diff --git a/.eslintrc.cjs b/.eslintrc.cjs new file mode 100644 index 0000000000..9ee6fa9c4c --- /dev/null +++ b/.eslintrc.cjs @@ -0,0 +1,147 @@ +/* eslint-env node */ + +const CODE_EXT = "js,jsx,cjs,mjs,ts,tsx,cts,mts" +const MARKDOWN_EXT = "md,mdx" + +module.exports = { + root: true, + plugins: [ + "@graphql-eslint", + "mdx", + "@typescript-eslint", + "tailwindcss", + "react", + "@next/next", + "react-hooks", + ], + overrides: [ + { + files: [`**/*.{${CODE_EXT}}`], + extends: [ + "eslint:recommended", + "plugin:@typescript-eslint/recommended", + "plugin:tailwindcss/recommended", + "prettier", + "plugin:@next/next/recommended", + "plugin:react-hooks/recommended-legacy", + "plugin:react/recommended", + ], + rules: { + "react/react-in-jsx-scope": "off", // TS checks this + "react/prop-types": "off", // and this + "no-undef": "off", // and this too + // This is type checking for projects without `@types/react`. Disabled due to false positives. + "react/no-unknown-property": "off", + + "react/no-unescaped-entities": [ + "warn", // quotes and apostrophes are okay + { + forbid: [ + { + char: "<", + alternatives: ["<"], + }, + { + char: ">", + alternatives: [">"], + }, + { + char: "{", + alternatives: ["{"], + }, + { + char: "}", + alternatives: ["}"], + }, + ], + }, + ], + "@next/next/no-img-element": "off", // straight up upsell, small `img`s actually don't need optimization + + "tailwindcss/classnames-order": "off", + "prefer-const": ["error", { destructuring: "all" }], + "prefer-rest-params": "off", + "@typescript-eslint/no-explicit-any": "off", + "@typescript-eslint/no-unused-vars": "off", + "@typescript-eslint/ban-ts-comment": "off", + "@typescript-eslint/no-var-requires": "off", + "@typescript-eslint/ban-types": "off", + "no-restricted-syntax": [ + "error", + { + selector: + "JSXElement[openingElement.name.name=/^(Image|NextImage)$/]:not(:has(JSXAttribute[name.name='placeholder']))", + message: + "Pass `placeholder: 'empty' | 'blur'` when calling or .", + }, + ], + }, + settings: { + tailwindcss: { + whitelist: ["roboto-mono"], + }, + react: { + version: "detect", + }, + }, + }, + { + files: [`**/*.{${MARKDOWN_EXT}}`], + parser: "eslint-mdx", + extends: ["plugin:mdx/recommended"], + processor: "mdx/remark", + parserOptions: { + ecmaVersion: 13, + sourceType: "module", + }, + settings: { + "mdx/code-blocks": true, + "mdx/language-mapper": { + js: "espree", + graphql: "@graphql-eslint/parser", + ts: "@typescript-eslint/parser", + typescript: "@typescript-eslint/parser", + }, + }, + rules: { + "mdx/remark": "error", + "no-unused-expressions": "off", + "react/jsx-no-undef": "off", + }, + }, + { + files: ["**/*.graphql"], + parser: "@graphql-eslint/parser", + rules: { + "@graphql-eslint/no-syntax-errors": "error", + "@graphql-eslint/unique-operation-name": "error", + "@graphql-eslint/unique-fragment-name": "error", + "@graphql-eslint/no-anonymous-operations": "warn", + "@graphql-eslint/lone-anonymous-operation": "error", + "@graphql-eslint/no-duplicate-fields": "error", + "@graphql-eslint/no-unused-fragments": "warn", + "@graphql-eslint/no-duplicate-fragment-names": "error", + "@graphql-eslint/no-undefined-variables": "error", + "@graphql-eslint/unique-variable-names": "error", + }, + }, + { + files: [`**/*.{${CODE_EXT}}`, `**/*.{${MARKDOWN_EXT}}`], + parserOptions: { + plugins: ["graphql"], + }, + }, + { + files: [ + `src/pages/blog/**/*.{${MARKDOWN_EXT}}`, + `src/pages/graphql-js/running-an-express-graphql-server.mdx`, + `src/code/**/*.{${MARKDOWN_EXT}}`, + `src/app/conf/**/*.{${MARKDOWN_EXT}}`, + ], + rules: { + // Disable `remark-lint-first-heading-level` since in blogs we don't want to enforce the first heading to be an `h1` + "mdx/remark": "off", + }, + }, + ], +} diff --git a/.github/ISSUE_TEMPLATE/bug-report.md b/.github/ISSUE_TEMPLATE/bug-report.md new file mode 100644 index 0000000000..13ade362dc --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug-report.md @@ -0,0 +1,32 @@ +--- +name: "Bug Report" +about: Notice something off? Tell us about it here. +labels: bug +--- + + + +### Description + + + +### Steps to Reproduce + + + +### Expected Result + + + +### Actual Result + + + +### Additional Context + + diff --git a/.github/ISSUE_TEMPLATE/code-changes.md b/.github/ISSUE_TEMPLATE/code-changes.md new file mode 100644 index 0000000000..a8e5849bd3 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/code-changes.md @@ -0,0 +1,23 @@ +--- +name: "Code Changes" +about: Tell us more about how you want to improve graphql.org +labels: enhancement +--- + + + +### Description + + + +### Motivation + + + +### Collaboration + + + +### Additional Context + + diff --git a/.github/ISSUE_TEMPLATE/new-faq-question.md b/.github/ISSUE_TEMPLATE/new-faq-question.md new file mode 100644 index 0000000000..d596fb62c0 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/new-faq-question.md @@ -0,0 +1,23 @@ +--- +name: "New FAQ Question" +about: Propose a new question to add to our FAQ page +labels: faq +--- + + + +### Question + + + +### Proposed answer + + + +### Collaboration + + + +### Additional Context + + diff --git a/.github/ISSUE_TEMPLATE/question.md b/.github/ISSUE_TEMPLATE/question.md new file mode 100644 index 0000000000..d45f50dd58 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/question.md @@ -0,0 +1,7 @@ +--- +name: "Question" +about: Ask us anything! +labels: question +--- + + diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000000..8c623d5fb9 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,15 @@ + + +Closes # + +## Description + + diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml new file mode 100644 index 0000000000..3602a15d43 --- /dev/null +++ b/.github/workflows/check.yml @@ -0,0 +1,57 @@ +name: Lint and check formatting + +on: pull_request + +jobs: + check: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - uses: the-guild-org/shared-config/setup@main + name: setup env + with: + packageManager: pnpm + workingDirectory: ./ + + - name: Install Dependencies + run: pnpm i + + - name: Run ESLint + run: pnpm lint --quiet + + - name: Run Prettier Check + run: pnpm format:check + + - name: Validate code snippets + run: pnpm validate:snippets + + playwright: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - uses: the-guild-org/shared-config/setup@main + name: setup env + with: + packageManager: pnpm + workingDirectory: ./ + + - name: Install Dependencies + run: pnpm i + + # per the docs: "caching browser binaries is not recommended, + # since the amount of time it takes to restore the cache is + # comparable to the time it takes to download the binaries" + - name: Install Playwright Browsers + run: ./node_modules/.bin/playwright install --with-deps + + - name: Run Playwright tests + run: ./node_modules/.bin/playwright test + + - uses: actions/upload-artifact@v4 + if: ${{ !cancelled() }} + with: + name: playwright-report + path: playwright-report/ + retention-days: 30 diff --git a/.github/workflows/conference-sync.yml b/.github/workflows/conference-sync.yml new file mode 100644 index 0000000000..776dc7aa58 --- /dev/null +++ b/.github/workflows/conference-sync.yml @@ -0,0 +1,26 @@ +# Sched's API rate limits are very limited, so we sync non-critical part of the data on a cron. +on: + workflow_dispatch: + # schedule: + # - cron: "*/10 * * * *" # every ten minutes + +jobs: + sync: + runs-on: ubuntu-latest + permissions: + contents: write + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Sync conference data from Sched + run: | + tsx scripts/sync-sched/sync.ts --year 2025 + env: + SCHED_ACCESS_TOKEN_2025: ${{ secrets.SCHED_ACCESS_TOKEN_2025 }} + + - name: Commit changes + uses: stefanzweifel/git-auto-commit-action@v5 + with: + file_pattern: "scripts/sync-sched/*.json" + commit_message: "Sync conference data from Sched" diff --git a/.gitignore b/.gitignore index aa091beba7..2c2af0a81e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,9 +1,67 @@ -*.swp -*~ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# nyc test coverage +.nyc_output + +# Compiled binary addons (http://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ + +# Typescript v1 declaration files +typings/ + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# dotenv environment variable files +.env* + +!static/img/__og-image/** +static/img/__og-image/* +!static/img/__og-image/**/*.png + +# Mac files .DS_Store -.nvmrc -node_modules -npm-debug.log -/build/ -.tmp.* \ No newline at end of file +# Swap files +*.swp + +# Codegen stuff +src/__generated__/ + +.idea/ +.next/ +public/sitemap.xml +out/ + +tsconfig.tsbuildinfo + +playwright-report/ diff --git a/.node-version b/.node-version new file mode 100644 index 0000000000..5767036af0 --- /dev/null +++ b/.node-version @@ -0,0 +1 @@ +22.21.1 diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000000..6c59086d86 --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +enable-pre-post-scripts=true diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000000..26cbea7e4e --- /dev/null +++ b/.prettierignore @@ -0,0 +1,12 @@ +public/ +pnpm-lock.yaml +*.mdx +!src/pages/blog/2024-04-11-announcing-new-graphql-website/index.mdx +!src/pages/blog/2024-08-15-graphql-local-initiative.mdx +!src/pages/community/foundation/community-grant.mdx +!src/pages/blog/2025-05-31-graphiql-4/index.mdx +!src/pages/blog/2025-06-10-graphiql-5/index.mdx +!src/pages/blog/2025-06-19-multioption-inputs-with-oneof/index.mdx +*.jpg + +scripts/**/*.json diff --git a/.remarkrc.js b/.remarkrc.js new file mode 100644 index 0000000000..45a8a7eba4 --- /dev/null +++ b/.remarkrc.js @@ -0,0 +1,7 @@ +export default { + plugins: [ + "frontmatter", // Required to parse frontmatter for linting + "remark-lint-first-heading-level", + "remark-lint-heading-increment", + ], +} diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index de27033073..0000000000 --- a/.travis.yml +++ /dev/null @@ -1,13 +0,0 @@ -language: node_js -node_js: 6 - -env: - global: - - secure: "HisahnzlpVlTi239Z80UtqRWYEWUBXyVDYsxX9vxwg332jSxO7Hr6TFmNjghpJPtT/HRjQ/FQ4Cfain2ae2OBi0a1mBNNvOTrfy8/Rvs+FwxlmPolzXKZg1PLx1A9HMlhVkAxYuk5AKv5wLNN3xWzPS9xcHASiCgHE1imq9tuf53tuflNpoAlRT6WVYqxuLluDTbfiTrmjjydfh/iTkYyU7mdfowEyS7+b7ltx8tzGD5Fif1dKBVZEkImxC5KV3oczk5zxIBC/j0SEmd4KLl5NH/kbUcD/mFSgtoKRSW0QwJdwR0I3AurP/D8FlTzVyCwwxMrZfnWjoync1bMJvRbz02KkiICt2lfI0BFo1dDD1yO8lYOhSHcXZRhhEypLu9mho2Cy0zy5zF5PF5t2X8zfGgkQ5eTy6xYCHOAl4eqO9NU2mtpKLdYpXfkBLRTa2e5U+DBqYt8fVXyBR2qVCbpIkg96Hx/FCCKtNlzjyhyTJmyoZr7BxPpHQZkmroieEMfpM7VfF729npf0n6jrfBLwyWFjCFAG9xLey537sUdczEltdWgOuW1rs0KaP4uM1si3S+fNndXLDX70n8BsadnJgq0y1RWAH1y8Y+Pa5cRl0QXQOJUgK4ZcS29+BzZ6RIsFUrAJXHCRdaTDrQNw8CepW443Ke9quwG8IJLCAPV0c=" - -deploy: - skip_cleanup: true - provider: script - script: ./resources/publish.sh - on: - branch: source diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000000..fd60454bed --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,22 @@ +{ + "eslint.format.enable": true, + "editor.formatOnSave": true, + "editor.defaultFormatter": "esbenp.prettier-vscode", + "yaml.schemas": { + "https://json.schemastore.org/github-workflow.json": ".github/workflows/**/*.yml" + }, + "typescript.tsdk": "node_modules/typescript/lib", + "[typescript]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "tailwindCSS.classFunctions": ["clsx"], + "files.associations": { + "*.css": "tailwindcss" + }, + "editor.quickSuggestions": { + "strings": "on" + }, + "typescript.preferences.autoImportFileExcludePatterns": [ + "**/node_modules/lucide-react" + ] +} diff --git a/BLOG_STYLE_GUIDE.md b/BLOG_STYLE_GUIDE.md new file mode 100644 index 0000000000..e7520372f2 --- /dev/null +++ b/BLOG_STYLE_GUIDE.md @@ -0,0 +1,82 @@ +# BLOG_STYLE_GUIDE.md + +## GraphQL Blog Content Style Guide + +Welcome to the GraphQL Blog Style Guide! This document outlines best practices and standards for writing engaging, informative, and technically accurate content for our audience. + +--- + +## ✍️ General Writing Principles + +- **Audience First**: Think about who the audience of your post is. +- **Clarity is Key**: Prioritize clear, concise explanations over jargon. Break down complex ideas with examples. +- **Vendor neutral**: The GraphQL Blog is about GraphQL as a technology. Vendor specific content and personal promotion doesn't belong in the GraphQL blog. + +## ℹ️ Content + +The GraphQL blog welcomes contributions. Anyone may submit a blog post idea by [opening an issue](https://github.com/graphql/graphql.github.io/issues/new) or a draft by [opening a pull request](https://github.com/graphql/graphql.github.io/pulls). + +Maintainers are responsible for approving and merging the pull requests. +When merging a blog post, they should also schedule an announcement on our social channels (at time of writing this is managed via [Typefully](https://typefully.com)). + +Example content: + +- Announcements: events, new versions of [GraphQL tools or specifications](https://github.com/orgs/graphql/repositories), updates about the GraphQL foundation, collaborations, etc... +- Best practices: share learnings and make the best of GraphQL. +- Case studies: explain how GraphQL helped solve a problem. +- Technical updates: broadcast an update about discussions happening in a working group. +- etc... + +This list is non-exhaustive. If there is something you would like to see on the GraphQL blog, [open an issue for discussion](https://github.com/graphql/graphql.github.io/issues/new). + +--- + +## 📚 Structure + +### Title + +- Clear, concise, and descriptive. +- Avoid clickbait. Example: + ✅ "Understanding GraphQL Subscriptions" + ❌ "This One GraphQL Trick Will Blow Your Mind" + +### Introduction + +- Hook the reader in 1–2 sentences. +- Set clear expectations about what the post covers and who it's for: + - open source users of a given project (release notes, updates,...) are probably already familiar with the tool. + - technical users (best practices, working group updates) have a technical background but may be new to GraphQL concepts. + - larger audience (case studies, events, grants, reports) may not necessarily have a technical background but still be interested in latest GraphQL content. + +### Body + +- Use clear headers (`##`, `###`) to organize sections. +- Limit paragraphs to 3–5 sentences. +- Use bullet points or numbered lists for step-by-step content. +- Include **code samples** where relevant. +- Use callouts for **tips**, **warnings**, or **best practices**. + +### Conclusion + +- Summarize key takeaways. +- Link to related resources, docs, or posts. +- Include a call to action if applicable (e.g., "Try it out", "Join the discussion"). + +--- + +## ✅ Do + +- Cite sources if you reference third-party tools or documentation. +- Use inclusive language: prefer "you/the user" over gendered or assumptive terms. +- Use present tense. + +## ❌ Don't + +- Don’t assume the reader knows your stack. +- Don't overuse metaphors; use them sparingly to aid understanding. +- Don't overuse passive voice. Active voice often brings more clarity. +- Don't overuse future tense. The present tense often brings more clarity. + +--- + +Thank you for contributing to the GraphQL Blog! 🎉 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000000..38d215bb86 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,187 @@ +# Contributing to graphql.org + +> This repository is governed by the [GraphQL Code of Conduct](https://graphql.org/codeofconduct). By contributing, you agree to abide by its terms. + +Thanks for taking the time to contribute! The GraphQL community is great because of people like you 🎉 + +There are many ways to get involved. Follow this guide and feel free to [reach out if you have questions](#asking-questions). + +## What's in this document + +- [Development guide](#development-guide) + - [Running the site locally](#running-the-site-locally) + - [Checking for broken links](#checking-for-broken-links) + - [Branching](#branching) + - [Project structure](#project-structure) + - [Publishing the updated site](#publishing-the-updated-site) +- [Updating content](#updating-content) + - [Fix a typo, code sample bug, or formatting](#fix-a-typo-code-sample-bug-or-formatting) + - [Add a library or tool to the Code page](#add-a-library-or-tool-to-the-code-page) + - [Add a resource to the Community page](#add-a-resource-to-the-community-page) + - [Add a question to the FAQ](#add-a-question-to-the-faq) + - [Write a new section or guide](#write-a-new-section-or-guide) + - [Add a blog post](#add-a-blog-post) +- [Making changes to the code](#making-changes-to-the-code) + - [Browser support](#browser-support) +- [Contributing something else](#contributing-something-else) +- [Asking questions](#asking-questions) + +## Development guide + +### Running the site locally + +First, clone this repository and move into the directory: + +```sh +git clone https://github.com/graphql/graphql.github.io.git +cd graphql.github.io +``` + +Then, use [pnpm](https://pnpm.io) to install and load all the necessary dependencies: + +```sh +pnpm i +``` + +> Note: [pnpm is currently the only way to run the site locally](https://github.com/graphql/graphql.github.io/issues/946). + +Run the `dev` script to launch the server: + +```sh +pnpm dev +``` + +Finally, open http://localhost:3000 to view it in the browser. + +The GraphQL website is built with [Nextra](https://nextra.site). This means that a hot-reloading development environment will be accessible by default. + +### Checking for broken links + +We use [Lychee](https://github.com/lycheeverse/lychee), a Rust-based CLI tool, to check for broken links in our documentation. + +To install Lychee locally: + +1. Install Rust: https://www.rust-lang.org/tools/install +2. After installing Rust, run: + +```bash +cargo install lychee +``` + +With Rust and Lychee installed, run the link checker: `pnpm run check:links`. + +### Branching + +Active development for graphql.org happens on the `source` branch. Be sure to create any new branches or direct any pull requests back to `source`. + +### Project structure + +- `public`: Static files, like images, can be referenced by your code starting from the base URL (`/`) +- `out`: Output files that will be served by a static HTTP server +- `src`: Markdown and the TypeScript/JavaScript files used to generate the website + - `app`: A new App Router built on React Server Components which supports shared layouts, nested routing, loading states, error handling, and more + - `pages`: A file-system based router, when a file is added to the `pages` directory, it's automatically available as a route + - `components`: React components used for pages + +### Publishing the updated site + +Your changes will be merged into the `source` branch. Then, the CI will automatically publish a new version of https://graphql.org via [Vercel](https://vercel.com/docs). + +## Updating content + +### Fix a typo, code sample bug, or formatting + +If you notice something wrong in the text or code samples, please follow our [development guide](#development-guide) to [open a pull request](https://github.com/graphql/graphql.github.io/pulls) with your fix. + +All of the content on https://graphql.org is written and formatted in [Markdown](https://nextra.site/docs/guide/markdown). + +### Add a library, tool, or service to the Code page + +The [Code page](https://graphql.org/code) is a collection of libraries, tools, and services built for GraphQL. + +#### General guidelines + +**Adding a resource:** + +- With rare exceptions, any pull request that adds a new library, tool, or service to the Code page will be accepted. +- Any library should include a few paragraphs describing the usage and offering people a chance to grok the project priorities. +- If there isn't a section already for your programming language, please add it. + +If it isn't a library, tool, or service - then it could go on the [Community page](#add-a-resource-to-the-community-page). If you aren't sure where your resource would fit, you can [open an issue](https://github.com/graphql/graphql.github.io/issues/new) and ask. + +**Removing a resource:** + +- Services that don't work anymore +- Code repositories that are archived +- Projects declared to be abandoned by their maintainers +- Any link that 404s + +We rely on these concrete signals before removing a resource. Even if a project hasn't been released in a few years, that doesn't mean that it's not working. + +#### Workflow + +To add or remove a resource to this page, follow our [development guide](#development-guide) to [open a pull request](https://github.com/graphql/graphql.github.io/pulls). + +The content for this page is located in [various directories under `src/code`](./src/code). Everything is written and formatted in [Markdown](https://nextra.site/docs/guide/markdown). + +### Add a resource to the Community page + +The [Community page](https://graphql.org/community) highlights resources and groups that help people get more involved with GraphQL. + +To add something to this page, follow our [development guide](#development-guide) to [open a pull request](https://github.com/graphql/graphql.github.io/pulls). + +The content for this page is located in a [directory under `src/pages/community`](./src/pages/community). Everything is written and formatted in [Markdown](https://nextra.site/docs/guide/markdown). + +### Add a question to the FAQ + +Our [Frequently Asked Questions (FAQ) page](https://graphql.org/faq) is designed to help answer questions from the community. This page is still in development, so if you think there's a question missing - please [open an issue](https://github.com/graphql/graphql.github.io/issues/new)! It'd be great if you could include both the question and a proposed answer outline in the issue description. + +Once you have approval from a maintainer, use the [development guide](#development-guide) to add your question and answer. The content for the FAQ is located in [`src/pages/faq`](./src/pages/faq). Each section has its own [Markdown](https://nextra.site/docs/guide/markdown) file. + +> Note: All answers in this section should be vendor-neutral and accessible to GraphQL users of all levels. + +When your answer is ready, [open a pull request](https://github.com/graphql/graphql.github.io/pulls). + +### Write a new section or guide + +There are still several [Best Practices guides that no one has written](https://github.com/graphql/graphql.github.io/issues/41) yet. If you want to take one of these, comment on [the original issue](https://github.com/graphql/graphql.github.io/issues/41) and mention which topic you'll work on. + +Then, use our [development guide](#development-guide) to determine where your new page best fits. Our documentation is written and formatted in [Markdown](https://nextra.site/docs/guide/markdown). + +Once it's ready for review, please [open a pull request](https://github.com/graphql/graphql.github.io/pulls). + +### Add a blog post + +This repository holds the [graphql.org blog](https://graphql.org/blog/) at [source/src/pages/blog](https://github.com/graphql/graphql.github.io/tree/source/src/pages/blog). Blog posts may contain announcements, news, best practices and more. + +Contributions are very welcome! Please see the [BLOG_STYLE_GUIDE](BLOG_STYLE_GUIDE.md) for more information. + +## Making changes to the code + +Before diving into any code updates, please [open an issue](https://github.com/graphql/graphql.github.io/issues/new) describing the change(s) you'd like to make. + +If you're working off an [existing issue](https://github.com/graphql/graphql.github.io/issues), follow our [development guide](#development-guide) to make your changes. Once it's ready for review, please [open a pull request](https://github.com/graphql/graphql.github.io/pulls) and reference the original issue. + +### Browser support + +We aim to support the latest stable versions of Chrome, Edge, Firefox, Safari, and Safari on mobile. + +## Contributing something else + +Interested in adding something not covered in this guide? Please [open an issue](https://github.com/graphql/graphql.github.io/issues/new) and tell us all about your idea. + +## Asking questions + +If you run into any problems or have questions while contributing, you're always welcome to [open an issue](https://github.com/graphql/graphql.github.io/issues/new). + +# Opening a PR to contribute your code + +You can also ping our team in the [#website channel on the GraphQL Slack](https://graphql.slack.com/messages/website/). [Get your invite here!](https://graphql-slack.herokuapp.com/) + +This repository is managed by EasyCLA. Project participants must sign the free [GraphQL Specification Membership agreement](https://preview-spec-membership.graphql.org) before making a contribution. You only need to do this one time, and it can be signed by [individual contributors](https://individual-spec-membership.graphql.org) or their [employers](https://corporate-spec-membership.graphql.org). + +To initiate the signature process please open a PR against this repo. The EasyCLA bot will block the merge if we still need a membership agreement from you. + +You can find [detailed information here](https://github.com/graphql/graphql-wg/tree/main/membership). If you have issues, please email operations@graphql.org. + +If your company benefits from GraphQL and you would like to provide essential financial support for the systems and people that power our community, please also consider membership in the [GraphQL Foundation](https://foundation.graphql.org/join). diff --git a/LICENSE b/LICENSE index 4e061975a4..7bbf892a04 100644 --- a/LICENSE +++ b/LICENSE @@ -1,26 +1,21 @@ -LICENSE AGREEMENT For graphql.org software +MIT License -Facebook, Inc. (“Facebook”) owns all right, title and interest, including all -intellectual property and other proprietary rights, in and to the graphql.org -software. Subject to your compliance with these terms, you are hereby granted a -non-exclusive, worldwide, royalty-free copyright license to (1) use and copy the -graphql.org software; and (2) reproduce and distribute the graphql.org software -as part of your own software (“Your Software”). Facebook reserves all rights not -expressly granted to you in this license agreement. +Copyright (c) GraphQL Contributors -THE SOFTWARE AND DOCUMENTATION, IF ANY, ARE PROVIDED "AS IS" AND ANY EXPRESS OR -IMPLIED WARRANTIES (INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE) ARE DISCLAIMED. IN NO -EVENT SHALL FACEBOOK OR ITS AFFILIATES, OFFICES, DIRECTORS OR EMPLOYEES BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF -THE USE OF THE SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -You will include in Your Software (e.g., in the file(s), documentation or other -materials accompanying your software): (1) the disclaimer set forth above; (2) -this sentence; and (3) the following copyright notice: +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -Copyright (c) 2015, Facebook, Inc. All rights reserved. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md index d7731138f7..f2f2a29b6e 100644 --- a/README.md +++ b/README.md @@ -1,29 +1,66 @@ -# Contributing +# Source Repository for GraphQL.org -Organization gh-pages deploy the `master` branch, so active development occurs -on this `source` branch. +This repository contains the source code for the [GraphQL website](https://graphql.org). -The site is written in JS and Markdown files in `site/`. +You can find more discussions on the #website channel on [the GraphQL Discord](https://discord.graphql.org). -The site chrome are all in JS files in `site/_core/`. +## Table of Contents -### Making changes +- [Overview](#overview) +- [Documentation](#documentation) +- [Deployment](#deployment) +- [How to Contribute](#how-to-contribute) +- [CLA Process](#cla-process) +- [Financial Support](#financial-support) -The first time, get all the dependencies loaded via +## Overview -``` -npm install -``` +**GraphQL** is a query language for APIs and a runtime for fulfilling those queries with your existing data. It provides: -Then, run the server via +- a complete and understandable description of the data in your API, +- support for powerful developer tooling, and +- precise querying, which offers several benefits: + - clients request only the data they need, improving efficiency; + - new fields and features can be added without impacting existing clients; and + - field-level usage can be tracked and monitored for insights and optimization. -``` -npm start -Open http://localhost:8444/ -``` +The [GraphQL Specification](https://spec.graphql.org/) is open source and governed by the [GraphQL Foundation](https://foundation.graphql.org/). -Anytime you change the contents, just refresh the page and it's going to be updated. +## Documentation -### Publish the Website +- [GraphQL Website](https://graphql.org/) +- [Reference Documentation](https://graphql.org/learn/) +- [Language Support, Tools, and Services](https://graphql.org/code/) +- [Frequently Asked Questions (FAQ)](https://graphql.org/faq/) +- [Community Resources](https://graphql.org/community/) -Once pushed to the `source` branch, Travis CI will publish http://graphql.org +## Deployment + +The website is deployed via [Vercel](https://vercel.com) on merges to the `source` branch. To preview changes locally, follow these steps: + +1. Clone the repository: + `git clone https://github.com/graphql/graphql.github.io.git` + `cd graphql.github.io` +2. Install dependencies: + `npm install` +3. Run the site locally: + `npm run dev` + +## How to Contribute + +We welcome contributions! 🎉 Please refer to our [contributing guide](./CONTRIBUTING.md) for detailed instructions on how to make changes to the GraphQL website. + +### CLA Process + +Before contributing, all participants must sign the free [GraphQL Specification Membership Agreement](https://preview-spec-membership.graphql.org). You only need to do this once, and it can be signed by: + +- [Individual contributors](http://individual-spec-membership.graphql.org/) +- [Employers](http://corporate-spec-membership.graphql.org/) + +To initiate the signature process, please open a PR against this repository. The EasyCLA bot will block the merge if the membership agreement has not been signed. + +For more information on the CLA, check out the [detailed instructions here](https://github.com/graphql/graphql-wg/tree/main/membership). If you encounter any issues, please contact us at [operations@graphql.org](mailto:operations@graphql.org). + +## Join the Foundation! + +If your company benefits from GraphQL and you would like to provide essential financial support for the systems and people that power our community, please consider becoming a member of the [GraphQL Foundation](https://foundation.graphql.org/join). diff --git a/generate-videos-mappings.py b/generate-videos-mappings.py new file mode 100644 index 0000000000..fbdde5e56b --- /dev/null +++ b/generate-videos-mappings.py @@ -0,0 +1,77 @@ +import os +import googleapiclient.discovery +import googleapiclient.errors +from dotenv import load_dotenv + + +load_dotenv(dotenv_path='.env.development') + +api_service_name = "youtube" +api_version = "v3" +api_key = os.getenv("YOUTUBE_ACCESS_TOKEN") + +youtube = googleapiclient.discovery.build( + api_service_name, api_version, developerKey=api_key) + +def get_videos(channel_id, max_results_per_page=50): + videos = [] + page_token = None # Start with no pageToken + total_fetched = 0 # Keep track of the total number of fetched videos + + while total_fetched < 200: # Keep looping until 200 videos have been fetched + request = youtube.search().list( + part="snippet", + channelId=channel_id, + maxResults=max_results_per_page, + order="date", + type="video", + pageToken=page_token # Include the current pageToken + ) + + response = request.execute() + + for item in response.get("items", []): + if total_fetched >= 200: + break # Break out of the loop if 200 videos have been fetched + + video_id = item["id"]["videoId"] + title = item["snippet"]["title"] + videos.append({'id': video_id, 'title': title}) + total_fetched += 1 # Increment the total_fetched count + + page_token = response.get("nextPageToken") # Get the next pageToken + + if not page_token: + break # Exit the loop if there are no more pages + + return videos + +def get_channel_id(channel_name): + request = youtube.search().list( + part="snippet", + q=channel_name, + type="channel", + maxResults=1 + ) + response = request.execute() + items = response.get("items", []) + if items: + return items[0]["snippet"]["channelId"] + else: + return None + +channel_name = "GraphQLFoundation" +channel_id = get_channel_id(channel_name) + +if channel_id: + videos = get_videos(channel_id) + + + with open('videos.ts', 'w') as f: + f.write('export const videos = [\n') + for video in videos: + f.write(f" {{ id: '{video['id']}', title: `{video['title']}` }},\n") + f.write('];\n') + print("JS file has been written with video information!") +else: + print(f"No channel found with name {channel_name}") \ No newline at end of file diff --git a/next-env.d.ts b/next-env.d.ts new file mode 100644 index 0000000000..725dd6f245 --- /dev/null +++ b/next-env.d.ts @@ -0,0 +1,6 @@ +/// +/// +/// + +// NOTE: This file should not be edited +// see https://nextjs.org/docs/app/building-your-application/configuring/typescript for more information. diff --git a/next-sitemap.config.js b/next-sitemap.config.js new file mode 100644 index 0000000000..b7f1b427aa --- /dev/null +++ b/next-sitemap.config.js @@ -0,0 +1,8 @@ +/* eslint-env node */ + +/** @type {import('next-sitemap').IConfig} */ +export default { + siteUrl: process.env.SITE_URL || "https://graphql.org/", + generateIndexSitemap: false, + output: "export", // Set static output here +} diff --git a/next.config.js b/next.config.js new file mode 100644 index 0000000000..64b247d8ad --- /dev/null +++ b/next.config.js @@ -0,0 +1,208 @@ +/* eslint-env node */ +// @ts-check + +import nextra from "nextra" +import path from "node:path" +import withLess from "next-with-less" +import nextBundleAnalyzer from "@next/bundle-analyzer" +import fs from "fs" +import rehypeMermaid from "rehype-mermaid" +import withPlaiceholder from "@plaiceholder/next" + +import { remarkGraphiQLComment } from "./src/remark-graphiql-comment.js" +import { syntaxHighlightingThemes } from "./src/_design-system/syntax/index.js" + +const vercelJSON = JSON.parse(fs.readFileSync("./vercel.json", "utf-8")) + +const withNextra = nextra({ + autoImportThemeStyle: false, + theme: "nextra-theme-docs", + themeConfig: "./theme.config.tsx", + mdxOptions: { + remarkPlugins: [remarkGraphiQLComment], + rehypePlugins: [mermaidConfig()], + rehypePrettyCodeOptions: { + theme: syntaxHighlightingThemes, + }, + }, +}) + +const sep = path.sep === "/" ? "/" : "\\\\" + +const ALLOWED_SVG_REGEX = new RegExp(`${sep}icons${sep}.+\\.svg$`) + +/** + * @type {import('next').NextConfig} + */ +const config = { + // reactStrictMode: true, provoke duplicated codemirror editors + webpack(config) { + // #region MDX + const mdxRule = config.module.rules.find(rule => rule.test?.test?.(".mdx")) + if (mdxRule) { + mdxRule.resourceQuery = { + not: /raw/, + } + } + // Instead of transforming MDX, with ?source we can get + // the raw content to process in a Server Component. + config.module.rules.push({ + test: /\.mdx$/i, + resourceQuery: /raw/, + type: "asset/source", + }) + // #endregion MDX + + // #region SVGs + const fileLoaderRule = config.module.rules.find(rule => + rule.test?.test?.(".svg"), + ) + + fileLoaderRule.exclude = /\.svg$/i + + config.module.rules.push( + // All .svg from /icons/ and with ?svgr are going to be processed by @svgr/webpack + { + test: ALLOWED_SVG_REGEX, + use: ["@svgr/webpack"], + }, + { + test: /\.svg$/i, + exclude: ALLOWED_SVG_REGEX, + resourceQuery: /svgr/, + use: [ + { + loader: "@svgr/webpack", + options: { + typescript: true, + svgoConfig: { + plugins: [ + { + name: "preset-default", + params: { + overrides: { + minifyStyles: false, + removeViewBox: false, + removeTitle: false, + }, + }, + }, + "removeXMLNS", + "removeXlink", + "prefixIds", + ], + }, + }, + }, + ], + }, + // Otherwise, we use the default file loader + { + ...fileLoaderRule, + test: /\.svg$/i, + exclude: ALLOWED_SVG_REGEX, + resourceQuery: { + not: [...fileLoaderRule.resourceQuery.not, /svgr/], + }, + }, + ) + // #endregion SVGs + + return config + }, + images: { + remotePatterns: [ + { + hostname: "avatars.sched.co", + pathname: "**", + }, + ], + }, + env: { + NEXT_PUBLIC_GA_ID: + process.env.NODE_ENV === "production" ? "UA-44373548-16" : "", + }, + headers: async () => { + return [ + { + source: "/graphql", + headers: [ + { + key: "Access-Control-Allow-Origin", + value: "*", + }, + { + key: "Access-Control-Allow-Methods", + value: "GET, POST, OPTIONS", + }, + { + key: "Access-Control-Allow-Headers", + value: "Content-Type", + }, + ], + }, + ] + }, + trailingSlash: true, + // Only for local development, skip 200 statusCode due following error: + // + // `statusCode` is not undefined or valid statusCode for route {"source":"/conf/attendee/:path*","destination":"https://graphql-conf-attendee-nextjs.vercel.app/:path*","statusCode":200} + // `statusCode` is not undefined or valid statusCode for route {"source":"/swapi-graphql/:path*","destination":"https://graphql.github.io/swapi-graphql/:path*","statusCode":200} + // Valid redirect statusCode values are 301, 302, 303, 307, 308 + redirects: () => vercelJSON.redirects.filter(o => o.statusCode !== 200), + async rewrites() { + return [ + { + source: "/swapi-graphql/:path*", + destination: "https://swapi-graphql.netlify.app/:path*", + }, + { + source: "/graphql", + destination: "https://swapi-graphql.netlify.app/graphql", + }, + ] + }, + typedRoutes: true, +} + +const withBundleAnalyzer = nextBundleAnalyzer({ + enabled: process.env.ANALYZE === "true", +}) + +export default withBundleAnalyzer( + withLess(withNextra(withPlaiceholder(config))), +) + +function mermaidConfig() { + return [ + rehypeMermaid, + /** @type {import("rehype-mermaid").RehypeMermaidOptions} */ ({ + mermaidConfig: { + fontFamily: "var(--font-sans)", // we can't use monospace here because it's way too wide + theme: "null", + look: "classic", + flowchart: { + defaultRenderer: "elk", + padding: 6, + }, + themeCSS: ` + .node rect { + fill: var(--mermaid-node-fill); + stroke: var(--mermaid-node-stroke); + } + .label text, span { + fill: hsl(var(--color-neu-900)); + color: hsl(var(--color-neu-900)); + } + .flowchart-link { + stroke: var(--mermaid-arrow); + } + .marker { + stroke: var(--mermaid-arrow); + fill: var(--mermaid-arrow); + } + `, + }, + }), + ] +} diff --git a/notes/ContributingToCodePage.md b/notes/ContributingToCodePage.md new file mode 100644 index 0000000000..89af8d680b --- /dev/null +++ b/notes/ContributingToCodePage.md @@ -0,0 +1,79 @@ +# Contributing to the Code Page + +Hi, thanks for reading the docs! + +Secondly, we want to provide a really strong overview of all the libraries in the GraphQL eco-system. To make this +easy for contributors the code page is automatically generated from a series of markdown files in this repo. + +```sh +$ tree src/code +src/code +├── language-support +│ ├── c-c +│ │ └── tools +│ │ └── libgraphqlparser.md +│ ├── clojure +│ │ ├── client +│ │ │ └── regraph.md +│ │ └── server +│ │ ├── alumbra.md +│ │ ├── graphql-clj.md +│ │ └── lacinia.md +│ ├── c-net +│ │ ├── client +│ │ │ ├── graphql-client.md +│ │ │ ├── graphql-net-client.md +│ │ │ └── sahb-graphqlclient.md +// etc +``` + +We'd love any new project to include a few paragraphs describing its goals and usage, the goal here is to make it easy for people to decide between options. + +Here's an optimal example of what we're looking for: + +- It uses yaml frontmatter to provide additional information like repo, npm +- It explains itself in the 'description' then fills fleshes out that description with some code samples + +````md +--- +name: Express GraphQL +description: The reference implementation of a GraphQL API server over an Express webserver. You can use this to run GraphQL in conjunction with a regular Express webserver, or as a standalone GraphQL server. +url: /graphql-js/running-an-express-graphql-server/ +github: graphql/graphql-http +npm: "graphql-http" +--- + +To run an `graphql-http` hello world server: + +```sh +npm install express graphql-http graphql +``` + +Then run `node server.js` with this code in `server.js`: + +```js +var express = require("express") +var { createHandler } = require("graphql-http/lib/use/express") +var { buildSchema } = require("graphql") + +var schema = buildSchema(/* GraphQL */ ` + type Query { + hello: String + } +`) + +var root = { hello: () => "Hello world!" } + +var app = express() +app.all( + "/graphql", + createHandler({ + schema: schema, + rootValue: root, + }), +) +app.listen(4000, () => console.log("Now browse to localhost:4000/graphql")) +``` +```` + +Any library/tool/service has a maximum height in the site, and then it can be expanded by clicking, so if you need quite a lot of space to explain your project then that's OK. diff --git a/notes/NewSiteArchitecture.md b/notes/NewSiteArchitecture.md index fb5bed0d79..09cfeeb506 100644 --- a/notes/NewSiteArchitecture.md +++ b/notes/NewSiteArchitecture.md @@ -2,172 +2,173 @@ ## Index -*Goal:* This is the landing page and is our opportunity to quickly capture attention and explain what GraphQL is and why you should care. +_Goal:_ This is the landing page and is our opportunity to quickly capture attention and explain what GraphQL is and why you should care. -*Timeframe:* Launch Mon, Sept 12th +_Timeframe:_ Launch Mon, Sept 12th This page is effectively a marketing page for GraphQL and should be the visual, scrollable version of the "Introducing GraphQL" conference talks and should be rich with visual metaphor and illustration and take advantage of whitespace to make individual salient points. -Above the fold, this page should succinctly explain what GraphQL is and illustrate with a simple (editable) query/response example. Before scrolling you should understand the following: +Above the fold, this page should succinctly explain what GraphQL is and illustrate with a simple (editable) query/response example. Before scrolling, you should understand the following: -* GraphQL solves the same problem as REST. -* GraphQL is an query language for APIs (and not Databases). -* GraphQL is sent by client applications, such as an iOS app. -* GraphQL is evaluated by a web service and often returned as JSON. -* GraphQL services provide a complete description of your data with a type system. -* It's easy to build powerful tools for your data using GraphQL. +- GraphQL solves the same problem as REST. +- GraphQL is a query language for APIs (and not Databases). +- GraphQL is sent by client applications, such as an iOS app. +- GraphQL is evaluated by a web service and often returned as JSON. +- GraphQL services provide a complete description of your data with a type system. +- It's easy to build powerful tools for your data using GraphQL. Below the fold we should introduce concepts one at a time, each with visual metaphor and take-aways: -1) GraphQL clients describe what they need in terms of how client developers think about data. +1. GraphQL clients describe what they need in terms of how client developers think about data. -* If you're familiar with JSON, GraphQL is easy to learn and understand. -* GraphQL only sends what you ask for, nothing more or less, making your app faster and more stable. -* It's easy to anticipate the shape of the result of any query. +- If you're familiar with JSON, GraphQL is easy to learn and understand. +- GraphQL only sends what you ask for, nothing more or less, making your app faster and more stable. +- It's easy to anticipate the shape of the result of any query. -2) GraphQL queries can access many "resources" in a single network request. +2. GraphQL queries can access many "resources" in a single network request. -* A query can access properties of not just one object, but of many related objects. -* A query can access multiple unrelated objects at once. -* Compared to REST, GraphQL collects all the data needed for your app with much less network activity, making your app faster. +- A query can access properties of not just one object, but of many related objects. +- A query can access multiple unrelated objects at once. +- Compared to REST, GraphQL collects all the data needed for your app with much less network activity, making your app faster. -3) GraphQL services describes what's possible with a strong type system. +3. GraphQL services describes what's possible with a strong type system. -* GraphQL services provide a complete description of your data. -* Every `{ }` corresponds to an object of a particular type, and every type describes the fields available. -* GraphQL only runs queries that make sense and provides helpful error messages. -* Tools and IDEs can make editing queries easy via type-aheads. - * GraphiQL is a free tool that you can use. -* Type system defines descriptions, making it easy to keep documentation up to date. -* Every query guarantees the shape and type of its response. +- GraphQL services provide a complete description of your data. +- Every `{ }` corresponds to an object of a particular type, and every type describes the fields available. +- GraphQL only runs queries that make sense and provides helpful error messages. +- Tools and IDEs can make editing queries easy via type-aheads. + - GraphiQL is a free tool that you can use. +- Type system defines descriptions, making it easy to keep documentation up to date. +- Every query guarantees the shape and type of its response. -4) GraphQL is composable via fragments. +4. GraphQL is composable via fragments. -* Fragments describe a portion of some Type to be queried. -* Fragments are often used next to View code where data is used. -* Fragments are composed together to create full queries. +- Fragments describe a portion of some Type to be queried. +- Fragments are often used next to View code where data is used. +- Fragments are composed together to create full queries. -5) GraphQL makes backwards-compatible APIs easy. +5. GraphQL makes backwards-compatible APIs easy. -* Server does not need to worry about concerns of any particular client, only the complete set of capabilities. Clients are responsible for the data they receive. -* Because GraphQL only sends what you ask for, new capabilities can be introduced via new fields on types with no impact on existing queries. -* Old capabilities can be marked "deprecated" with no impact on existing queries. -* No versioning your API when using GraphQL leads to cleaner code on the server. +- Server does not need to worry about concerns of any particular client, only the complete set of capabilities. Clients are responsible for the data they receive. +- Because GraphQL only sends what you ask for, new capabilities can be introduced via new fields on types with no impact on existing queries. +- Old capabilities can be marked "deprecated" with no impact on existing queries. +- No versioning your API when using GraphQL leads to cleaner code on the server. -6) GraphQL queries are answered by simple functions on your server. +6. GraphQL queries are answered by simple functions on your server. -* GraphQL is not backed by any database technology, just like REST. -* Every field on each type is represented by a function for retrieving that data. -* GraphQL will call your functions and execute a query with optimal concurrency. -* It's easy to write a GraphQL API using your existing data model. +- GraphQL is not backed by any database technology, just like REST. +- Every field on each type is represented by a function for retrieving that data. +- GraphQL will call your functions and execute a query with optimal concurrency. +- It's easy to write a GraphQL API using your existing data model. Finally, there will be a set of links for learning more (diving into `Learn`) and for getting started (in `Code`). As well as a wall-o-logo for companies using GraphQL. ## Learn -*Goal:* Introduce GraphQL, one concept at a time, covering both primary concepts and best practices. +_Goal:_ Introduce GraphQL, one concept at a time, covering both primary concepts and best practices. -*Timeframe:* Basic primary concepts by Sept 12th, advanced primary concepts by Sept 30th, best practices as ready over Q3/Q4. +_Timeframe:_ Basic primary concepts by Sept 12th, advanced primary concepts by Sept 30th, best practices as ready over Q3/Q4. Where "GraphQL the Spec" is designed for a specific audience of those building GraphQL servers, this represents "GraphQL the Book" and is designed for the audience of anyone who wishes to use GraphQL. It should cover both GraphQL core concepts in addition to best practices and further topics, and it should range from introductory concepts through advanced concepts. The landing page for this section should begin as a more information-rich introduction to GraphQL, explaining why you might use it, and give a brief overview of the constituent parts. Take-aways from this introduction page: -* GraphQL is a query language. -* GraphQL servers describe a type system, called a "schema". -* Clients can access a GraphQL server's type system to learn about what's possible. -* Clients send queries to servers and typically get back JSON. -* GraphQL servers validate and execute GraphQL queries. +- GraphQL is a query language. +- GraphQL servers describe a type system, called a "schema". +- Clients can access a GraphQL server's type system to learn about what's possible. +- Clients send queries to servers and typically get back JSON. +- GraphQL servers validate and execute GraphQL queries. There is then a TOC through the sections and chapters (this is a straw-man list, open to reordering and addition) -* Introducing GraphQL (this initial page) -* Core Concepts: - * Requests: - * Basics (queries & mutations, fields, arguments, aliases, comments) - * Variables - * Fragments - * Values - * Directives (skip & include) - * Type System: - * Basics (Schema, Objects & Fields) - * Scalars & Enums - * Lists & NonNull (mention error handling) - * Interfaces & Unions - * How GraphQL Works: - * Validation - * Execution & Error Handling - * Introspection -* Best Practices: - * Servers: - * Serving over HTTP - * Authentication & Authorization - * Mutations - * Paginating Lists - * Schema Changes & Versioning - * Query Performance (Batching & Caching) - * Security & Rate Limiting - * Schema Design Guidelines - * Clients: - * Using Variables - * Co-locating Fragments - * Caching Results - * Persisted Queries - * Generating Models - * Migrating from REST +- Introducing GraphQL (this initial page) +- Core Concepts: + - Requests: + - Basics (queries & mutations, fields, arguments, aliases, comments) + - Variables + - Fragments + - Values + - Directives (skip & include) + - Type System: + - Basics (Schema, Objects & Fields) + - Scalars & Enums + - Lists & NonNull (mention error handling) + - Interfaces & Unions + - How GraphQL Works: + - Validation + - Execution & Error Handling + - Introspection +- Best Practices: + - Servers: + - Serving over HTTP + - Authentication & Authorization + - Mutations + - Paginating Lists + - Schema Changes & Versioning + - Query Performance (Batching & Caching) + - Security & Rate Limiting + - Schema Design Guidelines + - Clients: + - Using Variables + - Co-locating Fragments + - Caching Results + - Persisted Queries + - Generating Models + - Migrating from REST ## Code -*Goal:* Introduce open source GraphQL tools along with quick getting started guidelines for each. +_Goal:_ Introduce open source GraphQL tools along with quick getting started guidelines for each. -*Timeframe:* At least 3 servers described by Sept 12th, remainder by Sept 30th. +_Timeframe:_ At least 3 servers described by Sept 12th, remainder by Sept 30th. This page is all about fulfilling the "Ok I'm sold! Now what?" conundrum. It should first very quickly reintroduce the elements of GraphQL you would expect to see software for as well as offer a quick path towards getting something working. -1) Servers +1. Servers Explain the purpose of a GraphQL server, that there are servers written for many different languages and environments, and that graphql-js is the reference implementation operated by Facebook. Each server should contain the following: -* Logo -* Name of Project -* Language/Environment -* Link to website -* Getting started (e.g. npm install + code sample) -2) Clients +- Logo +- Name of Project +- Language/Environment +- Link to website +- Getting started (e.g. npm install + code sample) + +2. Clients Explain the purpose of a GraphQL client, that it's okay to just use curl/XHR/fetch, and that clients can offer more value via smart caches and integration with UI frameworks. Each client should contain similar set of info as servers. -3) Services +3. Services Hosted GraphQL-as-a-service have an opportunity to pitch themselves here. -4) Tools +4. Tools Common tools used by GraphQL community, e.g. GraphiQL. ## Community -*Goal:* Central dispatch for finding help for GraphQL questions, learning about conferences and meetups, and connecting with the community. +_Goal:_ Central dispatch for finding help for GraphQL questions, learning about conferences and meetups, and connecting with the community. -*Timeframe:* Simple version by Sept 12th, evolve over time. +_Timeframe:_ Simple version by Sept 12th, evolve over time. This page should serve as a high-level view of what resources are available and what's going on in the community. It should encourage pull-requests to facilitate being updated by the community over time. -* Links out to: - * Stack Overflow topic - * Slack/Discord channels - * Popular blogs - * Twitter feed -* Calendar of upcoming meetups or conference talks related to GraphQL (encourage edits by community) -* Grid of recorded videos about GraphQL (conf talks, etc). +- Links out to: + - Stack Overflow topic + - Slack/Discord channels + - Popular blogs + - Twitter feed +- Calendar of upcoming meetups or conference talks related to GraphQL (encourage edits by community) +- Grid of recorded videos about GraphQL (conf talks, etc.). ## Blog -*Goal:* GraphQL core team's blog, signal-boosting popular articles written elsewhere. +_Goal:_ GraphQL core team's blog, signal-boosting popular articles written elsewhere. While any evergreen content typically belongs as chapters in the "Learn" section, the Blog is an opportunity for GraphQL core team members or occasional invited contributors to discuss experiments, interesting applications, or signal-boost things like new releases of the GraphQL spec, the reference implementation, upcoming events, or links out to interesting articles. diff --git a/package.json b/package.json index 1d1ab5ebd6..1e0cfb964e 100644 --- a/package.json +++ b/package.json @@ -1,41 +1,143 @@ { - "repository": "graphql/graphql.github.io", - "private": true, "version": "0.0.0", + "type": "module", + "repository": "graphql/graphql.github.io website", + "private": true, + "packageManager": "pnpm@10.16.1+sha512.0e155aa2629db8672b49e8475da6226aa4bdea85fdcdfdc15350874946d4f3c91faaf64cbdc4a5d1ab8002f473d5c3fcedcd197989cf0390f9badd3c04678706", "scripts": { - "start": "rm -rf build && babel-node resources/server.js", - "build": "rm -rf build && babel-node resources/build.js", - "watch": "rm -rf build && babel-node resources/watch.js", - "test": "npm run build" + "analyze": "ANALYZE=true next build", + "build": "next build", + "check:links": "lychee --verbose --no-progress './src/pages/**/*.mdx' --base https://graphql.org", + "dev": "next", + "format": "pnpm format:check --write", + "format:check": "prettier --cache --check .", + "lint": "eslint --ignore-path .gitignore .", + "lint:docs": "eslint --ignore-path .gitignore src/pages/learn --format stylish", + "lint:docs:ci": "eslint --ignore-path .gitignore src/pages/learn --format eslint-formatter-github", + "postbuild": "next-sitemap", + "prebuild": "tsx scripts/get-github-info", + "start": "next start", + "test": "playwright test && pnpm test:unit", + "test:e2e": "playwright test", + "test:ui": "playwright test --ui", + "test:unit": "node --import=tsx --test 'src/**/*.test.tsx'", + "validate:snippets": "node scripts/validate-snippets.js" }, - "babel": { - "optional": [ - "es7.asyncFunctions", - "es7.objectRestSpread" - ] + "dependencies": { + "@base-ui-components/react": "1.0.0-beta.4", + "@codemirror/autocomplete": "^6.18.6", + "@codemirror/commands": "^6.3.3", + "@codemirror/language": "^6.10.0", + "@codemirror/lint": "^6.8.5", + "@codemirror/state": "^6.4.0", + "@codemirror/view": "^6.24.0", + "@graphql-tools/schema": "10.0.26", + "@hasparus/lezer-json-shikified": "1.1.3", + "@headlessui/react": "^2.2.4", + "@igorkowalczyk/is-browser": "^5.1.0", + "@lezer/highlight": "^1.2.1", + "@next/bundle-analyzer": "^15.4.5", + "@plaiceholder/next": "^3.0.0", + "@sparticuz/chromium": "^138.0.2", + "@tailwindcss/container-queries": "^0.1.1", + "@tailwindcss/nesting": "0.0.0-insiders.565cd3e", + "@tailwindcss/typography": "^0.5.15", + "autoprefixer": "^10.4.20", + "calendar-link": "^2.10.0", + "clsx": "^2.1.1", + "cm6-graphql": "^0.2.1", + "date-fns": "^2.30.0", + "fast-glob": "^3.3.3", + "github-slugger": "2.0.0", + "graphql": "16.10.0", + "gray-matter": "^4.0.3", + "hast-util-to-string": "3.0.1", + "iframe-resizer-react": "^1.1.1", + "leaflet": "^1.9.4", + "lucide-react": "^0.469.0", + "motion": "^12.11.0", + "next": "^14.2.32", + "next-query-params": "^5.0.1", + "next-sitemap": "^4.2.3", + "next-with-less": "^3.0.1", + "nextra": "3.3.1", + "nextra-theme-docs": "3.3.1", + "numbro": "2.5.0", + "p-limit": "^4.0.0", + "parser-front-matter": "1.6.4", + "plaiceholder": "^3.0.0", + "playwright-core": "^1.54.2", + "postcss": "^8.4.49", + "postcss-import": "^16.1.1", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-medium-image-zoom": "5.2.13", + "react-use-measure": "^2.1.7", + "rehype-mermaid": "^3.0.0", + "rss": "1.2.2", + "scroll-into-view-if-needed": "^3.1.0", + "server-only": "0.0.1", + "string-similarity": "^4.0.4", + "string-strip-html": "^13.4.8", + "tailwindcss": "^3.4.17", + "timeago.js": "4.0.2", + "unified": "11.0.5", + "unist-util-visit": "^5.0.0", + "use-query-params": "^2.2.1" }, - "site": { - "source": "./site", - "build": "./build" + "optionalDependencies": { + "playwright": "^1.54.2" }, "devDependencies": { - "babel": "^5.8.23", - "babel-core": "^5.8.23", - "babel-loader": "^5.3.2", - "babel-runtime": "^5.8.20", - "express": "^4.13.3", - "js-yaml": "^3.4.0", - "less": "^2.7.1", - "react": "15.3.1", - "react-dom": "15.3.1", - "sane": "^1.2.0", - "webpack": "^1.12.1" + "@graphql-eslint/eslint-plugin": "4.4.0", + "@next/eslint-plugin-next": "^15.3.3", + "@playwright/test": "^1.54.2", + "@svgr/webpack": "^8.1.0", + "@testing-library/react": "^16.3.0", + "@types/codemirror": "5.60.17", + "@types/hast": "3.0.4", + "@types/jsdom": "^21.1.7", + "@types/node": "^22.10.5", + "@types/react": "^18.3.23", + "@types/rss": "0.0.32", + "@types/string-similarity": "^4.0.2", + "@typescript-eslint/eslint-plugin": "7.18.0", + "@typescript-eslint/parser": "7.18.0", + "eslint": "8.57.1", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-mdx": "^3.1.5", + "eslint-plugin-react": "^7.37.5", + "eslint-plugin-react-hooks": "^5.2.0", + "eslint-plugin-tailwindcss": "3.18.2", + "jsdom": "^26.1.0", + "prettier": "3.5.3", + "prettier-plugin-pkg": "^0.21.0", + "prettier-plugin-tailwindcss": "^0.6.12", + "remark-frontmatter": "5.0.0", + "remark-lint-first-heading-level": "3.1.2", + "remark-lint-heading-increment": "3.1.2", + "tsx": "^4.19.4", + "typescript": "^5.9.2" }, - "dependencies": { - "codemirror": "^5.6.0", - "codemirror-graphql": "^0.5.7", - "graphql": "^0.7.0", - "graphql-tools": "^0.6.6", - "marked": "^0.3.5" + "browserslist": [ + "chrome >0 and last 2.5 years", + "edge >0 and last 2.5 years", + "safari >0 and last 2.5 years", + "firefox >0 and last 2.5 years", + "and_chr >0 and last 2.5 years", + "and_ff >0 and last 2.5 years", + "ios >0 and last 2.5 years" + ], + "pnpm": { + "patchedDependencies": { + "nextra": "patches/nextra.patch", + "nextra-theme-docs": "patches/nextra-theme-docs.patch", + "mermaid-isomorphic": "patches/mermaid-isomorphic.patch" + }, + "onlyBuiltDependencies": [ + "esbuild", + "iframe-resizer", + "sharp" + ] } } diff --git a/patches/mermaid-isomorphic.patch b/patches/mermaid-isomorphic.patch new file mode 100644 index 0000000000..55b3a3a3f5 --- /dev/null +++ b/patches/mermaid-isomorphic.patch @@ -0,0 +1,44 @@ +diff --git a/dist/mermaid-isomorphic.js b/dist/mermaid-isomorphic.js +index aa5dc09a5dfb58a98d3f12cd2fc473caddd97b0d..d0fa3ca8e690233d0b50e4f992ab6ac33c11585b 100644 +--- a/dist/mermaid-isomorphic.js ++++ b/dist/mermaid-isomorphic.js +@@ -1,4 +1,5 @@ +-import { chromium } from 'playwright'; ++import { chromium as playwright } from 'playwright'; ++import chromium from '@sparticuz/chromium'; + const html = import.meta.resolve('../index.html'); + const mermaidScript = { + url: import.meta.resolve('mermaid/dist/mermaid.js') +@@ -7,6 +8,9 @@ const faStyle = { + // We use url, not path. If we use path, the fonts can’t be resolved. + url: import.meta.resolve('@fortawesome/fontawesome-free/css/all.css') + }; ++ ++chromium.setGraphicsMode = false; ++ + /* c8 ignore start */ + /** + * Render mermaid diagrams in the browser. +@@ -122,7 +126,21 @@ async function getBrowser(browserType, launchOptions) { + * A function that renders Mermaid diagrams in the browser. + */ + export function createMermaidRenderer(options = {}) { +- const { browserType = chromium, launchOptions } = options; ++ let { browserType = playwright, launchOptions } = options; ++ ++ if (process.env.CI) { ++ if (options.browserType) { ++ throw new Error('options.browserType is not supported because @hasparus patched it to run on Vercel builds, sorry'); ++ } ++ browserType = { ++ launch: async () => playwright.launch({ ++ ...launchOptions, ++ args: chromium.args, ++ executablePath: await chromium.executablePath(), ++ }) ++ } ++ } ++ + let browserPromise; + let count = 0; + return async (diagrams, renderOptions) => { diff --git a/patches/nextra-theme-docs.patch b/patches/nextra-theme-docs.patch new file mode 100644 index 0000000000..f5c1d4a00b --- /dev/null +++ b/patches/nextra-theme-docs.patch @@ -0,0 +1,110 @@ +diff --git a/dist/index.d.mts b/dist/index.d.mts +index 71f87bcd1dde49d7c19ad49fc098e715a76c5c10..53dffe4fbe5fb2a92cb55a0466bf95315f904e4e 100644 +--- a/dist/index.d.mts ++++ b/dist/index.d.mts +@@ -1421,3 +1421,24 @@ declare function ThemeSwitch({ lite, className }: ThemeSwitchProps): ReactElemen + declare function Layout({ children, themeConfig, pageOpts }: NextraThemeLayoutProps): ReactElement; + + export { Bleed, Collapse, type PartialDocsThemeConfig as DocsThemeConfig, Link, LocaleSwitch, Navbar, NotFoundPage, SkipNavContent, SkipNavLink, ThemeSwitch, Layout as default, getComponents, useConfig, useMenu, useThemeConfig }; ++ ++export type ActiveAnchor = Record< ++ string, ++ { ++ isActive?: boolean ++ aboveHalfViewport: boolean ++ index: number ++ insideHalfViewport: boolean ++ } ++> ++ ++export declare const useActiveAnchor: () => ActiveAnchor ++export declare const useSetActiveAnchor: () => Dispatch> ++export declare const useIntersectionObserver: () => IntersectionObserver | null ++export declare const useSlugs: () => WeakMap ++ ++export declare const NavLinks: (props: NavLinkProps) => ReactElement | null ++export interface NavLinkProps { ++ currentIndex: number ++ flatDocsDirectories: Item[] ++} +diff --git a/dist/index.js b/dist/index.js +index 56201641fd965dcc5ab7c5df53e444c41293c00e..29a446663f5d24acad0389f873c5e31be910717c 100644 +--- a/dist/index.js ++++ b/dist/index.js +@@ -100,10 +100,10 @@ IntersectionObserverContext.displayName = "IntersectionObserver"; + var slugs = /* @__PURE__ */ new WeakMap(); + var SlugsContext = createContext(slugs); + SlugsContext.displayName = "Slugs"; +-var useActiveAnchor = () => useContext(ActiveAnchorContext); +-var useSetActiveAnchor = () => useContext(SetActiveAnchorContext); +-var useIntersectionObserver = () => useContext(IntersectionObserverContext); +-var useSlugs = () => useContext(SlugsContext); ++export var useActiveAnchor = () => useContext(ActiveAnchorContext); ++export var useSetActiveAnchor = () => useContext(SetActiveAnchorContext); ++export var useIntersectionObserver = () => useContext(IntersectionObserverContext); ++export var useSlugs = () => useContext(SlugsContext); + var ActiveAnchorProvider = ({ + children + }) => { +@@ -520,44 +520,6 @@ function Bleed({ + ); + } + +-// src/components/breadcrumb.tsx +-import cn4 from "clsx"; +-import NextLink2 from "next/link"; +-import { ArrowRightIcon } from "nextra/icons"; +-import { Fragment as Fragment3 } from "react"; +-import { jsx as jsx9, jsxs as jsxs3 } from "react/jsx-runtime"; +-function Breadcrumb({ +- activePath +-}) { +- return /* @__PURE__ */ jsx9("div", { className: "nextra-breadcrumb _mt-1.5 _flex _items-center _gap-1 _overflow-hidden _text-sm _text-gray-500 dark:_text-gray-400 contrast-more:_text-current", children: activePath.map((item, index, arr) => { +- const nextItem = arr[index + 1]; +- const href = nextItem ? item.withIndexPage ? item.route : item.children[0].route === nextItem.route ? "" : item.children[0].route : ""; +- const ComponentToUse = href ? NextLink2 : "span"; +- return /* @__PURE__ */ jsxs3(Fragment3, { children: [ +- index > 0 && /* @__PURE__ */ jsx9( +- ArrowRightIcon, +- { +- height: "14", +- className: "_shrink-0 rtl:_rotate-180" +- } +- ), +- /* @__PURE__ */ jsx9( +- ComponentToUse, +- __spreadProps(__spreadValues({ +- className: cn4( +- "_whitespace-nowrap _transition-colors", +- nextItem ? "_min-w-6 _overflow-hidden _text-ellipsis" : "_font-medium _text-gray-700 contrast-more:_font-bold contrast-more:_text-current dark:_text-gray-100 contrast-more:dark:_text-current", +- href && "nextra-focus _ring-inset hover:_text-gray-900 dark:hover:_text-gray-100" +- ), +- title: item.title +- }, href && { href }), { +- children: item.title +- }) +- ) +- ] }, item.route + item.name); +- }) }); +-} +- + // src/components/collapse.tsx + import cn5 from "clsx"; + import { useEffect as useEffect3, useRef as useRef3 } from "react"; +@@ -1255,7 +1217,7 @@ var classes = { + ), + icon: cn10("_inline _h-5 _shrink-0") + }; +-function NavLinks({ ++export function NavLinks({ + flatDocsDirectories, + currentIndex + }) { +@@ -2421,7 +2383,6 @@ function Body({ children }) { + themeContext.typesetting === "article" && "nextra-body-typesetting-article" + ), + children: /* @__PURE__ */ jsxs17("main", { className: "_w-full _min-w-0 _max-w-6xl _px-6 _pt-4 md:_px-12", children: [ +- activeType !== "page" && themeContext.breadcrumb && /* @__PURE__ */ jsx26(Breadcrumb, { activePath }), + body + ] }) + } diff --git a/patches/nextra.patch b/patches/nextra.patch new file mode 100644 index 0000000000..88ae4a7082 --- /dev/null +++ b/patches/nextra.patch @@ -0,0 +1,58 @@ +diff --git a/dist/client/components/index.js b/dist/client/components/index.js +index 9d05118d3d10e746cd2c020785a0f34465bb8570..218107600d7efed1b5f9d49f0a696b166917d1ce 100644 +--- a/dist/client/components/index.js ++++ b/dist/client/components/index.js +@@ -14,7 +14,7 @@ import { Tabs } from "./tabs/index.js"; + import { Td } from "./td.js"; + import { Th } from "./th.js"; + import { Tr } from "./tr.js"; +-import { Mermaid } from "@theguild/remark-mermaid/mermaid"; ++// import { Mermaid } from "@theguild/remark-mermaid/mermaid"; + import { MathJax, MathJaxContext } from "better-react-mathjax"; + import { Playground } from "./playground.js"; + import { Popup } from "./popup.js"; +@@ -29,7 +29,7 @@ export { + ImageZoom, + MathJax, + MathJaxContext, +- Mermaid, ++ // Mermaid, // disabled to use rehype-mermaid and remove cytoscape from the bundle + Playground, + Popup, + Pre, +diff --git a/dist/client/normalize-pages.js b/dist/client/normalize-pages.js +index 15afee0c1de26f47d781f423e5ec32e33ad925d3..fefd01736bd2b778df275bf50ac48384d5f63845 100644 +--- a/dist/client/normalize-pages.js ++++ b/dist/client/normalize-pages.js +@@ -103,7 +103,9 @@ The field key "${metaKey}.items.${key}" in \`_meta\` file refers to a page that + } + if (item) continue; + if (typeof window === "undefined") { +- const isValid = metaItem.type === "separator" || metaItem.type === "menu" || metaItem.href; ++ const isValid = metaItem.type === "separator" || metaItem.type === "menu" || metaItem.href ++ // workaround ++ || metaKey === 'conf'; + if (!isValid) { + throw new Error( + `Validation of "_meta" file has failed. +diff --git a/dist/server/compile.js b/dist/server/compile.js +index c266efec3fe344a81c6d5791b93ab1b2bd268782..4866148a725800ef2326732f78807cca0f04cb7b 100644 +--- a/dist/server/compile.js ++++ b/dist/server/compile.js +@@ -1,6 +1,6 @@ + import path from "path"; + import { createProcessor } from "@mdx-js/mdx"; +-import { remarkMermaid } from "@theguild/remark-mermaid"; ++// import { remarkMermaid } from "@theguild/remark-mermaid"; + import { remarkNpm2Yarn } from "@theguild/remark-npm2yarn"; + import rehypeKatex from "rehype-katex"; + import rehypePrettyCode from "rehype-pretty-code"; +@@ -143,7 +143,7 @@ async function compileMdx(source, { + development: process.env.NODE_ENV === "development", + remarkPlugins: [ + ...remarkPlugins || [], +- remarkMermaid, ++ // remarkMermaid, // disabled to use rehype-mermaid and remove cytoscape from the bundle + // should be before remarkRemoveImports because contains `import { Mermaid } from ...` + [ + remarkNpm2Yarn, diff --git a/playwright.config.ts b/playwright.config.ts new file mode 100644 index 0000000000..de0ed7f7d4 --- /dev/null +++ b/playwright.config.ts @@ -0,0 +1,31 @@ +import { defineConfig, devices } from "@playwright/test" + +/** + * @see https://playwright.dev/docs/test-configuration + */ +export default defineConfig({ + testDir: "./test/e2e", + outputDir: "./test/out", + fullyParallel: true, + forbidOnly: !!process.env.CI, + retries: process.env.CI ? 2 : 0, + workers: process.env.CI ? 1 : undefined, + reporter: "html", + use: { + baseURL: "http://localhost:3000/", + trace: "on-first-retry", + }, + + projects: [ + { + name: "chromium", + use: { ...devices["Desktop Chrome"] }, + }, + ], + + webServer: { + command: "pnpm dev", + url: "http://localhost:3000/", + reuseExistingServer: !process.env.CI, + }, +}) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000000..c5c0cb0365 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,12782 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +patchedDependencies: + mermaid-isomorphic: + hash: fccadc7038719bcf9dc12a573655719edaf7ea8246bd144c660191d05b38c637 + path: patches/mermaid-isomorphic.patch + nextra: + hash: 007f6fda5122c6f4de34daac1f8221aa57dbe7c97563f4f6144c5c5310b2b7c8 + path: patches/nextra.patch + nextra-theme-docs: + hash: 8799231345920182b90fbd49ccc3481783ddbf5bd8dcea15b903a260c10d9bc0 + path: patches/nextra-theme-docs.patch + +importers: + + .: + dependencies: + '@base-ui-components/react': + specifier: 1.0.0-beta.4 + version: 1.0.0-beta.4(@types/react@18.3.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@codemirror/autocomplete': + specifier: ^6.18.6 + version: 6.19.1 + '@codemirror/commands': + specifier: ^6.3.3 + version: 6.10.0 + '@codemirror/language': + specifier: ^6.10.0 + version: 6.11.3 + '@codemirror/lint': + specifier: ^6.8.5 + version: 6.9.1 + '@codemirror/state': + specifier: ^6.4.0 + version: 6.5.2 + '@codemirror/view': + specifier: ^6.24.0 + version: 6.38.6 + '@graphql-tools/schema': + specifier: 10.0.26 + version: 10.0.26(graphql@16.10.0) + '@hasparus/lezer-json-shikified': + specifier: 1.1.3 + version: 1.1.3 + '@headlessui/react': + specifier: ^2.2.4 + version: 2.2.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@igorkowalczyk/is-browser': + specifier: ^5.1.0 + version: 5.1.0(tailwindcss@3.4.18(tsx@4.20.6)(yaml@2.8.1)) + '@lezer/highlight': + specifier: ^1.2.1 + version: 1.2.3 + '@next/bundle-analyzer': + specifier: ^15.4.5 + version: 15.5.6 + '@plaiceholder/next': + specifier: ^3.0.0 + version: 3.0.0(next@14.2.33(@babel/core@7.28.3)(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(plaiceholder@3.0.0(sharp@0.34.4))(sharp@0.34.4) + '@sparticuz/chromium': + specifier: ^138.0.2 + version: 138.0.2 + '@tailwindcss/container-queries': + specifier: ^0.1.1 + version: 0.1.1(tailwindcss@3.4.18(tsx@4.20.6)(yaml@2.8.1)) + '@tailwindcss/nesting': + specifier: 0.0.0-insiders.565cd3e + version: 0.0.0-insiders.565cd3e(postcss@8.5.6) + '@tailwindcss/typography': + specifier: ^0.5.15 + version: 0.5.19(tailwindcss@3.4.18(tsx@4.20.6)(yaml@2.8.1)) + autoprefixer: + specifier: ^10.4.20 + version: 10.4.21(postcss@8.5.6) + calendar-link: + specifier: ^2.10.0 + version: 2.11.0 + clsx: + specifier: ^2.1.1 + version: 2.1.1 + cm6-graphql: + specifier: ^0.2.1 + version: 0.2.1(@codemirror/autocomplete@6.19.1)(@codemirror/language@6.11.3)(@codemirror/lint@6.9.1)(@codemirror/state@6.5.2)(@codemirror/view@6.38.6)(@lezer/highlight@1.2.3)(graphql@16.10.0) + date-fns: + specifier: ^2.30.0 + version: 2.30.0 + fast-glob: + specifier: ^3.3.3 + version: 3.3.3 + github-slugger: + specifier: 2.0.0 + version: 2.0.0 + graphql: + specifier: 16.10.0 + version: 16.10.0 + gray-matter: + specifier: ^4.0.3 + version: 4.0.3 + hast-util-to-string: + specifier: 3.0.1 + version: 3.0.1 + iframe-resizer-react: + specifier: ^1.1.1 + version: 1.1.1(@babel/core@7.28.3)(prop-types@15.8.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + leaflet: + specifier: ^1.9.4 + version: 1.9.4 + lucide-react: + specifier: ^0.469.0 + version: 0.469.0(react@18.3.1) + motion: + specifier: ^12.11.0 + version: 12.23.24(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: + specifier: ^14.2.32 + version: 14.2.33(@babel/core@7.28.3)(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next-query-params: + specifier: ^5.0.1 + version: 5.1.0(next@14.2.33(@babel/core@7.28.3)(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(use-query-params@2.2.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + next-sitemap: + specifier: ^4.2.3 + version: 4.2.3(next@14.2.33(@babel/core@7.28.3)(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + next-with-less: + specifier: ^3.0.1 + version: 3.0.1(less-loader@12.3.0(less@4.4.1))(less@4.4.1)(next@14.2.33(@babel/core@7.28.3)(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + nextra: + specifier: 3.3.1 + version: 3.3.1(patch_hash=007f6fda5122c6f4de34daac1f8221aa57dbe7c97563f4f6144c5c5310b2b7c8)(@types/react@18.3.26)(acorn@8.15.0)(next@14.2.33(@babel/core@7.28.3)(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) + nextra-theme-docs: + specifier: 3.3.1 + version: 3.3.1(patch_hash=8799231345920182b90fbd49ccc3481783ddbf5bd8dcea15b903a260c10d9bc0)(next@14.2.33(@babel/core@7.28.3)(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(nextra@3.3.1(patch_hash=007f6fda5122c6f4de34daac1f8221aa57dbe7c97563f4f6144c5c5310b2b7c8)(@types/react@18.3.26)(acorn@8.15.0)(next@14.2.33(@babel/core@7.28.3)(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + numbro: + specifier: 2.5.0 + version: 2.5.0 + p-limit: + specifier: ^4.0.0 + version: 4.0.0 + parser-front-matter: + specifier: 1.6.4 + version: 1.6.4 + plaiceholder: + specifier: ^3.0.0 + version: 3.0.0(sharp@0.34.4) + playwright-core: + specifier: ^1.54.2 + version: 1.55.0 + postcss: + specifier: ^8.4.49 + version: 8.5.6 + postcss-import: + specifier: ^16.1.1 + version: 16.1.1(postcss@8.5.6) + react: + specifier: ^18.3.1 + version: 18.3.1 + react-dom: + specifier: ^18.3.1 + version: 18.3.1(react@18.3.1) + react-medium-image-zoom: + specifier: 5.2.13 + version: 5.2.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-use-measure: + specifier: ^2.1.7 + version: 2.1.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rehype-mermaid: + specifier: ^3.0.0 + version: 3.0.0(playwright@1.55.0) + rss: + specifier: 1.2.2 + version: 1.2.2 + scroll-into-view-if-needed: + specifier: ^3.1.0 + version: 3.1.0 + server-only: + specifier: 0.0.1 + version: 0.0.1 + string-similarity: + specifier: ^4.0.4 + version: 4.0.4 + string-strip-html: + specifier: ^13.4.8 + version: 13.4.24 + tailwindcss: + specifier: ^3.4.17 + version: 3.4.18(tsx@4.20.6)(yaml@2.8.1) + timeago.js: + specifier: 4.0.2 + version: 4.0.2 + unified: + specifier: 11.0.5 + version: 11.0.5 + unist-util-visit: + specifier: ^5.0.0 + version: 5.0.0 + use-query-params: + specifier: ^2.2.1 + version: 2.2.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + devDependencies: + '@graphql-eslint/eslint-plugin': + specifier: 4.4.0 + version: 4.4.0(@types/node@22.18.13)(eslint@8.57.1)(graphql@16.10.0)(typescript@5.9.3) + '@next/eslint-plugin-next': + specifier: ^15.3.3 + version: 15.5.6 + '@playwright/test': + specifier: ^1.54.2 + version: 1.55.0 + '@svgr/webpack': + specifier: ^8.1.0 + version: 8.1.0(typescript@5.9.3) + '@testing-library/react': + specifier: ^16.3.0 + version: 16.3.0(@testing-library/dom@10.4.1)(@types/react@18.3.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@types/codemirror': + specifier: 5.60.17 + version: 5.60.17 + '@types/hast': + specifier: 3.0.4 + version: 3.0.4 + '@types/jsdom': + specifier: ^21.1.7 + version: 21.1.7 + '@types/node': + specifier: ^22.10.5 + version: 22.18.13 + '@types/react': + specifier: ^18.3.23 + version: 18.3.26 + '@types/rss': + specifier: 0.0.32 + version: 0.0.32 + '@types/string-similarity': + specifier: ^4.0.2 + version: 4.0.2 + '@typescript-eslint/eslint-plugin': + specifier: 7.18.0 + version: 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/parser': + specifier: 7.18.0 + version: 7.18.0(eslint@8.57.1)(typescript@5.9.3) + eslint: + specifier: 8.57.1 + version: 8.57.1 + eslint-config-prettier: + specifier: ^9.1.0 + version: 9.1.2(eslint@8.57.1) + eslint-plugin-mdx: + specifier: ^3.1.5 + version: 3.6.2(eslint@8.57.1) + eslint-plugin-react: + specifier: ^7.37.5 + version: 7.37.5(eslint@8.57.1) + eslint-plugin-react-hooks: + specifier: ^5.2.0 + version: 5.2.0(eslint@8.57.1) + eslint-plugin-tailwindcss: + specifier: 3.18.2 + version: 3.18.2(tailwindcss@3.4.18(tsx@4.20.6)(yaml@2.8.1)) + jsdom: + specifier: ^26.1.0 + version: 26.1.0 + prettier: + specifier: 3.5.3 + version: 3.5.3 + prettier-plugin-pkg: + specifier: ^0.21.0 + version: 0.21.2(prettier@3.5.3) + prettier-plugin-tailwindcss: + specifier: ^0.6.12 + version: 0.6.14(prettier@3.5.3) + remark-frontmatter: + specifier: 5.0.0 + version: 5.0.0 + remark-lint-first-heading-level: + specifier: 3.1.2 + version: 3.1.2 + remark-lint-heading-increment: + specifier: 3.1.2 + version: 3.1.2 + tsx: + specifier: ^4.19.4 + version: 4.20.6 + typescript: + specifier: ^5.9.2 + version: 5.9.3 + optionalDependencies: + playwright: + specifier: ^1.54.2 + version: 1.55.0 + +packages: + + '@alloc/quick-lru@5.2.0': + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} + + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + + '@antfu/install-pkg@1.1.0': + resolution: {integrity: sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==} + + '@antfu/utils@8.1.1': + resolution: {integrity: sha512-Mex9nXf9vR6AhcXmMrlz/HVgYYZpVGJ6YlPgwl7UnaFpnshXs6EK/oa5Gpf3CzENMjkvEx2tQtntGnb7UtSTOQ==} + + '@asamuzakjp/css-color@3.2.0': + resolution: {integrity: sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==} + + '@babel/code-frame@7.27.1': + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.28.0': + resolution: {integrity: sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.28.3': + resolution: {integrity: sha512-yDBHV9kQNcr2/sUr9jghVyz9C3Y5G2zUM2H2lo+9mKv4sFgbA8s8Z9t8D1jiTkGoO/NoIfKMyKWr4s6CN23ZwQ==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.28.3': + resolution: {integrity: sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-annotate-as-pure@7.27.3': + resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.27.2': + resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-create-class-features-plugin@7.28.3': + resolution: {integrity: sha512-V9f6ZFIYSLNEbuGA/92uOvYsGCJNsuA8ESZ4ldc09bWk/j8H8TKiPw8Mk1eG6olpnO0ALHJmYfZvF4MEE4gajg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-create-regexp-features-plugin@7.27.1': + resolution: {integrity: sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-define-polyfill-provider@0.6.5': + resolution: {integrity: sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + '@babel/helper-globals@7.28.0': + resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-member-expression-to-functions@7.27.1': + resolution: {integrity: sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.27.1': + resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.28.3': + resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-optimise-call-expression@7.27.1': + resolution: {integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-plugin-utils@7.27.1': + resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-remap-async-to-generator@7.27.1': + resolution: {integrity: sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-replace-supers@7.27.1': + resolution: {integrity: sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-skip-transparent-expression-wrappers@7.27.1': + resolution: {integrity: sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.27.1': + resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.27.1': + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-wrap-function@7.28.3': + resolution: {integrity: sha512-zdf983tNfLZFletc0RRXYrHrucBEg95NIFMkn6K9dbeMYnsgHaSBGcQqdsCSStG2PYwRre0Qc2NNSCXbG+xc6g==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.28.3': + resolution: {integrity: sha512-PTNtvUQihsAsDHMOP5pfobP8C6CM4JWXmP8DrEIt46c3r2bf87Ua1zoqevsMo9g+tWDwgWrFP5EIxuBx5RudAw==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.28.3': + resolution: {integrity: sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.27.1': + resolution: {integrity: sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1': + resolution: {integrity: sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1': + resolution: {integrity: sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1': + resolution: {integrity: sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.13.0 + + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.28.3': + resolution: {integrity: sha512-b6YTX108evsvE4YgWyQ921ZAFFQm3Bn+CA3+ZXlNVnPhx+UfsVURoPjfGAPCjBgrqo30yX/C2nZGX96DxvR9Iw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2': + resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-proposal-private-property-in-object@7.21.11': + resolution: {integrity: sha512-0QZ8qP/3RLDVBwBFoWAwCtgcDZJVwA5LUJRZU8x2YFfKNuFq161wK3cuGrALu5yiPu+vzwTAg/sMWVNeWeNyaw==} + engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-property-in-object instead. + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-assertions@7.27.1': + resolution: {integrity: sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-attributes@7.27.1': + resolution: {integrity: sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-jsx@7.27.1': + resolution: {integrity: sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-private-property-in-object@7.14.5': + resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-typescript@7.27.1': + resolution: {integrity: sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-unicode-sets-regex@7.18.6': + resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-arrow-functions@7.27.1': + resolution: {integrity: sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-async-generator-functions@7.28.0': + resolution: {integrity: sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-async-to-generator@7.27.1': + resolution: {integrity: sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-block-scoped-functions@7.27.1': + resolution: {integrity: sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-block-scoping@7.28.0': + resolution: {integrity: sha512-gKKnwjpdx5sER/wl0WN0efUBFzF/56YZO0RJrSYP4CljXnP31ByY7fol89AzomdlLNzI36AvOTmYHsnZTCkq8Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-class-properties@7.27.1': + resolution: {integrity: sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-class-static-block@7.28.3': + resolution: {integrity: sha512-LtPXlBbRoc4Njl/oh1CeD/3jC+atytbnf/UqLoqTDcEYGUPj022+rvfkbDYieUrSj3CaV4yHDByPE+T2HwfsJg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.12.0 + + '@babel/plugin-transform-classes@7.28.3': + resolution: {integrity: sha512-DoEWC5SuxuARF2KdKmGUq3ghfPMO6ZzR12Dnp5gubwbeWJo4dbNWXJPVlwvh4Zlq6Z7YVvL8VFxeSOJgjsx4Sg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-computed-properties@7.27.1': + resolution: {integrity: sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-destructuring@7.28.0': + resolution: {integrity: sha512-v1nrSMBiKcodhsyJ4Gf+Z0U/yawmJDBOTpEB3mcQY52r9RIyPneGyAS/yM6seP/8I+mWI3elOMtT5dB8GJVs+A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-dotall-regex@7.27.1': + resolution: {integrity: sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-duplicate-keys@7.27.1': + resolution: {integrity: sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1': + resolution: {integrity: sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-dynamic-import@7.27.1': + resolution: {integrity: sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-explicit-resource-management@7.28.0': + resolution: {integrity: sha512-K8nhUcn3f6iB+P3gwCv/no7OdzOZQcKchW6N389V6PD8NUWKZHzndOd9sPDVbMoBsbmjMqlB4L9fm+fEFNVlwQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-exponentiation-operator@7.27.1': + resolution: {integrity: sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-export-namespace-from@7.27.1': + resolution: {integrity: sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-for-of@7.27.1': + resolution: {integrity: sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-function-name@7.27.1': + resolution: {integrity: sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-json-strings@7.27.1': + resolution: {integrity: sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-literals@7.27.1': + resolution: {integrity: sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-logical-assignment-operators@7.27.1': + resolution: {integrity: sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-member-expression-literals@7.27.1': + resolution: {integrity: sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-amd@7.27.1': + resolution: {integrity: sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-commonjs@7.27.1': + resolution: {integrity: sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-systemjs@7.27.1': + resolution: {integrity: sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-umd@7.27.1': + resolution: {integrity: sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-named-capturing-groups-regex@7.27.1': + resolution: {integrity: sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-new-target@7.27.1': + resolution: {integrity: sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-nullish-coalescing-operator@7.27.1': + resolution: {integrity: sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-numeric-separator@7.27.1': + resolution: {integrity: sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-object-rest-spread@7.28.0': + resolution: {integrity: sha512-9VNGikXxzu5eCiQjdE4IZn8sb9q7Xsk5EXLDBKUYg1e/Tve8/05+KJEtcxGxAgCY5t/BpKQM+JEL/yT4tvgiUA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-object-super@7.27.1': + resolution: {integrity: sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-optional-catch-binding@7.27.1': + resolution: {integrity: sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-optional-chaining@7.27.1': + resolution: {integrity: sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-parameters@7.27.7': + resolution: {integrity: sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-private-methods@7.27.1': + resolution: {integrity: sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-private-property-in-object@7.27.1': + resolution: {integrity: sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-property-literals@7.27.1': + resolution: {integrity: sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-constant-elements@7.27.1': + resolution: {integrity: sha512-edoidOjl/ZxvYo4lSBOQGDSyToYVkTAwyVoa2tkuYTSmjrB1+uAedoL5iROVLXkxH+vRgA7uP4tMg2pUJpZ3Ug==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-display-name@7.28.0': + resolution: {integrity: sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-development@7.27.1': + resolution: {integrity: sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx@7.27.1': + resolution: {integrity: sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-pure-annotations@7.27.1': + resolution: {integrity: sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-regenerator@7.28.3': + resolution: {integrity: sha512-K3/M/a4+ESb5LEldjQb+XSrpY0nF+ZBFlTCbSnKaYAMfD8v33O6PMs4uYnOk19HlcsI8WMu3McdFPTiQHF/1/A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-regexp-modifiers@7.27.1': + resolution: {integrity: sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-reserved-words@7.27.1': + resolution: {integrity: sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-shorthand-properties@7.27.1': + resolution: {integrity: sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-spread@7.27.1': + resolution: {integrity: sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-sticky-regex@7.27.1': + resolution: {integrity: sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-template-literals@7.27.1': + resolution: {integrity: sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-typeof-symbol@7.27.1': + resolution: {integrity: sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-typescript@7.28.0': + resolution: {integrity: sha512-4AEiDEBPIZvLQaWlc9liCavE0xRM0dNca41WtBeM3jgFptfUOSG9z0uteLhq6+3rq+WB6jIvUwKDTpXEHPJ2Vg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-escapes@7.27.1': + resolution: {integrity: sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-property-regex@7.27.1': + resolution: {integrity: sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-regex@7.27.1': + resolution: {integrity: sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-sets-regex@7.27.1': + resolution: {integrity: sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/preset-env@7.28.3': + resolution: {integrity: sha512-ROiDcM+GbYVPYBOeCR6uBXKkQpBExLl8k9HO1ygXEyds39j+vCCsjmj7S8GOniZQlEs81QlkdJZe76IpLSiqpg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/preset-modules@0.1.6-no-external-plugins': + resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} + peerDependencies: + '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 + + '@babel/preset-react@7.27.1': + resolution: {integrity: sha512-oJHWh2gLhU9dW9HHr42q0cI0/iHHXTLGe39qvpAZZzagHy0MzYLCnCVV0symeRvzmjHyVU7mw2K06E6u/JwbhA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/preset-typescript@7.27.1': + resolution: {integrity: sha512-l7WfQfX0WK4M0v2RudjuQK4u99BS6yLHYEmdtVPP7lKV013zr9DygFuWNlnbvQ9LR+LS0Egz/XAvGx5U9MX0fQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/runtime@7.28.3': + resolution: {integrity: sha512-9uIQ10o0WGdpP6GDhXcdOJPJuDgFtIDtN/9+ArJQ2NAfAmiuhTQdzkaTGR33v43GYS2UrSA0eX2pPPHoFVvpxA==} + engines: {node: '>=6.9.0'} + + '@babel/runtime@7.28.4': + resolution: {integrity: sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==} + engines: {node: '>=6.9.0'} + + '@babel/template@7.27.2': + resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.28.3': + resolution: {integrity: sha512-7w4kZYHneL3A6NP2nxzHvT3HCZ7puDZZjFMqDpBPECub79sTtSO5CGXDkKrTQq8ksAwfD/XI2MRFX23njdDaIQ==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.28.2': + resolution: {integrity: sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==} + engines: {node: '>=6.9.0'} + + '@base-ui-components/react@1.0.0-beta.4': + resolution: {integrity: sha512-sPYKj26gbFHD2ZsrMYqQshXnMuomBodzPn+d0dDxWieTj232XCQ9QGt9fU9l5SDGC9hi8s24lDlg9FXPSI7T8A==} + engines: {node: '>=14.0.0'} + peerDependencies: + '@types/react': ^17 || ^18 || ^19 + react: ^17 || ^18 || ^19 + react-dom: ^17 || ^18 || ^19 + peerDependenciesMeta: + '@types/react': + optional: true + + '@base-ui-components/utils@0.1.2': + resolution: {integrity: sha512-aEitDGpMsYO2qnSpYOwZNykn9Rzn2ioyEVk2fyDRH7t+TIHVKpp9CeV7SPTq43M9mMSDxQ+7UeZJVkrj2dCVIQ==} + peerDependencies: + '@types/react': ^17 || ^18 || ^19 + react: ^17 || ^18 || ^19 + react-dom: ^17 || ^18 || ^19 + peerDependenciesMeta: + '@types/react': + optional: true + + '@braintree/sanitize-url@7.1.1': + resolution: {integrity: sha512-i1L7noDNxtFyL5DmZafWy1wRVhGehQmzZaz1HiN5e7iylJMSZR7ekOV7NsIqa5qBldlLrsKv4HbgFUVlQrz8Mw==} + + '@chevrotain/cst-dts-gen@11.0.3': + resolution: {integrity: sha512-BvIKpRLeS/8UbfxXxgC33xOumsacaeCKAjAeLyOn7Pcp95HiRbrpl14S+9vaZLolnbssPIUuiUd8IvgkRyt6NQ==} + + '@chevrotain/gast@11.0.3': + resolution: {integrity: sha512-+qNfcoNk70PyS/uxmj3li5NiECO+2YKZZQMbmjTqRI3Qchu8Hig/Q9vgkHpI3alNjr7M+a2St5pw5w5F6NL5/Q==} + + '@chevrotain/regexp-to-ast@11.0.3': + resolution: {integrity: sha512-1fMHaBZxLFvWI067AVbGJav1eRY7N8DDvYCTwGBiE/ytKBgP8azTdgyrKyWZ9Mfh09eHWb5PgTSO8wi7U824RA==} + + '@chevrotain/types@11.0.3': + resolution: {integrity: sha512-gsiM3G8b58kZC2HaWR50gu6Y1440cHiJ+i3JUvcp/35JchYejb2+5MVeJK0iKThYpAa/P2PYFV4hoi44HD+aHQ==} + + '@chevrotain/utils@11.0.3': + resolution: {integrity: sha512-YslZMgtJUyuMbZ+aKvfF3x1f5liK4mWNxghFRv7jqRR9C3R3fAOGTTKvxXDa2Y1s9zSbcpuO0cAxDYsc9SrXoQ==} + + '@codemirror/autocomplete@6.19.1': + resolution: {integrity: sha512-q6NenYkEy2fn9+JyjIxMWcNjzTL/IhwqfzOut1/G3PrIFkrbl4AL7Wkse5tLrQUUyqGoAKU5+Pi5jnnXxH5HGw==} + + '@codemirror/commands@6.10.0': + resolution: {integrity: sha512-2xUIc5mHXQzT16JnyOFkh8PvfeXuIut3pslWGfsGOhxP/lpgRm9HOl/mpzLErgt5mXDovqA0d11P21gofRLb9w==} + + '@codemirror/language@6.11.3': + resolution: {integrity: sha512-9HBM2XnwDj7fnu0551HkGdrUrrqmYq/WC5iv6nbY2WdicXdGbhR/gfbZOH73Aqj4351alY1+aoG9rCNfiwS1RA==} + + '@codemirror/lint@6.9.1': + resolution: {integrity: sha512-te7To1EQHePBQQzasDKWmK2xKINIXpk+xAiSYr9ZN+VB4KaT+/Hi2PEkeErTk5BV3PTz1TLyQL4MtJfPkKZ9sw==} + + '@codemirror/state@6.5.2': + resolution: {integrity: sha512-FVqsPqtPWKVVL3dPSxy8wEF/ymIEuVzF1PK3VbUgrxXpJUSHQWWZz4JMToquRxnkw+36LTamCZG2iua2Ptq0fA==} + + '@codemirror/view@6.38.6': + resolution: {integrity: sha512-qiS0z1bKs5WOvHIAC0Cybmv4AJSkAXgX5aD6Mqd2epSLlVJsQl8NG23jCVouIgkh4All/mrbdsf2UOLFnJw0tw==} + + '@corex/deepmerge@4.0.43': + resolution: {integrity: sha512-N8uEMrMPL0cu/bdboEWpQYb/0i2K5Qn8eCsxzOmxSggJbbQte7ljMRoXm917AbntqTGOzdTu+vP3KOOzoC70HQ==} + + '@csstools/color-helpers@5.1.0': + resolution: {integrity: sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==} + engines: {node: '>=18'} + + '@csstools/css-calc@2.1.4': + resolution: {integrity: sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-parser-algorithms': ^3.0.5 + '@csstools/css-tokenizer': ^3.0.4 + + '@csstools/css-color-parser@3.1.0': + resolution: {integrity: sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-parser-algorithms': ^3.0.5 + '@csstools/css-tokenizer': ^3.0.4 + + '@csstools/css-parser-algorithms@3.0.5': + resolution: {integrity: sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-tokenizer': ^3.0.4 + + '@csstools/css-tokenizer@3.0.4': + resolution: {integrity: sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==} + engines: {node: '>=18'} + + '@discoveryjs/json-ext@0.5.7': + resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} + engines: {node: '>=10.0.0'} + + '@emnapi/runtime@1.6.0': + resolution: {integrity: sha512-obtUmAHTMjll499P+D9A3axeJFlhdjOWdKUNs/U6QIGT7V5RjcUW1xToAzjvmgTSQhDbYn/NwfTRoJcQ2rNBxA==} + + '@envelop/core@5.3.0': + resolution: {integrity: sha512-xvUkOWXI8JsG2OOnqiI2tOkEc52wbmIqWORr7yGc8B8E53Oh1MMGGGck4mbR80s25LnHVzfNIiIlNkuDgZRuuA==} + engines: {node: '>=18.0.0'} + + '@envelop/instrumentation@1.0.0': + resolution: {integrity: sha512-cxgkB66RQB95H3X27jlnxCRNTmPuSTgmBAq6/4n2Dtv4hsk4yz8FadA1ggmd0uZzvKqWD6CR+WFgTjhDqg7eyw==} + engines: {node: '>=18.0.0'} + + '@envelop/types@5.2.1': + resolution: {integrity: sha512-CsFmA3u3c2QoLDTfEpGr4t25fjMU31nyvse7IzWTvb0ZycuPjMjb0fjlheh+PbhBYb9YLugnT2uY6Mwcg1o+Zg==} + engines: {node: '>=18.0.0'} + + '@esbuild/aix-ppc64@0.25.10': + resolution: {integrity: sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.25.10': + resolution: {integrity: sha512-LSQa7eDahypv/VO6WKohZGPSJDq5OVOo3UoFR1E4t4Gj1W7zEQMUhI+lo81H+DtB+kP+tDgBp+M4oNCwp6kffg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.25.10': + resolution: {integrity: sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.25.10': + resolution: {integrity: sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.25.10': + resolution: {integrity: sha512-JC74bdXcQEpW9KkV326WpZZjLguSZ3DfS8wrrvPMHgQOIEIG/sPXEN/V8IssoJhbefLRcRqw6RQH2NnpdprtMA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.25.10': + resolution: {integrity: sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.25.10': + resolution: {integrity: sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.25.10': + resolution: {integrity: sha512-LLgJfHJk014Aa4anGDbh8bmI5Lk+QidDmGzuC2D+vP7mv/GeSN+H39zOf7pN5N8p059FcOfs2bVlrRr4SK9WxA==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.25.10': + resolution: {integrity: sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.25.10': + resolution: {integrity: sha512-oR31GtBTFYCqEBALI9r6WxoU/ZofZl962pouZRTEYECvNF/dtXKku8YXcJkhgK/beU+zedXfIzHijSRapJY3vg==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.25.10': + resolution: {integrity: sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.25.10': + resolution: {integrity: sha512-xoSphrd4AZda8+rUDDfD9J6FUMjrkTz8itpTITM4/xgerAZZcFW7Dv+sun7333IfKxGG8gAq+3NbfEMJfiY+Eg==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.25.10': + resolution: {integrity: sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.25.10': + resolution: {integrity: sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.25.10': + resolution: {integrity: sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.25.10': + resolution: {integrity: sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.25.10': + resolution: {integrity: sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.25.10': + resolution: {integrity: sha512-AKQM3gfYfSW8XRk8DdMCzaLUFB15dTrZfnX8WXQoOUpUBQ+NaAFCP1kPS/ykbbGYz7rxn0WS48/81l9hFl3u4A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.10': + resolution: {integrity: sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.25.10': + resolution: {integrity: sha512-5Se0VM9Wtq797YFn+dLimf2Zx6McttsH2olUBsDml+lm0GOCRVebRWUvDtkY4BWYv/3NgzS8b/UM3jQNh5hYyw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.10': + resolution: {integrity: sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.25.10': + resolution: {integrity: sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.25.10': + resolution: {integrity: sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.25.10': + resolution: {integrity: sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.25.10': + resolution: {integrity: sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.25.10': + resolution: {integrity: sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@eslint-community/eslint-utils@4.7.0': + resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.1': + resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/eslintrc@2.1.4': + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@eslint/js@8.57.1': + resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@fastify/busboy@3.2.0': + resolution: {integrity: sha512-m9FVDXU3GT2ITSe0UaMA5rU3QkfC/UXtCU8y0gSN/GugTqtVldOBWIB5V6V3sbmenVZUIpU6f+mPEO2+m5iTaA==} + + '@floating-ui/core@1.7.3': + resolution: {integrity: sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==} + + '@floating-ui/dom@1.7.4': + resolution: {integrity: sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==} + + '@floating-ui/react-dom@2.1.6': + resolution: {integrity: sha512-4JX6rEatQEvlmgU80wZyq9RT96HZJa88q8hp0pBd+LrczeDI4o6uA2M+uvxngVHo4Ihr8uibXxH6+70zhAFrVw==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@floating-ui/react@0.26.28': + resolution: {integrity: sha512-yORQuuAtVpiRjpMhdc0wJj06b9JFjrYF4qp96j++v2NBpbi6SEGF7donUJ3TMieerQ6qVkAv1tgr7L4r5roTqw==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@floating-ui/utils@0.2.10': + resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==} + + '@formatjs/intl-localematcher@0.5.10': + resolution: {integrity: sha512-af3qATX+m4Rnd9+wHcjJ4w2ijq+rAVP3CCinJQvFv1kgSu1W6jypUmvleJxcewdxmutM8dmIRZFxO/IQBZmP2Q==} + + '@fortawesome/fontawesome-free@6.7.2': + resolution: {integrity: sha512-JUOtgFW6k9u4Y+xeIaEiLr3+cjoUPiAuLXoyKOJSia6Duzb7pq+A76P9ZdPDoAoxHdHzq6gE9/jKBGXlZT8FbA==} + engines: {node: '>=6'} + + '@graphql-eslint/eslint-plugin@4.4.0': + resolution: {integrity: sha512-dhW6fpk3Souuaphhc38uMAGCcgKMgtCJWFygIKODw/Kns43wiQqRPVay0aNFY1JBx3aevn4KPT/BCOdm6HNncA==} + engines: {node: '>=18'} + peerDependencies: + '@apollo/subgraph': ^2 + eslint: '>=8.44.0' + graphql: ^16 + json-schema-to-ts: ^3 + peerDependenciesMeta: + '@apollo/subgraph': + optional: true + json-schema-to-ts: + optional: true + + '@graphql-hive/signal@1.0.0': + resolution: {integrity: sha512-RiwLMc89lTjvyLEivZ/qxAC5nBHoS2CtsWFSOsN35sxG9zoo5Z+JsFHM8MlvmO9yt+MJNIyC5MLE1rsbOphlag==} + engines: {node: '>=18.0.0'} + + '@graphql-tools/batch-execute@9.0.19': + resolution: {integrity: sha512-VGamgY4PLzSx48IHPoblRw0oTaBa7S26RpZXt0Y4NN90ytoE0LutlpB2484RbkfcTjv9wa64QD474+YP1kEgGA==} + engines: {node: '>=18.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + + '@graphql-tools/code-file-loader@8.1.22': + resolution: {integrity: sha512-FSka29kqFkfFmw36CwoQ+4iyhchxfEzPbXOi37lCEjWLHudGaPkXc3RyB9LdmBxx3g3GHEu43a5n5W8gfcrMdA==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + + '@graphql-tools/delegate@10.2.23': + resolution: {integrity: sha512-xrPtl7f1LxS+B6o+W7ueuQh67CwRkfl+UKJncaslnqYdkxKmNBB4wnzVcW8ZsRdwbsla/v43PtwAvSlzxCzq2w==} + engines: {node: '>=18.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + + '@graphql-tools/executor-common@0.0.4': + resolution: {integrity: sha512-SEH/OWR+sHbknqZyROCFHcRrbZeUAyjCsgpVWCRjqjqRbiJiXq6TxNIIOmpXgkrXWW/2Ev4Wms6YSGJXjdCs6Q==} + engines: {node: '>=18.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + + '@graphql-tools/executor-common@0.0.6': + resolution: {integrity: sha512-JAH/R1zf77CSkpYATIJw+eOJwsbWocdDjY+avY7G+P5HCXxwQjAjWVkJI1QJBQYjPQDVxwf1fmTZlIN3VOadow==} + engines: {node: '>=18.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + + '@graphql-tools/executor-graphql-ws@2.0.7': + resolution: {integrity: sha512-J27za7sKF6RjhmvSOwOQFeNhNHyP4f4niqPnerJmq73OtLx9Y2PGOhkXOEB0PjhvPJceuttkD2O1yMgEkTGs3Q==} + engines: {node: '>=18.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + + '@graphql-tools/executor-http@1.3.3': + resolution: {integrity: sha512-LIy+l08/Ivl8f8sMiHW2ebyck59JzyzO/yF9SFS4NH6MJZUezA1xThUXCDIKhHiD56h/gPojbkpcFvM2CbNE7A==} + engines: {node: '>=18.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + + '@graphql-tools/executor-legacy-ws@1.1.19': + resolution: {integrity: sha512-bEbv/SlEdhWQD0WZLUX1kOenEdVZk1yYtilrAWjRUgfHRZoEkY9s+oiqOxnth3z68wC2MWYx7ykkS5hhDamixg==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + + '@graphql-tools/executor@1.4.9': + resolution: {integrity: sha512-SAUlDT70JAvXeqV87gGzvDzUGofn39nvaVcVhNf12Dt+GfWHtNNO/RCn/Ea4VJaSLGzraUd41ObnN3i80EBU7w==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + + '@graphql-tools/graphql-file-loader@8.0.22': + resolution: {integrity: sha512-KFUbjXgWr5+w/AioOuIuULy4LwcyDuQqTRFQGe+US1d9Z4+ZopcJLwsJTqp5B+icDkCqld4paN0y0qi9MrIvbg==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + + '@graphql-tools/graphql-tag-pluck@8.3.21': + resolution: {integrity: sha512-TJhELNvR1tmghXMi6HVKp/Swxbx1rcSp/zdkuJZT0DCM3vOY11FXY6NW3aoxumcuYDNN3jqXcCPKstYGFPi5GQ==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + + '@graphql-tools/import@7.0.21': + resolution: {integrity: sha512-bcAqNWm/gLVEOy55o/WdaROERpDyUEmIfZ9E6NDjVk1ZGWfZe47+RgriTV80j6J5S5J1g+6loFkVWGAMqdN06g==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + + '@graphql-tools/json-file-loader@8.0.20': + resolution: {integrity: sha512-5v6W+ZLBBML5SgntuBDLsYoqUvwfNboAwL6BwPHi3z/hH1f8BS9/0+MCW9OGY712g7E4pc3y9KqS67mWF753eA==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + + '@graphql-tools/load@8.1.2': + resolution: {integrity: sha512-WhDPv25/jRND+0uripofMX0IEwo6mrv+tJg6HifRmDu8USCD7nZhufT0PP7lIcuutqjIQFyogqT70BQsy6wOgw==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + + '@graphql-tools/merge@9.1.1': + resolution: {integrity: sha512-BJ5/7Y7GOhTuvzzO5tSBFL4NGr7PVqTJY3KeIDlVTT8YLcTXtBR+hlrC3uyEym7Ragn+zyWdHeJ9ev+nRX1X2w==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + + '@graphql-tools/merge@9.1.2': + resolution: {integrity: sha512-Ny9YhWKv+KxZFdXYt+wlyEW55GzhFiq4daV4wYgpP0aRbwQaczNJd1L3VjjBsPKjmW8lctZXUoqYTqU5QPcBGw==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + + '@graphql-tools/schema@10.0.26': + resolution: {integrity: sha512-KOmjuiWa9poP/Lza4HV0ZBPYGJI3VE3QzXA/8e0+wjcsRuEmxMLP82re1PUg0QRzp2UzifAB/gd7DoXmVGG9Fg==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + + '@graphql-tools/url-loader@8.0.33': + resolution: {integrity: sha512-Fu626qcNHcqAj8uYd7QRarcJn5XZ863kmxsg1sm0fyjyfBJnsvC7ddFt6Hayz5kxVKfsnjxiDfPMXanvsQVBKw==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + + '@graphql-tools/utils@10.10.0': + resolution: {integrity: sha512-OOeab5Y9qeKq0zfoJCSScMcDfGcIxp05+LW2xYVCS2l3su+K3lYcg5+cAAx9n0SFxpJl8zF5denq2QDsfM7NnQ==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + + '@graphql-tools/utils@10.9.1': + resolution: {integrity: sha512-B1wwkXk9UvU7LCBkPs8513WxOQ2H8Fo5p8HR1+Id9WmYE5+bd51vqN+MbrqvWczHCH2gwkREgHJN88tE0n1FCw==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + + '@graphql-tools/wrap@10.1.4': + resolution: {integrity: sha512-7pyNKqXProRjlSdqOtrbnFRMQAVamCmEREilOXtZujxY6kYit3tvWWSjUrcIOheltTffoRh7EQSjpy2JDCzasg==} + engines: {node: '>=18.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + + '@graphql-typed-document-node/core@3.2.0': + resolution: {integrity: sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==} + peerDependencies: + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + + '@hasparus/lezer-json-shikified@1.1.3': + resolution: {integrity: sha512-fuM39qCIgpFOZBkcK2wWCZuBVYVO7yzWb+ITCB6AR67quD80PVX5931vb/IvVolPQ2ssgt2Cp/4GOe+b5yujoQ==} + + '@headlessui/react@2.2.9': + resolution: {integrity: sha512-Mb+Un58gwBn0/yWZfyrCh0TJyurtT+dETj7YHleylHk5od3dv2XqETPGWMyQ5/7sYN7oWdyM1u9MvC0OC8UmzQ==} + engines: {node: '>=10'} + peerDependencies: + react: ^18 || ^19 || ^19.0.0-rc + react-dom: ^18 || ^19 || ^19.0.0-rc + + '@humanwhocodes/config-array@0.13.0': + resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} + engines: {node: '>=10.10.0'} + deprecated: Use @eslint/config-array instead + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/object-schema@2.0.3': + resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + deprecated: Use @eslint/object-schema instead + + '@iconify/types@2.0.0': + resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} + + '@iconify/utils@2.3.0': + resolution: {integrity: sha512-GmQ78prtwYW6EtzXRU1rY+KwOKfz32PD7iJh6Iyqw68GiKuoZ2A6pRtzWONz5VQJbp50mEjXh/7NkumtrAgRKA==} + + '@igorkowalczyk/is-browser@5.1.0': + resolution: {integrity: sha512-OwyO+ocRLbo/iQsTBlCbx8S33esB35LgH4xhJJZk6MzpMKv8UFzEKWpzg2KI02syrPXvJ3hlU//Cq8fwxp/3sQ==} + engines: {node: '>=16'} + peerDependencies: + tailwindcss: '>=3.0.0 || >=4.0.0' + + '@img/colour@1.0.0': + resolution: {integrity: sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==} + engines: {node: '>=18'} + + '@img/sharp-darwin-arm64@0.34.4': + resolution: {integrity: sha512-sitdlPzDVyvmINUdJle3TNHl+AG9QcwiAMsXmccqsCOMZNIdW2/7S26w0LyU8euiLVzFBL3dXPwVCq/ODnf2vA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [darwin] + + '@img/sharp-darwin-x64@0.34.4': + resolution: {integrity: sha512-rZheupWIoa3+SOdF/IcUe1ah4ZDpKBGWcsPX6MT0lYniH9micvIU7HQkYTfrx5Xi8u+YqwLtxC/3vl8TQN6rMg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-darwin-arm64@1.2.3': + resolution: {integrity: sha512-QzWAKo7kpHxbuHqUC28DZ9pIKpSi2ts2OJnoIGI26+HMgq92ZZ4vk8iJd4XsxN+tYfNJxzH6W62X5eTcsBymHw==} + cpu: [arm64] + os: [darwin] + + '@img/sharp-libvips-darwin-x64@1.2.3': + resolution: {integrity: sha512-Ju+g2xn1E2AKO6YBhxjj+ACcsPQRHT0bhpglxcEf+3uyPY+/gL8veniKoo96335ZaPo03bdDXMv0t+BBFAbmRA==} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-linux-arm64@1.2.3': + resolution: {integrity: sha512-I4RxkXU90cpufazhGPyVujYwfIm9Nk1QDEmiIsaPwdnm013F7RIceaCc87kAH+oUB1ezqEvC6ga4m7MSlqsJvQ==} + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linux-arm@1.2.3': + resolution: {integrity: sha512-x1uE93lyP6wEwGvgAIV0gP6zmaL/a0tGzJs/BIDDG0zeBhMnuUPm7ptxGhUbcGs4okDJrk4nxgrmxpib9g6HpA==} + cpu: [arm] + os: [linux] + + '@img/sharp-libvips-linux-ppc64@1.2.3': + resolution: {integrity: sha512-Y2T7IsQvJLMCBM+pmPbM3bKT/yYJvVtLJGfCs4Sp95SjvnFIjynbjzsa7dY1fRJX45FTSfDksbTp6AGWudiyCg==} + cpu: [ppc64] + os: [linux] + + '@img/sharp-libvips-linux-s390x@1.2.3': + resolution: {integrity: sha512-RgWrs/gVU7f+K7P+KeHFaBAJlNkD1nIZuVXdQv6S+fNA6syCcoboNjsV2Pou7zNlVdNQoQUpQTk8SWDHUA3y/w==} + cpu: [s390x] + os: [linux] + + '@img/sharp-libvips-linux-x64@1.2.3': + resolution: {integrity: sha512-3JU7LmR85K6bBiRzSUc/Ff9JBVIFVvq6bomKE0e63UXGeRw2HPVEjoJke1Yx+iU4rL7/7kUjES4dZ/81Qjhyxg==} + cpu: [x64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-arm64@1.2.3': + resolution: {integrity: sha512-F9q83RZ8yaCwENw1GieztSfj5msz7GGykG/BA+MOUefvER69K/ubgFHNeSyUu64amHIYKGDs4sRCMzXVj8sEyw==} + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-x64@1.2.3': + resolution: {integrity: sha512-U5PUY5jbc45ANM6tSJpsgqmBF/VsL6LnxJmIf11kB7J5DctHgqm0SkuXzVWtIY90GnJxKnC/JT251TDnk1fu/g==} + cpu: [x64] + os: [linux] + + '@img/sharp-linux-arm64@0.34.4': + resolution: {integrity: sha512-YXU1F/mN/Wu786tl72CyJjP/Ngl8mGHN1hST4BGl+hiW5jhCnV2uRVTNOcaYPs73NeT/H8Upm3y9582JVuZHrQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + + '@img/sharp-linux-arm@0.34.4': + resolution: {integrity: sha512-Xyam4mlqM0KkTHYVSuc6wXRmM7LGN0P12li03jAnZ3EJWZqj83+hi8Y9UxZUbxsgsK1qOEwg7O0Bc0LjqQVtxA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm] + os: [linux] + + '@img/sharp-linux-ppc64@0.34.4': + resolution: {integrity: sha512-F4PDtF4Cy8L8hXA2p3TO6s4aDt93v+LKmpcYFLAVdkkD3hSxZzee0rh6/+94FpAynsuMpLX5h+LRsSG3rIciUQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ppc64] + os: [linux] + + '@img/sharp-linux-s390x@0.34.4': + resolution: {integrity: sha512-qVrZKE9Bsnzy+myf7lFKvng6bQzhNUAYcVORq2P7bDlvmF6u2sCmK2KyEQEBdYk+u3T01pVsPrkj943T1aJAsw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [s390x] + os: [linux] + + '@img/sharp-linux-x64@0.34.4': + resolution: {integrity: sha512-ZfGtcp2xS51iG79c6Vhw9CWqQC8l2Ot8dygxoDoIQPTat/Ov3qAa8qpxSrtAEAJW+UjTXc4yxCjNfxm4h6Xm2A==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + + '@img/sharp-linuxmusl-arm64@0.34.4': + resolution: {integrity: sha512-8hDVvW9eu4yHWnjaOOR8kHVrew1iIX+MUgwxSuH2XyYeNRtLUe4VNioSqbNkB7ZYQJj9rUTT4PyRscyk2PXFKA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + + '@img/sharp-linuxmusl-x64@0.34.4': + resolution: {integrity: sha512-lU0aA5L8QTlfKjpDCEFOZsTYGn3AEiO6db8W5aQDxj0nQkVrZWmN3ZP9sYKWJdtq3PWPhUNlqehWyXpYDcI9Sg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + + '@img/sharp-wasm32@0.34.4': + resolution: {integrity: sha512-33QL6ZO/qpRyG7woB/HUALz28WnTMI2W1jgX3Nu2bypqLIKx/QKMILLJzJjI+SIbvXdG9fUnmrxR7vbi1sTBeA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [wasm32] + + '@img/sharp-win32-arm64@0.34.4': + resolution: {integrity: sha512-2Q250do/5WXTwxW3zjsEuMSv5sUU4Tq9VThWKlU2EYLm4MB7ZeMwF+SFJutldYODXF6jzc6YEOC+VfX0SZQPqA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [win32] + + '@img/sharp-win32-ia32@0.34.4': + resolution: {integrity: sha512-3ZeLue5V82dT92CNL6rsal6I2weKw1cYu+rGKm8fOCCtJTR2gYeUfY3FqUnIJsMUPIH68oS5jmZ0NiJ508YpEw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ia32] + os: [win32] + + '@img/sharp-win32-x64@0.34.4': + resolution: {integrity: sha512-xIyj4wpYs8J18sVN3mSQjwrw7fKUqRw+Z5rnHNCy5fYTxigBz81u5mOMPmFumwjcn8+ld1ppptMBCLic1nz6ig==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [win32] + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/trace-mapping@0.3.30': + resolution: {integrity: sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==} + + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@lezer/common@1.2.3': + resolution: {integrity: sha512-w7ojc8ejBqr2REPsWxJjrMFsA/ysDCFICn8zEOR9mrqzOu2amhITYuLD8ag6XZf0CFXDrhKqw7+tW8cX66NaDA==} + + '@lezer/common@1.3.0': + resolution: {integrity: sha512-L9X8uHCYU310o99L3/MpJKYxPzXPOS7S0NmBaM7UO/x2Kb2WbmMLSkfvdr1KxRIFYOpbY0Jhn7CfLSUDzL8arQ==} + + '@lezer/highlight@1.2.3': + resolution: {integrity: sha512-qXdH7UqTvGfdVBINrgKhDsVTJTxactNNxLk7+UMwZhU13lMHaOBlJe9Vqp907ya56Y3+ed2tlqzys7jDkTmW0g==} + + '@lezer/lr@1.4.2': + resolution: {integrity: sha512-pu0K1jCIdnQ12aWNaAVU5bzi7Bd1w54J3ECgANPmYLtQKP0HBj2cE/5coBD66MT10xbtIuUr7tg0Shbsvk0mDA==} + + '@marijn/find-cluster-break@1.0.2': + resolution: {integrity: sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==} + + '@mdx-js/mdx@3.1.0': + resolution: {integrity: sha512-/QxEhPAvGwbQmy1Px8F899L5Uc2KZ6JtXwlCgJmjSTBedwOZkByYcBG4GceIGPXRDsmfxhHazuS+hlOShRLeDw==} + + '@mdx-js/react@3.1.0': + resolution: {integrity: sha512-QjHtSaoameoalGnKDT3FoIl4+9RwyTmo9ZJGBdLOks/YOiWHoRDI3PUwEzOE7kEmGcV3AFcp9K6dYu9rEuKLAQ==} + peerDependencies: + '@types/react': '>=16' + react: '>=16' + + '@mermaid-js/parser@0.6.2': + resolution: {integrity: sha512-+PO02uGF6L6Cs0Bw8RpGhikVvMWEysfAyl27qTlroUB8jSWr1lL0Sf6zi78ZxlSnmgSY2AMMKVgghnN9jTtwkQ==} + + '@napi-rs/simple-git-android-arm-eabi@0.1.22': + resolution: {integrity: sha512-JQZdnDNm8o43A5GOzwN/0Tz3CDBQtBUNqzVwEopm32uayjdjxev1Csp1JeaqF3v9djLDIvsSE39ecsN2LhCKKQ==} + engines: {node: '>= 10'} + cpu: [arm] + os: [android] + + '@napi-rs/simple-git-android-arm64@0.1.22': + resolution: {integrity: sha512-46OZ0SkhnvM+fapWjzg/eqbJvClxynUpWYyYBn4jAj7GQs1/Yyc8431spzDmkA8mL0M7Xo8SmbkzTDE7WwYAfg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + + '@napi-rs/simple-git-darwin-arm64@0.1.22': + resolution: {integrity: sha512-zH3h0C8Mkn9//MajPI6kHnttywjsBmZ37fhLX/Fiw5XKu84eHA6dRyVtMzoZxj6s+bjNTgaMgMUucxPn9ktxTQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@napi-rs/simple-git-darwin-x64@0.1.22': + resolution: {integrity: sha512-GZN7lRAkGKB6PJxWsoyeYJhh85oOOjVNyl+/uipNX8bR+mFDCqRsCE3rRCFGV9WrZUHXkcuRL2laIRn7lLi3ag==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@napi-rs/simple-git-freebsd-x64@0.1.22': + resolution: {integrity: sha512-xyqX1C5I0WBrUgZONxHjZH5a4LqQ9oki3SKFAVpercVYAcx3pq6BkZy1YUOP4qx78WxU1CCNfHBN7V+XO7D99A==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + + '@napi-rs/simple-git-linux-arm-gnueabihf@0.1.22': + resolution: {integrity: sha512-4LOtbp9ll93B9fxRvXiUJd1/RM3uafMJE7dGBZGKWBMGM76+BAcCEUv2BY85EfsU/IgopXI6n09TycRfPWOjxA==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + + '@napi-rs/simple-git-linux-arm64-gnu@0.1.22': + resolution: {integrity: sha512-GVOjP/JjCzbQ0kSqao7ctC/1sodVtv5VF57rW9BFpo2y6tEYPCqHnkQkTpieuwMNe+TVOhBUC1+wH0d9/knIHg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@napi-rs/simple-git-linux-arm64-musl@0.1.22': + resolution: {integrity: sha512-MOs7fPyJiU/wqOpKzAOmOpxJ/TZfP4JwmvPad/cXTOWYwwyppMlXFRms3i98EU3HOazI/wMU2Ksfda3+TBluWA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@napi-rs/simple-git-linux-ppc64-gnu@0.1.22': + resolution: {integrity: sha512-L59dR30VBShRUIZ5/cQHU25upNgKS0AMQ7537J6LCIUEFwwXrKORZKJ8ceR+s3Sr/4jempWVvMdjEpFDE4HYww==} + engines: {node: '>= 10'} + cpu: [ppc64] + os: [linux] + + '@napi-rs/simple-git-linux-s390x-gnu@0.1.22': + resolution: {integrity: sha512-4FHkPlCSIZUGC6HiADffbe6NVoTBMd65pIwcd40IDbtFKOgFMBA+pWRqKiQ21FERGH16Zed7XHJJoY3jpOqtmQ==} + engines: {node: '>= 10'} + cpu: [s390x] + os: [linux] + + '@napi-rs/simple-git-linux-x64-gnu@0.1.22': + resolution: {integrity: sha512-Ei1tM5Ho/dwknF3pOzqkNW9Iv8oFzRxE8uOhrITcdlpxRxVrBVptUF6/0WPdvd7R9747D/q61QG/AVyWsWLFKw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@napi-rs/simple-git-linux-x64-musl@0.1.22': + resolution: {integrity: sha512-zRYxg7it0p3rLyEJYoCoL2PQJNgArVLyNavHW03TFUAYkYi5bxQ/UFNVpgxMaXohr5yu7qCBqeo9j4DWeysalg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@napi-rs/simple-git-win32-arm64-msvc@0.1.22': + resolution: {integrity: sha512-XGFR1fj+Y9cWACcovV2Ey/R2xQOZKs8t+7KHPerYdJ4PtjVzGznI4c2EBHXtdOIYvkw7tL5rZ7FN1HJKdD5Quw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@napi-rs/simple-git-win32-ia32-msvc@0.1.22': + resolution: {integrity: sha512-Gqr9Y0gs6hcNBA1IXBpoqTFnnIoHuZGhrYqaZzEvGMLrTrpbXrXVEtX3DAAD2RLc1b87CPcJ49a7sre3PU3Rfw==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + + '@napi-rs/simple-git-win32-x64-msvc@0.1.22': + resolution: {integrity: sha512-hQjcreHmUcpw4UrtkOron1/TQObfe484lxiXFLLUj7aWnnnOVs1mnXq5/Bo9+3NYZldFpFRJPdPBeHCisXkKJg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@napi-rs/simple-git@0.1.22': + resolution: {integrity: sha512-bMVoAKhpjTOPHkW/lprDPwv5aD4R4C3Irt8vn+SKA9wudLe9COLxOhurrKRsxmZccUbWXRF7vukNeGUAj5P8kA==} + engines: {node: '>= 10'} + + '@next/bundle-analyzer@15.5.6': + resolution: {integrity: sha512-IHeyk2s9/fVDAGDLNbBkCSG8XBabhuMajiaJggjsg4GyFIswh78DzLo5Nl5th8QTs3U/teYeczvfeV9w1Tx3qA==} + + '@next/env@13.5.11': + resolution: {integrity: sha512-fbb2C7HChgM7CemdCY+y3N1n8pcTKdqtQLbC7/EQtPdLvlMUT9JX/dBYl8MMZAtYG4uVMyPFHXckb68q/NRwqg==} + + '@next/env@14.2.33': + resolution: {integrity: sha512-CgVHNZ1fRIlxkLhIX22flAZI/HmpDaZ8vwyJ/B0SDPTBuLZ1PJ+DWMjCHhqnExfmSQzA/PbZi8OAc7PAq2w9IA==} + + '@next/eslint-plugin-next@15.5.6': + resolution: {integrity: sha512-YxDvsT2fwy1j5gMqk3ppXlsgDopHnkM4BoxSVASbvvgh5zgsK8lvWerDzPip8k3WVzsTZ1O7A7si1KNfN4OZfQ==} + + '@next/swc-darwin-arm64@14.2.33': + resolution: {integrity: sha512-HqYnb6pxlsshoSTubdXKu15g3iivcbsMXg4bYpjL2iS/V6aQot+iyF4BUc2qA/J/n55YtvE4PHMKWBKGCF/+wA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@next/swc-darwin-x64@14.2.33': + resolution: {integrity: sha512-8HGBeAE5rX3jzKvF593XTTFg3gxeU4f+UWnswa6JPhzaR6+zblO5+fjltJWIZc4aUalqTclvN2QtTC37LxvZAA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@next/swc-linux-arm64-gnu@14.2.33': + resolution: {integrity: sha512-JXMBka6lNNmqbkvcTtaX8Gu5by9547bukHQvPoLe9VRBx1gHwzf5tdt4AaezW85HAB3pikcvyqBToRTDA4DeLw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@next/swc-linux-arm64-musl@14.2.33': + resolution: {integrity: sha512-Bm+QulsAItD/x6Ih8wGIMfRJy4G73tu1HJsrccPW6AfqdZd0Sfm5Imhgkgq2+kly065rYMnCOxTBvmvFY1BKfg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@next/swc-linux-x64-gnu@14.2.33': + resolution: {integrity: sha512-FnFn+ZBgsVMbGDsTqo8zsnRzydvsGV8vfiWwUo1LD8FTmPTdV+otGSWKc4LJec0oSexFnCYVO4hX8P8qQKaSlg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@next/swc-linux-x64-musl@14.2.33': + resolution: {integrity: sha512-345tsIWMzoXaQndUTDv1qypDRiebFxGYx9pYkhwY4hBRaOLt8UGfiWKr9FSSHs25dFIf8ZqIFaPdy5MljdoawA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@next/swc-win32-arm64-msvc@14.2.33': + resolution: {integrity: sha512-nscpt0G6UCTkrT2ppnJnFsYbPDQwmum4GNXYTeoTIdsmMydSKFz9Iny2jpaRupTb+Wl298+Rh82WKzt9LCcqSQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@next/swc-win32-ia32-msvc@14.2.33': + resolution: {integrity: sha512-pc9LpGNKhJ0dXQhZ5QMmYxtARwwmWLpeocFmVG5Z0DzWq5Uf0izcI8tLc+qOpqxO1PWqZ5A7J1blrUIKrIFc7Q==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + + '@next/swc-win32-x64-msvc@14.2.33': + resolution: {integrity: sha512-nOjfZMy8B94MdisuzZo9/57xuFVLHJaDj5e/xrduJp9CV2/HrfxTRH2fbyLe+K9QT41WBLUd4iXX3R7jBp0EUg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@npmcli/config@8.3.4': + resolution: {integrity: sha512-01rtHedemDNhUXdicU7s+QYz/3JyV5Naj84cvdXGH4mgCdL+agmSYaLF4LUG4vMCLzhBO8YtS0gPpH1FGvbgAw==} + engines: {node: ^16.14.0 || >=18.0.0} + + '@npmcli/git@5.0.8': + resolution: {integrity: sha512-liASfw5cqhjNW9UFd+ruwwdEf/lbOAQjLL2XY2dFW/bkJheXDYZgOyul/4gVvEV4BWkTXjYGmDqMw9uegdbJNQ==} + engines: {node: ^16.14.0 || >=18.0.0} + + '@npmcli/map-workspaces@3.0.6': + resolution: {integrity: sha512-tkYs0OYnzQm6iIRdfy+LcLBjcKuQCeE5YLb8KnrIlutJfheNaPvPpgoFEyEFgbjzl5PLZ3IA/BWAwRU0eHuQDA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + '@npmcli/name-from-folder@2.0.0': + resolution: {integrity: sha512-pwK+BfEBZJbKdNYpHHRTNBwBoqrN/iIMO0AiGvYsp3Hoaq0WbgGSWQR6SCldZovoDpY3yje5lkFUe6gsDgJ2vg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + '@npmcli/package-json@5.2.1': + resolution: {integrity: sha512-f7zYC6kQautXHvNbLEWgD/uGu1+xCn9izgqBfgItWSx22U0ZDekxN08A1vM8cTxj/cRVe0Q94Ode+tdoYmIOOQ==} + engines: {node: ^16.14.0 || >=18.0.0} + + '@npmcli/promise-spawn@7.0.2': + resolution: {integrity: sha512-xhfYPXoV5Dy4UkY0D+v2KkwvnDfiA/8Mt3sWCGI/hM03NsYIH8ZaG6QzS9x7pje5vHZBZJ2v6VRFVTWACnqcmQ==} + engines: {node: ^16.14.0 || >=18.0.0} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@pkgr/core@0.2.9': + resolution: {integrity: sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + + '@plaiceholder/next@3.0.0': + resolution: {integrity: sha512-7UK/H1X64hwo2VaxOPKMXE+OY9IgmKLPsq/xKHZ+gU07oqQSfIWWIgpVVucMB3ZgVYah+68agR15BRuSxAuMHw==} + peerDependencies: + next: '>= 10.0.0' + plaiceholder: '>=3.0.0' + sharp: '>= 0.30.6' + + '@playwright/test@1.55.0': + resolution: {integrity: sha512-04IXzPwHrW69XusN/SIdDdKZBzMfOT9UNT/YiJit/xpy2VuAoB8NHc8Aplb96zsWDddLnbkPL3TsmrS04ZU2xQ==} + engines: {node: '>=18'} + hasBin: true + + '@polka/url@1.0.0-next.29': + resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} + + '@react-aria/focus@3.21.1': + resolution: {integrity: sha512-hmH1IhHlcQ2lSIxmki1biWzMbGgnhdxJUM0MFfzc71Rv6YAzhlx4kX3GYn4VNcjCeb6cdPv4RZ5vunV4kgMZYQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + + '@react-aria/interactions@3.25.5': + resolution: {integrity: sha512-EweYHOEvMwef/wsiEqV73KurX/OqnmbzKQa2fLxdULbec5+yDj6wVGaRHIzM4NiijIDe+bldEl5DG05CAKOAHA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + + '@react-aria/ssr@3.9.10': + resolution: {integrity: sha512-hvTm77Pf+pMBhuBm760Li0BVIO38jv1IBws1xFm1NoL26PU+fe+FMW5+VZWyANR6nYL65joaJKZqOdTQMkO9IQ==} + engines: {node: '>= 12'} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + + '@react-aria/utils@3.30.1': + resolution: {integrity: sha512-zETcbDd6Vf9GbLndO6RiWJadIZsBU2MMm23rBACXLmpRztkrIqPEb2RVdlLaq1+GklDx0Ii6PfveVjx+8S5U6A==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + + '@react-stately/flags@3.1.2': + resolution: {integrity: sha512-2HjFcZx1MyQXoPqcBGALwWWmgFVUk2TuKVIQxCbRq7fPyWXIl6VHcakCLurdtYC2Iks7zizvz0Idv48MQ38DWg==} + + '@react-stately/utils@3.10.8': + resolution: {integrity: sha512-SN3/h7SzRsusVQjQ4v10LaVsDc81jyyR0DD5HnsQitm/I5WDpaSr2nRHtyloPFU48jlql1XX/S04T2DLQM7Y3g==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + + '@react-types/shared@3.32.0': + resolution: {integrity: sha512-t+cligIJsZYFMSPFMvsJMjzlzde06tZMOIOFa1OV5Z0BcMowrb2g4mB57j/9nP28iJIRYn10xCniQts+qadrqQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + + '@repeaterjs/repeater@3.0.6': + resolution: {integrity: sha512-Javneu5lsuhwNCryN+pXH93VPQ8g0dBX7wItHFgYiwQmzE1sVdg5tWHiOgHywzL2W21XQopa7IwIEnNbmeUJYA==} + + '@shikijs/core@1.29.2': + resolution: {integrity: sha512-vju0lY9r27jJfOY4Z7+Rt/nIOjzJpZ3y+nYpqtUZInVoXQ/TJZcfGnNOGnKjFdVZb8qexiCuSlZRKcGfhhTTZQ==} + + '@shikijs/engine-javascript@1.29.2': + resolution: {integrity: sha512-iNEZv4IrLYPv64Q6k7EPpOCE/nuvGiKl7zxdq0WFuRPF5PAE9PRo2JGq/d8crLusM59BRemJ4eOqrFrC4wiQ+A==} + + '@shikijs/engine-oniguruma@1.29.2': + resolution: {integrity: sha512-7iiOx3SG8+g1MnlzZVDYiaeHe7Ez2Kf2HrJzdmGwkRisT7r4rak0e655AcM/tF9JG/kg5fMNYlLLKglbN7gBqA==} + + '@shikijs/langs@1.29.2': + resolution: {integrity: sha512-FIBA7N3LZ+223U7cJDUYd5shmciFQlYkFXlkKVaHsCPgfVLiO+e12FmQE6Tf9vuyEsFe3dIl8qGWKXgEHL9wmQ==} + + '@shikijs/themes@1.29.2': + resolution: {integrity: sha512-i9TNZlsq4uoyqSbluIcZkmPL9Bfi3djVxRnofUHwvx/h6SRW3cwgBC5SML7vsDcWyukY0eCzVN980rqP6qNl9g==} + + '@shikijs/twoslash@1.29.2': + resolution: {integrity: sha512-2S04ppAEa477tiaLfGEn1QJWbZUmbk8UoPbAEw4PifsrxkBXtAtOflIZJNtuCwz8ptc/TPxy7CO7gW4Uoi6o/g==} + + '@shikijs/types@1.29.2': + resolution: {integrity: sha512-VJjK0eIijTZf0QSTODEXCqinjBn0joAHQ+aPSBzrv4O2d/QSbsMw+ZeSRx03kV34Hy7NzUvV/7NqfYGRLrASmw==} + + '@shikijs/vscode-textmate@10.0.2': + resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} + + '@sparticuz/chromium@138.0.2': + resolution: {integrity: sha512-vs5qUiK6kFCzLCxZ2buWONcB6jdF3VWdYp6kH1tt56tZ78p51dMAxfWsfk9P62z/jAeqbVg4V6Rb3Ic4aAeOKQ==} + engines: {node: '>=20.11.0'} + + '@svgr/babel-plugin-add-jsx-attribute@8.0.0': + resolution: {integrity: sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-remove-jsx-attribute@8.0.0': + resolution: {integrity: sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0': + resolution: {integrity: sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0': + resolution: {integrity: sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-svg-dynamic-title@8.0.0': + resolution: {integrity: sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-svg-em-dimensions@8.0.0': + resolution: {integrity: sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-transform-react-native-svg@8.1.0': + resolution: {integrity: sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-transform-svg-component@8.0.0': + resolution: {integrity: sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==} + engines: {node: '>=12'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-preset@8.1.0': + resolution: {integrity: sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/core@8.1.0': + resolution: {integrity: sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==} + engines: {node: '>=14'} + + '@svgr/hast-util-to-babel-ast@8.0.0': + resolution: {integrity: sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==} + engines: {node: '>=14'} + + '@svgr/plugin-jsx@8.1.0': + resolution: {integrity: sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==} + engines: {node: '>=14'} + peerDependencies: + '@svgr/core': '*' + + '@svgr/plugin-svgo@8.1.0': + resolution: {integrity: sha512-Ywtl837OGO9pTLIN/onoWLmDQ4zFUycI1g76vuKGEz6evR/ZTJlJuz3G/fIkb6OVBJ2g0o6CGJzaEjfmEo3AHA==} + engines: {node: '>=14'} + peerDependencies: + '@svgr/core': '*' + + '@svgr/webpack@8.1.0': + resolution: {integrity: sha512-LnhVjMWyMQV9ZmeEy26maJk+8HTIbd59cH4F2MJ439k9DqejRisfFNGAPvRYlKETuh9LrImlS8aKsBgKjMA8WA==} + engines: {node: '>=14'} + + '@swc/counter@0.1.3': + resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} + + '@swc/helpers@0.5.17': + resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==} + + '@swc/helpers@0.5.5': + resolution: {integrity: sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==} + + '@tailwindcss/container-queries@0.1.1': + resolution: {integrity: sha512-p18dswChx6WnTSaJCSGx6lTmrGzNNvm2FtXmiO6AuA1V4U5REyoqwmT6kgAsIMdjo07QdAfYXHJ4hnMtfHzWgA==} + peerDependencies: + tailwindcss: '>=3.2.0' + + '@tailwindcss/nesting@0.0.0-insiders.565cd3e': + resolution: {integrity: sha512-WhHoFBx19TnH/c+xLwT/sxei6+4RpdfiyG3MYXfmLaMsADmVqBkF7B6lDalgZD9YdM459MF7DtxVbWkOrV7IaQ==} + peerDependencies: + postcss: ^8.2.15 + + '@tailwindcss/typography@0.5.19': + resolution: {integrity: sha512-w31dd8HOx3k9vPtcQh5QHP9GwKcgbMp87j58qi6xgiBnFFtKEAgCWnDw4qUT8aHwkCp8bKvb/KGKWWHedP0AAg==} + peerDependencies: + tailwindcss: '>=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1' + + '@tanstack/react-virtual@3.13.12': + resolution: {integrity: sha512-Gd13QdxPSukP8ZrkbgS2RwoZseTTbQPLnQEn7HY/rqtM+8Zt95f7xKC7N0EsKs7aoz0WzZ+fditZux+F8EzYxA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + '@tanstack/virtual-core@3.13.12': + resolution: {integrity: sha512-1YBOJfRHV4sXUmWsFSf5rQor4Ss82G8dQWLRbnk3GA4jeP8hQt1hxXh0tmflpC0dz3VgEv/1+qwPyLeWkQuPFA==} + + '@testing-library/dom@10.4.1': + resolution: {integrity: sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==} + engines: {node: '>=18'} + + '@testing-library/react@16.3.0': + resolution: {integrity: sha512-kFSyxiEDwv1WLl2fgsq6pPBbw5aWKrsY2/noi1Id0TK0UParSF62oFQFGHXIyaG4pp2tEub/Zlel+fjjZILDsw==} + engines: {node: '>=18'} + peerDependencies: + '@testing-library/dom': ^10.0.0 + '@types/react': ^18.0.0 || ^19.0.0 + '@types/react-dom': ^18.0.0 || ^19.0.0 + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@theguild/federation-composition@0.19.1': + resolution: {integrity: sha512-E4kllHSRYh+FsY0VR+fwl0rmWhDV8xUgWawLZTXmy15nCWQwj0BDsoEpdEXjPh7xes+75cRaeJcSbZ4jkBuSdg==} + engines: {node: '>=18'} + peerDependencies: + graphql: ^16.0.0 + + '@theguild/remark-mermaid@0.1.3': + resolution: {integrity: sha512-2FjVlaaKXK7Zj7UJAgOVTyaahn/3/EAfqYhyXg0BfDBVUl+lXcoIWRaxzqfnDr2rv8ax6GsC5mNh6hAaT86PDw==} + peerDependencies: + react: ^18.2.0 + + '@theguild/remark-npm2yarn@0.3.3': + resolution: {integrity: sha512-ma6DvR03gdbvwqfKx1omqhg9May/VYGdMHvTzB4VuxkyS7KzfZ/lzrj43hmcsggpMje0x7SADA/pcMph0ejRnA==} + + '@trysound/sax@0.2.0': + resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} + engines: {node: '>=10.13.0'} + + '@types/aria-query@5.0.4': + resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} + + '@types/codemirror@5.60.17': + resolution: {integrity: sha512-AZq2FIsUHVMlp7VSe2hTfl5w4pcUkoFkM3zVsRKsn1ca8CXRDYvnin04+HP2REkwsxemuHqvDofdlhUWNpbwfw==} + + '@types/concat-stream@2.0.3': + resolution: {integrity: sha512-3qe4oQAPNwVNwK4C9c8u+VJqv9kez+2MR4qJpoPFfXtgxxif1QbFusvXzK0/Wra2VX07smostI2VMmJNSpZjuQ==} + + '@types/d3-array@3.2.1': + resolution: {integrity: sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==} + + '@types/d3-axis@3.0.6': + resolution: {integrity: sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==} + + '@types/d3-brush@3.0.6': + resolution: {integrity: sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==} + + '@types/d3-chord@3.0.6': + resolution: {integrity: sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==} + + '@types/d3-color@3.1.3': + resolution: {integrity: sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==} + + '@types/d3-contour@3.0.6': + resolution: {integrity: sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==} + + '@types/d3-delaunay@6.0.4': + resolution: {integrity: sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==} + + '@types/d3-dispatch@3.0.7': + resolution: {integrity: sha512-5o9OIAdKkhN1QItV2oqaE5KMIiXAvDWBDPrD85e58Qlz1c1kI/J0NcqbEG88CoTwJrYe7ntUCVfeUl2UJKbWgA==} + + '@types/d3-drag@3.0.7': + resolution: {integrity: sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==} + + '@types/d3-dsv@3.0.7': + resolution: {integrity: sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==} + + '@types/d3-ease@3.0.2': + resolution: {integrity: sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==} + + '@types/d3-fetch@3.0.7': + resolution: {integrity: sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==} + + '@types/d3-force@3.0.10': + resolution: {integrity: sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==} + + '@types/d3-format@3.0.4': + resolution: {integrity: sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==} + + '@types/d3-geo@3.1.0': + resolution: {integrity: sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==} + + '@types/d3-hierarchy@3.1.7': + resolution: {integrity: sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==} + + '@types/d3-interpolate@3.0.4': + resolution: {integrity: sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==} + + '@types/d3-path@3.1.1': + resolution: {integrity: sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==} + + '@types/d3-polygon@3.0.2': + resolution: {integrity: sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==} + + '@types/d3-quadtree@3.0.6': + resolution: {integrity: sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==} + + '@types/d3-random@3.0.3': + resolution: {integrity: sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==} + + '@types/d3-scale-chromatic@3.1.0': + resolution: {integrity: sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==} + + '@types/d3-scale@4.0.9': + resolution: {integrity: sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==} + + '@types/d3-selection@3.0.11': + resolution: {integrity: sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==} + + '@types/d3-shape@3.1.7': + resolution: {integrity: sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg==} + + '@types/d3-time-format@4.0.3': + resolution: {integrity: sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==} + + '@types/d3-time@3.0.4': + resolution: {integrity: sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==} + + '@types/d3-timer@3.0.2': + resolution: {integrity: sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==} + + '@types/d3-transition@3.0.9': + resolution: {integrity: sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==} + + '@types/d3-zoom@3.0.8': + resolution: {integrity: sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==} + + '@types/d3@7.4.3': + resolution: {integrity: sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==} + + '@types/debug@4.1.12': + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + + '@types/estree-jsx@1.0.5': + resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} + + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + + '@types/geojson@7946.0.16': + resolution: {integrity: sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==} + + '@types/hast@3.0.4': + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + + '@types/is-empty@1.2.3': + resolution: {integrity: sha512-4J1l5d79hoIvsrKh5VUKVRA1aIdsOb10Hu5j3J2VfP/msDnfTdGPmNp2E1Wg+vs97Bktzo+MZePFFXSGoykYJw==} + + '@types/jsdom@21.1.7': + resolution: {integrity: sha512-yOriVnggzrnQ3a9OKOCxaVuSug3w3/SbOj5i7VwXWZEyUNl3bLF9V3MfxGbZKuwqJOQyRfqXyROBB1CoZLFWzA==} + + '@types/katex@0.16.7': + resolution: {integrity: sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ==} + + '@types/lodash-es@4.17.12': + resolution: {integrity: sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==} + + '@types/lodash@4.17.20': + resolution: {integrity: sha512-H3MHACvFUEiujabxhaI/ImO6gUrd8oOurg7LQtS7mbwIXA/cUqWrvBsaeJ23aZEPk1TAYkurjfMbSELfoCXlGA==} + + '@types/mdast@3.0.15': + resolution: {integrity: sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==} + + '@types/mdast@4.0.4': + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + + '@types/mdx@2.0.13': + resolution: {integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==} + + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + + '@types/nlcst@2.0.3': + resolution: {integrity: sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==} + + '@types/node@22.18.13': + resolution: {integrity: sha512-Bo45YKIjnmFtv6I1TuC8AaHBbqXtIo+Om5fE4QiU1Tj8QR/qt+8O3BAtOimG5IFmwaWiPmB3Mv3jtYzBA4Us2A==} + + '@types/prop-types@15.7.15': + resolution: {integrity: sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==} + + '@types/react@18.3.26': + resolution: {integrity: sha512-RFA/bURkcKzx/X9oumPG9Vp3D3JUgus/d0b67KB0t5S/raciymilkOa66olh78MUI92QLbEJevO7rvqU/kjwKA==} + + '@types/rss@0.0.32': + resolution: {integrity: sha512-2oKNqKyUY4RSdvl5eZR1n2Q9yvw3XTe3mQHsFPn9alaNBxfPnbXBtGP8R0SV8pK1PrVnLul0zx7izbm5/gF5Qw==} + + '@types/string-similarity@4.0.2': + resolution: {integrity: sha512-LkJQ/jsXtCVMK+sKYAmX/8zEq+/46f1PTQw7YtmQwb74jemS1SlNLmARM2Zml9DgdDTWKAtc5L13WorpHPDjDA==} + + '@types/supports-color@8.1.3': + resolution: {integrity: sha512-Hy6UMpxhE3j1tLpl27exp1XqHD7n8chAiNPzWfz16LPZoMMoSc4dzLl6w9qijkEb/r5O1ozdu1CWGA2L83ZeZg==} + + '@types/tern@0.23.9': + resolution: {integrity: sha512-ypzHFE/wBzh+BlH6rrBgS5I/Z7RD21pGhZ2rltb/+ZrVM1awdZwjx7hE5XfuYgHWk9uvV5HLZN3SloevCAp3Bw==} + + '@types/tough-cookie@4.0.5': + resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} + + '@types/trusted-types@2.0.7': + resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} + + '@types/unist@2.0.11': + resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} + + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + + '@types/ws@8.18.1': + resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} + + '@typescript-eslint/eslint-plugin@7.18.0': + resolution: {integrity: sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + '@typescript-eslint/parser': ^7.0.0 + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/parser@7.18.0': + resolution: {integrity: sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/scope-manager@7.18.0': + resolution: {integrity: sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@typescript-eslint/type-utils@7.18.0': + resolution: {integrity: sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/types@7.18.0': + resolution: {integrity: sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@typescript-eslint/typescript-estree@7.18.0': + resolution: {integrity: sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/utils@7.18.0': + resolution: {integrity: sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + + '@typescript-eslint/visitor-keys@7.18.0': + resolution: {integrity: sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@typescript/vfs@1.6.1': + resolution: {integrity: sha512-JwoxboBh7Oz1v38tPbkrZ62ZXNHAk9bJ7c9x0eI5zBfBnBYGhURdbnh7Z4smN/MV48Y5OCcZb58n972UtbazsA==} + peerDependencies: + typescript: '*' + + '@ungap/structured-clone@1.3.0': + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + + '@whatwg-node/disposablestack@0.0.6': + resolution: {integrity: sha512-LOtTn+JgJvX8WfBVJtF08TGrdjuFzGJc4mkP8EdDI8ADbvO7kiexYep1o8dwnt0okb0jYclCDXF13xU7Ge4zSw==} + engines: {node: '>=18.0.0'} + + '@whatwg-node/fetch@0.10.10': + resolution: {integrity: sha512-watz4i/Vv4HpoJ+GranJ7HH75Pf+OkPQ63NoVmru6Srgc8VezTArB00i/oQlnn0KWh14gM42F22Qcc9SU9mo/w==} + engines: {node: '>=18.0.0'} + + '@whatwg-node/node-fetch@0.7.25': + resolution: {integrity: sha512-szCTESNJV+Xd56zU6ShOi/JWROxE9IwCic8o5D9z5QECZloas6Ez5tUuKqXTAdu6fHFx1t6C+5gwj8smzOLjtg==} + engines: {node: '>=18.0.0'} + + '@whatwg-node/promise-helpers@1.3.2': + resolution: {integrity: sha512-Nst5JdK47VIl9UcGwtv2Rcgyn5lWtZ0/mhRQ4G8NN2isxpq2TO30iqHzmwoJycjWuyUfg3GFXqP/gFHXeV57IA==} + engines: {node: '>=16.0.0'} + + '@xmldom/xmldom@0.9.8': + resolution: {integrity: sha512-p96FSY54r+WJ50FIOsCOjyj/wavs8921hG5+kVMmZgKcvIKxMXHTrjNJvRgWa/zuX3B6t2lijLNFaOyuxUH+2A==} + engines: {node: '>=14.6'} + + abbrev@2.0.0: + resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn-walk@8.3.4: + resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} + engines: {node: '>=0.4.0'} + + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + engines: {node: '>=0.4.0'} + hasBin: true + + agent-base@7.1.4: + resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} + engines: {node: '>= 14'} + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.2.0: + resolution: {integrity: sha512-TKY5pyBkHyADOPYlRT9Lx6F544mPl0vS5Ew7BJ45hA08Q+t3GjbueLliBWN3sMICk6+y7HdyxSzC4bWS8baBdg==} + engines: {node: '>=12'} + + ansi-regex@6.2.2: + resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} + engines: {node: '>=12'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + + ansi-styles@6.2.3: + resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} + engines: {node: '>=12'} + + any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + aria-query@5.3.0: + resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} + + array-buffer-byte-length@1.0.2: + resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} + engines: {node: '>= 0.4'} + + array-includes@3.1.9: + resolution: {integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==} + engines: {node: '>= 0.4'} + + array-iterate@2.0.1: + resolution: {integrity: sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + array.prototype.findlast@1.2.5: + resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} + engines: {node: '>= 0.4'} + + array.prototype.flat@1.3.3: + resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} + engines: {node: '>= 0.4'} + + array.prototype.flatmap@1.3.3: + resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} + engines: {node: '>= 0.4'} + + array.prototype.tosorted@1.1.4: + resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==} + engines: {node: '>= 0.4'} + + arraybuffer.prototype.slice@1.0.4: + resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} + engines: {node: '>= 0.4'} + + arrify@1.0.1: + resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} + engines: {node: '>=0.10.0'} + + astring@1.9.0: + resolution: {integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==} + hasBin: true + + async-function@1.0.0: + resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} + engines: {node: '>= 0.4'} + + autoprefixer@10.4.21: + resolution: {integrity: sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + + b4a@1.6.7: + resolution: {integrity: sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==} + + babel-plugin-polyfill-corejs2@0.4.14: + resolution: {integrity: sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-plugin-polyfill-corejs3@0.13.0: + resolution: {integrity: sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-plugin-polyfill-regenerator@0.6.5: + resolution: {integrity: sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + bail@2.0.2: + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + bare-events@2.6.1: + resolution: {integrity: sha512-AuTJkq9XmE6Vk0FJVNq5QxETrSA/vKHarWVBG5l/JbdCL1prJemiyJqUS0jrlXO0MftuPq4m3YVYhoNc5+aE/g==} + + bare-fs@4.2.1: + resolution: {integrity: sha512-mELROzV0IhqilFgsl1gyp48pnZsaV9xhQapHLDsvn4d4ZTfbFhcghQezl7FTEDNBcGqLUnNI3lUlm6ecrLWdFA==} + engines: {bare: '>=1.16.0'} + peerDependencies: + bare-buffer: '*' + peerDependenciesMeta: + bare-buffer: + optional: true + + bare-os@3.6.2: + resolution: {integrity: sha512-T+V1+1srU2qYNBmJCXZkUY5vQ0B4FSlL3QDROnKQYOqeiQR8UbjNHlPa+TIbM4cuidiN9GaTaOZgSEgsvPbh5A==} + engines: {bare: '>=1.14.0'} + + bare-path@3.0.0: + resolution: {integrity: sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==} + + bare-stream@2.7.0: + resolution: {integrity: sha512-oyXQNicV1y8nc2aKffH+BUHFRXmx6VrPzlnaEvMhram0nPBrKcEdcyBg5r08D0i8VxngHFAiVyn1QKXpSG0B8A==} + peerDependencies: + bare-buffer: '*' + bare-events: '*' + peerDependenciesMeta: + bare-buffer: + optional: true + bare-events: + optional: true + + better-react-mathjax@2.3.0: + resolution: {integrity: sha512-K0ceQC+jQmB+NLDogO5HCpqmYf18AU2FxDbLdduYgkHYWZApFggkHE4dIaXCV1NqeoscESYXXo1GSkY6fA295w==} + peerDependencies: + react: '>=16.8' + + bignumber.js@9.3.1: + resolution: {integrity: sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + + brace-expansion@1.1.12: + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} + + brace-expansion@2.0.2: + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browserslist@4.25.3: + resolution: {integrity: sha512-cDGv1kkDI4/0e5yON9yM5G/0A5u8sf5TnmdX5C9qHzI9PPu++sQ9zjm1k9NiOrf3riY4OkK0zSGqfvJyJsgCBQ==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + busboy@1.6.0: + resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} + engines: {node: '>=10.16.0'} + + calendar-link@2.11.0: + resolution: {integrity: sha512-TcL+yXB8q6rZgrYF5dU7UwFjcR9n/kcwMEOohI+E4vXXxJ5ndLCcjw3aujUtRfo/GIpLFRoOQs8Zk/qZSwNkgg==} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bind@1.0.8: + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camelcase-css@2.0.1: + resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} + engines: {node: '>= 6'} + + camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + + caniuse-lite@1.0.30001736: + resolution: {integrity: sha512-ImpN5gLEY8gWeqfLUyEF4b7mYWcYoR2Si1VhnrbM4JizRFmfGaAQ12PhNykq6nvI4XvKLrsp8Xde74D5phJOSw==} + + caniuse-lite@1.0.30001751: + resolution: {integrity: sha512-A0QJhug0Ly64Ii3eIqHu5X51ebln3k4yTUkY1j8drqpWHVreg/VLijN48cZ1bYPiqOQuqpkIKnzr/Ul8V+p6Cw==} + + ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chalk@5.6.0: + resolution: {integrity: sha512-46QrSQFyVSEyYAgQ22hQ+zDa60YHA4fBstHmtSApj1Y5vKtG27fWowW03jCk5KcbXEWPZUIR894aARCA/G1kfQ==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + + character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + + character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + + character-reference-invalid@2.0.1: + resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + + chevrotain-allstar@0.3.1: + resolution: {integrity: sha512-b7g+y9A0v4mxCW1qUhf3BSVPg+/NvGErk/dOkrDaHA0nQIQGAtrOjlX//9OQtRlSCy+x9rfB5N8yC71lH1nvMw==} + peerDependencies: + chevrotain: ^11.0.0 + + chevrotain@11.0.3: + resolution: {integrity: sha512-ci2iJH6LeIkvP9eJW6gpueU8cnZhv85ELY8w8WiFtNjMHA5ad6pQLaJo9mEly/9qUyCpvqX8/POVUTf18/HFdw==} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + ci-info@4.3.0: + resolution: {integrity: sha512-l+2bNRMiQgcfILUi33labAZYIWlH1kWDp+ecNo5iisRKrbm0xcRyCww71/YU0Fkw0mAFpz9bJayXPjey6vkmaQ==} + engines: {node: '>=8'} + + client-only@0.0.1: + resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} + + clipboardy@4.0.0: + resolution: {integrity: sha512-5mOlNS0mhX0707P2I0aZ2V/cmHUEO/fL7VFLqszkhUsxt7RwnmrInf/eEQKlf5GzvYeHIjT+Ov1HRfNmymlG0w==} + engines: {node: '>=18'} + + clone-deep@4.0.1: + resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} + engines: {node: '>=6'} + + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + + cm6-graphql@0.2.1: + resolution: {integrity: sha512-FIAFHn6qyiXChTz3Pml0NgTM8LyyXs8QfP2iPG7MLA8Xi83WuVlkGG5PDs+DDeEVabHkLIZmcyNngQlxLXKk6A==} + peerDependencies: + '@codemirror/autocomplete': ^6.0.0 + '@codemirror/language': ^6.0.0 + '@codemirror/lint': ^6.0.0 + '@codemirror/state': ^6.0.0 + '@codemirror/view': ^6.0.0 + '@lezer/highlight': ^1.0.0 + graphql: ^15.5.0 || ^16.0.0 || ^17.0.0 + + codsen-utils@1.6.19: + resolution: {integrity: sha512-HwpbFE4zTNgVxJai42yGWvvV9VUPXcVQ9U72sE9eezluiUFeIKpni0uSsvqSx0mZ2c1NqKR8RZMQPx3XqixVaw==} + engines: {node: '>=14.18.0'} + + collapse-white-space@2.1.0: + resolution: {integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + + commander@13.1.0: + resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} + engines: {node: '>=18'} + + commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + + commander@7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + + commander@8.3.0: + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} + engines: {node: '>= 12'} + + compute-scroll-into-view@3.1.1: + resolution: {integrity: sha512-VRhuHOLoKYOy4UbilLbUzbYg93XLjv2PncJC50EuTWPA3gaja1UjBsUP/D/9/juV3vQFr6XBEzn9KCAHdUvOHw==} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + concat-stream@2.0.0: + resolution: {integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==} + engines: {'0': node >= 6.0} + + confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + + confbox@0.2.2: + resolution: {integrity: sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==} + + constant-case@3.0.4: + resolution: {integrity: sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + copy-anything@2.0.6: + resolution: {integrity: sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==} + + core-js-compat@3.45.1: + resolution: {integrity: sha512-tqTt5T4PzsMIZ430XGviK4vzYSoeNJ6CXODi6c/voxOT6IZqBht5/EKaSNnYiEjjRYxjVz7DQIsOsY0XNi8PIA==} + + cose-base@1.0.3: + resolution: {integrity: sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==} + + cose-base@2.2.0: + resolution: {integrity: sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==} + + cosmiconfig@8.3.6: + resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + + crelt@1.0.6: + resolution: {integrity: sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==} + + cross-inspect@1.0.1: + resolution: {integrity: sha512-Pcw1JTvZLSJH83iiGWt6fRcT+BjZlCDRVwYLbUcHzv/CRpB7r0MlSrGbIyQvVSNyGnbt7G4AXuyCiDR3POvZ1A==} + engines: {node: '>=16.0.0'} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + css-select@5.2.2: + resolution: {integrity: sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==} + + css-tree@2.2.1: + resolution: {integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + + css-tree@2.3.1: + resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + + css-what@6.2.2: + resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==} + engines: {node: '>= 6'} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + csso@5.0.5: + resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + + cssstyle@4.6.0: + resolution: {integrity: sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg==} + engines: {node: '>=18'} + + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + cytoscape-cose-bilkent@4.1.0: + resolution: {integrity: sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==} + peerDependencies: + cytoscape: ^3.2.0 + + cytoscape-fcose@2.2.0: + resolution: {integrity: sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==} + peerDependencies: + cytoscape: ^3.2.0 + + cytoscape@3.33.1: + resolution: {integrity: sha512-iJc4TwyANnOGR1OmWhsS9ayRS3s+XQ185FmuHObThD+5AeJCakAAbWv8KimMTt08xCCLNgneQwFp+JRJOr9qGQ==} + engines: {node: '>=0.10'} + + d3-array@2.12.1: + resolution: {integrity: sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==} + + d3-array@3.2.4: + resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} + engines: {node: '>=12'} + + d3-axis@3.0.0: + resolution: {integrity: sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==} + engines: {node: '>=12'} + + d3-brush@3.0.0: + resolution: {integrity: sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==} + engines: {node: '>=12'} + + d3-chord@3.0.1: + resolution: {integrity: sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==} + engines: {node: '>=12'} + + d3-color@3.1.0: + resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} + engines: {node: '>=12'} + + d3-contour@4.0.2: + resolution: {integrity: sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==} + engines: {node: '>=12'} + + d3-delaunay@6.0.4: + resolution: {integrity: sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==} + engines: {node: '>=12'} + + d3-dispatch@3.0.1: + resolution: {integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==} + engines: {node: '>=12'} + + d3-drag@3.0.0: + resolution: {integrity: sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==} + engines: {node: '>=12'} + + d3-dsv@3.0.1: + resolution: {integrity: sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==} + engines: {node: '>=12'} + hasBin: true + + d3-ease@3.0.1: + resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} + engines: {node: '>=12'} + + d3-fetch@3.0.1: + resolution: {integrity: sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==} + engines: {node: '>=12'} + + d3-force@3.0.0: + resolution: {integrity: sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==} + engines: {node: '>=12'} + + d3-format@3.1.0: + resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==} + engines: {node: '>=12'} + + d3-geo@3.1.1: + resolution: {integrity: sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==} + engines: {node: '>=12'} + + d3-hierarchy@3.1.2: + resolution: {integrity: sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==} + engines: {node: '>=12'} + + d3-interpolate@3.0.1: + resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} + engines: {node: '>=12'} + + d3-path@1.0.9: + resolution: {integrity: sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==} + + d3-path@3.1.0: + resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==} + engines: {node: '>=12'} + + d3-polygon@3.0.1: + resolution: {integrity: sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==} + engines: {node: '>=12'} + + d3-quadtree@3.0.1: + resolution: {integrity: sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==} + engines: {node: '>=12'} + + d3-random@3.0.1: + resolution: {integrity: sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==} + engines: {node: '>=12'} + + d3-sankey@0.12.3: + resolution: {integrity: sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==} + + d3-scale-chromatic@3.1.0: + resolution: {integrity: sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==} + engines: {node: '>=12'} + + d3-scale@4.0.2: + resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==} + engines: {node: '>=12'} + + d3-selection@3.0.0: + resolution: {integrity: sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==} + engines: {node: '>=12'} + + d3-shape@1.3.7: + resolution: {integrity: sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==} + + d3-shape@3.2.0: + resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==} + engines: {node: '>=12'} + + d3-time-format@4.1.0: + resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==} + engines: {node: '>=12'} + + d3-time@3.1.0: + resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==} + engines: {node: '>=12'} + + d3-timer@3.0.1: + resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} + engines: {node: '>=12'} + + d3-transition@3.0.1: + resolution: {integrity: sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==} + engines: {node: '>=12'} + peerDependencies: + d3-selection: 2 - 3 + + d3-zoom@3.0.0: + resolution: {integrity: sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==} + engines: {node: '>=12'} + + d3@7.9.0: + resolution: {integrity: sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==} + engines: {node: '>=12'} + + dagre-d3-es@7.0.11: + resolution: {integrity: sha512-tvlJLyQf834SylNKax8Wkzco/1ias1OPw8DcUMDE7oUIoSEW25riQVuiu/0OWEFqT0cxHT3Pa9/D82Jr47IONw==} + + data-uri-to-buffer@4.0.1: + resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} + engines: {node: '>= 12'} + + data-urls@5.0.0: + resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} + engines: {node: '>=18'} + + data-view-buffer@1.0.2: + resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} + engines: {node: '>= 0.4'} + + data-view-byte-length@1.0.2: + resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} + engines: {node: '>= 0.4'} + + data-view-byte-offset@1.0.1: + resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} + engines: {node: '>= 0.4'} + + dataloader@2.2.3: + resolution: {integrity: sha512-y2krtASINtPFS1rSDjacrFgn1dcUuoREVabwlOGOe4SdxenREqwjwjElAdwvbGM7kgZz9a3KVicWR7vcz8rnzA==} + + date-fns@2.30.0: + resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} + engines: {node: '>=0.11'} + + dayjs@1.11.13: + resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} + + debounce-promise@3.1.2: + resolution: {integrity: sha512-rZHcgBkbYavBeD9ej6sP56XfG53d51CD4dnaw989YX/nZ/ZJfgRx/9ePKmTNiUiyQvh4mtrMoS3OAWW+yoYtpg==} + + debounce@1.2.1: + resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==} + + debug@4.4.1: + resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decimal.js@10.6.0: + resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==} + + decode-named-character-reference@1.2.0: + resolution: {integrity: sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==} + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + delaunator@5.0.1: + resolution: {integrity: sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + + devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + + didyoumean@1.2.2: + resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + + diff@5.2.0: + resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} + engines: {node: '>=0.3.1'} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + dlv@1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + + doctrine@2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + + doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + + dom-accessibility-api@0.5.16: + resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} + + dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + + domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + + domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + + dompurify@3.2.6: + resolution: {integrity: sha512-/2GogDQlohXPZe6D6NOgQvXLPSYBqIWMnZ8zzOhn09REE4eyAzb+Hed3jhoM9OkuaJ8P6ZGTTVWQKAi8ieIzfQ==} + + domutils@3.2.2: + resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} + + dot-case@3.0.4: + resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + + dset@3.1.4: + resolution: {integrity: sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==} + engines: {node: '>=4'} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + duplexer@0.1.2: + resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + electron-to-chromium@1.5.207: + resolution: {integrity: sha512-mryFrrL/GXDTmAtIVMVf+eIXM09BBPlO5IQ7lUyKmK8d+A4VpRGG+M3ofoVef6qyF8s60rJei8ymlJxjUA8Faw==} + + emoji-regex-xs@1.0.0: + resolution: {integrity: sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==} + + emoji-regex@10.4.0: + resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + end-of-stream@1.4.5: + resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + entities@6.0.1: + resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} + engines: {node: '>=0.12'} + + err-code@2.0.3: + resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} + + errno@0.1.8: + resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} + hasBin: true + + error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + + es-abstract@1.24.0: + resolution: {integrity: sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==} + engines: {node: '>= 0.4'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-iterator-helpers@1.2.1: + resolution: {integrity: sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==} + engines: {node: '>= 0.4'} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + es-shim-unscopables@1.1.0: + resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} + engines: {node: '>= 0.4'} + + es-to-primitive@1.3.0: + resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} + engines: {node: '>= 0.4'} + + esast-util-from-estree@2.0.0: + resolution: {integrity: sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==} + + esast-util-from-js@2.0.1: + resolution: {integrity: sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==} + + esbuild@0.25.10: + resolution: {integrity: sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==} + engines: {node: '>=18'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + + eslint-config-prettier@9.1.2: + resolution: {integrity: sha512-iI1f+D2ViGn+uvv5HuHVUamg8ll4tN+JRHGc6IJi4TP9Kl976C57fzPXgseXNs8v0iA8aSJpHsTWjDb9QJamGQ==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + + eslint-mdx@3.6.2: + resolution: {integrity: sha512-5hczn5iSSEcwtNtVXFwCKIk6iLEDaZpwc3vjYDl/B779OzaAAK/ou16J2xVdO6ecOLEO1WZqp7MRCQ/WsKDUig==} + engines: {node: '>=18.0.0'} + peerDependencies: + eslint: '>=8.0.0' + remark-lint-file-extension: '*' + peerDependenciesMeta: + remark-lint-file-extension: + optional: true + + eslint-plugin-mdx@3.6.2: + resolution: {integrity: sha512-RfMd5HYD/9+cqANhVWJbuBRg3huWUsAoGJNGmPsyiRD2X6BaG6bvt1omyk1ORlg81GK8ST7Ojt5fNAuwWhWU8A==} + engines: {node: '>=18.0.0'} + peerDependencies: + eslint: '>=8.0.0' + + eslint-plugin-react-hooks@5.2.0: + resolution: {integrity: sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==} + engines: {node: '>=10'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 + + eslint-plugin-react@7.37.5: + resolution: {integrity: sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==} + engines: {node: '>=4'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 + + eslint-plugin-tailwindcss@3.18.2: + resolution: {integrity: sha512-QbkMLDC/OkkjFQ1iz/5jkMdHfiMu/uwujUHLAJK5iwNHD8RTxVTlsUezE0toTZ6VhybNBsk+gYGPDq2agfeRNA==} + engines: {node: '>=18.12.0'} + peerDependencies: + tailwindcss: ^3.4.0 + + eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@4.2.1: + resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint@8.57.1: + resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. + hasBin: true + + esm@3.2.25: + resolution: {integrity: sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==} + engines: {node: '>=6'} + + espree@10.4.0: + resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + estree-util-attach-comments@3.0.0: + resolution: {integrity: sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==} + + estree-util-build-jsx@3.0.1: + resolution: {integrity: sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==} + + estree-util-is-identifier-name@2.1.0: + resolution: {integrity: sha512-bEN9VHRyXAUOjkKVQVvArFym08BTWB0aJPppZZr0UNyAqWsLaVfAqP7hbaTJjzHifmB5ebnR8Wm7r7yGN/HonQ==} + + estree-util-is-identifier-name@3.0.0: + resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} + + estree-util-scope@1.0.0: + resolution: {integrity: sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==} + + estree-util-to-js@2.0.0: + resolution: {integrity: sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==} + + estree-util-value-to-estree@3.4.0: + resolution: {integrity: sha512-Zlp+gxis+gCfK12d3Srl2PdX2ybsEA8ZYy6vQGVQTNNYLEGRQQ56XB64bjemN8kxIKXP1nC9ip4Z+ILy9LGzvQ==} + + estree-util-visit@2.0.0: + resolution: {integrity: sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==} + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} + + exsolve@1.0.7: + resolution: {integrity: sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==} + + extend-shallow@2.0.1: + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} + engines: {node: '>=0.10.0'} + + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-fifo@1.3.2: + resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} + + fast-glob@3.3.1: + resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} + engines: {node: '>=8.6.0'} + + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fastq@1.19.1: + resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} + + fault@2.0.1: + resolution: {integrity: sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==} + + fetch-blob@3.2.0: + resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} + engines: {node: ^12.20 || >= 14.13} + + file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + + file-is-binary@1.0.0: + resolution: {integrity: sha512-71I2LciuolZDBUCu4JzFBKxSvVurMD84G97uCYgt9PZ7ElhEomGqYHTKKU2NcDOxR1g2bwn+hRbkTFSrD80Pfw==} + engines: {node: '>=0.10.0'} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + + flatted@3.3.3: + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + + flexsearch@0.7.43: + resolution: {integrity: sha512-c5o/+Um8aqCSOXGcZoqZOm+NqtVwNsvVpWv6lfmSclU954O3wvQKxxK8zj74fPaSJbXpSLTs4PRhh+wnoCXnKg==} + + follow-redirects@1.15.11: + resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + for-each@0.3.5: + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} + engines: {node: '>= 0.4'} + + for-in@1.0.2: + resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==} + engines: {node: '>=0.10.0'} + + foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} + engines: {node: '>=14'} + + format@0.2.2: + resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} + engines: {node: '>=0.4.x'} + + formdata-polyfill@4.0.10: + resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} + engines: {node: '>=12.20.0'} + + fraction.js@4.3.7: + resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + + framer-motion@12.23.24: + resolution: {integrity: sha512-HMi5HRoRCTou+3fb3h9oTLyJGBxHfW+HnNE25tAXOvVx/IvwMHK0cx7IR4a2ZU6sh3IX1Z+4ts32PcYBOqka8w==} + peerDependencies: + '@emotion/is-prop-valid': '*' + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@emotion/is-prop-valid': + optional: true + react: + optional: true + react-dom: + optional: true + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + function.prototype.name@1.1.8: + resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} + engines: {node: '>= 0.4'} + + functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} + + get-symbol-description@1.1.0: + resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} + engines: {node: '>= 0.4'} + + get-tsconfig@4.12.0: + resolution: {integrity: sha512-LScr2aNr2FbjAjZh2C6X6BxRx1/x+aTDExct/xyq2XKbYOiG5c0aK7pMsSuyc0brz3ibr/lbQiHD9jzt4lccJw==} + + github-slugger@2.0.0: + resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + + globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + + globals@15.15.0: + resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} + engines: {node: '>=18'} + + globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} + + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + graphql-config@5.1.5: + resolution: {integrity: sha512-mG2LL1HccpU8qg5ajLROgdsBzx/o2M6kgI3uAmoaXiSH9PCUbtIyLomLqUtCFaAeG2YCFsl0M5cfQ9rKmDoMVA==} + engines: {node: '>= 16.0.0'} + peerDependencies: + cosmiconfig-toml-loader: ^1.0.0 + graphql: ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 + peerDependenciesMeta: + cosmiconfig-toml-loader: + optional: true + + graphql-depth-limit@1.1.0: + resolution: {integrity: sha512-+3B2BaG8qQ8E18kzk9yiSdAa75i/hnnOwgSeAxVJctGQPvmeiLtqKOYF6HETCyRjiF7Xfsyal0HbLlxCQkgkrw==} + engines: {node: '>=6.0.0'} + peerDependencies: + graphql: '*' + + graphql-language-service@5.5.0: + resolution: {integrity: sha512-9EvWrLLkF6Y5e29/2cmFoAO6hBPPAZlCyjznmpR11iFtRydfkss+9m6x+htA8h7YznGam+TtJwS6JuwoWWgb2Q==} + hasBin: true + peerDependencies: + graphql: ^15.5.0 || ^16.0.0 || ^17.0.0 + + graphql-ws@6.0.6: + resolution: {integrity: sha512-zgfER9s+ftkGKUZgc0xbx8T7/HMO4AV5/YuYiFc+AtgcO5T0v8AxYYNQ+ltzuzDZgNkYJaFspm5MMYLjQzrkmw==} + engines: {node: '>=20'} + peerDependencies: + '@fastify/websocket': ^10 || ^11 + crossws: ~0.3 + graphql: ^15.10.1 || ^16 + uWebSockets.js: ^20 + ws: ^8 + peerDependenciesMeta: + '@fastify/websocket': + optional: true + crossws: + optional: true + uWebSockets.js: + optional: true + ws: + optional: true + + graphql@16.10.0: + resolution: {integrity: sha512-AjqGKbDGUFRKIRCP9tCKiIGHyriz2oHEbPIbEtcSLSs4YjReZOIPQQWek4+6hjw62H9QShXHyaGivGiYVLeYFQ==} + engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} + + gray-matter@3.1.1: + resolution: {integrity: sha512-nZ1qjLmayEv0/wt3sHig7I0s3/sJO0dkAaKYQ5YAOApUtYEOonXSFdWvL1khvnZMTvov4UufkqlFsilPnejEXA==} + engines: {node: '>=0.10.0'} + + gray-matter@4.0.3: + resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} + engines: {node: '>=6.0'} + + gzip-size@6.0.0: + resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==} + engines: {node: '>=10'} + + hachure-fill@0.5.2: + resolution: {integrity: sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==} + + has-bigints@1.1.0: + resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} + engines: {node: '>= 0.4'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-proto@1.2.0: + resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} + engines: {node: '>= 0.4'} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + hast-util-from-dom@5.0.1: + resolution: {integrity: sha512-N+LqofjR2zuzTjCPzyDUdSshy4Ma6li7p/c3pA78uTwzFgENbgbUrm2ugwsOdcjI1muO+o6Dgzp9p8WHtn/39Q==} + + hast-util-from-html-isomorphic@2.0.0: + resolution: {integrity: sha512-zJfpXq44yff2hmE0XmwEOzdWin5xwH+QIhMLOScpX91e/NSGPsAzNCvLQDIEPyO2TXi+lBmU6hjLIhV8MwP2kw==} + + hast-util-from-html@2.0.3: + resolution: {integrity: sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==} + + hast-util-from-parse5@8.0.3: + resolution: {integrity: sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==} + + hast-util-is-element@3.0.0: + resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==} + + hast-util-parse-selector@4.0.0: + resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} + + hast-util-raw@9.1.0: + resolution: {integrity: sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==} + + hast-util-to-estree@3.1.3: + resolution: {integrity: sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w==} + + hast-util-to-html@9.0.5: + resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} + + hast-util-to-jsx-runtime@2.3.6: + resolution: {integrity: sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==} + + hast-util-to-parse5@8.0.0: + resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==} + + hast-util-to-string@3.0.1: + resolution: {integrity: sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A==} + + hast-util-to-text@4.0.2: + resolution: {integrity: sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==} + + hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + + hastscript@9.0.1: + resolution: {integrity: sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==} + + hosted-git-info@7.0.2: + resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==} + engines: {node: ^16.14.0 || >=18.0.0} + + html-encoding-sniffer@4.0.0: + resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} + engines: {node: '>=18'} + + html-entities@2.6.0: + resolution: {integrity: sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==} + + html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + + html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + + http-proxy-agent@7.0.2: + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + engines: {node: '>= 14'} + + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} + + human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + + iframe-resizer-react@1.1.1: + resolution: {integrity: sha512-s0EUUekv58FGbuWBanSCVsEKmmyBdWmdwQ8qx8g04jlNlCR7pNuDz7fw7zo5T5sdssl6yRMDl97NBdwD1gfDyQ==} + engines: {node: '>=16', npm: '>=5'} + peerDependencies: + prop-types: ^15.7.2 + react: ^16.13.1 || ^18.0.0 + react-dom: ^16.13.1 || ^18.0.0 + + iframe-resizer@4.4.5: + resolution: {integrity: sha512-U8bCywf/Gh07O69RXo6dXAzTtODQrxaHGHRI7Nt4ipXsuq6EMxVsOP/jjaP43YtXz/ibESS0uSVDN3sOGCzSmw==} + engines: {node: '>=0.8.0'} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + ignore@6.0.2: + resolution: {integrity: sha512-InwqeHHN2XpumIkMvpl/DCJVrAHgCsG5+cn1XlnLWGwtZBm8QJfSusItfrwx81CTp5agNZqpKU2J/ccC5nGT4A==} + engines: {node: '>= 4'} + + image-size@0.5.5: + resolution: {integrity: sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==} + engines: {node: '>=0.10.0'} + hasBin: true + + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + + import-meta-resolve@4.1.0: + resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ini@4.1.3: + resolution: {integrity: sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + inline-style-parser@0.2.4: + resolution: {integrity: sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==} + + internal-slot@1.1.0: + resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} + engines: {node: '>= 0.4'} + + internmap@1.0.1: + resolution: {integrity: sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==} + + internmap@2.0.3: + resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} + engines: {node: '>=12'} + + is-alphabetical@2.0.1: + resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} + + is-alphanumerical@2.0.1: + resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} + + is-array-buffer@3.0.5: + resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} + engines: {node: '>= 0.4'} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-async-function@2.1.1: + resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} + engines: {node: '>= 0.4'} + + is-bigint@1.1.0: + resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} + engines: {node: '>= 0.4'} + + is-binary-buffer@1.0.0: + resolution: {integrity: sha512-fP08vt1YuBWSWdDCWkHUDo/Gb+YpnsiK41w2kP3iAkWhMKV4uuAAwPQm9GkA4r+OCDzpa+APIOaHZW6d83e5Ug==} + engines: {node: '>=4'} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-boolean-object@1.2.2: + resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} + engines: {node: '>= 0.4'} + + is-buffer@1.1.6: + resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} + + is-buffer@2.0.5: + resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} + engines: {node: '>=4'} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} + + is-data-view@1.0.2: + resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} + engines: {node: '>= 0.4'} + + is-date-object@1.1.0: + resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} + engines: {node: '>= 0.4'} + + is-decimal@2.0.1: + resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + + is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + + is-empty@1.2.0: + resolution: {integrity: sha512-F2FnH/otLNJv0J6wc73A5Xo7oHLNnqplYqZhUu01tD54DIPvxIRSTSLkrUB/M0nHO4vo1O9PDfN4KoTxCzLh/w==} + + is-extendable@0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} + engines: {node: '>=0.10.0'} + + is-extendable@1.0.1: + resolution: {integrity: sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==} + engines: {node: '>=0.10.0'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-finalizationregistry@1.1.1: + resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} + engines: {node: '>= 0.4'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-generator-function@1.1.0: + resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} + engines: {node: '>= 0.4'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-hexadecimal@2.0.1: + resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + + is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + + is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} + + is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + + is-number-object@1.1.1: + resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} + engines: {node: '>= 0.4'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + + is-plain-object@2.0.4: + resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} + engines: {node: '>=0.10.0'} + + is-plain-object@5.0.0: + resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} + engines: {node: '>=0.10.0'} + + is-potential-custom-element-name@1.0.1: + resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + + is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} + + is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} + + is-shared-array-buffer@1.0.4: + resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} + engines: {node: '>= 0.4'} + + is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + is-string@1.1.1: + resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} + engines: {node: '>= 0.4'} + + is-symbol@1.1.1: + resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} + engines: {node: '>= 0.4'} + + is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} + engines: {node: '>= 0.4'} + + is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} + + is-weakref@1.1.1: + resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} + engines: {node: '>= 0.4'} + + is-weakset@2.0.4: + resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} + engines: {node: '>= 0.4'} + + is-what@3.14.1: + resolution: {integrity: sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==} + + is-whitespace@0.3.0: + resolution: {integrity: sha512-RydPhl4S6JwAyj0JJjshWJEFG6hNye3pZFBRZaTUfZFwGHxzppNaNOVgQuS/E/SlhrApuMXrpnK1EEIXfdo3Dg==} + engines: {node: '>=0.10.0'} + + is-wsl@3.1.0: + resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} + engines: {node: '>=16'} + + is64bit@2.0.0: + resolution: {integrity: sha512-jv+8jaWCl0g2lSBkNSVXdzfBA0npK1HGC2KtWM9FumFRoGS94g3NbCCLVnCYHLjp4GrW2KZeeSTMo5ddtznmGw==} + engines: {node: '>=18'} + + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + isexe@3.1.1: + resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==} + engines: {node: '>=16'} + + isobject@3.0.1: + resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} + engines: {node: '>=0.10.0'} + + isomorphic-ws@5.0.0: + resolution: {integrity: sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==} + peerDependencies: + ws: '*' + + iterator.prototype@1.1.5: + resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==} + engines: {node: '>= 0.4'} + + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + jiti@1.21.7: + resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} + hasBin: true + + jiti@2.6.1: + resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} + hasBin: true + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + jsdom@26.1.0: + resolution: {integrity: sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg==} + engines: {node: '>=18'} + peerDependencies: + canvas: ^3.0.0 + peerDependenciesMeta: + canvas: + optional: true + + jsesc@3.0.2: + resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} + engines: {node: '>=6'} + hasBin: true + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-parse-even-better-errors@3.0.2: + resolution: {integrity: sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsx-ast-utils@3.3.5: + resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} + engines: {node: '>=4.0'} + + katex@0.16.22: + resolution: {integrity: sha512-XCHRdUw4lf3SKBaJe4EvgqIuWwkPSo9XoeO8GjQW94Bp7TWv9hNhzZjZ+OH9yf1UmLygb7DIT5GSFQiyt16zYg==} + hasBin: true + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + khroma@2.1.0: + resolution: {integrity: sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==} + + kind-of@3.2.2: + resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==} + engines: {node: '>=0.10.0'} + + kind-of@5.1.0: + resolution: {integrity: sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==} + engines: {node: '>=0.10.0'} + + kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + + kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + + kolorist@1.8.0: + resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} + + langium@3.3.1: + resolution: {integrity: sha512-QJv/h939gDpvT+9SiLVlY7tZC3xB2qK57v0J04Sh9wpMb6MP1q8gB21L3WIo8T5P1MSMg3Ep14L7KkDCFG3y4w==} + engines: {node: '>=16.0.0'} + + layout-base@1.0.2: + resolution: {integrity: sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==} + + layout-base@2.0.1: + resolution: {integrity: sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==} + + lazy-cache@2.0.2: + resolution: {integrity: sha512-7vp2Acd2+Kz4XkzxGxaB1FWOi8KjWIWsgdfD5MCb86DWvlLqhRPM+d6Pro3iNEL5VT9mstz5hKAlcd+QR6H3aA==} + engines: {node: '>=0.10.0'} + + leaflet@1.9.4: + resolution: {integrity: sha512-nxS1ynzJOmOlHp+iL3FyWqK89GtNL8U8rvlMOsQdTTssxZwCXh8N2NB3GDQOL+YR3XnWyZAxwQixURb+FA74PA==} + + less-loader@12.3.0: + resolution: {integrity: sha512-0M6+uYulvYIWs52y0LqN4+QM9TqWAohYSNTo4htE8Z7Cn3G/qQMEmktfHmyJT23k+20kU9zHH2wrfFXkxNLtVw==} + engines: {node: '>= 18.12.0'} + peerDependencies: + '@rspack/core': 0.x || 1.x + less: ^3.5.0 || ^4.0.0 + webpack: ^5.0.0 + peerDependenciesMeta: + '@rspack/core': + optional: true + webpack: + optional: true + + less@4.4.1: + resolution: {integrity: sha512-X9HKyiXPi0f/ed0XhgUlBeFfxrlDP3xR4M7768Zl+WXLUViuL9AOPPJP4nCV0tgRWvTYvpNmN0SFhZOQzy16PA==} + engines: {node: '>=14'} + hasBin: true + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + lilconfig@3.1.3: + resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} + engines: {node: '>=14'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + lines-and-columns@2.0.4: + resolution: {integrity: sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + load-plugin@6.0.3: + resolution: {integrity: sha512-kc0X2FEUZr145odl68frm+lMJuQ23+rTXYmR6TImqPtbpmXC4vVXbWKDQ9IzndA0HfyQamWfKLhzsqGSTxE63w==} + + local-pkg@1.1.2: + resolution: {integrity: sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==} + engines: {node: '>=14'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash-es@4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + + lodash.debounce@4.0.8: + resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + + lodash.lowercase@4.3.0: + resolution: {integrity: sha512-UcvP1IZYyDKyEL64mmrwoA1AbFu5ahojhTtkOUr1K9dbuxzS9ev8i4TxMMGCqRC9TE8uDaSoufNAXxRPNTseVA==} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash.sortby@4.7.0: + resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} + + longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + + lower-case@2.0.2: + resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + lucide-react@0.469.0: + resolution: {integrity: sha512-28vvUnnKQ/dBwiCQtwJw7QauYnE7yd2Cyp4tTTJpvglX4EMpbflcdBgrgToX2j71B3YvugK/NH3BGUk+E/p/Fw==} + peerDependencies: + react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + lz-string@1.5.0: + resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} + hasBin: true + + make-dir@2.1.0: + resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} + engines: {node: '>=6'} + + markdown-extensions@2.0.0: + resolution: {integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==} + engines: {node: '>=16'} + + markdown-table@3.0.4: + resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} + + marked@16.2.0: + resolution: {integrity: sha512-LbbTuye+0dWRz2TS9KJ7wsnD4KAtpj0MVkWc90XvBa6AslXsT0hTBVH5k32pcSyHH1fst9XEFJunXHktVy0zlg==} + engines: {node: '>= 20'} + hasBin: true + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + mathjax-full@3.2.2: + resolution: {integrity: sha512-+LfG9Fik+OuI8SLwsiR02IVdjcnRCy5MufYLi0C3TdMT56L/pjB0alMVGgoWJF8pN9Rc7FESycZB9BMNWIid5w==} + deprecated: Version 4 replaces this package with the scoped package @mathjax/src + + mdast-util-find-and-replace@3.0.2: + resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==} + + mdast-util-from-markdown@2.0.2: + resolution: {integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==} + + mdast-util-frontmatter@2.0.1: + resolution: {integrity: sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==} + + mdast-util-gfm-autolink-literal@2.0.1: + resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==} + + mdast-util-gfm-footnote@2.1.0: + resolution: {integrity: sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==} + + mdast-util-gfm-strikethrough@2.0.0: + resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} + + mdast-util-gfm-table@2.0.0: + resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} + + mdast-util-gfm-task-list-item@2.0.0: + resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} + + mdast-util-gfm@3.1.0: + resolution: {integrity: sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==} + + mdast-util-math@3.0.0: + resolution: {integrity: sha512-Tl9GBNeG/AhJnQM221bJR2HPvLOSnLE/T9cJI9tlc6zwQk2nPk/4f0cHkOdEixQPC/j8UtKDdITswvLAy1OZ1w==} + + mdast-util-mdx-expression@2.0.1: + resolution: {integrity: sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==} + + mdast-util-mdx-jsx@3.2.0: + resolution: {integrity: sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==} + + mdast-util-mdx@3.0.0: + resolution: {integrity: sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==} + + mdast-util-mdxjs-esm@2.0.1: + resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==} + + mdast-util-phrasing@4.1.0: + resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} + + mdast-util-to-hast@13.2.0: + resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==} + + mdast-util-to-markdown@2.1.2: + resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} + + mdast-util-to-string@4.0.0: + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + + mdn-data@2.0.28: + resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==} + + mdn-data@2.0.30: + resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + mermaid-isomorphic@3.0.4: + resolution: {integrity: sha512-XQTy7H1XwHK3DPEHf+ZNWiqUEd9BwX3Xws38R9Fj2gx718srmgjlZoUzHr+Tca+O+dqJOJsAJaKzCoP65QDfDg==} + peerDependencies: + playwright: '1' + peerDependenciesMeta: + playwright: + optional: true + + mermaid@11.10.0: + resolution: {integrity: sha512-oQsFzPBy9xlpnGxUqLbVY8pvknLlsNIJ0NWwi8SUJjhbP1IT0E0o1lfhU4iYV3ubpy+xkzkaOyDUQMn06vQElQ==} + + meros@1.3.1: + resolution: {integrity: sha512-eV7dRObfTrckdmAz4/n7pT1njIsIJXRIZkgCiX43xEsPNy4gjXQzOYYxmGcolAMtF7HyfqRuDBh3Lgs4hmhVEw==} + engines: {node: '>=13'} + peerDependencies: + '@types/node': '>=13' + peerDependenciesMeta: + '@types/node': + optional: true + + mhchemparser@4.2.1: + resolution: {integrity: sha512-kYmyrCirqJf3zZ9t/0wGgRZ4/ZJw//VwaRVGA75C4nhE60vtnIzhl9J9ndkX/h6hxSN7pjg/cE0VxbnNM+bnDQ==} + + micromark-core-commonmark@2.0.3: + resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} + + micromark-extension-frontmatter@2.0.0: + resolution: {integrity: sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==} + + micromark-extension-gfm-autolink-literal@2.1.0: + resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==} + + micromark-extension-gfm-footnote@2.1.0: + resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==} + + micromark-extension-gfm-strikethrough@2.1.0: + resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==} + + micromark-extension-gfm-table@2.1.1: + resolution: {integrity: sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==} + + micromark-extension-gfm-tagfilter@2.0.0: + resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} + + micromark-extension-gfm-task-list-item@2.1.0: + resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==} + + micromark-extension-gfm@3.0.0: + resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} + + micromark-extension-math@3.1.0: + resolution: {integrity: sha512-lvEqd+fHjATVs+2v/8kg9i5Q0AP2k85H0WUOwpIVvUML8BapsMvh1XAogmQjOCsLpoKRCVQqEkQBB3NhVBcsOg==} + + micromark-extension-mdx-expression@3.0.1: + resolution: {integrity: sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q==} + + micromark-extension-mdx-jsx@3.0.2: + resolution: {integrity: sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ==} + + micromark-extension-mdx-md@2.0.0: + resolution: {integrity: sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==} + + micromark-extension-mdxjs-esm@3.0.0: + resolution: {integrity: sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==} + + micromark-extension-mdxjs@3.0.0: + resolution: {integrity: sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==} + + micromark-factory-destination@2.0.1: + resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} + + micromark-factory-label@2.0.1: + resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} + + micromark-factory-mdx-expression@2.0.3: + resolution: {integrity: sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ==} + + micromark-factory-space@2.0.1: + resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==} + + micromark-factory-title@2.0.1: + resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==} + + micromark-factory-whitespace@2.0.1: + resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==} + + micromark-util-character@2.1.1: + resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} + + micromark-util-chunked@2.0.1: + resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==} + + micromark-util-classify-character@2.0.1: + resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==} + + micromark-util-combine-extensions@2.0.1: + resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==} + + micromark-util-decode-numeric-character-reference@2.0.2: + resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==} + + micromark-util-decode-string@2.0.1: + resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==} + + micromark-util-encode@2.0.1: + resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} + + micromark-util-events-to-acorn@2.0.3: + resolution: {integrity: sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg==} + + micromark-util-html-tag-name@2.0.1: + resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} + + micromark-util-normalize-identifier@2.0.1: + resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==} + + micromark-util-resolve-all@2.0.1: + resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==} + + micromark-util-sanitize-uri@2.0.1: + resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} + + micromark-util-subtokenize@2.1.0: + resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==} + + micromark-util-symbol@2.0.1: + resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} + + micromark-util-types@2.0.2: + resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} + + micromark@4.0.2: + resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mime-db@1.25.0: + resolution: {integrity: sha512-5k547tI4Cy+Lddr/hdjNbBEWBwSl8EBc5aSdKvedav8DReADgWJzcYiktaRIw3GtGC1jjwldXtTzvqJZmtvC7w==} + engines: {node: '>= 0.6'} + + mime-types@2.1.13: + resolution: {integrity: sha512-ryBDp1Z/6X90UvjUK3RksH0IBPM137T7cmg4OgD5wQBojlAiUwuok0QeELkim/72EtcYuNlmbkrcGuxj3Kl0YQ==} + engines: {node: '>= 0.6'} + + mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + + mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + + mini-svg-data-uri@1.4.4: + resolution: {integrity: sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==} + hasBin: true + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + mixin-deep@1.3.2: + resolution: {integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==} + engines: {node: '>=0.10.0'} + + mj-context-menu@0.6.1: + resolution: {integrity: sha512-7NO5s6n10TIV96d4g2uDpG7ZDpIhMh0QNfGdJw/W47JswFcosz457wqz/b5sAKvl12sxINGFCn80NZHKwxQEXA==} + + mlly@1.7.4: + resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==} + + motion-dom@12.23.23: + resolution: {integrity: sha512-n5yolOs0TQQBRUFImrRfs/+6X4p3Q4n1dUEqt/H58Vx7OW6RF+foWEgmTVDhIWJIMXOuNNL0apKH2S16en9eiA==} + + motion-utils@12.23.6: + resolution: {integrity: sha512-eAWoPgr4eFEOFfg2WjIsMoqJTW6Z8MTUCgn/GZ3VRpClWBdnbjryiA3ZSNLyxCTmCQx4RmYX6jX1iWHbenUPNQ==} + + motion@12.23.24: + resolution: {integrity: sha512-Rc5E7oe2YZ72N//S3QXGzbnXgqNrTESv8KKxABR20q2FLch9gHLo0JLyYo2hZ238bZ9Gx6cWhj9VO0IgwbMjCw==} + peerDependencies: + '@emotion/is-prop-valid': '*' + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@emotion/is-prop-valid': + optional: true + react: + optional: true + react-dom: + optional: true + + mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + + mrmime@2.0.1: + resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} + engines: {node: '>=10'} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + needle@3.3.1: + resolution: {integrity: sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==} + engines: {node: '>= 4.4.x'} + hasBin: true + + negotiator@1.0.0: + resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} + engines: {node: '>= 0.6'} + + next-query-params@5.1.0: + resolution: {integrity: sha512-sSdMLXdC6CExNNJgbpzeFEZvhR/i1LRYvh8IF4QvuZa5eZ4DSmxMNFQ2qXOd56wQkALOPGWd4vl9+d1L/XS0PQ==} + peerDependencies: + next: ^10.0.0 || ^11.0.0 || ^12.0.0 || ^13.0.0 || ^14.0.0 || ^15.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + use-query-params: ^2.0.0 + + next-sitemap@4.2.3: + resolution: {integrity: sha512-vjdCxeDuWDzldhCnyFCQipw5bfpl4HmZA7uoo3GAaYGjGgfL4Cxb1CiztPuWGmS+auYs7/8OekRS8C2cjdAsjQ==} + engines: {node: '>=14.18'} + hasBin: true + peerDependencies: + next: '*' + + next-themes@0.4.6: + resolution: {integrity: sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA==} + peerDependencies: + react: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc + react-dom: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc + + next-with-less@3.0.1: + resolution: {integrity: sha512-lVJQ+dNWGpR1ccWM/LjY+8i28DC2oPa1Ivrc+h4+DFPJJN6O2EGKZIFBGrd9GLbwAEjFzKPs7yUk6bnrbY0qcw==} + peerDependencies: + less: '*' + less-loader: '>= 7.0.0' + next: '>= 11.0.1' + + next@14.2.33: + resolution: {integrity: sha512-GiKHLsD00t4ACm1p00VgrI0rUFAC9cRDGReKyERlM57aeEZkOQGcZTpIbsGn0b562FTPJWmYfKwplfO9EaT6ng==} + engines: {node: '>=18.17.0'} + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.1.0 + '@playwright/test': ^1.41.2 + react: ^18.2.0 + react-dom: ^18.2.0 + sass: ^1.3.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + '@playwright/test': + optional: true + sass: + optional: true + + nextra-theme-docs@3.3.1: + resolution: {integrity: sha512-P305m2UcW2IDyQhjrcAu0qpdPArikofinABslUCAyixYShsmcdDRUhIMd4QBHYru4gQuVjGWX9PhWZZCbNvzDQ==} + peerDependencies: + next: '>=13' + nextra: 3.3.1 + react: '>=18' + react-dom: '>=18' + + nextra@3.3.1: + resolution: {integrity: sha512-jiwj+LfUPHHeAxJAEqFuglxnbjFgzAOnDWFsjv7iv3BWiX8OksDwd3I2Sv3j2zba00iIBDEPdNeylfzTtTLZVg==} + engines: {node: '>=18'} + peerDependencies: + next: '>=13' + react: '>=18' + react-dom: '>=18' + + nlcst-to-string@4.0.0: + resolution: {integrity: sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==} + + no-case@3.0.4: + resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + + node-domexception@1.0.0: + resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} + engines: {node: '>=10.5.0'} + deprecated: Use your platform's native DOMException instead + + node-fetch@3.3.2: + resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + node-releases@2.0.19: + resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + + nopt@7.2.1: + resolution: {integrity: sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + + normalize-package-data@6.0.2: + resolution: {integrity: sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==} + engines: {node: ^16.14.0 || >=18.0.0} + + normalize-path@2.1.1: + resolution: {integrity: sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==} + engines: {node: '>=0.10.0'} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + normalize-range@0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} + + npm-install-checks@6.3.0: + resolution: {integrity: sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + npm-normalize-package-bin@3.0.1: + resolution: {integrity: sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + npm-package-arg@11.0.3: + resolution: {integrity: sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==} + engines: {node: ^16.14.0 || >=18.0.0} + + npm-pick-manifest@9.1.0: + resolution: {integrity: sha512-nkc+3pIIhqHVQr085X9d2JzPzLyjzQS96zbruppqC9aZRm/x8xx6xhI98gHtsfELP2bE+loHq8ZaHFHhe+NauA==} + engines: {node: ^16.14.0 || >=18.0.0} + + npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + npm-to-yarn@3.0.1: + resolution: {integrity: sha512-tt6PvKu4WyzPwWUzy/hvPFqn+uwXO0K1ZHka8az3NnrhWJDmSqI8ncWq0fkL0k/lmmi5tAC11FXwXuh0rFbt1A==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + + nullthrows@1.1.1: + resolution: {integrity: sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==} + + numbro@2.5.0: + resolution: {integrity: sha512-xDcctDimhzko/e+y+Q2/8i3qNC9Svw1QgOkSkQoO0kIPI473tR9QRbo2KP88Ty9p8WbPy+3OpTaAIzehtuHq+A==} + + nwsapi@2.2.22: + resolution: {integrity: sha512-ujSMe1OWVn55euT1ihwCI1ZcAaAU3nxUiDwfDQldc51ZXaB9m2AyOn6/jh1BLe2t/G8xd6uKG1UBF2aZJeg2SQ==} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-hash@3.0.0: + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} + + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object.assign@4.1.7: + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} + engines: {node: '>= 0.4'} + + object.entries@1.1.9: + resolution: {integrity: sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==} + engines: {node: '>= 0.4'} + + object.fromentries@2.0.8: + resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} + engines: {node: '>= 0.4'} + + object.values@1.2.1: + resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} + engines: {node: '>= 0.4'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + + oniguruma-to-es@2.3.0: + resolution: {integrity: sha512-bwALDxriqfKGfUufKGGepCzu9x7nJQuoRoAFp4AnwehhC2crqrDIAP/uN2qdlsAvSMpeRC3+Yzhqc7hLmle5+g==} + + opener@1.5.2: + resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==} + hasBin: true + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + own-keys@1.0.1: + resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} + engines: {node: '>= 0.4'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + p-limit@6.2.0: + resolution: {integrity: sha512-kuUqqHNUqoIWp/c467RI4X6mmyuojY5jGutNU0wVTmEOOfcuwLqyMVoAi9MKi2Ak+5i9+nhmrK4ufZE8069kHA==} + engines: {node: '>=18'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + package-manager-detector@1.3.0: + resolution: {integrity: sha512-ZsEbbZORsyHuO00lY1kV3/t72yp6Ysay6Pd17ZAlNGuGwmWDLCJxFpRs0IzfXfj1o4icJOkUEioexFHzyPurSQ==} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-entities@4.0.2: + resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + parse-json@7.1.1: + resolution: {integrity: sha512-SgOTCX/EZXtZxBE5eJ97P4yGM5n37BwRU+YMsH4vNzFqJV/oWFXXCmwFlgWUM4PrakybVOueJJ6pwHqSVhTFDw==} + engines: {node: '>=16'} + + parse-latin@7.0.0: + resolution: {integrity: sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ==} + + parse-node-version@1.0.1: + resolution: {integrity: sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==} + engines: {node: '>= 0.10'} + + parse-numeric-range@1.3.0: + resolution: {integrity: sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==} + + parse5@7.3.0: + resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} + + parser-front-matter@1.6.4: + resolution: {integrity: sha512-eqtUnI5+COkf1CQOYo8FmykN5Zs+5Yr60f/7GcPgQDZEEjdE/VZ4WMaMo9g37foof8h64t/TH2Uvk2Sq0fDy/g==} + engines: {node: '>=0.10.0'} + + path-data-parser@0.1.0: + resolution: {integrity: sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + + pify@4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + + pirates@4.0.7: + resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} + engines: {node: '>= 6'} + + pkg-types@1.3.1: + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + + pkg-types@2.3.0: + resolution: {integrity: sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==} + + plaiceholder@3.0.0: + resolution: {integrity: sha512-jwHxxHPnr1BwRzPCeZgEK2BMsEy2327sWynw3qb6XC/oGgGDUTPtR8pFxFQmNArhMBwhkUbUr5OPhhIJpCa8eQ==} + peerDependencies: + sharp: '>= 0.30.6' + + playwright-core@1.55.0: + resolution: {integrity: sha512-GvZs4vU3U5ro2nZpeiwyb0zuFaqb9sUiAJuyrWpcGouD8y9/HLgGbNRjIph7zU9D3hnPaisMl9zG9CgFi/biIg==} + engines: {node: '>=18'} + hasBin: true + + playwright@1.55.0: + resolution: {integrity: sha512-sdCWStblvV1YU909Xqx0DhOjPZE4/5lJsIS84IfN9dAZfcl/CIZ5O8l3o0j7hPMjDvqoTF8ZUcc+i/GL5erstA==} + engines: {node: '>=18'} + hasBin: true + + points-on-curve@0.2.0: + resolution: {integrity: sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==} + + points-on-path@0.2.1: + resolution: {integrity: sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==} + + possible-typed-array-names@1.1.0: + resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} + engines: {node: '>= 0.4'} + + postcss-import@15.1.0: + resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} + engines: {node: '>=14.0.0'} + peerDependencies: + postcss: ^8.0.0 + + postcss-import@16.1.1: + resolution: {integrity: sha512-2xVS1NCZAfjtVdvXiyegxzJ447GyqCeEI5V7ApgQVOWnros1p5lGNovJNapwPpMombyFBfqDwt7AD3n2l0KOfQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + postcss: ^8.0.0 + + postcss-js@4.1.0: + resolution: {integrity: sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==} + engines: {node: ^12 || ^14 || >= 16} + peerDependencies: + postcss: ^8.4.21 + + postcss-load-config@6.0.1: + resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} + engines: {node: '>= 18'} + peerDependencies: + jiti: '>=1.21.0' + postcss: '>=8.0.9' + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + jiti: + optional: true + postcss: + optional: true + tsx: + optional: true + yaml: + optional: true + + postcss-nested@5.0.6: + resolution: {integrity: sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + + postcss-nested@6.2.0: + resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + + postcss-selector-parser@6.0.10: + resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==} + engines: {node: '>=4'} + + postcss-selector-parser@6.1.2: + resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} + engines: {node: '>=4'} + + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + postcss@8.4.31: + resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} + engines: {node: ^10 || ^12 || >=14} + + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + engines: {node: ^10 || ^12 || >=14} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prettier-plugin-pkg@0.21.2: + resolution: {integrity: sha512-CSlM5+51B7yTKcoRWT4M3ImcdFHD5NUz0Xu2t8J03B761zu6J3BjSo/XleKp2kB0tH49K7oG5Uuqn6ldI5LRLg==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + prettier: ^3.0.3 + + prettier-plugin-tailwindcss@0.6.14: + resolution: {integrity: sha512-pi2e/+ZygeIqntN+vC573BcW5Cve8zUB0SSAGxqpB4f96boZF4M3phPVoOFCeypwkpRYdi7+jQ5YJJUwrkGUAg==} + engines: {node: '>=14.21.3'} + peerDependencies: + '@ianvs/prettier-plugin-sort-imports': '*' + '@prettier/plugin-hermes': '*' + '@prettier/plugin-oxc': '*' + '@prettier/plugin-pug': '*' + '@shopify/prettier-plugin-liquid': '*' + '@trivago/prettier-plugin-sort-imports': '*' + '@zackad/prettier-plugin-twig': '*' + prettier: ^3.0 + prettier-plugin-astro: '*' + prettier-plugin-css-order: '*' + prettier-plugin-import-sort: '*' + prettier-plugin-jsdoc: '*' + prettier-plugin-marko: '*' + prettier-plugin-multiline-arrays: '*' + prettier-plugin-organize-attributes: '*' + prettier-plugin-organize-imports: '*' + prettier-plugin-sort-imports: '*' + prettier-plugin-style-order: '*' + prettier-plugin-svelte: '*' + peerDependenciesMeta: + '@ianvs/prettier-plugin-sort-imports': + optional: true + '@prettier/plugin-hermes': + optional: true + '@prettier/plugin-oxc': + optional: true + '@prettier/plugin-pug': + optional: true + '@shopify/prettier-plugin-liquid': + optional: true + '@trivago/prettier-plugin-sort-imports': + optional: true + '@zackad/prettier-plugin-twig': + optional: true + prettier-plugin-astro: + optional: true + prettier-plugin-css-order: + optional: true + prettier-plugin-import-sort: + optional: true + prettier-plugin-jsdoc: + optional: true + prettier-plugin-marko: + optional: true + prettier-plugin-multiline-arrays: + optional: true + prettier-plugin-organize-attributes: + optional: true + prettier-plugin-organize-imports: + optional: true + prettier-plugin-sort-imports: + optional: true + prettier-plugin-style-order: + optional: true + prettier-plugin-svelte: + optional: true + + prettier@3.5.3: + resolution: {integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==} + engines: {node: '>=14'} + hasBin: true + + pretty-format@27.5.1: + resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + + proc-log@4.2.0: + resolution: {integrity: sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + promise-inflight@1.0.1: + resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} + peerDependencies: + bluebird: '*' + peerDependenciesMeta: + bluebird: + optional: true + + promise-retry@2.0.1: + resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} + engines: {node: '>=10'} + + prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + + property-information@6.5.0: + resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} + + property-information@7.1.0: + resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} + + prr@1.0.1: + resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==} + + pump@3.0.3: + resolution: {integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + quansync@0.2.11: + resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + ranges-apply@7.0.31: + resolution: {integrity: sha512-J/METHTxhQTRpLS3hzkvipyRyheAYmAa6BeZaJaTTutIU4spGfU8vKBnhSgKa+WAVAqpZKzqcX29+HHR2lcKLg==} + engines: {node: '>=14.18.0'} + + ranges-merge@9.0.30: + resolution: {integrity: sha512-JZhIFH6UO7A0XIJdSONFqlDHjwVmNZ0SPXJ3Q+Xjux1RiTDyUV4SA1tvjPOO0tKO2Fp7joU0/RUF92zCCjQvag==} + engines: {node: '>=14.18.0'} + + ranges-push@7.0.30: + resolution: {integrity: sha512-W5KYKPjXQY39DlPa4/ADb7wCWVIr3jurkjRzDtrhXJ6qCIHvG5oA8DIKLN0Ry2mNmnoQGHB95MMPSniSaiwmWA==} + engines: {node: '>=14.18.0'} + + ranges-sort@6.0.25: + resolution: {integrity: sha512-SKIziziX7dYobzh7N+AFgUJedsuQzD/NtZRjKJwaugNMr/G1CYZ/2yEna/UG/qQIKDnnK7Y1shiHiuYvT/7JyQ==} + engines: {node: '>=14.18.0'} + + react-dom@18.3.1: + resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} + peerDependencies: + react: ^18.3.1 + + react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + react-is@17.0.2: + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + + react-medium-image-zoom@5.2.13: + resolution: {integrity: sha512-KcBL4OsoUQJgIFh6vQgt/6sRGqDy6bQBcsbhGD2tsy4B5Pw3dWrboocVOyIm76RRALEZ6Qwp3EDvIvfEv0m5sg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + react-use-measure@2.1.7: + resolution: {integrity: sha512-KrvcAo13I/60HpwGO5jpW7E9DfusKyLPLvuHlUyP5zqnmAPhNc6qTRjUQrdTADl0lpPpDVU2/Gg51UlOGHXbdg==} + peerDependencies: + react: '>=16.13' + react-dom: '>=16.13' + peerDependenciesMeta: + react-dom: + optional: true + + react@18.3.1: + resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} + engines: {node: '>=0.10.0'} + + read-cache@1.0.0: + resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + + read-package-json-fast@3.0.2: + resolution: {integrity: sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + reading-time@1.5.0: + resolution: {integrity: sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg==} + + recma-build-jsx@1.0.0: + resolution: {integrity: sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==} + + recma-jsx@1.0.1: + resolution: {integrity: sha512-huSIy7VU2Z5OLv6oFLosQGGDqPqdO1iq6bWNAdhzMxSJP7RAso4fCZ1cKu8j9YHCZf3TPrq4dw3okhrylgcd7w==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + recma-parse@1.0.0: + resolution: {integrity: sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==} + + recma-stringify@1.0.0: + resolution: {integrity: sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==} + + reflect.getprototypeof@1.0.10: + resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} + engines: {node: '>= 0.4'} + + regenerate-unicode-properties@10.2.0: + resolution: {integrity: sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==} + engines: {node: '>=4'} + + regenerate@1.4.2: + resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} + + regex-recursion@5.1.1: + resolution: {integrity: sha512-ae7SBCbzVNrIjgSbh7wMznPcQel1DNlDtzensnFxpiNpXt1U2ju/bHugH422r+4LAVS1FpW1YCwilmnNsjum9w==} + + regex-utilities@2.3.0: + resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} + + regex@5.1.1: + resolution: {integrity: sha512-dN5I359AVGPnwzJm2jN1k0W9LPZ+ePvoOeVMMfqIMFz53sSwXkxaJoxr50ptnsC771lK95BnTrVSZxq0b9yCGw==} + + regexp.prototype.flags@1.5.4: + resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} + engines: {node: '>= 0.4'} + + regexpu-core@6.2.0: + resolution: {integrity: sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==} + engines: {node: '>=4'} + + regjsgen@0.8.0: + resolution: {integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==} + + regjsparser@0.12.0: + resolution: {integrity: sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==} + hasBin: true + + rehype-katex@7.0.1: + resolution: {integrity: sha512-OiM2wrZ/wuhKkigASodFoo8wimG3H12LWQaH8qSPVJn9apWKFSH3YOCtbKpBorTVw/eI7cuT21XBbvwEswbIOA==} + + rehype-mermaid@3.0.0: + resolution: {integrity: sha512-fxrD5E4Fa1WXUjmjNDvLOMT4XB1WaxcfycFIWiYU0yEMQhcTDElc9aDFnbDFRLxG1Cfo1I3mfD5kg4sjlWaB+Q==} + peerDependencies: + playwright: '1' + peerDependenciesMeta: + playwright: + optional: true + + rehype-parse@9.0.1: + resolution: {integrity: sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==} + + rehype-pretty-code@0.14.0: + resolution: {integrity: sha512-hBeKF/Wkkf3zyUS8lal9RCUuhypDWLQc+h9UrP9Pav25FUm/AQAVh4m5gdvJxh4Oz+U+xKvdsV01p1LdvsZTiQ==} + engines: {node: '>=18'} + peerDependencies: + shiki: ^1.3.0 + + rehype-raw@7.0.0: + resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} + + rehype-recma@1.0.0: + resolution: {integrity: sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==} + + remark-frontmatter@5.0.0: + resolution: {integrity: sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ==} + + remark-gfm@4.0.1: + resolution: {integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==} + + remark-lint-first-heading-level@3.1.2: + resolution: {integrity: sha512-uSgDMAKOolDcxfJwQU+iJK2Vbz2ZIzBAjQiN0f+9O/7XwrAH5IuVQH60w7chuxVrauVHmd1rbjmvzXVq8R30VQ==} + + remark-lint-heading-increment@3.1.2: + resolution: {integrity: sha512-+fMfZmFh6ie6MmbRCVW77Rha15zDmnHWKiA0Do08OTrfngPTv8ZKXYLmxhUpL+xV9ts9q+9Kz5rv0L4QD4sEwQ==} + + remark-math@6.0.0: + resolution: {integrity: sha512-MMqgnP74Igy+S3WwnhQ7kqGlEerTETXMvJhrUzDikVZ2/uogJCb+WHUg97hK9/jcfc0dkD73s3LN8zU49cTEtA==} + + remark-mdx@3.1.0: + resolution: {integrity: sha512-Ngl/H3YXyBV9RcRNdlYsZujAmhsxwzxpDzpDEhFBVAGthS4GDgnctpDjgFl/ULx5UEDzqtW1cyBSNKqYYrqLBA==} + + remark-parse@11.0.0: + resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} + + remark-reading-time@2.0.2: + resolution: {integrity: sha512-ILjIuR0dQQ8pELPgaFvz7ralcSN62rD/L1pTUJgWb4gfua3ZwYEI8mnKGxEQCbrXSUF/OvycTkcUbifGOtOn5A==} + + remark-rehype@11.1.2: + resolution: {integrity: sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==} + + remark-smartypants@3.0.2: + resolution: {integrity: sha512-ILTWeOriIluwEvPjv67v7Blgrcx+LZOkAUVtKI3putuhlZm84FnqDORNXPPm+HY3NdZOMhyDwZ1E+eZB/Df5dA==} + engines: {node: '>=16.0.0'} + + remark-stringify@11.0.0: + resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + + remove-trailing-separator@1.1.0: + resolution: {integrity: sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==} + + reselect@5.1.1: + resolution: {integrity: sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + + resolve@1.22.10: + resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} + engines: {node: '>= 0.4'} + hasBin: true + + resolve@2.0.0-next.5: + resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} + hasBin: true + + retext-latin@4.0.0: + resolution: {integrity: sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA==} + + retext-smartypants@6.2.0: + resolution: {integrity: sha512-kk0jOU7+zGv//kfjXEBjdIryL1Acl4i9XNkHxtM7Tm5lFiCog576fjNC9hjoR7LTKQ0DsPWy09JummSsH1uqfQ==} + + retext-stringify@4.0.0: + resolution: {integrity: sha512-rtfN/0o8kL1e+78+uxPTqu1Klt0yPzKuQ2BfWwwfgIUSayyzxpM1PJzkKt4V8803uB9qSy32MvI7Xep9khTpiA==} + + retext@9.0.0: + resolution: {integrity: sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA==} + + retry@0.12.0: + resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} + engines: {node: '>= 4'} + + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rfdc@1.4.1: + resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + robust-predicates@3.0.2: + resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} + + roughjs@4.6.6: + resolution: {integrity: sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==} + + rrweb-cssom@0.8.0: + resolution: {integrity: sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==} + + rss@1.2.2: + resolution: {integrity: sha512-xUhRTgslHeCBeHAqaWSbOYTydN2f0tAzNXvzh3stjz7QDhQMzdgHf3pfgNIngeytQflrFPfy6axHilTETr6gDg==} + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + rw@1.3.3: + resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==} + + sade@1.8.1: + resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} + engines: {node: '>=6'} + + safe-array-concat@1.1.3: + resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} + engines: {node: '>=0.4'} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safe-push-apply@1.0.0: + resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} + engines: {node: '>= 0.4'} + + safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} + engines: {node: '>= 0.4'} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + sax@1.4.1: + resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} + + saxes@6.0.0: + resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} + engines: {node: '>=v12.22.7'} + + scheduler@0.23.2: + resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + + scroll-into-view-if-needed@3.1.0: + resolution: {integrity: sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==} + + section-matter@1.0.0: + resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} + engines: {node: '>=4'} + + semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.7.2: + resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} + engines: {node: '>=10'} + hasBin: true + + semver@7.7.3: + resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} + engines: {node: '>=10'} + hasBin: true + + serialize-query-params@2.0.2: + resolution: {integrity: sha512-1chMo1dST4pFA9RDXAtF0Rbjaut4is7bzFbI1Z26IuMub68pNCILku85aYmeFhvnY//BXUPUhoRMjYcsT93J/Q==} + + server-only@0.0.1: + resolution: {integrity: sha512-qepMx2JxAa5jjfzxG79yPPq+8BuFToHd1hm7kI+Z4zAq1ftQiP7HcxMhDDItrbtwVeLg/cY2JnKnrcFkmiswNA==} + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + + set-getter@0.1.1: + resolution: {integrity: sha512-9sVWOy+gthr+0G9DzqqLaYNA7+5OKkSmcqjL9cBpDEaZrr3ShQlyX2cZ/O/ozE41oxn/Tt0LGEM/w4Rub3A3gw==} + engines: {node: '>=0.10.0'} + + set-proto@1.0.0: + resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} + engines: {node: '>= 0.4'} + + shallow-clone@3.0.1: + resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} + engines: {node: '>=8'} + + sharp@0.34.4: + resolution: {integrity: sha512-FUH39xp3SBPnxWvd5iib1X8XY7J0K0X7d93sie9CJg2PO8/7gmg89Nve6OjItK53/MlAushNNxteBYfM6DEuoA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + shiki@1.29.2: + resolution: {integrity: sha512-njXuliz/cP+67jU2hukkxCNuH1yUi4QfdZZY+sMr5PPrIyXSu5iTb/qYC4BiWWB0vZ+7TbdvYUCeL23zpwCfbg==} + + side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + sirv@2.0.4: + resolution: {integrity: sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==} + engines: {node: '>= 10'} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + slash@5.1.0: + resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} + engines: {node: '>=14.16'} + + snake-case@3.0.4: + resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + source-map@0.7.6: + resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} + engines: {node: '>= 12'} + + space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + + spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + + spdx-exceptions@2.5.0: + resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} + + spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + + spdx-license-ids@3.0.22: + resolution: {integrity: sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==} + + speech-rule-engine@4.1.2: + resolution: {integrity: sha512-S6ji+flMEga+1QU79NDbwZ8Ivf0S/MpupQQiIC0rTpU/ZTKgcajijJJb1OcByBQDjrXCN1/DJtGz4ZJeBMPGJw==} + hasBin: true + + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + stop-iteration-iterator@1.1.0: + resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} + engines: {node: '>= 0.4'} + + streamsearch@1.1.0: + resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} + engines: {node: '>=10.0.0'} + + streamx@2.22.1: + resolution: {integrity: sha512-znKXEBxfatz2GBNK02kRnCXjV+AA4kjZIUxeWSr3UGirZMJfTE9uiwKHobnbgxWyL/JWro8tTq+vOqAK1/qbSA==} + + string-collapse-leading-whitespace@7.0.20: + resolution: {integrity: sha512-DdYqlFPp7BJKIQle8VvcyRNmJY3SPdhZgKyLMw86uFD4eomtNtgGYu0rXBrPiBGzS1yBSnDXtNt4cqmJNmCNwg==} + engines: {node: '>=14.18.0'} + + string-env-interpolation@1.0.1: + resolution: {integrity: sha512-78lwMoCcn0nNu8LszbP1UA7g55OeE4v7rCeWnM5B453rnNr4aq+5it3FEYtZrSEiMvHZOZ9Jlqb0OD0M2VInqg==} + + string-left-right@6.0.32: + resolution: {integrity: sha512-hq1gRikdFqhFV3QJHsVjqLkpyulNUNngvHJIaQPNeohrLJuscfAC7mkK2ooirIrAkwYCzGOiNd8bxceqBb3UbA==} + engines: {node: '>=14.18.0'} + + string-similarity@4.0.4: + resolution: {integrity: sha512-/q/8Q4Bl4ZKAPjj8WerIBJWALKkaPRfrvhfF8k/B23i4nzrlRj2/go1m90In7nG/3XDSbOo0+pu6RvCTM9RGMQ==} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + + string-strip-html@13.4.24: + resolution: {integrity: sha512-/75YBvkZ8zc3uyuLKVhdpqI6DzP0YUcghyTpAuk1fs0LWuG4BCD0kE2Zjk3SRo1/FUMZ7KQfFQ3AN8Ee/2/VSQ==} + engines: {node: '>=14.18.0'} + + string-trim-spaces-only@5.0.24: + resolution: {integrity: sha512-RWrhY2QUOzjtyGzY4z9V3Olfcnfu+IPpoTqBCVkEZfPtVpPPph3foP9AuNdQMcZX5r+LtGA8+tz+kMlyttaTfg==} + engines: {node: '>=14.18.0'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string-width@6.1.0: + resolution: {integrity: sha512-k01swCJAgQmuADB0YIc+7TuatfNvTBVOoaUWJjTB9R4VJzR5vNWzf5t42ESVZFPS8xTySF7CAdV4t/aaIm3UnQ==} + engines: {node: '>=16'} + + string.prototype.matchall@4.0.12: + resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==} + engines: {node: '>= 0.4'} + + string.prototype.repeat@1.0.0: + resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==} + + string.prototype.trim@1.2.10: + resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} + engines: {node: '>= 0.4'} + + string.prototype.trimend@1.0.9: + resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} + engines: {node: '>= 0.4'} + + string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + stringify-entities@4.0.4: + resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + strip-ansi@7.1.2: + resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} + engines: {node: '>=12'} + + strip-bom-string@1.0.0: + resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==} + engines: {node: '>=0.10.0'} + + strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + style-mod@4.1.2: + resolution: {integrity: sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw==} + + style-mod@4.1.3: + resolution: {integrity: sha512-i/n8VsZydrugj3Iuzll8+x/00GH2vnYsk1eomD8QiRrSAeW6ItbCQDtfXCeJHd0iwiNagqjQkvpvREEPtW3IoQ==} + + style-to-js@1.1.17: + resolution: {integrity: sha512-xQcBGDxJb6jjFCTzvQtfiPn6YvvP2O8U1MDIPNfJQlWMYfktPy+iGsHE7cssjs7y84d9fQaK4UF3RIJaAHSoYA==} + + style-to-object@1.0.9: + resolution: {integrity: sha512-G4qppLgKu/k6FwRpHiGiKPaPTFcG3g4wNVX/Qsfu+RqQM30E7Tyu/TEgxcL9PNLF5pdRLwQdE3YKKf+KF2Dzlw==} + + styled-jsx@5.1.1: + resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@babel/core': '*' + babel-plugin-macros: '*' + react: '>= 16.8.0 || 17.x.x || ^18.0.0-0' + peerDependenciesMeta: + '@babel/core': + optional: true + babel-plugin-macros: + optional: true + + stylis@4.3.6: + resolution: {integrity: sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==} + + sucrase@3.35.0: + resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-color@9.4.0: + resolution: {integrity: sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw==} + engines: {node: '>=12'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + svg-parser@2.0.4: + resolution: {integrity: sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==} + + svgo@3.3.2: + resolution: {integrity: sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==} + engines: {node: '>=14.0.0'} + hasBin: true + + symbol-tree@3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + + sync-fetch@0.6.0-2: + resolution: {integrity: sha512-c7AfkZ9udatCuAy9RSfiGPpeOKKUAUK5e1cXadLOGUjasdxqYqAK0jTNkM/FSEyJ3a5Ra27j/tw/PS0qLmaF/A==} + engines: {node: '>=18'} + + synckit@0.11.11: + resolution: {integrity: sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==} + engines: {node: ^14.18.0 || >=16.0.0} + + system-architecture@0.1.0: + resolution: {integrity: sha512-ulAk51I9UVUyJgxlv9M6lFot2WP3e7t8Kz9+IS6D4rVba1tR9kON+Ey69f+1R4Q8cd45Lod6a4IcJIxnzGc/zA==} + engines: {node: '>=18'} + + tabbable@6.2.0: + resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} + + tailwindcss@3.4.18: + resolution: {integrity: sha512-6A2rnmW5xZMdw11LYjhcI5846rt9pbLSabY5XPxo+XWdxwZaFEn47Go4NzFiHu9sNNmr/kXivP1vStfvMaK1GQ==} + engines: {node: '>=14.0.0'} + hasBin: true + + tar-fs@3.1.0: + resolution: {integrity: sha512-5Mty5y/sOF1YWj1J6GiBodjlDc05CUR8PKXrsnFAiSG0xA+GHeWLovaZPYUDXkH/1iKRf2+M5+OrRgzC7O9b7w==} + + tar-stream@3.1.7: + resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} + + text-decoder@1.2.3: + resolution: {integrity: sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==} + + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + + thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + + timeago.js@4.0.2: + resolution: {integrity: sha512-a7wPxPdVlQL7lqvitHGGRsofhdwtkoSXPGATFuSOA2i1ZNQEPLrGnj68vOp2sOJTCFAQVXPeNMX/GctBaO9L2w==} + + timeout-signal@2.0.0: + resolution: {integrity: sha512-YBGpG4bWsHoPvofT6y/5iqulfXIiIErl5B0LdtHT1mGXDFTAhhRrbUpTvBgYbovr+3cKblya2WAOcpoy90XguA==} + engines: {node: '>=16'} + + tiny-invariant@1.3.3: + resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} + + tinyexec@1.0.1: + resolution: {integrity: sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==} + + title@4.0.1: + resolution: {integrity: sha512-xRnPkJx9nvE5MF6LkB5e8QJjE2FW8269wTu/LQdf7zZqBgPly0QJPf/CWAo7srj5so4yXfoLEdCFgurlpi47zg==} + hasBin: true + + tldts-core@6.1.86: + resolution: {integrity: sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==} + + tldts@6.1.86: + resolution: {integrity: sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==} + hasBin: true + + to-object-path@0.3.0: + resolution: {integrity: sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==} + engines: {node: '>=0.10.0'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + totalist@3.0.1: + resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} + engines: {node: '>=6'} + + tough-cookie@5.1.2: + resolution: {integrity: sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==} + engines: {node: '>=16'} + + tr46@5.1.1: + resolution: {integrity: sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==} + engines: {node: '>=18'} + + trim-leading-lines@0.1.1: + resolution: {integrity: sha512-ViFS8blDWJN4Jg10fyZ+sIAfkSSAn5NiTVywc3kKtMWK3DZjaV7FV86oX3i9KY6/gqYkdka/UNeM2/NMGttiyA==} + engines: {node: '>=0.10.0'} + + trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + + trough@2.2.0: + resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} + + ts-api-utils@1.4.3: + resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==} + engines: {node: '>=16'} + peerDependencies: + typescript: '>=4.2.0' + + ts-dedent@2.2.0: + resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} + engines: {node: '>=6.10'} + + ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + tsx@4.20.6: + resolution: {integrity: sha512-ytQKuwgmrrkDTFP4LjR0ToE2nqgy886GpvRSpU0JAnrdBYppuY5rLkRUYPU1yCryb24SsKBTL/hlDQAEFVwtZg==} + engines: {node: '>=18.0.0'} + hasBin: true + + twoslash-protocol@0.2.12: + resolution: {integrity: sha512-5qZLXVYfZ9ABdjqbvPc4RWMr7PrpPaaDSeaYY55vl/w1j6H6kzsWK/urAEIXlzYlyrFmyz1UbwIt+AA0ck+wbg==} + + twoslash@0.2.12: + resolution: {integrity: sha512-tEHPASMqi7kqwfJbkk7hc/4EhlrKCSLcur+TcvYki3vhIfaRMXnXjaYFgXpoZRbT6GdprD4tGuVBEmTpUgLBsw==} + peerDependencies: + typescript: '*' + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + type-fest@3.13.1: + resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==} + engines: {node: '>=14.16'} + + typed-array-buffer@1.0.3: + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} + engines: {node: '>= 0.4'} + + typed-array-byte-length@1.0.3: + resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} + engines: {node: '>= 0.4'} + + typed-array-byte-offset@1.0.4: + resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} + engines: {node: '>= 0.4'} + + typed-array-length@1.0.7: + resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} + engines: {node: '>= 0.4'} + + typedarray@0.0.6: + resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} + + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + + ufo@1.6.1: + resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} + + unbox-primitive@1.1.0: + resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} + engines: {node: '>= 0.4'} + + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + + unicode-canonical-property-names-ecmascript@2.0.1: + resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==} + engines: {node: '>=4'} + + unicode-match-property-ecmascript@2.0.0: + resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} + engines: {node: '>=4'} + + unicode-match-property-value-ecmascript@2.2.0: + resolution: {integrity: sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==} + engines: {node: '>=4'} + + unicode-property-aliases-ecmascript@2.1.0: + resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} + engines: {node: '>=4'} + + unified-engine@11.2.2: + resolution: {integrity: sha512-15g/gWE7qQl9tQ3nAEbMd5h9HV1EACtFs6N9xaRBZICoCwnNGbal1kOs++ICf4aiTdItZxU2s/kYWhW7htlqJg==} + + unified-lint-rule@2.1.2: + resolution: {integrity: sha512-JWudPtRN7TLFHVLEVZ+Rm8FUb6kCAtHxEXFgBGDxRSdNMnGyTU5zyYvduHSF/liExlFB3vdFvsAHnNVE/UjAwA==} + + unified@10.1.2: + resolution: {integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==} + + unified@11.0.5: + resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} + + unist-util-find-after@5.0.0: + resolution: {integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==} + + unist-util-generated@2.0.1: + resolution: {integrity: sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==} + + unist-util-inspect@8.1.0: + resolution: {integrity: sha512-mOlg8Mp33pR0eeFpo5d2902ojqFFOKMMG2hF8bmH7ZlhnmjFgh0NI3/ZDwdaBJNbvrS7LZFVrBVtIE9KZ9s7vQ==} + + unist-util-is@5.2.1: + resolution: {integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==} + + unist-util-is@6.0.0: + resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} + + unist-util-modify-children@4.0.0: + resolution: {integrity: sha512-+tdN5fGNddvsQdIzUF3Xx82CU9sMM+fA0dLgR9vOmT0oPT2jH+P1nd5lSqfCfXAw+93NhcXNY2qqvTUtE4cQkw==} + + unist-util-position-from-estree@2.0.0: + resolution: {integrity: sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==} + + unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + + unist-util-remove-position@5.0.0: + resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==} + + unist-util-remove@4.0.0: + resolution: {integrity: sha512-b4gokeGId57UVRX/eVKej5gXqGlc9+trkORhFJpu9raqZkZhU0zm8Doi05+HaiBsMEIJowL+2WtQ5ItjsngPXg==} + + unist-util-stringify-position@3.0.3: + resolution: {integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==} + + unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + + unist-util-visit-children@3.0.0: + resolution: {integrity: sha512-RgmdTfSBOg04sdPcpTSD1jzoNBjt9a80/ZCzp5cI9n1qPzLZWF9YdvWGN2zmTumP1HWhXKdUWexjy/Wy/lJ7tA==} + + unist-util-visit-parents@4.1.1: + resolution: {integrity: sha512-1xAFJXAKpnnJl8G7K5KgU7FY55y3GcLIXqkzUj5QF/QVP7biUm0K0O2oqVkYsdjzJKifYeWn9+o6piAK2hGSHw==} + + unist-util-visit-parents@5.1.3: + resolution: {integrity: sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==} + + unist-util-visit-parents@6.0.1: + resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} + + unist-util-visit@3.1.0: + resolution: {integrity: sha512-Szoh+R/Ll68QWAyQyZZpQzZQm2UPbxibDvaY8Xc9SUtYgPsDzx5AWSk++UUt2hJuow8mvwR+rG+LQLw+KsuAKA==} + + unist-util-visit@4.1.2: + resolution: {integrity: sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==} + + unist-util-visit@5.0.0: + resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + + unixify@1.0.0: + resolution: {integrity: sha512-6bc58dPYhCMHHuwxldQxO3RRNZ4eCogZ/st++0+fcC1nr0jiGUtAdBJ2qzmLQWSxbtz42pWt4QQMiZ9HvZf5cg==} + engines: {node: '>=0.10.0'} + + update-browserslist-db@1.1.3: + resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + upper-case@2.0.2: + resolution: {integrity: sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==} + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + urlpattern-polyfill@10.1.0: + resolution: {integrity: sha512-IGjKp/o0NL3Bso1PymYURCJxMPNAf/ILOpendP9f5B6e1rTJgdgiOvgfoT8VxCAdY+Wisb9uhGaJJf3yZ2V9nw==} + + use-query-params@2.2.1: + resolution: {integrity: sha512-i6alcyLB8w9i3ZK3caNftdb+UnbfBRNPDnc89CNQWkGRmDrm/gfydHvMBfVsQJRq3NoHOM2dt/ceBWG2397v1Q==} + peerDependencies: + '@reach/router': ^1.2.1 + react: '>=16.8.0' + react-dom: '>=16.8.0' + react-router-dom: '>=5' + peerDependenciesMeta: + '@reach/router': + optional: true + react-router-dom: + optional: true + + use-sync-external-store@1.5.0: + resolution: {integrity: sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + uuid@11.1.0: + resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==} + hasBin: true + + uvu@0.5.6: + resolution: {integrity: sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==} + engines: {node: '>=8'} + hasBin: true + + validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + + validate-npm-package-name@5.0.1: + resolution: {integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + vfile-location@5.0.3: + resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} + + vfile-message@3.1.4: + resolution: {integrity: sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==} + + vfile-message@4.0.3: + resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==} + + vfile-reporter@8.1.1: + resolution: {integrity: sha512-qxRZcnFSQt6pWKn3PAk81yLK2rO2i7CDXpy8v8ZquiEOMLSnPw6BMSi9Y1sUCwGGl7a9b3CJT1CKpnRF7pp66g==} + + vfile-sort@4.0.0: + resolution: {integrity: sha512-lffPI1JrbHDTToJwcq0rl6rBmkjQmMuXkAxsZPRS9DXbaJQvc642eCg6EGxcX2i1L+esbuhq+2l9tBll5v8AeQ==} + + vfile-statistics@3.0.0: + resolution: {integrity: sha512-/qlwqwWBWFOmpXujL/20P+Iuydil0rZZNglR+VNm6J0gpLHwuVM5s7g2TfVoswbXjZ4HuIhLMySEyIw5i7/D8w==} + + vfile@5.3.7: + resolution: {integrity: sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==} + + vfile@6.0.3: + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + + vscode-jsonrpc@8.2.0: + resolution: {integrity: sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==} + engines: {node: '>=14.0.0'} + + vscode-languageserver-protocol@3.17.5: + resolution: {integrity: sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==} + + vscode-languageserver-textdocument@1.0.12: + resolution: {integrity: sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==} + + vscode-languageserver-types@3.17.5: + resolution: {integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==} + + vscode-languageserver@9.0.1: + resolution: {integrity: sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==} + hasBin: true + + vscode-uri@3.0.8: + resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==} + + w3c-keyname@2.2.8: + resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==} + + w3c-xmlserializer@5.0.0: + resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} + engines: {node: '>=18'} + + walk-up-path@3.0.1: + resolution: {integrity: sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA==} + + warning@4.0.3: + resolution: {integrity: sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==} + + web-namespaces@2.0.1: + resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} + + web-streams-polyfill@3.3.3: + resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} + engines: {node: '>= 8'} + + webidl-conversions@7.0.0: + resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} + engines: {node: '>=12'} + + webpack-bundle-analyzer@4.10.1: + resolution: {integrity: sha512-s3P7pgexgT/HTUSYgxJyn28A+99mmLq4HsJepMPzu0R8ImJc52QNqaFYW1Z2z2uIb1/J3eYgaAWVpaC+v/1aAQ==} + engines: {node: '>= 10.13.0'} + hasBin: true + + whatwg-encoding@3.1.1: + resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} + engines: {node: '>=18'} + + whatwg-mimetype@4.0.0: + resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} + engines: {node: '>=18'} + + whatwg-url@14.2.0: + resolution: {integrity: sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==} + engines: {node: '>=18'} + + which-boxed-primitive@1.1.1: + resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} + engines: {node: '>= 0.4'} + + which-builtin-type@1.2.1: + resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} + engines: {node: '>= 0.4'} + + which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} + + which-typed-array@1.1.19: + resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} + engines: {node: '>= 0.4'} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + which@4.0.0: + resolution: {integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==} + engines: {node: ^16.13.0 || >=18.0.0} + hasBin: true + + wicked-good-xpath@1.3.0: + resolution: {integrity: sha512-Gd9+TUn5nXdwj/hFsPVx5cuHHiF5Bwuc30jZ4+ronF1qHK5O7HD0sgmXWSEgwKquT3ClLoKPVbO6qGwVwLzvAw==} + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + ws@7.5.10: + resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + ws@8.18.3: + resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + xml-name-validator@5.0.0: + resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} + engines: {node: '>=18'} + + xml@1.0.1: + resolution: {integrity: sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==} + + xmlchars@2.2.0: + resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yaml@2.8.1: + resolution: {integrity: sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==} + engines: {node: '>= 14.6'} + hasBin: true + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + yocto-queue@1.2.1: + resolution: {integrity: sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==} + engines: {node: '>=12.20'} + + zod-validation-error@3.5.3: + resolution: {integrity: sha512-OT5Y8lbUadqVZCsnyFaTQ4/O2mys4tj7PqhdbBCp7McPwvIEKfPtdA6QfPeFQK2/Rz5LgwmAXRJTugBNBi0btw==} + engines: {node: '>=18.0.0'} + peerDependencies: + zod: ^3.25.0 || ^4.0.0 + + zod@3.25.76: + resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} + + zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + +snapshots: + + '@alloc/quick-lru@5.2.0': {} + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.30 + + '@antfu/install-pkg@1.1.0': + dependencies: + package-manager-detector: 1.3.0 + tinyexec: 1.0.1 + + '@antfu/utils@8.1.1': {} + + '@asamuzakjp/css-color@3.2.0': + dependencies: + '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + lru-cache: 10.4.3 + + '@babel/code-frame@7.27.1': + dependencies: + '@babel/helper-validator-identifier': 7.27.1 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.28.0': {} + + '@babel/core@7.28.3': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.3 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.3) + '@babel/helpers': 7.28.3 + '@babel/parser': 7.28.3 + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.3 + '@babel/types': 7.28.2 + convert-source-map: 2.0.0 + debug: 4.4.1 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.28.3': + dependencies: + '@babel/parser': 7.28.3 + '@babel/types': 7.28.2 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.30 + jsesc: 3.1.0 + + '@babel/helper-annotate-as-pure@7.27.3': + dependencies: + '@babel/types': 7.28.2 + + '@babel/helper-compilation-targets@7.27.2': + dependencies: + '@babel/compat-data': 7.28.0 + '@babel/helper-validator-option': 7.27.1 + browserslist: 4.25.3 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-create-class-features-plugin@7.28.3(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-member-expression-to-functions': 7.27.1 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.3) + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/traverse': 7.28.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/helper-create-regexp-features-plugin@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-annotate-as-pure': 7.27.3 + regexpu-core: 6.2.0 + semver: 6.3.1 + + '@babel/helper-define-polyfill-provider@0.6.5(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + debug: 4.4.1 + lodash.debounce: 4.0.8 + resolve: 1.22.10 + transitivePeerDependencies: + - supports-color + + '@babel/helper-globals@7.28.0': {} + + '@babel/helper-member-expression-to-functions@7.27.1': + dependencies: + '@babel/traverse': 7.28.3 + '@babel/types': 7.28.2 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-imports@7.27.1': + dependencies: + '@babel/traverse': 7.28.3 + '@babel/types': 7.28.2 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.28.3 + transitivePeerDependencies: + - supports-color + + '@babel/helper-optimise-call-expression@7.27.1': + dependencies: + '@babel/types': 7.28.2 + + '@babel/helper-plugin-utils@7.27.1': {} + + '@babel/helper-remap-async-to-generator@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-wrap-function': 7.28.3 + '@babel/traverse': 7.28.3 + transitivePeerDependencies: + - supports-color + + '@babel/helper-replace-supers@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-member-expression-to-functions': 7.27.1 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/traverse': 7.28.3 + transitivePeerDependencies: + - supports-color + + '@babel/helper-skip-transparent-expression-wrappers@7.27.1': + dependencies: + '@babel/traverse': 7.28.3 + '@babel/types': 7.28.2 + transitivePeerDependencies: + - supports-color + + '@babel/helper-string-parser@7.27.1': {} + + '@babel/helper-validator-identifier@7.27.1': {} + + '@babel/helper-validator-option@7.27.1': {} + + '@babel/helper-wrap-function@7.28.3': + dependencies: + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.3 + '@babel/types': 7.28.2 + transitivePeerDependencies: + - supports-color + + '@babel/helpers@7.28.3': + dependencies: + '@babel/template': 7.27.2 + '@babel/types': 7.28.2 + + '@babel/parser@7.28.3': + dependencies: + '@babel/types': 7.28.2 + + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/traverse': 7.28.3 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.28.3) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.28.3(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/traverse': 7.28.3 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + + '@babel/plugin-proposal-private-property-in-object@7.21.11(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.3) + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.28.3) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-syntax-import-assertions@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.3) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-arrow-functions@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-async-generator-functions@7.28.0(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.28.3) + '@babel/traverse': 7.28.3 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-async-to-generator@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.28.3) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-block-scoped-functions@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-block-scoping@7.28.0(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-class-properties@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.3) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-class-static-block@7.28.3(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.3) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-classes@7.28.3(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-globals': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.3) + '@babel/traverse': 7.28.3 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-computed-properties@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/template': 7.27.2 + + '@babel/plugin-transform-destructuring@7.28.0(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/traverse': 7.28.3 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-dotall-regex@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.3) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-duplicate-keys@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.3) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-dynamic-import@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-explicit-resource-management@7.28.0(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-destructuring': 7.28.0(@babel/core@7.28.3) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-exponentiation-operator@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-export-namespace-from@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-for-of@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-function-name@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/traverse': 7.28.3 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-json-strings@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-literals@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-logical-assignment-operators@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-member-expression-literals@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-modules-amd@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.3) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-commonjs@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.3) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-systemjs@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.3) + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.28.3 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-umd@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.3) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-named-capturing-groups-regex@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.3) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-new-target@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-nullish-coalescing-operator@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-numeric-separator@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-object-rest-spread@7.28.0(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-destructuring': 7.28.0(@babel/core@7.28.3) + '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.28.3) + '@babel/traverse': 7.28.3 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-object-super@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.3) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-optional-catch-binding@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-optional-chaining@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-parameters@7.27.7(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-private-methods@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.3) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-private-property-in-object@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.3) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-property-literals@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-react-constant-elements@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-react-display-name@7.28.0(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-react-jsx-development@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.28.3) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-react-jsx@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.3) + '@babel/types': 7.28.2 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-react-pure-annotations@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-regenerator@7.28.3(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-regexp-modifiers@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.3) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-reserved-words@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-shorthand-properties@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-spread@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-sticky-regex@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-template-literals@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-typeof-symbol@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-typescript@7.28.0(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.3) + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.3) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-unicode-escapes@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-unicode-property-regex@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.3) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-unicode-regex@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.3) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-unicode-sets-regex@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.3) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/preset-env@7.28.3(@babel/core@7.28.3)': + dependencies: + '@babel/compat-data': 7.28.0 + '@babel/core': 7.28.3 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-option': 7.27.1 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.28.3(@babel/core@7.28.3) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.3) + '@babel/plugin-syntax-import-assertions': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.28.3) + '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-async-generator-functions': 7.28.0(@babel/core@7.28.3) + '@babel/plugin-transform-async-to-generator': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-block-scoped-functions': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-block-scoping': 7.28.0(@babel/core@7.28.3) + '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-class-static-block': 7.28.3(@babel/core@7.28.3) + '@babel/plugin-transform-classes': 7.28.3(@babel/core@7.28.3) + '@babel/plugin-transform-computed-properties': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-destructuring': 7.28.0(@babel/core@7.28.3) + '@babel/plugin-transform-dotall-regex': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-duplicate-keys': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-dynamic-import': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-explicit-resource-management': 7.28.0(@babel/core@7.28.3) + '@babel/plugin-transform-exponentiation-operator': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-export-namespace-from': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-function-name': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-json-strings': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-literals': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-logical-assignment-operators': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-member-expression-literals': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-modules-amd': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-modules-systemjs': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-modules-umd': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-named-capturing-groups-regex': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-new-target': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-nullish-coalescing-operator': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-numeric-separator': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-object-rest-spread': 7.28.0(@babel/core@7.28.3) + '@babel/plugin-transform-object-super': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-optional-catch-binding': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.28.3) + '@babel/plugin-transform-private-methods': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-private-property-in-object': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-property-literals': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-regenerator': 7.28.3(@babel/core@7.28.3) + '@babel/plugin-transform-regexp-modifiers': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-reserved-words': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-spread': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-sticky-regex': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-typeof-symbol': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-unicode-escapes': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-unicode-property-regex': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-unicode-sets-regex': 7.27.1(@babel/core@7.28.3) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.28.3) + babel-plugin-polyfill-corejs2: 0.4.14(@babel/core@7.28.3) + babel-plugin-polyfill-corejs3: 0.13.0(@babel/core@7.28.3) + babel-plugin-polyfill-regenerator: 0.6.5(@babel/core@7.28.3) + core-js-compat: 3.45.1 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/types': 7.28.2 + esutils: 2.0.3 + + '@babel/preset-react@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-option': 7.27.1 + '@babel/plugin-transform-react-display-name': 7.28.0(@babel/core@7.28.3) + '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-react-jsx-development': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-react-pure-annotations': 7.27.1(@babel/core@7.28.3) + transitivePeerDependencies: + - supports-color + + '@babel/preset-typescript@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-option': 7.27.1 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-typescript': 7.28.0(@babel/core@7.28.3) + transitivePeerDependencies: + - supports-color + + '@babel/runtime@7.28.3': {} + + '@babel/runtime@7.28.4': {} + + '@babel/template@7.27.2': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/parser': 7.28.3 + '@babel/types': 7.28.2 + + '@babel/traverse@7.28.3': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.3 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.28.3 + '@babel/template': 7.27.2 + '@babel/types': 7.28.2 + debug: 4.4.1 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.28.2': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + + '@base-ui-components/react@1.0.0-beta.4(@types/react@18.3.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.28.4 + '@base-ui-components/utils': 0.1.2(@types/react@18.3.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@floating-ui/react-dom': 2.1.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@floating-ui/utils': 0.2.10 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + reselect: 5.1.1 + tabbable: 6.2.0 + use-sync-external-store: 1.5.0(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.26 + + '@base-ui-components/utils@0.1.2(@types/react@18.3.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.28.4 + '@floating-ui/utils': 0.2.10 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + reselect: 5.1.1 + use-sync-external-store: 1.5.0(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.26 + + '@braintree/sanitize-url@7.1.1': {} + + '@chevrotain/cst-dts-gen@11.0.3': + dependencies: + '@chevrotain/gast': 11.0.3 + '@chevrotain/types': 11.0.3 + lodash-es: 4.17.21 + + '@chevrotain/gast@11.0.3': + dependencies: + '@chevrotain/types': 11.0.3 + lodash-es: 4.17.21 + + '@chevrotain/regexp-to-ast@11.0.3': {} + + '@chevrotain/types@11.0.3': {} + + '@chevrotain/utils@11.0.3': {} + + '@codemirror/autocomplete@6.19.1': + dependencies: + '@codemirror/language': 6.11.3 + '@codemirror/state': 6.5.2 + '@codemirror/view': 6.38.6 + '@lezer/common': 1.3.0 + + '@codemirror/commands@6.10.0': + dependencies: + '@codemirror/language': 6.11.3 + '@codemirror/state': 6.5.2 + '@codemirror/view': 6.38.6 + '@lezer/common': 1.3.0 + + '@codemirror/language@6.11.3': + dependencies: + '@codemirror/state': 6.5.2 + '@codemirror/view': 6.38.6 + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.3 + '@lezer/lr': 1.4.2 + style-mod: 4.1.2 + + '@codemirror/lint@6.9.1': + dependencies: + '@codemirror/state': 6.5.2 + '@codemirror/view': 6.38.6 + crelt: 1.0.6 + + '@codemirror/state@6.5.2': + dependencies: + '@marijn/find-cluster-break': 1.0.2 + + '@codemirror/view@6.38.6': + dependencies: + '@codemirror/state': 6.5.2 + crelt: 1.0.6 + style-mod: 4.1.3 + w3c-keyname: 2.2.8 + + '@corex/deepmerge@4.0.43': {} + + '@csstools/color-helpers@5.1.0': {} + + '@csstools/css-calc@2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + + '@csstools/css-color-parser@3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/color-helpers': 5.1.0 + '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + + '@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/css-tokenizer': 3.0.4 + + '@csstools/css-tokenizer@3.0.4': {} + + '@discoveryjs/json-ext@0.5.7': {} + + '@emnapi/runtime@1.6.0': + dependencies: + tslib: 2.8.1 + optional: true + + '@envelop/core@5.3.0': + dependencies: + '@envelop/instrumentation': 1.0.0 + '@envelop/types': 5.2.1 + '@whatwg-node/promise-helpers': 1.3.2 + tslib: 2.8.1 + + '@envelop/instrumentation@1.0.0': + dependencies: + '@whatwg-node/promise-helpers': 1.3.2 + tslib: 2.8.1 + + '@envelop/types@5.2.1': + dependencies: + '@whatwg-node/promise-helpers': 1.3.2 + tslib: 2.8.1 + + '@esbuild/aix-ppc64@0.25.10': + optional: true + + '@esbuild/android-arm64@0.25.10': + optional: true + + '@esbuild/android-arm@0.25.10': + optional: true + + '@esbuild/android-x64@0.25.10': + optional: true + + '@esbuild/darwin-arm64@0.25.10': + optional: true + + '@esbuild/darwin-x64@0.25.10': + optional: true + + '@esbuild/freebsd-arm64@0.25.10': + optional: true + + '@esbuild/freebsd-x64@0.25.10': + optional: true + + '@esbuild/linux-arm64@0.25.10': + optional: true + + '@esbuild/linux-arm@0.25.10': + optional: true + + '@esbuild/linux-ia32@0.25.10': + optional: true + + '@esbuild/linux-loong64@0.25.10': + optional: true + + '@esbuild/linux-mips64el@0.25.10': + optional: true + + '@esbuild/linux-ppc64@0.25.10': + optional: true + + '@esbuild/linux-riscv64@0.25.10': + optional: true + + '@esbuild/linux-s390x@0.25.10': + optional: true + + '@esbuild/linux-x64@0.25.10': + optional: true + + '@esbuild/netbsd-arm64@0.25.10': + optional: true + + '@esbuild/netbsd-x64@0.25.10': + optional: true + + '@esbuild/openbsd-arm64@0.25.10': + optional: true + + '@esbuild/openbsd-x64@0.25.10': + optional: true + + '@esbuild/openharmony-arm64@0.25.10': + optional: true + + '@esbuild/sunos-x64@0.25.10': + optional: true + + '@esbuild/win32-arm64@0.25.10': + optional: true + + '@esbuild/win32-ia32@0.25.10': + optional: true + + '@esbuild/win32-x64@0.25.10': + optional: true + + '@eslint-community/eslint-utils@4.7.0(eslint@8.57.1)': + dependencies: + eslint: 8.57.1 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.1': {} + + '@eslint/eslintrc@2.1.4': + dependencies: + ajv: 6.12.6 + debug: 4.4.1 + espree: 9.6.1 + globals: 13.24.0 + ignore: 5.3.2 + import-fresh: 3.3.1 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@8.57.1': {} + + '@fastify/busboy@3.2.0': {} + + '@floating-ui/core@1.7.3': + dependencies: + '@floating-ui/utils': 0.2.10 + + '@floating-ui/dom@1.7.4': + dependencies: + '@floating-ui/core': 1.7.3 + '@floating-ui/utils': 0.2.10 + + '@floating-ui/react-dom@2.1.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@floating-ui/dom': 1.7.4 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@floating-ui/react@0.26.28(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@floating-ui/react-dom': 2.1.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@floating-ui/utils': 0.2.10 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + tabbable: 6.2.0 + + '@floating-ui/utils@0.2.10': {} + + '@formatjs/intl-localematcher@0.5.10': + dependencies: + tslib: 2.8.1 + + '@fortawesome/fontawesome-free@6.7.2': {} + + '@graphql-eslint/eslint-plugin@4.4.0(@types/node@22.18.13)(eslint@8.57.1)(graphql@16.10.0)(typescript@5.9.3)': + dependencies: + '@graphql-tools/code-file-loader': 8.1.22(graphql@16.10.0) + '@graphql-tools/graphql-tag-pluck': 8.3.21(graphql@16.10.0) + '@graphql-tools/utils': 10.9.1(graphql@16.10.0) + debug: 4.4.1 + eslint: 8.57.1 + fast-glob: 3.3.3 + graphql: 16.10.0 + graphql-config: 5.1.5(@types/node@22.18.13)(graphql@16.10.0)(typescript@5.9.3) + graphql-depth-limit: 1.1.0(graphql@16.10.0) + lodash.lowercase: 4.3.0 + transitivePeerDependencies: + - '@fastify/websocket' + - '@types/node' + - bufferutil + - cosmiconfig-toml-loader + - crossws + - supports-color + - typescript + - uWebSockets.js + - utf-8-validate + + '@graphql-hive/signal@1.0.0': {} + + '@graphql-tools/batch-execute@9.0.19(graphql@16.10.0)': + dependencies: + '@graphql-tools/utils': 10.9.1(graphql@16.10.0) + '@whatwg-node/promise-helpers': 1.3.2 + dataloader: 2.2.3 + graphql: 16.10.0 + tslib: 2.8.1 + + '@graphql-tools/code-file-loader@8.1.22(graphql@16.10.0)': + dependencies: + '@graphql-tools/graphql-tag-pluck': 8.3.21(graphql@16.10.0) + '@graphql-tools/utils': 10.9.1(graphql@16.10.0) + globby: 11.1.0 + graphql: 16.10.0 + tslib: 2.8.1 + unixify: 1.0.0 + transitivePeerDependencies: + - supports-color + + '@graphql-tools/delegate@10.2.23(graphql@16.10.0)': + dependencies: + '@graphql-tools/batch-execute': 9.0.19(graphql@16.10.0) + '@graphql-tools/executor': 1.4.9(graphql@16.10.0) + '@graphql-tools/schema': 10.0.26(graphql@16.10.0) + '@graphql-tools/utils': 10.9.1(graphql@16.10.0) + '@repeaterjs/repeater': 3.0.6 + '@whatwg-node/promise-helpers': 1.3.2 + dataloader: 2.2.3 + dset: 3.1.4 + graphql: 16.10.0 + tslib: 2.8.1 + + '@graphql-tools/executor-common@0.0.4(graphql@16.10.0)': + dependencies: + '@envelop/core': 5.3.0 + '@graphql-tools/utils': 10.9.1(graphql@16.10.0) + graphql: 16.10.0 + + '@graphql-tools/executor-common@0.0.6(graphql@16.10.0)': + dependencies: + '@envelop/core': 5.3.0 + '@graphql-tools/utils': 10.9.1(graphql@16.10.0) + graphql: 16.10.0 + + '@graphql-tools/executor-graphql-ws@2.0.7(graphql@16.10.0)': + dependencies: + '@graphql-tools/executor-common': 0.0.6(graphql@16.10.0) + '@graphql-tools/utils': 10.9.1(graphql@16.10.0) + '@whatwg-node/disposablestack': 0.0.6 + graphql: 16.10.0 + graphql-ws: 6.0.6(graphql@16.10.0)(ws@8.18.3) + isomorphic-ws: 5.0.0(ws@8.18.3) + tslib: 2.8.1 + ws: 8.18.3 + transitivePeerDependencies: + - '@fastify/websocket' + - bufferutil + - crossws + - uWebSockets.js + - utf-8-validate + + '@graphql-tools/executor-http@1.3.3(@types/node@22.18.13)(graphql@16.10.0)': + dependencies: + '@graphql-hive/signal': 1.0.0 + '@graphql-tools/executor-common': 0.0.4(graphql@16.10.0) + '@graphql-tools/utils': 10.9.1(graphql@16.10.0) + '@repeaterjs/repeater': 3.0.6 + '@whatwg-node/disposablestack': 0.0.6 + '@whatwg-node/fetch': 0.10.10 + '@whatwg-node/promise-helpers': 1.3.2 + graphql: 16.10.0 + meros: 1.3.1(@types/node@22.18.13) + tslib: 2.8.1 + transitivePeerDependencies: + - '@types/node' + + '@graphql-tools/executor-legacy-ws@1.1.19(graphql@16.10.0)': + dependencies: + '@graphql-tools/utils': 10.9.1(graphql@16.10.0) + '@types/ws': 8.18.1 + graphql: 16.10.0 + isomorphic-ws: 5.0.0(ws@8.18.3) + tslib: 2.8.1 + ws: 8.18.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@graphql-tools/executor@1.4.9(graphql@16.10.0)': + dependencies: + '@graphql-tools/utils': 10.9.1(graphql@16.10.0) + '@graphql-typed-document-node/core': 3.2.0(graphql@16.10.0) + '@repeaterjs/repeater': 3.0.6 + '@whatwg-node/disposablestack': 0.0.6 + '@whatwg-node/promise-helpers': 1.3.2 + graphql: 16.10.0 + tslib: 2.8.1 + + '@graphql-tools/graphql-file-loader@8.0.22(graphql@16.10.0)': + dependencies: + '@graphql-tools/import': 7.0.21(graphql@16.10.0) + '@graphql-tools/utils': 10.9.1(graphql@16.10.0) + globby: 11.1.0 + graphql: 16.10.0 + tslib: 2.8.1 + unixify: 1.0.0 + transitivePeerDependencies: + - supports-color + + '@graphql-tools/graphql-tag-pluck@8.3.21(graphql@16.10.0)': + dependencies: + '@babel/core': 7.28.3 + '@babel/parser': 7.28.3 + '@babel/plugin-syntax-import-assertions': 7.27.1(@babel/core@7.28.3) + '@babel/traverse': 7.28.3 + '@babel/types': 7.28.2 + '@graphql-tools/utils': 10.9.1(graphql@16.10.0) + graphql: 16.10.0 + tslib: 2.8.1 + transitivePeerDependencies: + - supports-color + + '@graphql-tools/import@7.0.21(graphql@16.10.0)': + dependencies: + '@graphql-tools/utils': 10.9.1(graphql@16.10.0) + '@theguild/federation-composition': 0.19.1(graphql@16.10.0) + graphql: 16.10.0 + resolve-from: 5.0.0 + tslib: 2.8.1 + transitivePeerDependencies: + - supports-color + + '@graphql-tools/json-file-loader@8.0.20(graphql@16.10.0)': + dependencies: + '@graphql-tools/utils': 10.9.1(graphql@16.10.0) + globby: 11.1.0 + graphql: 16.10.0 + tslib: 2.8.1 + unixify: 1.0.0 + + '@graphql-tools/load@8.1.2(graphql@16.10.0)': + dependencies: + '@graphql-tools/schema': 10.0.26(graphql@16.10.0) + '@graphql-tools/utils': 10.9.1(graphql@16.10.0) + graphql: 16.10.0 + p-limit: 3.1.0 + tslib: 2.8.1 + + '@graphql-tools/merge@9.1.1(graphql@16.10.0)': + dependencies: + '@graphql-tools/utils': 10.9.1(graphql@16.10.0) + graphql: 16.10.0 + tslib: 2.8.1 + + '@graphql-tools/merge@9.1.2(graphql@16.10.0)': + dependencies: + '@graphql-tools/utils': 10.10.0(graphql@16.10.0) + graphql: 16.10.0 + tslib: 2.8.1 + + '@graphql-tools/schema@10.0.26(graphql@16.10.0)': + dependencies: + '@graphql-tools/merge': 9.1.2(graphql@16.10.0) + '@graphql-tools/utils': 10.10.0(graphql@16.10.0) + graphql: 16.10.0 + tslib: 2.8.1 + + '@graphql-tools/url-loader@8.0.33(@types/node@22.18.13)(graphql@16.10.0)': + dependencies: + '@graphql-tools/executor-graphql-ws': 2.0.7(graphql@16.10.0) + '@graphql-tools/executor-http': 1.3.3(@types/node@22.18.13)(graphql@16.10.0) + '@graphql-tools/executor-legacy-ws': 1.1.19(graphql@16.10.0) + '@graphql-tools/utils': 10.9.1(graphql@16.10.0) + '@graphql-tools/wrap': 10.1.4(graphql@16.10.0) + '@types/ws': 8.18.1 + '@whatwg-node/fetch': 0.10.10 + '@whatwg-node/promise-helpers': 1.3.2 + graphql: 16.10.0 + isomorphic-ws: 5.0.0(ws@8.18.3) + sync-fetch: 0.6.0-2 + tslib: 2.8.1 + ws: 8.18.3 + transitivePeerDependencies: + - '@fastify/websocket' + - '@types/node' + - bufferutil + - crossws + - uWebSockets.js + - utf-8-validate + + '@graphql-tools/utils@10.10.0(graphql@16.10.0)': + dependencies: + '@graphql-typed-document-node/core': 3.2.0(graphql@16.10.0) + '@whatwg-node/promise-helpers': 1.3.2 + cross-inspect: 1.0.1 + dset: 3.1.4 + graphql: 16.10.0 + tslib: 2.8.1 + + '@graphql-tools/utils@10.9.1(graphql@16.10.0)': + dependencies: + '@graphql-typed-document-node/core': 3.2.0(graphql@16.10.0) + '@whatwg-node/promise-helpers': 1.3.2 + cross-inspect: 1.0.1 + dset: 3.1.4 + graphql: 16.10.0 + tslib: 2.8.1 + + '@graphql-tools/wrap@10.1.4(graphql@16.10.0)': + dependencies: + '@graphql-tools/delegate': 10.2.23(graphql@16.10.0) + '@graphql-tools/schema': 10.0.26(graphql@16.10.0) + '@graphql-tools/utils': 10.9.1(graphql@16.10.0) + '@whatwg-node/promise-helpers': 1.3.2 + graphql: 16.10.0 + tslib: 2.8.1 + + '@graphql-typed-document-node/core@3.2.0(graphql@16.10.0)': + dependencies: + graphql: 16.10.0 + + '@hasparus/lezer-json-shikified@1.1.3': + dependencies: + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.3 + '@lezer/lr': 1.4.2 + + '@headlessui/react@2.2.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@floating-ui/react': 0.26.28(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/focus': 3.21.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/interactions': 3.25.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tanstack/react-virtual': 3.13.12(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + use-sync-external-store: 1.5.0(react@18.3.1) + + '@humanwhocodes/config-array@0.13.0': + dependencies: + '@humanwhocodes/object-schema': 2.0.3 + debug: 4.4.1 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/object-schema@2.0.3': {} + + '@iconify/types@2.0.0': {} + + '@iconify/utils@2.3.0': + dependencies: + '@antfu/install-pkg': 1.1.0 + '@antfu/utils': 8.1.1 + '@iconify/types': 2.0.0 + debug: 4.4.1 + globals: 15.15.0 + kolorist: 1.8.0 + local-pkg: 1.1.2 + mlly: 1.7.4 + transitivePeerDependencies: + - supports-color + + '@igorkowalczyk/is-browser@5.1.0(tailwindcss@3.4.18(tsx@4.20.6)(yaml@2.8.1))': + dependencies: + tailwindcss: 3.4.18(tsx@4.20.6)(yaml@2.8.1) + + '@img/colour@1.0.0': {} + + '@img/sharp-darwin-arm64@0.34.4': + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.2.3 + optional: true + + '@img/sharp-darwin-x64@0.34.4': + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.2.3 + optional: true + + '@img/sharp-libvips-darwin-arm64@1.2.3': + optional: true + + '@img/sharp-libvips-darwin-x64@1.2.3': + optional: true + + '@img/sharp-libvips-linux-arm64@1.2.3': + optional: true + + '@img/sharp-libvips-linux-arm@1.2.3': + optional: true + + '@img/sharp-libvips-linux-ppc64@1.2.3': + optional: true + + '@img/sharp-libvips-linux-s390x@1.2.3': + optional: true + + '@img/sharp-libvips-linux-x64@1.2.3': + optional: true + + '@img/sharp-libvips-linuxmusl-arm64@1.2.3': + optional: true + + '@img/sharp-libvips-linuxmusl-x64@1.2.3': + optional: true + + '@img/sharp-linux-arm64@0.34.4': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.2.3 + optional: true + + '@img/sharp-linux-arm@0.34.4': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.2.3 + optional: true + + '@img/sharp-linux-ppc64@0.34.4': + optionalDependencies: + '@img/sharp-libvips-linux-ppc64': 1.2.3 + optional: true + + '@img/sharp-linux-s390x@0.34.4': + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.2.3 + optional: true + + '@img/sharp-linux-x64@0.34.4': + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.2.3 + optional: true + + '@img/sharp-linuxmusl-arm64@0.34.4': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.2.3 + optional: true + + '@img/sharp-linuxmusl-x64@0.34.4': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.2.3 + optional: true + + '@img/sharp-wasm32@0.34.4': + dependencies: + '@emnapi/runtime': 1.6.0 + optional: true + + '@img/sharp-win32-arm64@0.34.4': + optional: true + + '@img/sharp-win32-ia32@0.34.4': + optional: true + + '@img/sharp-win32-x64@0.34.4': + optional: true + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.2 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.30': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@lezer/common@1.2.3': {} + + '@lezer/common@1.3.0': {} + + '@lezer/highlight@1.2.3': + dependencies: + '@lezer/common': 1.3.0 + + '@lezer/lr@1.4.2': + dependencies: + '@lezer/common': 1.2.3 + + '@marijn/find-cluster-break@1.0.2': {} + + '@mdx-js/mdx@3.1.0(acorn@8.15.0)': + dependencies: + '@types/estree': 1.0.8 + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdx': 2.0.13 + collapse-white-space: 2.1.0 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + estree-util-scope: 1.0.0 + estree-walker: 3.0.3 + hast-util-to-jsx-runtime: 2.3.6 + markdown-extensions: 2.0.0 + recma-build-jsx: 1.0.0 + recma-jsx: 1.0.1(acorn@8.15.0) + recma-stringify: 1.0.0 + rehype-recma: 1.0.0 + remark-mdx: 3.1.0 + remark-parse: 11.0.0 + remark-rehype: 11.1.2 + source-map: 0.7.6 + unified: 11.0.5 + unist-util-position-from-estree: 2.0.0 + unist-util-stringify-position: 4.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + transitivePeerDependencies: + - acorn + - supports-color + + '@mdx-js/react@3.1.0(@types/react@18.3.26)(react@18.3.1)': + dependencies: + '@types/mdx': 2.0.13 + '@types/react': 18.3.26 + react: 18.3.1 + + '@mermaid-js/parser@0.6.2': + dependencies: + langium: 3.3.1 + + '@napi-rs/simple-git-android-arm-eabi@0.1.22': + optional: true + + '@napi-rs/simple-git-android-arm64@0.1.22': + optional: true + + '@napi-rs/simple-git-darwin-arm64@0.1.22': + optional: true + + '@napi-rs/simple-git-darwin-x64@0.1.22': + optional: true + + '@napi-rs/simple-git-freebsd-x64@0.1.22': + optional: true + + '@napi-rs/simple-git-linux-arm-gnueabihf@0.1.22': + optional: true + + '@napi-rs/simple-git-linux-arm64-gnu@0.1.22': + optional: true + + '@napi-rs/simple-git-linux-arm64-musl@0.1.22': + optional: true + + '@napi-rs/simple-git-linux-ppc64-gnu@0.1.22': + optional: true + + '@napi-rs/simple-git-linux-s390x-gnu@0.1.22': + optional: true + + '@napi-rs/simple-git-linux-x64-gnu@0.1.22': + optional: true + + '@napi-rs/simple-git-linux-x64-musl@0.1.22': + optional: true + + '@napi-rs/simple-git-win32-arm64-msvc@0.1.22': + optional: true + + '@napi-rs/simple-git-win32-ia32-msvc@0.1.22': + optional: true + + '@napi-rs/simple-git-win32-x64-msvc@0.1.22': + optional: true + + '@napi-rs/simple-git@0.1.22': + optionalDependencies: + '@napi-rs/simple-git-android-arm-eabi': 0.1.22 + '@napi-rs/simple-git-android-arm64': 0.1.22 + '@napi-rs/simple-git-darwin-arm64': 0.1.22 + '@napi-rs/simple-git-darwin-x64': 0.1.22 + '@napi-rs/simple-git-freebsd-x64': 0.1.22 + '@napi-rs/simple-git-linux-arm-gnueabihf': 0.1.22 + '@napi-rs/simple-git-linux-arm64-gnu': 0.1.22 + '@napi-rs/simple-git-linux-arm64-musl': 0.1.22 + '@napi-rs/simple-git-linux-ppc64-gnu': 0.1.22 + '@napi-rs/simple-git-linux-s390x-gnu': 0.1.22 + '@napi-rs/simple-git-linux-x64-gnu': 0.1.22 + '@napi-rs/simple-git-linux-x64-musl': 0.1.22 + '@napi-rs/simple-git-win32-arm64-msvc': 0.1.22 + '@napi-rs/simple-git-win32-ia32-msvc': 0.1.22 + '@napi-rs/simple-git-win32-x64-msvc': 0.1.22 + + '@next/bundle-analyzer@15.5.6': + dependencies: + webpack-bundle-analyzer: 4.10.1 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@next/env@13.5.11': {} + + '@next/env@14.2.33': {} + + '@next/eslint-plugin-next@15.5.6': + dependencies: + fast-glob: 3.3.1 + + '@next/swc-darwin-arm64@14.2.33': + optional: true + + '@next/swc-darwin-x64@14.2.33': + optional: true + + '@next/swc-linux-arm64-gnu@14.2.33': + optional: true + + '@next/swc-linux-arm64-musl@14.2.33': + optional: true + + '@next/swc-linux-x64-gnu@14.2.33': + optional: true + + '@next/swc-linux-x64-musl@14.2.33': + optional: true + + '@next/swc-win32-arm64-msvc@14.2.33': + optional: true + + '@next/swc-win32-ia32-msvc@14.2.33': + optional: true + + '@next/swc-win32-x64-msvc@14.2.33': + optional: true + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.19.1 + + '@npmcli/config@8.3.4': + dependencies: + '@npmcli/map-workspaces': 3.0.6 + '@npmcli/package-json': 5.2.1 + ci-info: 4.3.0 + ini: 4.1.3 + nopt: 7.2.1 + proc-log: 4.2.0 + semver: 7.7.2 + walk-up-path: 3.0.1 + transitivePeerDependencies: + - bluebird + + '@npmcli/git@5.0.8': + dependencies: + '@npmcli/promise-spawn': 7.0.2 + ini: 4.1.3 + lru-cache: 10.4.3 + npm-pick-manifest: 9.1.0 + proc-log: 4.2.0 + promise-inflight: 1.0.1 + promise-retry: 2.0.1 + semver: 7.7.2 + which: 4.0.0 + transitivePeerDependencies: + - bluebird + + '@npmcli/map-workspaces@3.0.6': + dependencies: + '@npmcli/name-from-folder': 2.0.0 + glob: 10.4.5 + minimatch: 9.0.5 + read-package-json-fast: 3.0.2 + + '@npmcli/name-from-folder@2.0.0': {} + + '@npmcli/package-json@5.2.1': + dependencies: + '@npmcli/git': 5.0.8 + glob: 10.4.5 + hosted-git-info: 7.0.2 + json-parse-even-better-errors: 3.0.2 + normalize-package-data: 6.0.2 + proc-log: 4.2.0 + semver: 7.7.2 + transitivePeerDependencies: + - bluebird + + '@npmcli/promise-spawn@7.0.2': + dependencies: + which: 4.0.0 + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@pkgr/core@0.2.9': {} + + '@plaiceholder/next@3.0.0(next@14.2.33(@babel/core@7.28.3)(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(plaiceholder@3.0.0(sharp@0.34.4))(sharp@0.34.4)': + dependencies: + next: 14.2.33(@babel/core@7.28.3)(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + plaiceholder: 3.0.0(sharp@0.34.4) + sharp: 0.34.4 + + '@playwright/test@1.55.0': + dependencies: + playwright: 1.55.0 + + '@polka/url@1.0.0-next.29': {} + + '@react-aria/focus@3.21.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@react-aria/interactions': 3.25.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/utils': 3.30.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-types/shared': 3.32.0(react@18.3.1) + '@swc/helpers': 0.5.17 + clsx: 2.1.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@react-aria/interactions@3.25.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@react-aria/ssr': 3.9.10(react@18.3.1) + '@react-aria/utils': 3.30.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-stately/flags': 3.1.2 + '@react-types/shared': 3.32.0(react@18.3.1) + '@swc/helpers': 0.5.17 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@react-aria/ssr@3.9.10(react@18.3.1)': + dependencies: + '@swc/helpers': 0.5.17 + react: 18.3.1 + + '@react-aria/utils@3.30.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@react-aria/ssr': 3.9.10(react@18.3.1) + '@react-stately/flags': 3.1.2 + '@react-stately/utils': 3.10.8(react@18.3.1) + '@react-types/shared': 3.32.0(react@18.3.1) + '@swc/helpers': 0.5.17 + clsx: 2.1.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@react-stately/flags@3.1.2': + dependencies: + '@swc/helpers': 0.5.17 + + '@react-stately/utils@3.10.8(react@18.3.1)': + dependencies: + '@swc/helpers': 0.5.17 + react: 18.3.1 + + '@react-types/shared@3.32.0(react@18.3.1)': + dependencies: + react: 18.3.1 + + '@repeaterjs/repeater@3.0.6': {} + + '@shikijs/core@1.29.2': + dependencies: + '@shikijs/engine-javascript': 1.29.2 + '@shikijs/engine-oniguruma': 1.29.2 + '@shikijs/types': 1.29.2 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.5 + + '@shikijs/engine-javascript@1.29.2': + dependencies: + '@shikijs/types': 1.29.2 + '@shikijs/vscode-textmate': 10.0.2 + oniguruma-to-es: 2.3.0 + + '@shikijs/engine-oniguruma@1.29.2': + dependencies: + '@shikijs/types': 1.29.2 + '@shikijs/vscode-textmate': 10.0.2 + + '@shikijs/langs@1.29.2': + dependencies: + '@shikijs/types': 1.29.2 + + '@shikijs/themes@1.29.2': + dependencies: + '@shikijs/types': 1.29.2 + + '@shikijs/twoslash@1.29.2(typescript@5.9.3)': + dependencies: + '@shikijs/core': 1.29.2 + '@shikijs/types': 1.29.2 + twoslash: 0.2.12(typescript@5.9.3) + transitivePeerDependencies: + - supports-color + - typescript + + '@shikijs/types@1.29.2': + dependencies: + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + + '@shikijs/vscode-textmate@10.0.2': {} + + '@sparticuz/chromium@138.0.2': + dependencies: + follow-redirects: 1.15.11 + tar-fs: 3.1.0 + transitivePeerDependencies: + - bare-buffer + - debug + + '@svgr/babel-plugin-add-jsx-attribute@8.0.0(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + + '@svgr/babel-plugin-remove-jsx-attribute@8.0.0(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + + '@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + + '@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + + '@svgr/babel-plugin-svg-dynamic-title@8.0.0(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + + '@svgr/babel-plugin-svg-em-dimensions@8.0.0(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + + '@svgr/babel-plugin-transform-react-native-svg@8.1.0(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + + '@svgr/babel-plugin-transform-svg-component@8.0.0(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + + '@svgr/babel-preset@8.1.0(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@svgr/babel-plugin-add-jsx-attribute': 8.0.0(@babel/core@7.28.3) + '@svgr/babel-plugin-remove-jsx-attribute': 8.0.0(@babel/core@7.28.3) + '@svgr/babel-plugin-remove-jsx-empty-expression': 8.0.0(@babel/core@7.28.3) + '@svgr/babel-plugin-replace-jsx-attribute-value': 8.0.0(@babel/core@7.28.3) + '@svgr/babel-plugin-svg-dynamic-title': 8.0.0(@babel/core@7.28.3) + '@svgr/babel-plugin-svg-em-dimensions': 8.0.0(@babel/core@7.28.3) + '@svgr/babel-plugin-transform-react-native-svg': 8.1.0(@babel/core@7.28.3) + '@svgr/babel-plugin-transform-svg-component': 8.0.0(@babel/core@7.28.3) + + '@svgr/core@8.1.0(typescript@5.9.3)': + dependencies: + '@babel/core': 7.28.3 + '@svgr/babel-preset': 8.1.0(@babel/core@7.28.3) + camelcase: 6.3.0 + cosmiconfig: 8.3.6(typescript@5.9.3) + snake-case: 3.0.4 + transitivePeerDependencies: + - supports-color + - typescript + + '@svgr/hast-util-to-babel-ast@8.0.0': + dependencies: + '@babel/types': 7.28.2 + entities: 4.5.0 + + '@svgr/plugin-jsx@8.1.0(@svgr/core@8.1.0(typescript@5.9.3))': + dependencies: + '@babel/core': 7.28.3 + '@svgr/babel-preset': 8.1.0(@babel/core@7.28.3) + '@svgr/core': 8.1.0(typescript@5.9.3) + '@svgr/hast-util-to-babel-ast': 8.0.0 + svg-parser: 2.0.4 + transitivePeerDependencies: + - supports-color + + '@svgr/plugin-svgo@8.1.0(@svgr/core@8.1.0(typescript@5.9.3))(typescript@5.9.3)': + dependencies: + '@svgr/core': 8.1.0(typescript@5.9.3) + cosmiconfig: 8.3.6(typescript@5.9.3) + deepmerge: 4.3.1 + svgo: 3.3.2 + transitivePeerDependencies: + - typescript + + '@svgr/webpack@8.1.0(typescript@5.9.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/plugin-transform-react-constant-elements': 7.27.1(@babel/core@7.28.3) + '@babel/preset-env': 7.28.3(@babel/core@7.28.3) + '@babel/preset-react': 7.27.1(@babel/core@7.28.3) + '@babel/preset-typescript': 7.27.1(@babel/core@7.28.3) + '@svgr/core': 8.1.0(typescript@5.9.3) + '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0(typescript@5.9.3)) + '@svgr/plugin-svgo': 8.1.0(@svgr/core@8.1.0(typescript@5.9.3))(typescript@5.9.3) + transitivePeerDependencies: + - supports-color + - typescript + + '@swc/counter@0.1.3': {} + + '@swc/helpers@0.5.17': + dependencies: + tslib: 2.8.1 + + '@swc/helpers@0.5.5': + dependencies: + '@swc/counter': 0.1.3 + tslib: 2.8.1 + + '@tailwindcss/container-queries@0.1.1(tailwindcss@3.4.18(tsx@4.20.6)(yaml@2.8.1))': + dependencies: + tailwindcss: 3.4.18(tsx@4.20.6)(yaml@2.8.1) + + '@tailwindcss/nesting@0.0.0-insiders.565cd3e(postcss@8.5.6)': + dependencies: + postcss: 8.5.6 + postcss-nested: 5.0.6(postcss@8.5.6) + + '@tailwindcss/typography@0.5.19(tailwindcss@3.4.18(tsx@4.20.6)(yaml@2.8.1))': + dependencies: + postcss-selector-parser: 6.0.10 + tailwindcss: 3.4.18(tsx@4.20.6)(yaml@2.8.1) + + '@tanstack/react-virtual@3.13.12(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@tanstack/virtual-core': 3.13.12 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@tanstack/virtual-core@3.13.12': {} + + '@testing-library/dom@10.4.1': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/runtime': 7.28.4 + '@types/aria-query': 5.0.4 + aria-query: 5.3.0 + dom-accessibility-api: 0.5.16 + lz-string: 1.5.0 + picocolors: 1.1.1 + pretty-format: 27.5.1 + + '@testing-library/react@16.3.0(@testing-library/dom@10.4.1)(@types/react@18.3.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.28.3 + '@testing-library/dom': 10.4.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.26 + + '@theguild/federation-composition@0.19.1(graphql@16.10.0)': + dependencies: + constant-case: 3.0.4 + debug: 4.4.1 + graphql: 16.10.0 + json5: 2.2.3 + lodash.sortby: 4.7.0 + transitivePeerDependencies: + - supports-color + + '@theguild/remark-mermaid@0.1.3(react@18.3.1)': + dependencies: + mermaid: 11.10.0 + react: 18.3.1 + unist-util-visit: 5.0.0 + transitivePeerDependencies: + - supports-color + + '@theguild/remark-npm2yarn@0.3.3': + dependencies: + npm-to-yarn: 3.0.1 + unist-util-visit: 5.0.0 + + '@trysound/sax@0.2.0': {} + + '@types/aria-query@5.0.4': {} + + '@types/codemirror@5.60.17': + dependencies: + '@types/tern': 0.23.9 + + '@types/concat-stream@2.0.3': + dependencies: + '@types/node': 22.18.13 + + '@types/d3-array@3.2.1': {} + + '@types/d3-axis@3.0.6': + dependencies: + '@types/d3-selection': 3.0.11 + + '@types/d3-brush@3.0.6': + dependencies: + '@types/d3-selection': 3.0.11 + + '@types/d3-chord@3.0.6': {} + + '@types/d3-color@3.1.3': {} + + '@types/d3-contour@3.0.6': + dependencies: + '@types/d3-array': 3.2.1 + '@types/geojson': 7946.0.16 + + '@types/d3-delaunay@6.0.4': {} + + '@types/d3-dispatch@3.0.7': {} + + '@types/d3-drag@3.0.7': + dependencies: + '@types/d3-selection': 3.0.11 + + '@types/d3-dsv@3.0.7': {} + + '@types/d3-ease@3.0.2': {} + + '@types/d3-fetch@3.0.7': + dependencies: + '@types/d3-dsv': 3.0.7 + + '@types/d3-force@3.0.10': {} + + '@types/d3-format@3.0.4': {} + + '@types/d3-geo@3.1.0': + dependencies: + '@types/geojson': 7946.0.16 + + '@types/d3-hierarchy@3.1.7': {} + + '@types/d3-interpolate@3.0.4': + dependencies: + '@types/d3-color': 3.1.3 + + '@types/d3-path@3.1.1': {} + + '@types/d3-polygon@3.0.2': {} + + '@types/d3-quadtree@3.0.6': {} + + '@types/d3-random@3.0.3': {} + + '@types/d3-scale-chromatic@3.1.0': {} + + '@types/d3-scale@4.0.9': + dependencies: + '@types/d3-time': 3.0.4 + + '@types/d3-selection@3.0.11': {} + + '@types/d3-shape@3.1.7': + dependencies: + '@types/d3-path': 3.1.1 + + '@types/d3-time-format@4.0.3': {} + + '@types/d3-time@3.0.4': {} + + '@types/d3-timer@3.0.2': {} + + '@types/d3-transition@3.0.9': + dependencies: + '@types/d3-selection': 3.0.11 + + '@types/d3-zoom@3.0.8': + dependencies: + '@types/d3-interpolate': 3.0.4 + '@types/d3-selection': 3.0.11 + + '@types/d3@7.4.3': + dependencies: + '@types/d3-array': 3.2.1 + '@types/d3-axis': 3.0.6 + '@types/d3-brush': 3.0.6 + '@types/d3-chord': 3.0.6 + '@types/d3-color': 3.1.3 + '@types/d3-contour': 3.0.6 + '@types/d3-delaunay': 6.0.4 + '@types/d3-dispatch': 3.0.7 + '@types/d3-drag': 3.0.7 + '@types/d3-dsv': 3.0.7 + '@types/d3-ease': 3.0.2 + '@types/d3-fetch': 3.0.7 + '@types/d3-force': 3.0.10 + '@types/d3-format': 3.0.4 + '@types/d3-geo': 3.1.0 + '@types/d3-hierarchy': 3.1.7 + '@types/d3-interpolate': 3.0.4 + '@types/d3-path': 3.1.1 + '@types/d3-polygon': 3.0.2 + '@types/d3-quadtree': 3.0.6 + '@types/d3-random': 3.0.3 + '@types/d3-scale': 4.0.9 + '@types/d3-scale-chromatic': 3.1.0 + '@types/d3-selection': 3.0.11 + '@types/d3-shape': 3.1.7 + '@types/d3-time': 3.0.4 + '@types/d3-time-format': 4.0.3 + '@types/d3-timer': 3.0.2 + '@types/d3-transition': 3.0.9 + '@types/d3-zoom': 3.0.8 + + '@types/debug@4.1.12': + dependencies: + '@types/ms': 2.1.0 + + '@types/estree-jsx@1.0.5': + dependencies: + '@types/estree': 1.0.8 + + '@types/estree@1.0.8': {} + + '@types/geojson@7946.0.16': {} + + '@types/hast@3.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/is-empty@1.2.3': {} + + '@types/jsdom@21.1.7': + dependencies: + '@types/node': 22.18.13 + '@types/tough-cookie': 4.0.5 + parse5: 7.3.0 + + '@types/katex@0.16.7': {} + + '@types/lodash-es@4.17.12': + dependencies: + '@types/lodash': 4.17.20 + + '@types/lodash@4.17.20': {} + + '@types/mdast@3.0.15': + dependencies: + '@types/unist': 2.0.11 + + '@types/mdast@4.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/mdx@2.0.13': {} + + '@types/ms@2.1.0': {} + + '@types/nlcst@2.0.3': + dependencies: + '@types/unist': 3.0.3 + + '@types/node@22.18.13': + dependencies: + undici-types: 6.21.0 + + '@types/prop-types@15.7.15': {} + + '@types/react@18.3.26': + dependencies: + '@types/prop-types': 15.7.15 + csstype: 3.1.3 + + '@types/rss@0.0.32': {} + + '@types/string-similarity@4.0.2': {} + + '@types/supports-color@8.1.3': {} + + '@types/tern@0.23.9': + dependencies: + '@types/estree': 1.0.8 + + '@types/tough-cookie@4.0.5': {} + + '@types/trusted-types@2.0.7': + optional: true + + '@types/unist@2.0.11': {} + + '@types/unist@3.0.3': {} + + '@types/ws@8.18.1': + dependencies: + '@types/node': 22.18.13 + + '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3)': + dependencies: + '@eslint-community/regexpp': 4.12.1 + '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/scope-manager': 7.18.0 + '@typescript-eslint/type-utils': 7.18.0(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 7.18.0 + eslint: 8.57.1 + graphemer: 1.4.0 + ignore: 5.3.2 + natural-compare: 1.4.0 + ts-api-utils: 1.4.3(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.3)': + dependencies: + '@typescript-eslint/scope-manager': 7.18.0 + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 7.18.0 + debug: 4.4.1 + eslint: 8.57.1 + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@7.18.0': + dependencies: + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/visitor-keys': 7.18.0 + + '@typescript-eslint/type-utils@7.18.0(eslint@8.57.1)(typescript@5.9.3)': + dependencies: + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.9.3) + '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.9.3) + debug: 4.4.1 + eslint: 8.57.1 + ts-api-utils: 1.4.3(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@7.18.0': {} + + '@typescript-eslint/typescript-estree@7.18.0(typescript@5.9.3)': + dependencies: + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/visitor-keys': 7.18.0 + debug: 4.4.1 + globby: 11.1.0 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.7.2 + ts-api-utils: 1.4.3(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@7.18.0(eslint@8.57.1)(typescript@5.9.3)': + dependencies: + '@eslint-community/eslint-utils': 4.7.0(eslint@8.57.1) + '@typescript-eslint/scope-manager': 7.18.0 + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.9.3) + eslint: 8.57.1 + transitivePeerDependencies: + - supports-color + - typescript + + '@typescript-eslint/visitor-keys@7.18.0': + dependencies: + '@typescript-eslint/types': 7.18.0 + eslint-visitor-keys: 3.4.3 + + '@typescript/vfs@1.6.1(typescript@5.9.3)': + dependencies: + debug: 4.4.1 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@ungap/structured-clone@1.3.0': {} + + '@whatwg-node/disposablestack@0.0.6': + dependencies: + '@whatwg-node/promise-helpers': 1.3.2 + tslib: 2.8.1 + + '@whatwg-node/fetch@0.10.10': + dependencies: + '@whatwg-node/node-fetch': 0.7.25 + urlpattern-polyfill: 10.1.0 + + '@whatwg-node/node-fetch@0.7.25': + dependencies: + '@fastify/busboy': 3.2.0 + '@whatwg-node/disposablestack': 0.0.6 + '@whatwg-node/promise-helpers': 1.3.2 + tslib: 2.8.1 + + '@whatwg-node/promise-helpers@1.3.2': + dependencies: + tslib: 2.8.1 + + '@xmldom/xmldom@0.9.8': {} + + abbrev@2.0.0: {} + + acorn-jsx@5.3.2(acorn@8.15.0): + dependencies: + acorn: 8.15.0 + + acorn-walk@8.3.4: + dependencies: + acorn: 8.15.0 + + acorn@8.15.0: {} + + agent-base@7.1.4: {} + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ansi-regex@5.0.1: {} + + ansi-regex@6.2.0: {} + + ansi-regex@6.2.2: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@5.2.0: {} + + ansi-styles@6.2.3: {} + + any-promise@1.3.0: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + arg@5.0.2: {} + + argparse@1.0.10: + dependencies: + sprintf-js: 1.0.3 + + argparse@2.0.1: {} + + aria-query@5.3.0: + dependencies: + dequal: 2.0.3 + + array-buffer-byte-length@1.0.2: + dependencies: + call-bound: 1.0.4 + is-array-buffer: 3.0.5 + + array-includes@3.1.9: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + is-string: 1.1.1 + math-intrinsics: 1.1.0 + + array-iterate@2.0.1: {} + + array-union@2.1.0: {} + + array.prototype.findlast@1.2.5: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-shim-unscopables: 1.1.0 + + array.prototype.flat@1.3.3: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-shim-unscopables: 1.1.0 + + array.prototype.flatmap@1.3.3: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-shim-unscopables: 1.1.0 + + array.prototype.tosorted@1.1.4: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-errors: 1.3.0 + es-shim-unscopables: 1.1.0 + + arraybuffer.prototype.slice@1.0.4: + dependencies: + array-buffer-byte-length: 1.0.2 + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + is-array-buffer: 3.0.5 + + arrify@1.0.1: {} + + astring@1.9.0: {} + + async-function@1.0.0: {} + + autoprefixer@10.4.21(postcss@8.5.6): + dependencies: + browserslist: 4.25.3 + caniuse-lite: 1.0.30001736 + fraction.js: 4.3.7 + normalize-range: 0.1.2 + picocolors: 1.1.1 + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + available-typed-arrays@1.0.7: + dependencies: + possible-typed-array-names: 1.1.0 + + b4a@1.6.7: {} + + babel-plugin-polyfill-corejs2@0.4.14(@babel/core@7.28.3): + dependencies: + '@babel/compat-data': 7.28.0 + '@babel/core': 7.28.3 + '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.3) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + babel-plugin-polyfill-corejs3@0.13.0(@babel/core@7.28.3): + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.3) + core-js-compat: 3.45.1 + transitivePeerDependencies: + - supports-color + + babel-plugin-polyfill-regenerator@0.6.5(@babel/core@7.28.3): + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.3) + transitivePeerDependencies: + - supports-color + + bail@2.0.2: {} + + balanced-match@1.0.2: {} + + bare-events@2.6.1: + optional: true + + bare-fs@4.2.1: + dependencies: + bare-events: 2.6.1 + bare-path: 3.0.0 + bare-stream: 2.7.0(bare-events@2.6.1) + optional: true + + bare-os@3.6.2: + optional: true + + bare-path@3.0.0: + dependencies: + bare-os: 3.6.2 + optional: true + + bare-stream@2.7.0(bare-events@2.6.1): + dependencies: + streamx: 2.22.1 + optionalDependencies: + bare-events: 2.6.1 + optional: true + + better-react-mathjax@2.3.0(react@18.3.1): + dependencies: + mathjax-full: 3.2.2 + react: 18.3.1 + + bignumber.js@9.3.1: {} + + binary-extensions@2.3.0: {} + + boolbase@1.0.0: {} + + brace-expansion@1.1.12: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.2: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + browserslist@4.25.3: + dependencies: + caniuse-lite: 1.0.30001736 + electron-to-chromium: 1.5.207 + node-releases: 2.0.19 + update-browserslist-db: 1.1.3(browserslist@4.25.3) + + buffer-from@1.1.2: {} + + busboy@1.6.0: + dependencies: + streamsearch: 1.1.0 + + calendar-link@2.11.0: + dependencies: + dayjs: 1.11.13 + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bind@1.0.8: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + get-intrinsic: 1.3.0 + set-function-length: 1.2.2 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + + callsites@3.1.0: {} + + camelcase-css@2.0.1: {} + + camelcase@6.3.0: {} + + caniuse-lite@1.0.30001736: {} + + caniuse-lite@1.0.30001751: {} + + ccount@2.0.1: {} + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + chalk@5.6.0: {} + + character-entities-html4@2.1.0: {} + + character-entities-legacy@3.0.0: {} + + character-entities@2.0.2: {} + + character-reference-invalid@2.0.1: {} + + chevrotain-allstar@0.3.1(chevrotain@11.0.3): + dependencies: + chevrotain: 11.0.3 + lodash-es: 4.17.21 + + chevrotain@11.0.3: + dependencies: + '@chevrotain/cst-dts-gen': 11.0.3 + '@chevrotain/gast': 11.0.3 + '@chevrotain/regexp-to-ast': 11.0.3 + '@chevrotain/types': 11.0.3 + '@chevrotain/utils': 11.0.3 + lodash-es: 4.17.21 + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + ci-info@4.3.0: {} + + client-only@0.0.1: {} + + clipboardy@4.0.0: + dependencies: + execa: 8.0.1 + is-wsl: 3.1.0 + is64bit: 2.0.0 + + clone-deep@4.0.1: + dependencies: + is-plain-object: 2.0.4 + kind-of: 6.0.3 + shallow-clone: 3.0.1 + + clsx@2.1.1: {} + + cm6-graphql@0.2.1(@codemirror/autocomplete@6.19.1)(@codemirror/language@6.11.3)(@codemirror/lint@6.9.1)(@codemirror/state@6.5.2)(@codemirror/view@6.38.6)(@lezer/highlight@1.2.3)(graphql@16.10.0): + dependencies: + '@codemirror/autocomplete': 6.19.1 + '@codemirror/language': 6.11.3 + '@codemirror/lint': 6.9.1 + '@codemirror/state': 6.5.2 + '@codemirror/view': 6.38.6 + '@lezer/highlight': 1.2.3 + graphql: 16.10.0 + graphql-language-service: 5.5.0(graphql@16.10.0) + + codsen-utils@1.6.19: + dependencies: + rfdc: 1.4.1 + + collapse-white-space@2.1.0: {} + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + comma-separated-tokens@2.0.3: {} + + commander@13.1.0: {} + + commander@4.1.1: {} + + commander@7.2.0: {} + + commander@8.3.0: {} + + compute-scroll-into-view@3.1.1: {} + + concat-map@0.0.1: {} + + concat-stream@2.0.0: + dependencies: + buffer-from: 1.1.2 + inherits: 2.0.4 + readable-stream: 3.6.2 + typedarray: 0.0.6 + + confbox@0.1.8: {} + + confbox@0.2.2: {} + + constant-case@3.0.4: + dependencies: + no-case: 3.0.4 + tslib: 2.8.1 + upper-case: 2.0.2 + + convert-source-map@2.0.0: {} + + copy-anything@2.0.6: + dependencies: + is-what: 3.14.1 + + core-js-compat@3.45.1: + dependencies: + browserslist: 4.25.3 + + cose-base@1.0.3: + dependencies: + layout-base: 1.0.2 + + cose-base@2.2.0: + dependencies: + layout-base: 2.0.1 + + cosmiconfig@8.3.6(typescript@5.9.3): + dependencies: + import-fresh: 3.3.1 + js-yaml: 4.1.0 + parse-json: 5.2.0 + path-type: 4.0.0 + optionalDependencies: + typescript: 5.9.3 + + crelt@1.0.6: {} + + cross-inspect@1.0.1: + dependencies: + tslib: 2.8.1 + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + css-select@5.2.2: + dependencies: + boolbase: 1.0.0 + css-what: 6.2.2 + domhandler: 5.0.3 + domutils: 3.2.2 + nth-check: 2.1.1 + + css-tree@2.2.1: + dependencies: + mdn-data: 2.0.28 + source-map-js: 1.2.1 + + css-tree@2.3.1: + dependencies: + mdn-data: 2.0.30 + source-map-js: 1.2.1 + + css-what@6.2.2: {} + + cssesc@3.0.0: {} + + csso@5.0.5: + dependencies: + css-tree: 2.2.1 + + cssstyle@4.6.0: + dependencies: + '@asamuzakjp/css-color': 3.2.0 + rrweb-cssom: 0.8.0 + + csstype@3.1.3: {} + + cytoscape-cose-bilkent@4.1.0(cytoscape@3.33.1): + dependencies: + cose-base: 1.0.3 + cytoscape: 3.33.1 + + cytoscape-fcose@2.2.0(cytoscape@3.33.1): + dependencies: + cose-base: 2.2.0 + cytoscape: 3.33.1 + + cytoscape@3.33.1: {} + + d3-array@2.12.1: + dependencies: + internmap: 1.0.1 + + d3-array@3.2.4: + dependencies: + internmap: 2.0.3 + + d3-axis@3.0.0: {} + + d3-brush@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-transition: 3.0.1(d3-selection@3.0.0) + + d3-chord@3.0.1: + dependencies: + d3-path: 3.1.0 + + d3-color@3.1.0: {} + + d3-contour@4.0.2: + dependencies: + d3-array: 3.2.4 + + d3-delaunay@6.0.4: + dependencies: + delaunator: 5.0.1 + + d3-dispatch@3.0.1: {} + + d3-drag@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-selection: 3.0.0 + + d3-dsv@3.0.1: + dependencies: + commander: 7.2.0 + iconv-lite: 0.6.3 + rw: 1.3.3 + + d3-ease@3.0.1: {} + + d3-fetch@3.0.1: + dependencies: + d3-dsv: 3.0.1 + + d3-force@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-quadtree: 3.0.1 + d3-timer: 3.0.1 + + d3-format@3.1.0: {} + + d3-geo@3.1.1: + dependencies: + d3-array: 3.2.4 + + d3-hierarchy@3.1.2: {} + + d3-interpolate@3.0.1: + dependencies: + d3-color: 3.1.0 + + d3-path@1.0.9: {} + + d3-path@3.1.0: {} + + d3-polygon@3.0.1: {} + + d3-quadtree@3.0.1: {} + + d3-random@3.0.1: {} + + d3-sankey@0.12.3: + dependencies: + d3-array: 2.12.1 + d3-shape: 1.3.7 + + d3-scale-chromatic@3.1.0: + dependencies: + d3-color: 3.1.0 + d3-interpolate: 3.0.1 + + d3-scale@4.0.2: + dependencies: + d3-array: 3.2.4 + d3-format: 3.1.0 + d3-interpolate: 3.0.1 + d3-time: 3.1.0 + d3-time-format: 4.1.0 + + d3-selection@3.0.0: {} + + d3-shape@1.3.7: + dependencies: + d3-path: 1.0.9 + + d3-shape@3.2.0: + dependencies: + d3-path: 3.1.0 + + d3-time-format@4.1.0: + dependencies: + d3-time: 3.1.0 + + d3-time@3.1.0: + dependencies: + d3-array: 3.2.4 + + d3-timer@3.0.1: {} + + d3-transition@3.0.1(d3-selection@3.0.0): + dependencies: + d3-color: 3.1.0 + d3-dispatch: 3.0.1 + d3-ease: 3.0.1 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-timer: 3.0.1 + + d3-zoom@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-transition: 3.0.1(d3-selection@3.0.0) + + d3@7.9.0: + dependencies: + d3-array: 3.2.4 + d3-axis: 3.0.0 + d3-brush: 3.0.0 + d3-chord: 3.0.1 + d3-color: 3.1.0 + d3-contour: 4.0.2 + d3-delaunay: 6.0.4 + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-dsv: 3.0.1 + d3-ease: 3.0.1 + d3-fetch: 3.0.1 + d3-force: 3.0.0 + d3-format: 3.1.0 + d3-geo: 3.1.1 + d3-hierarchy: 3.1.2 + d3-interpolate: 3.0.1 + d3-path: 3.1.0 + d3-polygon: 3.0.1 + d3-quadtree: 3.0.1 + d3-random: 3.0.1 + d3-scale: 4.0.2 + d3-scale-chromatic: 3.1.0 + d3-selection: 3.0.0 + d3-shape: 3.2.0 + d3-time: 3.1.0 + d3-time-format: 4.1.0 + d3-timer: 3.0.1 + d3-transition: 3.0.1(d3-selection@3.0.0) + d3-zoom: 3.0.0 + + dagre-d3-es@7.0.11: + dependencies: + d3: 7.9.0 + lodash-es: 4.17.21 + + data-uri-to-buffer@4.0.1: {} + + data-urls@5.0.0: + dependencies: + whatwg-mimetype: 4.0.0 + whatwg-url: 14.2.0 + + data-view-buffer@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-length@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-offset@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + dataloader@2.2.3: {} + + date-fns@2.30.0: + dependencies: + '@babel/runtime': 7.28.3 + + dayjs@1.11.13: {} + + debounce-promise@3.1.2: {} + + debounce@1.2.1: {} + + debug@4.4.1: + dependencies: + ms: 2.1.3 + + decimal.js@10.6.0: {} + + decode-named-character-reference@1.2.0: + dependencies: + character-entities: 2.0.2 + + deep-is@0.1.4: {} + + deepmerge@4.3.1: {} + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + + delaunator@5.0.1: + dependencies: + robust-predicates: 3.0.2 + + dequal@2.0.3: {} + + detect-libc@2.1.2: {} + + devlop@1.1.0: + dependencies: + dequal: 2.0.3 + + didyoumean@1.2.2: {} + + diff@5.2.0: {} + + dir-glob@3.0.1: + dependencies: + path-type: 4.0.0 + + dlv@1.1.3: {} + + doctrine@2.1.0: + dependencies: + esutils: 2.0.3 + + doctrine@3.0.0: + dependencies: + esutils: 2.0.3 + + dom-accessibility-api@0.5.16: {} + + dom-serializer@2.0.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + + domelementtype@2.3.0: {} + + domhandler@5.0.3: + dependencies: + domelementtype: 2.3.0 + + dompurify@3.2.6: + optionalDependencies: + '@types/trusted-types': 2.0.7 + + domutils@3.2.2: + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + + dot-case@3.0.4: + dependencies: + no-case: 3.0.4 + tslib: 2.8.1 + + dset@3.1.4: {} + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + duplexer@0.1.2: {} + + eastasianwidth@0.2.0: {} + + electron-to-chromium@1.5.207: {} + + emoji-regex-xs@1.0.0: {} + + emoji-regex@10.4.0: {} + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + end-of-stream@1.4.5: + dependencies: + once: 1.4.0 + + entities@4.5.0: {} + + entities@6.0.1: {} + + err-code@2.0.3: {} + + errno@0.1.8: + dependencies: + prr: 1.0.1 + optional: true + + error-ex@1.3.2: + dependencies: + is-arrayish: 0.2.1 + + es-abstract@1.24.0: + dependencies: + array-buffer-byte-length: 1.0.2 + arraybuffer.prototype.slice: 1.0.4 + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 + data-view-buffer: 1.0.2 + data-view-byte-length: 1.0.2 + data-view-byte-offset: 1.0.1 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-set-tostringtag: 2.1.0 + es-to-primitive: 1.3.0 + function.prototype.name: 1.1.8 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + get-symbol-description: 1.1.0 + globalthis: 1.0.4 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + internal-slot: 1.1.0 + is-array-buffer: 3.0.5 + is-callable: 1.2.7 + is-data-view: 1.0.2 + is-negative-zero: 2.0.3 + is-regex: 1.2.1 + is-set: 2.0.3 + is-shared-array-buffer: 1.0.4 + is-string: 1.1.1 + is-typed-array: 1.1.15 + is-weakref: 1.1.1 + math-intrinsics: 1.1.0 + object-inspect: 1.13.4 + object-keys: 1.1.1 + object.assign: 4.1.7 + own-keys: 1.0.1 + regexp.prototype.flags: 1.5.4 + safe-array-concat: 1.1.3 + safe-push-apply: 1.0.0 + safe-regex-test: 1.1.0 + set-proto: 1.0.0 + stop-iteration-iterator: 1.1.0 + string.prototype.trim: 1.2.10 + string.prototype.trimend: 1.0.9 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.3 + typed-array-byte-length: 1.0.3 + typed-array-byte-offset: 1.0.4 + typed-array-length: 1.0.7 + unbox-primitive: 1.1.0 + which-typed-array: 1.1.19 + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-iterator-helpers@1.2.1: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-errors: 1.3.0 + es-set-tostringtag: 2.1.0 + function-bind: 1.1.2 + get-intrinsic: 1.3.0 + globalthis: 1.0.4 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + internal-slot: 1.1.0 + iterator.prototype: 1.1.5 + safe-array-concat: 1.1.3 + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + es-shim-unscopables@1.1.0: + dependencies: + hasown: 2.0.2 + + es-to-primitive@1.3.0: + dependencies: + is-callable: 1.2.7 + is-date-object: 1.1.0 + is-symbol: 1.1.1 + + esast-util-from-estree@2.0.0: + dependencies: + '@types/estree-jsx': 1.0.5 + devlop: 1.1.0 + estree-util-visit: 2.0.0 + unist-util-position-from-estree: 2.0.0 + + esast-util-from-js@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + acorn: 8.15.0 + esast-util-from-estree: 2.0.0 + vfile-message: 4.0.3 + + esbuild@0.25.10: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.10 + '@esbuild/android-arm': 0.25.10 + '@esbuild/android-arm64': 0.25.10 + '@esbuild/android-x64': 0.25.10 + '@esbuild/darwin-arm64': 0.25.10 + '@esbuild/darwin-x64': 0.25.10 + '@esbuild/freebsd-arm64': 0.25.10 + '@esbuild/freebsd-x64': 0.25.10 + '@esbuild/linux-arm': 0.25.10 + '@esbuild/linux-arm64': 0.25.10 + '@esbuild/linux-ia32': 0.25.10 + '@esbuild/linux-loong64': 0.25.10 + '@esbuild/linux-mips64el': 0.25.10 + '@esbuild/linux-ppc64': 0.25.10 + '@esbuild/linux-riscv64': 0.25.10 + '@esbuild/linux-s390x': 0.25.10 + '@esbuild/linux-x64': 0.25.10 + '@esbuild/netbsd-arm64': 0.25.10 + '@esbuild/netbsd-x64': 0.25.10 + '@esbuild/openbsd-arm64': 0.25.10 + '@esbuild/openbsd-x64': 0.25.10 + '@esbuild/openharmony-arm64': 0.25.10 + '@esbuild/sunos-x64': 0.25.10 + '@esbuild/win32-arm64': 0.25.10 + '@esbuild/win32-ia32': 0.25.10 + '@esbuild/win32-x64': 0.25.10 + + escalade@3.2.0: {} + + escape-string-regexp@4.0.0: {} + + escape-string-regexp@5.0.0: {} + + eslint-config-prettier@9.1.2(eslint@8.57.1): + dependencies: + eslint: 8.57.1 + + eslint-mdx@3.6.2(eslint@8.57.1): + dependencies: + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) + eslint: 8.57.1 + espree: 10.4.0 + estree-util-visit: 2.0.0 + remark-mdx: 3.1.0 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + synckit: 0.11.11 + unified: 11.0.5 + unified-engine: 11.2.2 + unist-util-visit: 5.0.0 + uvu: 0.5.6 + vfile: 6.0.3 + transitivePeerDependencies: + - bluebird + - supports-color + + eslint-plugin-mdx@3.6.2(eslint@8.57.1): + dependencies: + eslint: 8.57.1 + eslint-mdx: 3.6.2(eslint@8.57.1) + mdast-util-from-markdown: 2.0.2 + mdast-util-mdx: 3.0.0 + micromark-extension-mdxjs: 3.0.0 + remark-mdx: 3.1.0 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + synckit: 0.11.11 + unified: 11.0.5 + vfile: 6.0.3 + transitivePeerDependencies: + - bluebird + - remark-lint-file-extension + - supports-color + + eslint-plugin-react-hooks@5.2.0(eslint@8.57.1): + dependencies: + eslint: 8.57.1 + + eslint-plugin-react@7.37.5(eslint@8.57.1): + dependencies: + array-includes: 3.1.9 + array.prototype.findlast: 1.2.5 + array.prototype.flatmap: 1.3.3 + array.prototype.tosorted: 1.1.4 + doctrine: 2.1.0 + es-iterator-helpers: 1.2.1 + eslint: 8.57.1 + estraverse: 5.3.0 + hasown: 2.0.2 + jsx-ast-utils: 3.3.5 + minimatch: 3.1.2 + object.entries: 1.1.9 + object.fromentries: 2.0.8 + object.values: 1.2.1 + prop-types: 15.8.1 + resolve: 2.0.0-next.5 + semver: 6.3.1 + string.prototype.matchall: 4.0.12 + string.prototype.repeat: 1.0.0 + + eslint-plugin-tailwindcss@3.18.2(tailwindcss@3.4.18(tsx@4.20.6)(yaml@2.8.1)): + dependencies: + fast-glob: 3.3.3 + postcss: 8.5.6 + tailwindcss: 3.4.18(tsx@4.20.6)(yaml@2.8.1) + + eslint-scope@7.2.2: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint-visitor-keys@4.2.1: {} + + eslint@8.57.1: + dependencies: + '@eslint-community/eslint-utils': 4.7.0(eslint@8.57.1) + '@eslint-community/regexpp': 4.12.1 + '@eslint/eslintrc': 2.1.4 + '@eslint/js': 8.57.1 + '@humanwhocodes/config-array': 0.13.0 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.3.0 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.1 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.6.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.24.0 + graphemer: 1.4.0 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + + esm@3.2.25: {} + + espree@10.4.0: + dependencies: + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) + eslint-visitor-keys: 4.2.1 + + espree@9.6.1: + dependencies: + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) + eslint-visitor-keys: 3.4.3 + + esprima@4.0.1: {} + + esquery@1.6.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@5.3.0: {} + + estree-util-attach-comments@3.0.0: + dependencies: + '@types/estree': 1.0.8 + + estree-util-build-jsx@3.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + estree-walker: 3.0.3 + + estree-util-is-identifier-name@2.1.0: {} + + estree-util-is-identifier-name@3.0.0: {} + + estree-util-scope@1.0.0: + dependencies: + '@types/estree': 1.0.8 + devlop: 1.1.0 + + estree-util-to-js@2.0.0: + dependencies: + '@types/estree-jsx': 1.0.5 + astring: 1.9.0 + source-map: 0.7.6 + + estree-util-value-to-estree@3.4.0: + dependencies: + '@types/estree': 1.0.8 + + estree-util-visit@2.0.0: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/unist': 3.0.3 + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.8 + + esutils@2.0.3: {} + + execa@8.0.1: + dependencies: + cross-spawn: 7.0.6 + get-stream: 8.0.1 + human-signals: 5.0.0 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.3.0 + onetime: 6.0.0 + signal-exit: 4.1.0 + strip-final-newline: 3.0.0 + + exsolve@1.0.7: {} + + extend-shallow@2.0.1: + dependencies: + is-extendable: 0.1.1 + + extend@3.0.2: {} + + fast-deep-equal@3.1.3: {} + + fast-fifo@1.3.2: {} + + fast-glob@3.3.1: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fast-glob@3.3.3: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fastq@1.19.1: + dependencies: + reusify: 1.1.0 + + fault@2.0.1: + dependencies: + format: 0.2.2 + + fetch-blob@3.2.0: + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 3.3.3 + + file-entry-cache@6.0.1: + dependencies: + flat-cache: 3.2.0 + + file-is-binary@1.0.0: + dependencies: + is-binary-buffer: 1.0.0 + isobject: 3.0.1 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flat-cache@3.2.0: + dependencies: + flatted: 3.3.3 + keyv: 4.5.4 + rimraf: 3.0.2 + + flatted@3.3.3: {} + + flexsearch@0.7.43: {} + + follow-redirects@1.15.11: {} + + for-each@0.3.5: + dependencies: + is-callable: 1.2.7 + + for-in@1.0.2: {} + + foreground-child@3.3.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + format@0.2.2: {} + + formdata-polyfill@4.0.10: + dependencies: + fetch-blob: 3.2.0 + + fraction.js@4.3.7: {} + + framer-motion@12.23.24(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + motion-dom: 12.23.23 + motion-utils: 12.23.6 + tslib: 2.8.1 + optionalDependencies: + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + fs.realpath@1.0.0: {} + + fsevents@2.3.2: + optional: true + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + function.prototype.name@1.1.8: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + functions-have-names: 1.2.3 + hasown: 2.0.2 + is-callable: 1.2.7 + + functions-have-names@1.2.3: {} + + gensync@1.0.0-beta.2: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + get-stream@8.0.1: {} + + get-symbol-description@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + + get-tsconfig@4.12.0: + dependencies: + resolve-pkg-maps: 1.0.0 + + github-slugger@2.0.0: {} + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob@10.4.5: + dependencies: + foreground-child: 3.3.1 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + globals@13.24.0: + dependencies: + type-fest: 0.20.2 + + globals@15.15.0: {} + + globalthis@1.0.4: + dependencies: + define-properties: 1.2.1 + gopd: 1.2.0 + + globby@11.1.0: + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.3 + ignore: 5.3.2 + merge2: 1.4.1 + slash: 3.0.0 + + gopd@1.2.0: {} + + graceful-fs@4.2.11: {} + + graphemer@1.4.0: {} + + graphql-config@5.1.5(@types/node@22.18.13)(graphql@16.10.0)(typescript@5.9.3): + dependencies: + '@graphql-tools/graphql-file-loader': 8.0.22(graphql@16.10.0) + '@graphql-tools/json-file-loader': 8.0.20(graphql@16.10.0) + '@graphql-tools/load': 8.1.2(graphql@16.10.0) + '@graphql-tools/merge': 9.1.1(graphql@16.10.0) + '@graphql-tools/url-loader': 8.0.33(@types/node@22.18.13)(graphql@16.10.0) + '@graphql-tools/utils': 10.9.1(graphql@16.10.0) + cosmiconfig: 8.3.6(typescript@5.9.3) + graphql: 16.10.0 + jiti: 2.6.1 + minimatch: 9.0.5 + string-env-interpolation: 1.0.1 + tslib: 2.8.1 + transitivePeerDependencies: + - '@fastify/websocket' + - '@types/node' + - bufferutil + - crossws + - supports-color + - typescript + - uWebSockets.js + - utf-8-validate + + graphql-depth-limit@1.1.0(graphql@16.10.0): + dependencies: + arrify: 1.0.1 + graphql: 16.10.0 + + graphql-language-service@5.5.0(graphql@16.10.0): + dependencies: + debounce-promise: 3.1.2 + graphql: 16.10.0 + nullthrows: 1.1.1 + vscode-languageserver-types: 3.17.5 + + graphql-ws@6.0.6(graphql@16.10.0)(ws@8.18.3): + dependencies: + graphql: 16.10.0 + optionalDependencies: + ws: 8.18.3 + + graphql@16.10.0: {} + + gray-matter@3.1.1: + dependencies: + extend-shallow: 2.0.1 + js-yaml: 3.14.1 + kind-of: 5.1.0 + strip-bom-string: 1.0.0 + + gray-matter@4.0.3: + dependencies: + js-yaml: 3.14.1 + kind-of: 6.0.3 + section-matter: 1.0.0 + strip-bom-string: 1.0.0 + + gzip-size@6.0.0: + dependencies: + duplexer: 0.1.2 + + hachure-fill@0.5.2: {} + + has-bigints@1.1.0: {} + + has-flag@4.0.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.1 + + has-proto@1.2.0: + dependencies: + dunder-proto: 1.0.1 + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + hast-util-from-dom@5.0.1: + dependencies: + '@types/hast': 3.0.4 + hastscript: 9.0.1 + web-namespaces: 2.0.1 + + hast-util-from-html-isomorphic@2.0.0: + dependencies: + '@types/hast': 3.0.4 + hast-util-from-dom: 5.0.1 + hast-util-from-html: 2.0.3 + unist-util-remove-position: 5.0.0 + + hast-util-from-html@2.0.3: + dependencies: + '@types/hast': 3.0.4 + devlop: 1.1.0 + hast-util-from-parse5: 8.0.3 + parse5: 7.3.0 + vfile: 6.0.3 + vfile-message: 4.0.3 + + hast-util-from-parse5@8.0.3: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + devlop: 1.1.0 + hastscript: 9.0.1 + property-information: 7.1.0 + vfile: 6.0.3 + vfile-location: 5.0.3 + web-namespaces: 2.0.1 + + hast-util-is-element@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hast-util-parse-selector@4.0.0: + dependencies: + '@types/hast': 3.0.4 + + hast-util-raw@9.1.0: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + '@ungap/structured-clone': 1.3.0 + hast-util-from-parse5: 8.0.3 + hast-util-to-parse5: 8.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.0 + parse5: 7.3.0 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + + hast-util-to-estree@3.1.3: + dependencies: + '@types/estree': 1.0.8 + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + estree-util-attach-comments: 3.0.0 + estree-util-is-identifier-name: 3.0.0 + hast-util-whitespace: 3.0.0 + mdast-util-mdx-expression: 2.0.1 + mdast-util-mdx-jsx: 3.2.0 + mdast-util-mdxjs-esm: 2.0.1 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + style-to-js: 1.1.17 + unist-util-position: 5.0.0 + zwitch: 2.0.4 + transitivePeerDependencies: + - supports-color + + hast-util-to-html@9.0.5: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + comma-separated-tokens: 2.0.3 + hast-util-whitespace: 3.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.0 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + stringify-entities: 4.0.4 + zwitch: 2.0.4 + + hast-util-to-jsx-runtime@2.3.6: + dependencies: + '@types/estree': 1.0.8 + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + hast-util-whitespace: 3.0.0 + mdast-util-mdx-expression: 2.0.1 + mdast-util-mdx-jsx: 3.2.0 + mdast-util-mdxjs-esm: 2.0.1 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + style-to-js: 1.1.17 + unist-util-position: 5.0.0 + vfile-message: 4.0.3 + transitivePeerDependencies: + - supports-color + + hast-util-to-parse5@8.0.0: + dependencies: + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + property-information: 6.5.0 + space-separated-tokens: 2.0.2 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + + hast-util-to-string@3.0.1: + dependencies: + '@types/hast': 3.0.4 + + hast-util-to-text@4.0.2: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + hast-util-is-element: 3.0.0 + unist-util-find-after: 5.0.0 + + hast-util-whitespace@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hastscript@9.0.1: + dependencies: + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + hast-util-parse-selector: 4.0.0 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + + hosted-git-info@7.0.2: + dependencies: + lru-cache: 10.4.3 + + html-encoding-sniffer@4.0.0: + dependencies: + whatwg-encoding: 3.1.1 + + html-entities@2.6.0: {} + + html-escaper@2.0.2: {} + + html-void-elements@3.0.0: {} + + http-proxy-agent@7.0.2: + dependencies: + agent-base: 7.1.4 + debug: 4.4.1 + transitivePeerDependencies: + - supports-color + + https-proxy-agent@7.0.6: + dependencies: + agent-base: 7.1.4 + debug: 4.4.1 + transitivePeerDependencies: + - supports-color + + human-signals@5.0.0: {} + + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + + iframe-resizer-react@1.1.1(@babel/core@7.28.3)(prop-types@15.8.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/plugin-proposal-private-property-in-object': 7.21.11(@babel/core@7.28.3) + iframe-resizer: 4.4.5 + prop-types: 15.8.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + warning: 4.0.3 + transitivePeerDependencies: + - '@babel/core' + - supports-color + + iframe-resizer@4.4.5: {} + + ignore@5.3.2: {} + + ignore@6.0.2: {} + + image-size@0.5.5: + optional: true + + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + import-meta-resolve@4.1.0: {} + + imurmurhash@0.1.4: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + ini@4.1.3: {} + + inline-style-parser@0.2.4: {} + + internal-slot@1.1.0: + dependencies: + es-errors: 1.3.0 + hasown: 2.0.2 + side-channel: 1.1.0 + + internmap@1.0.1: {} + + internmap@2.0.3: {} + + is-alphabetical@2.0.1: {} + + is-alphanumerical@2.0.1: + dependencies: + is-alphabetical: 2.0.1 + is-decimal: 2.0.1 + + is-array-buffer@3.0.5: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + + is-arrayish@0.2.1: {} + + is-async-function@2.1.1: + dependencies: + async-function: 1.0.0 + call-bound: 1.0.4 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-bigint@1.1.0: + dependencies: + has-bigints: 1.1.0 + + is-binary-buffer@1.0.0: + dependencies: + is-buffer: 1.1.6 + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-boolean-object@1.2.2: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-buffer@1.1.6: {} + + is-buffer@2.0.5: {} + + is-callable@1.2.7: {} + + is-core-module@2.16.1: + dependencies: + hasown: 2.0.2 + + is-data-view@1.0.2: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + is-typed-array: 1.1.15 + + is-date-object@1.1.0: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-decimal@2.0.1: {} + + is-docker@3.0.0: {} + + is-empty@1.2.0: {} + + is-extendable@0.1.1: {} + + is-extendable@1.0.1: + dependencies: + is-plain-object: 2.0.4 + + is-extglob@2.1.1: {} + + is-finalizationregistry@1.1.1: + dependencies: + call-bound: 1.0.4 + + is-fullwidth-code-point@3.0.0: {} + + is-generator-function@1.1.0: + dependencies: + call-bound: 1.0.4 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-hexadecimal@2.0.1: {} + + is-inside-container@1.0.0: + dependencies: + is-docker: 3.0.0 + + is-map@2.0.3: {} + + is-negative-zero@2.0.3: {} + + is-number-object@1.1.1: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-number@7.0.0: {} + + is-path-inside@3.0.3: {} + + is-plain-obj@4.1.0: {} + + is-plain-object@2.0.4: + dependencies: + isobject: 3.0.1 + + is-plain-object@5.0.0: {} + + is-potential-custom-element-name@1.0.1: {} + + is-regex@1.2.1: + dependencies: + call-bound: 1.0.4 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + is-set@2.0.3: {} + + is-shared-array-buffer@1.0.4: + dependencies: + call-bound: 1.0.4 + + is-stream@3.0.0: {} + + is-string@1.1.1: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-symbol@1.1.1: + dependencies: + call-bound: 1.0.4 + has-symbols: 1.1.0 + safe-regex-test: 1.1.0 + + is-typed-array@1.1.15: + dependencies: + which-typed-array: 1.1.19 + + is-weakmap@2.0.2: {} + + is-weakref@1.1.1: + dependencies: + call-bound: 1.0.4 + + is-weakset@2.0.4: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + + is-what@3.14.1: {} + + is-whitespace@0.3.0: {} + + is-wsl@3.1.0: + dependencies: + is-inside-container: 1.0.0 + + is64bit@2.0.0: + dependencies: + system-architecture: 0.1.0 + + isarray@2.0.5: {} + + isexe@2.0.0: {} + + isexe@3.1.1: {} + + isobject@3.0.1: {} + + isomorphic-ws@5.0.0(ws@8.18.3): + dependencies: + ws: 8.18.3 + + iterator.prototype@1.1.5: + dependencies: + define-data-property: 1.1.4 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + has-symbols: 1.1.0 + set-function-name: 2.0.2 + + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + jiti@1.21.7: {} + + jiti@2.6.1: {} + + js-tokens@4.0.0: {} + + js-yaml@3.14.1: + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + jsdom@26.1.0: + dependencies: + cssstyle: 4.6.0 + data-urls: 5.0.0 + decimal.js: 10.6.0 + html-encoding-sniffer: 4.0.0 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + is-potential-custom-element-name: 1.0.1 + nwsapi: 2.2.22 + parse5: 7.3.0 + rrweb-cssom: 0.8.0 + saxes: 6.0.0 + symbol-tree: 3.2.4 + tough-cookie: 5.1.2 + w3c-xmlserializer: 5.0.0 + webidl-conversions: 7.0.0 + whatwg-encoding: 3.1.1 + whatwg-mimetype: 4.0.0 + whatwg-url: 14.2.0 + ws: 8.18.3 + xml-name-validator: 5.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + jsesc@3.0.2: {} + + jsesc@3.1.0: {} + + json-buffer@3.0.1: {} + + json-parse-even-better-errors@2.3.1: {} + + json-parse-even-better-errors@3.0.2: {} + + json-schema-traverse@0.4.1: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + json5@2.2.3: {} + + jsx-ast-utils@3.3.5: + dependencies: + array-includes: 3.1.9 + array.prototype.flat: 1.3.3 + object.assign: 4.1.7 + object.values: 1.2.1 + + katex@0.16.22: + dependencies: + commander: 8.3.0 + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + khroma@2.1.0: {} + + kind-of@3.2.2: + dependencies: + is-buffer: 1.1.6 + + kind-of@5.1.0: {} + + kind-of@6.0.3: {} + + kleur@4.1.5: {} + + kolorist@1.8.0: {} + + langium@3.3.1: + dependencies: + chevrotain: 11.0.3 + chevrotain-allstar: 0.3.1(chevrotain@11.0.3) + vscode-languageserver: 9.0.1 + vscode-languageserver-textdocument: 1.0.12 + vscode-uri: 3.0.8 + + layout-base@1.0.2: {} + + layout-base@2.0.1: {} + + lazy-cache@2.0.2: + dependencies: + set-getter: 0.1.1 + + leaflet@1.9.4: {} + + less-loader@12.3.0(less@4.4.1): + dependencies: + less: 4.4.1 + + less@4.4.1: + dependencies: + copy-anything: 2.0.6 + parse-node-version: 1.0.1 + tslib: 2.8.1 + optionalDependencies: + errno: 0.1.8 + graceful-fs: 4.2.11 + image-size: 0.5.5 + make-dir: 2.1.0 + mime: 1.6.0 + needle: 3.3.1 + source-map: 0.6.1 + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + lilconfig@3.1.3: {} + + lines-and-columns@1.2.4: {} + + lines-and-columns@2.0.4: {} + + load-plugin@6.0.3: + dependencies: + '@npmcli/config': 8.3.4 + import-meta-resolve: 4.1.0 + transitivePeerDependencies: + - bluebird + + local-pkg@1.1.2: + dependencies: + mlly: 1.7.4 + pkg-types: 2.3.0 + quansync: 0.2.11 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash-es@4.17.21: {} + + lodash.debounce@4.0.8: {} + + lodash.lowercase@4.3.0: {} + + lodash.merge@4.6.2: {} + + lodash.sortby@4.7.0: {} + + longest-streak@3.1.0: {} + + loose-envify@1.4.0: + dependencies: + js-tokens: 4.0.0 + + lower-case@2.0.2: + dependencies: + tslib: 2.8.1 + + lru-cache@10.4.3: {} + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + lucide-react@0.469.0(react@18.3.1): + dependencies: + react: 18.3.1 + + lz-string@1.5.0: {} + + make-dir@2.1.0: + dependencies: + pify: 4.0.1 + semver: 5.7.2 + optional: true + + markdown-extensions@2.0.0: {} + + markdown-table@3.0.4: {} + + marked@16.2.0: {} + + math-intrinsics@1.1.0: {} + + mathjax-full@3.2.2: + dependencies: + esm: 3.2.25 + mhchemparser: 4.2.1 + mj-context-menu: 0.6.1 + speech-rule-engine: 4.1.2 + + mdast-util-find-and-replace@3.0.2: + dependencies: + '@types/mdast': 4.0.4 + escape-string-regexp: 5.0.0 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + + mdast-util-from-markdown@2.0.2: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + decode-named-character-reference: 1.2.0 + devlop: 1.1.0 + mdast-util-to-string: 4.0.0 + micromark: 4.0.2 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-decode-string: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + unist-util-stringify-position: 4.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-frontmatter@2.0.1: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + escape-string-regexp: 5.0.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + micromark-extension-frontmatter: 2.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-autolink-literal@2.0.1: + dependencies: + '@types/mdast': 4.0.4 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-find-and-replace: 3.0.2 + micromark-util-character: 2.1.1 + + mdast-util-gfm-footnote@2.1.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + micromark-util-normalize-identifier: 2.0.1 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-strikethrough@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-table@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + markdown-table: 3.0.4 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-task-list-item@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm@3.1.0: + dependencies: + mdast-util-from-markdown: 2.0.2 + mdast-util-gfm-autolink-literal: 2.0.1 + mdast-util-gfm-footnote: 2.1.0 + mdast-util-gfm-strikethrough: 2.0.0 + mdast-util-gfm-table: 2.0.0 + mdast-util-gfm-task-list-item: 2.0.0 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-math@3.0.0: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + longest-streak: 3.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + unist-util-remove-position: 5.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx-expression@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx-jsx@3.2.0: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + parse-entities: 4.0.2 + stringify-entities: 4.0.4 + unist-util-stringify-position: 4.0.0 + vfile-message: 4.0.3 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx@3.0.0: + dependencies: + mdast-util-from-markdown: 2.0.2 + mdast-util-mdx-expression: 2.0.1 + mdast-util-mdx-jsx: 3.2.0 + mdast-util-mdxjs-esm: 2.0.1 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdxjs-esm@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-phrasing@4.1.0: + dependencies: + '@types/mdast': 4.0.4 + unist-util-is: 6.0.0 + + mdast-util-to-hast@13.2.0: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@ungap/structured-clone': 1.3.0 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.1 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + + mdast-util-to-markdown@2.1.2: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + longest-streak: 3.1.0 + mdast-util-phrasing: 4.1.0 + mdast-util-to-string: 4.0.0 + micromark-util-classify-character: 2.0.1 + micromark-util-decode-string: 2.0.1 + unist-util-visit: 5.0.0 + zwitch: 2.0.4 + + mdast-util-to-string@4.0.0: + dependencies: + '@types/mdast': 4.0.4 + + mdn-data@2.0.28: {} + + mdn-data@2.0.30: {} + + merge-stream@2.0.0: {} + + merge2@1.4.1: {} + + mermaid-isomorphic@3.0.4(patch_hash=fccadc7038719bcf9dc12a573655719edaf7ea8246bd144c660191d05b38c637)(playwright@1.55.0): + dependencies: + '@fortawesome/fontawesome-free': 6.7.2 + mermaid: 11.10.0 + optionalDependencies: + playwright: 1.55.0 + transitivePeerDependencies: + - supports-color + + mermaid@11.10.0: + dependencies: + '@braintree/sanitize-url': 7.1.1 + '@iconify/utils': 2.3.0 + '@mermaid-js/parser': 0.6.2 + '@types/d3': 7.4.3 + cytoscape: 3.33.1 + cytoscape-cose-bilkent: 4.1.0(cytoscape@3.33.1) + cytoscape-fcose: 2.2.0(cytoscape@3.33.1) + d3: 7.9.0 + d3-sankey: 0.12.3 + dagre-d3-es: 7.0.11 + dayjs: 1.11.13 + dompurify: 3.2.6 + katex: 0.16.22 + khroma: 2.1.0 + lodash-es: 4.17.21 + marked: 16.2.0 + roughjs: 4.6.6 + stylis: 4.3.6 + ts-dedent: 2.2.0 + uuid: 11.1.0 + transitivePeerDependencies: + - supports-color + + meros@1.3.1(@types/node@22.18.13): + optionalDependencies: + '@types/node': 22.18.13 + + mhchemparser@4.2.1: {} + + micromark-core-commonmark@2.0.3: + dependencies: + decode-named-character-reference: 1.2.0 + devlop: 1.1.0 + micromark-factory-destination: 2.0.1 + micromark-factory-label: 2.0.1 + micromark-factory-space: 2.0.1 + micromark-factory-title: 2.0.1 + micromark-factory-whitespace: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-html-tag-name: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-frontmatter@2.0.0: + dependencies: + fault: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-autolink-literal@2.1.0: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-footnote@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-strikethrough@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-table@2.1.1: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-tagfilter@2.0.0: + dependencies: + micromark-util-types: 2.0.2 + + micromark-extension-gfm-task-list-item@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm@3.0.0: + dependencies: + micromark-extension-gfm-autolink-literal: 2.1.0 + micromark-extension-gfm-footnote: 2.1.0 + micromark-extension-gfm-strikethrough: 2.1.0 + micromark-extension-gfm-table: 2.1.1 + micromark-extension-gfm-tagfilter: 2.0.0 + micromark-extension-gfm-task-list-item: 2.1.0 + micromark-util-combine-extensions: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-math@3.1.0: + dependencies: + '@types/katex': 0.16.7 + devlop: 1.1.0 + katex: 0.16.22 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-mdx-expression@3.0.1: + dependencies: + '@types/estree': 1.0.8 + devlop: 1.1.0 + micromark-factory-mdx-expression: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-mdx-jsx@3.0.2: + dependencies: + '@types/estree': 1.0.8 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + micromark-factory-mdx-expression: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + vfile-message: 4.0.3 + + micromark-extension-mdx-md@2.0.0: + dependencies: + micromark-util-types: 2.0.2 + + micromark-extension-mdxjs-esm@3.0.0: + dependencies: + '@types/estree': 1.0.8 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + unist-util-position-from-estree: 2.0.0 + vfile-message: 4.0.3 + + micromark-extension-mdxjs@3.0.0: + dependencies: + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) + micromark-extension-mdx-expression: 3.0.1 + micromark-extension-mdx-jsx: 3.0.2 + micromark-extension-mdx-md: 2.0.0 + micromark-extension-mdxjs-esm: 3.0.0 + micromark-util-combine-extensions: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-destination@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-label@2.0.1: + dependencies: + devlop: 1.1.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-mdx-expression@2.0.3: + dependencies: + '@types/estree': 1.0.8 + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + unist-util-position-from-estree: 2.0.0 + vfile-message: 4.0.3 + + micromark-factory-space@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-types: 2.0.2 + + micromark-factory-title@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-whitespace@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-character@2.1.1: + dependencies: + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-chunked@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-classify-character@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-combine-extensions@2.0.1: + dependencies: + micromark-util-chunked: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-decode-numeric-character-reference@2.0.2: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-decode-string@2.0.1: + dependencies: + decode-named-character-reference: 1.2.0 + micromark-util-character: 2.1.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-symbol: 2.0.1 + + micromark-util-encode@2.0.1: {} + + micromark-util-events-to-acorn@2.0.3: + dependencies: + '@types/estree': 1.0.8 + '@types/unist': 3.0.3 + devlop: 1.1.0 + estree-util-visit: 2.0.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + vfile-message: 4.0.3 + + micromark-util-html-tag-name@2.0.1: {} + + micromark-util-normalize-identifier@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-resolve-all@2.0.1: + dependencies: + micromark-util-types: 2.0.2 + + micromark-util-sanitize-uri@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-encode: 2.0.1 + micromark-util-symbol: 2.0.1 + + micromark-util-subtokenize@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-symbol@2.0.1: {} + + micromark-util-types@2.0.2: {} + + micromark@4.0.2: + dependencies: + '@types/debug': 4.1.12 + debug: 4.4.1 + decode-named-character-reference: 1.2.0 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-combine-extensions: 2.0.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-encode: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + transitivePeerDependencies: + - supports-color + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mime-db@1.25.0: {} + + mime-types@2.1.13: + dependencies: + mime-db: 1.25.0 + + mime@1.6.0: + optional: true + + mimic-fn@4.0.0: {} + + mini-svg-data-uri@1.4.4: {} + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.12 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.2 + + minimist@1.2.8: {} + + minipass@7.1.2: {} + + mixin-deep@1.3.2: + dependencies: + for-in: 1.0.2 + is-extendable: 1.0.1 + + mj-context-menu@0.6.1: {} + + mlly@1.7.4: + dependencies: + acorn: 8.15.0 + pathe: 2.0.3 + pkg-types: 1.3.1 + ufo: 1.6.1 + + motion-dom@12.23.23: + dependencies: + motion-utils: 12.23.6 + + motion-utils@12.23.6: {} + + motion@12.23.24(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + framer-motion: 12.23.24(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + tslib: 2.8.1 + optionalDependencies: + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + mri@1.2.0: {} + + mrmime@2.0.1: {} + + ms@2.1.3: {} + + mz@2.7.0: + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + + nanoid@3.3.11: {} + + natural-compare@1.4.0: {} + + needle@3.3.1: + dependencies: + iconv-lite: 0.6.3 + sax: 1.4.1 + optional: true + + negotiator@1.0.0: {} + + next-query-params@5.1.0(next@14.2.33(@babel/core@7.28.3)(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(use-query-params@2.2.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)): + dependencies: + next: 14.2.33(@babel/core@7.28.3)(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + tslib: 2.8.1 + use-query-params: 2.2.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + + next-sitemap@4.2.3(next@14.2.33(@babel/core@7.28.3)(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)): + dependencies: + '@corex/deepmerge': 4.0.43 + '@next/env': 13.5.11 + fast-glob: 3.3.3 + minimist: 1.2.8 + next: 14.2.33(@babel/core@7.28.3)(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + + next-themes@0.4.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + next-with-less@3.0.1(less-loader@12.3.0(less@4.4.1))(less@4.4.1)(next@14.2.33(@babel/core@7.28.3)(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)): + dependencies: + clone-deep: 4.0.1 + less: 4.4.1 + less-loader: 12.3.0(less@4.4.1) + next: 14.2.33(@babel/core@7.28.3)(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + + next@14.2.33(@babel/core@7.28.3)(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@next/env': 14.2.33 + '@swc/helpers': 0.5.5 + busboy: 1.6.0 + caniuse-lite: 1.0.30001751 + graceful-fs: 4.2.11 + postcss: 8.4.31 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + styled-jsx: 5.1.1(@babel/core@7.28.3)(react@18.3.1) + optionalDependencies: + '@next/swc-darwin-arm64': 14.2.33 + '@next/swc-darwin-x64': 14.2.33 + '@next/swc-linux-arm64-gnu': 14.2.33 + '@next/swc-linux-arm64-musl': 14.2.33 + '@next/swc-linux-x64-gnu': 14.2.33 + '@next/swc-linux-x64-musl': 14.2.33 + '@next/swc-win32-arm64-msvc': 14.2.33 + '@next/swc-win32-ia32-msvc': 14.2.33 + '@next/swc-win32-x64-msvc': 14.2.33 + '@playwright/test': 1.55.0 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + + nextra-theme-docs@3.3.1(patch_hash=8799231345920182b90fbd49ccc3481783ddbf5bd8dcea15b903a260c10d9bc0)(next@14.2.33(@babel/core@7.28.3)(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(nextra@3.3.1(patch_hash=007f6fda5122c6f4de34daac1f8221aa57dbe7c97563f4f6144c5c5310b2b7c8)(@types/react@18.3.26)(acorn@8.15.0)(next@14.2.33(@babel/core@7.28.3)(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@headlessui/react': 2.2.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + clsx: 2.1.1 + escape-string-regexp: 5.0.0 + flexsearch: 0.7.43 + next: 14.2.33(@babel/core@7.28.3)(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next-themes: 0.4.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + nextra: 3.3.1(patch_hash=007f6fda5122c6f4de34daac1f8221aa57dbe7c97563f4f6144c5c5310b2b7c8)(@types/react@18.3.26)(acorn@8.15.0)(next@14.2.33(@babel/core@7.28.3)(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + scroll-into-view-if-needed: 3.1.0 + zod: 3.25.76 + + nextra@3.3.1(patch_hash=007f6fda5122c6f4de34daac1f8221aa57dbe7c97563f4f6144c5c5310b2b7c8)(@types/react@18.3.26)(acorn@8.15.0)(next@14.2.33(@babel/core@7.28.3)(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3): + dependencies: + '@formatjs/intl-localematcher': 0.5.10 + '@headlessui/react': 2.2.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@mdx-js/mdx': 3.1.0(acorn@8.15.0) + '@mdx-js/react': 3.1.0(@types/react@18.3.26)(react@18.3.1) + '@napi-rs/simple-git': 0.1.22 + '@shikijs/twoslash': 1.29.2(typescript@5.9.3) + '@theguild/remark-mermaid': 0.1.3(react@18.3.1) + '@theguild/remark-npm2yarn': 0.3.3 + better-react-mathjax: 2.3.0(react@18.3.1) + clsx: 2.1.1 + estree-util-to-js: 2.0.0 + estree-util-value-to-estree: 3.4.0 + github-slugger: 2.0.0 + graceful-fs: 4.2.11 + gray-matter: 4.0.3 + hast-util-to-estree: 3.1.3 + katex: 0.16.22 + mdast-util-from-markdown: 2.0.2 + mdast-util-gfm: 3.1.0 + mdast-util-to-hast: 13.2.0 + negotiator: 1.0.0 + next: 14.2.33(@babel/core@7.28.3)(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + p-limit: 6.2.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-medium-image-zoom: 5.2.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rehype-katex: 7.0.1 + rehype-pretty-code: 0.14.0(shiki@1.29.2) + rehype-raw: 7.0.0 + remark-frontmatter: 5.0.0 + remark-gfm: 4.0.1 + remark-math: 6.0.0 + remark-reading-time: 2.0.2 + remark-smartypants: 3.0.2 + shiki: 1.29.2 + slash: 5.1.0 + title: 4.0.1 + unist-util-remove: 4.0.0 + unist-util-visit: 5.0.0 + yaml: 2.8.1 + zod: 3.25.76 + zod-validation-error: 3.5.3(zod@3.25.76) + transitivePeerDependencies: + - '@types/react' + - acorn + - supports-color + - typescript + + nlcst-to-string@4.0.0: + dependencies: + '@types/nlcst': 2.0.3 + + no-case@3.0.4: + dependencies: + lower-case: 2.0.2 + tslib: 2.8.1 + + node-domexception@1.0.0: {} + + node-fetch@3.3.2: + dependencies: + data-uri-to-buffer: 4.0.1 + fetch-blob: 3.2.0 + formdata-polyfill: 4.0.10 + + node-releases@2.0.19: {} + + nopt@7.2.1: + dependencies: + abbrev: 2.0.0 + + normalize-package-data@6.0.2: + dependencies: + hosted-git-info: 7.0.2 + semver: 7.7.2 + validate-npm-package-license: 3.0.4 + + normalize-path@2.1.1: + dependencies: + remove-trailing-separator: 1.1.0 + + normalize-path@3.0.0: {} + + normalize-range@0.1.2: {} + + npm-install-checks@6.3.0: + dependencies: + semver: 7.7.2 + + npm-normalize-package-bin@3.0.1: {} + + npm-package-arg@11.0.3: + dependencies: + hosted-git-info: 7.0.2 + proc-log: 4.2.0 + semver: 7.7.2 + validate-npm-package-name: 5.0.1 + + npm-pick-manifest@9.1.0: + dependencies: + npm-install-checks: 6.3.0 + npm-normalize-package-bin: 3.0.1 + npm-package-arg: 11.0.3 + semver: 7.7.2 + + npm-run-path@5.3.0: + dependencies: + path-key: 4.0.0 + + npm-to-yarn@3.0.1: {} + + nth-check@2.1.1: + dependencies: + boolbase: 1.0.0 + + nullthrows@1.1.1: {} + + numbro@2.5.0: + dependencies: + bignumber.js: 9.3.1 + + nwsapi@2.2.22: {} + + object-assign@4.1.1: {} + + object-hash@3.0.0: {} + + object-inspect@1.13.4: {} + + object-keys@1.1.1: {} + + object.assign@4.1.7: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + has-symbols: 1.1.0 + object-keys: 1.1.1 + + object.entries@1.1.9: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + object.fromentries@2.0.8: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-object-atoms: 1.1.1 + + object.values@1.2.1: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + onetime@6.0.0: + dependencies: + mimic-fn: 4.0.0 + + oniguruma-to-es@2.3.0: + dependencies: + emoji-regex-xs: 1.0.0 + regex: 5.1.1 + regex-recursion: 5.1.1 + + opener@1.5.2: {} + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + own-keys@1.0.1: + dependencies: + get-intrinsic: 1.3.0 + object-keys: 1.1.1 + safe-push-apply: 1.0.0 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-limit@4.0.0: + dependencies: + yocto-queue: 1.2.1 + + p-limit@6.2.0: + dependencies: + yocto-queue: 1.2.1 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + package-json-from-dist@1.0.1: {} + + package-manager-detector@1.3.0: {} + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parse-entities@4.0.2: + dependencies: + '@types/unist': 2.0.11 + character-entities-legacy: 3.0.0 + character-reference-invalid: 2.0.1 + decode-named-character-reference: 1.2.0 + is-alphanumerical: 2.0.1 + is-decimal: 2.0.1 + is-hexadecimal: 2.0.1 + + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.27.1 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + parse-json@7.1.1: + dependencies: + '@babel/code-frame': 7.27.1 + error-ex: 1.3.2 + json-parse-even-better-errors: 3.0.2 + lines-and-columns: 2.0.4 + type-fest: 3.13.1 + + parse-latin@7.0.0: + dependencies: + '@types/nlcst': 2.0.3 + '@types/unist': 3.0.3 + nlcst-to-string: 4.0.0 + unist-util-modify-children: 4.0.0 + unist-util-visit-children: 3.0.0 + vfile: 6.0.3 + + parse-node-version@1.0.1: {} + + parse-numeric-range@1.3.0: {} + + parse5@7.3.0: + dependencies: + entities: 6.0.1 + + parser-front-matter@1.6.4: + dependencies: + extend-shallow: 2.0.1 + file-is-binary: 1.0.0 + gray-matter: 3.1.1 + isobject: 3.0.1 + lazy-cache: 2.0.2 + mixin-deep: 1.3.2 + trim-leading-lines: 0.1.1 + + path-data-parser@0.1.0: {} + + path-exists@4.0.0: {} + + path-is-absolute@1.0.1: {} + + path-key@3.1.1: {} + + path-key@4.0.0: {} + + path-parse@1.0.7: {} + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + + path-type@4.0.0: {} + + pathe@2.0.3: {} + + picocolors@1.1.1: {} + + picomatch@2.3.1: {} + + pify@2.3.0: {} + + pify@4.0.1: + optional: true + + pirates@4.0.7: {} + + pkg-types@1.3.1: + dependencies: + confbox: 0.1.8 + mlly: 1.7.4 + pathe: 2.0.3 + + pkg-types@2.3.0: + dependencies: + confbox: 0.2.2 + exsolve: 1.0.7 + pathe: 2.0.3 + + plaiceholder@3.0.0(sharp@0.34.4): + dependencies: + sharp: 0.34.4 + + playwright-core@1.55.0: {} + + playwright@1.55.0: + dependencies: + playwright-core: 1.55.0 + optionalDependencies: + fsevents: 2.3.2 + + points-on-curve@0.2.0: {} + + points-on-path@0.2.1: + dependencies: + path-data-parser: 0.1.0 + points-on-curve: 0.2.0 + + possible-typed-array-names@1.1.0: {} + + postcss-import@15.1.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.10 + + postcss-import@16.1.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.10 + + postcss-js@4.1.0(postcss@8.5.6): + dependencies: + camelcase-css: 2.0.1 + postcss: 8.5.6 + + postcss-load-config@6.0.1(jiti@1.21.7)(postcss@8.5.6)(tsx@4.20.6)(yaml@2.8.1): + dependencies: + lilconfig: 3.1.3 + optionalDependencies: + jiti: 1.21.7 + postcss: 8.5.6 + tsx: 4.20.6 + yaml: 2.8.1 + + postcss-nested@5.0.6(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-selector-parser: 6.1.2 + + postcss-nested@6.2.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-selector-parser: 6.1.2 + + postcss-selector-parser@6.0.10: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-selector-parser@6.1.2: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-value-parser@4.2.0: {} + + postcss@8.4.31: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + postcss@8.5.6: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + prelude-ls@1.2.1: {} + + prettier-plugin-pkg@0.21.2(prettier@3.5.3): + dependencies: + prettier: 3.5.3 + + prettier-plugin-tailwindcss@0.6.14(prettier@3.5.3): + dependencies: + prettier: 3.5.3 + + prettier@3.5.3: {} + + pretty-format@27.5.1: + dependencies: + ansi-regex: 5.0.1 + ansi-styles: 5.2.0 + react-is: 17.0.2 + + proc-log@4.2.0: {} + + promise-inflight@1.0.1: {} + + promise-retry@2.0.1: + dependencies: + err-code: 2.0.3 + retry: 0.12.0 + + prop-types@15.8.1: + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + + property-information@6.5.0: {} + + property-information@7.1.0: {} + + prr@1.0.1: + optional: true + + pump@3.0.3: + dependencies: + end-of-stream: 1.4.5 + once: 1.4.0 + + punycode@2.3.1: {} + + quansync@0.2.11: {} + + queue-microtask@1.2.3: {} + + ranges-apply@7.0.31: + dependencies: + ranges-merge: 9.0.30 + tiny-invariant: 1.3.3 + + ranges-merge@9.0.30: + dependencies: + ranges-push: 7.0.30 + ranges-sort: 6.0.25 + + ranges-push@7.0.30: + dependencies: + codsen-utils: 1.6.19 + ranges-sort: 6.0.25 + string-collapse-leading-whitespace: 7.0.20 + string-trim-spaces-only: 5.0.24 + + ranges-sort@6.0.25: {} + + react-dom@18.3.1(react@18.3.1): + dependencies: + loose-envify: 1.4.0 + react: 18.3.1 + scheduler: 0.23.2 + + react-is@16.13.1: {} + + react-is@17.0.2: {} + + react-medium-image-zoom@5.2.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + react-use-measure@2.1.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + react: 18.3.1 + optionalDependencies: + react-dom: 18.3.1(react@18.3.1) + + react@18.3.1: + dependencies: + loose-envify: 1.4.0 + + read-cache@1.0.0: + dependencies: + pify: 2.3.0 + + read-package-json-fast@3.0.2: + dependencies: + json-parse-even-better-errors: 3.0.2 + npm-normalize-package-bin: 3.0.1 + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + + reading-time@1.5.0: {} + + recma-build-jsx@1.0.0: + dependencies: + '@types/estree': 1.0.8 + estree-util-build-jsx: 3.0.1 + vfile: 6.0.3 + + recma-jsx@1.0.1(acorn@8.15.0): + dependencies: + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) + estree-util-to-js: 2.0.0 + recma-parse: 1.0.0 + recma-stringify: 1.0.0 + unified: 11.0.5 + + recma-parse@1.0.0: + dependencies: + '@types/estree': 1.0.8 + esast-util-from-js: 2.0.1 + unified: 11.0.5 + vfile: 6.0.3 + + recma-stringify@1.0.0: + dependencies: + '@types/estree': 1.0.8 + estree-util-to-js: 2.0.0 + unified: 11.0.5 + vfile: 6.0.3 + + reflect.getprototypeof@1.0.10: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + which-builtin-type: 1.2.1 + + regenerate-unicode-properties@10.2.0: + dependencies: + regenerate: 1.4.2 + + regenerate@1.4.2: {} + + regex-recursion@5.1.1: + dependencies: + regex: 5.1.1 + regex-utilities: 2.3.0 + + regex-utilities@2.3.0: {} + + regex@5.1.1: + dependencies: + regex-utilities: 2.3.0 + + regexp.prototype.flags@1.5.4: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-errors: 1.3.0 + get-proto: 1.0.1 + gopd: 1.2.0 + set-function-name: 2.0.2 + + regexpu-core@6.2.0: + dependencies: + regenerate: 1.4.2 + regenerate-unicode-properties: 10.2.0 + regjsgen: 0.8.0 + regjsparser: 0.12.0 + unicode-match-property-ecmascript: 2.0.0 + unicode-match-property-value-ecmascript: 2.2.0 + + regjsgen@0.8.0: {} + + regjsparser@0.12.0: + dependencies: + jsesc: 3.0.2 + + rehype-katex@7.0.1: + dependencies: + '@types/hast': 3.0.4 + '@types/katex': 0.16.7 + hast-util-from-html-isomorphic: 2.0.0 + hast-util-to-text: 4.0.2 + katex: 0.16.22 + unist-util-visit-parents: 6.0.1 + vfile: 6.0.3 + + rehype-mermaid@3.0.0(playwright@1.55.0): + dependencies: + '@types/hast': 3.0.4 + hast-util-from-html-isomorphic: 2.0.0 + hast-util-to-text: 4.0.2 + mermaid-isomorphic: 3.0.4(patch_hash=fccadc7038719bcf9dc12a573655719edaf7ea8246bd144c660191d05b38c637)(playwright@1.55.0) + mini-svg-data-uri: 1.4.4 + space-separated-tokens: 2.0.2 + unified: 11.0.5 + unist-util-visit-parents: 6.0.1 + vfile: 6.0.3 + optionalDependencies: + playwright: 1.55.0 + transitivePeerDependencies: + - supports-color + + rehype-parse@9.0.1: + dependencies: + '@types/hast': 3.0.4 + hast-util-from-html: 2.0.3 + unified: 11.0.5 + + rehype-pretty-code@0.14.0(shiki@1.29.2): + dependencies: + '@types/hast': 3.0.4 + hast-util-to-string: 3.0.1 + parse-numeric-range: 1.3.0 + rehype-parse: 9.0.1 + shiki: 1.29.2 + unified: 11.0.5 + unist-util-visit: 5.0.0 + + rehype-raw@7.0.0: + dependencies: + '@types/hast': 3.0.4 + hast-util-raw: 9.1.0 + vfile: 6.0.3 + + rehype-recma@1.0.0: + dependencies: + '@types/estree': 1.0.8 + '@types/hast': 3.0.4 + hast-util-to-estree: 3.1.3 + transitivePeerDependencies: + - supports-color + + remark-frontmatter@5.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-frontmatter: 2.0.1 + micromark-extension-frontmatter: 2.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-gfm@4.0.1: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-gfm: 3.1.0 + micromark-extension-gfm: 3.0.0 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-lint-first-heading-level@3.1.2: + dependencies: + '@types/mdast': 3.0.15 + unified: 10.1.2 + unified-lint-rule: 2.1.2 + unist-util-generated: 2.0.1 + unist-util-visit: 4.1.2 + + remark-lint-heading-increment@3.1.2: + dependencies: + '@types/mdast': 3.0.15 + unified: 10.1.2 + unified-lint-rule: 2.1.2 + unist-util-generated: 2.0.1 + unist-util-visit: 4.1.2 + + remark-math@6.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-math: 3.0.0 + micromark-extension-math: 3.1.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-mdx@3.1.0: + dependencies: + mdast-util-mdx: 3.0.0 + micromark-extension-mdxjs: 3.0.0 + transitivePeerDependencies: + - supports-color + + remark-parse@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.2 + micromark-util-types: 2.0.2 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-reading-time@2.0.2: + dependencies: + estree-util-is-identifier-name: 2.1.0 + estree-util-value-to-estree: 3.4.0 + reading-time: 1.5.0 + unist-util-visit: 3.1.0 + + remark-rehype@11.1.2: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + mdast-util-to-hast: 13.2.0 + unified: 11.0.5 + vfile: 6.0.3 + + remark-smartypants@3.0.2: + dependencies: + retext: 9.0.0 + retext-smartypants: 6.2.0 + unified: 11.0.5 + unist-util-visit: 5.0.0 + + remark-stringify@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-to-markdown: 2.1.2 + unified: 11.0.5 + + remove-trailing-separator@1.1.0: {} + + reselect@5.1.1: {} + + resolve-from@4.0.0: {} + + resolve-from@5.0.0: {} + + resolve-pkg-maps@1.0.0: {} + + resolve@1.22.10: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + resolve@2.0.0-next.5: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + retext-latin@4.0.0: + dependencies: + '@types/nlcst': 2.0.3 + parse-latin: 7.0.0 + unified: 11.0.5 + + retext-smartypants@6.2.0: + dependencies: + '@types/nlcst': 2.0.3 + nlcst-to-string: 4.0.0 + unist-util-visit: 5.0.0 + + retext-stringify@4.0.0: + dependencies: + '@types/nlcst': 2.0.3 + nlcst-to-string: 4.0.0 + unified: 11.0.5 + + retext@9.0.0: + dependencies: + '@types/nlcst': 2.0.3 + retext-latin: 4.0.0 + retext-stringify: 4.0.0 + unified: 11.0.5 + + retry@0.12.0: {} + + reusify@1.1.0: {} + + rfdc@1.4.1: {} + + rimraf@3.0.2: + dependencies: + glob: 7.2.3 + + robust-predicates@3.0.2: {} + + roughjs@4.6.6: + dependencies: + hachure-fill: 0.5.2 + path-data-parser: 0.1.0 + points-on-curve: 0.2.0 + points-on-path: 0.2.1 + + rrweb-cssom@0.8.0: {} + + rss@1.2.2: + dependencies: + mime-types: 2.1.13 + xml: 1.0.1 + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + rw@1.3.3: {} + + sade@1.8.1: + dependencies: + mri: 1.2.0 + + safe-array-concat@1.1.3: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + has-symbols: 1.1.0 + isarray: 2.0.5 + + safe-buffer@5.2.1: {} + + safe-push-apply@1.0.0: + dependencies: + es-errors: 1.3.0 + isarray: 2.0.5 + + safe-regex-test@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-regex: 1.2.1 + + safer-buffer@2.1.2: {} + + sax@1.4.1: + optional: true + + saxes@6.0.0: + dependencies: + xmlchars: 2.2.0 + + scheduler@0.23.2: + dependencies: + loose-envify: 1.4.0 + + scroll-into-view-if-needed@3.1.0: + dependencies: + compute-scroll-into-view: 3.1.1 + + section-matter@1.0.0: + dependencies: + extend-shallow: 2.0.1 + kind-of: 6.0.3 + + semver@5.7.2: + optional: true + + semver@6.3.1: {} + + semver@7.7.2: {} + + semver@7.7.3: {} + + serialize-query-params@2.0.2: {} + + server-only@0.0.1: {} + + set-function-length@1.2.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + + set-function-name@2.0.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + + set-getter@0.1.1: + dependencies: + to-object-path: 0.3.0 + + set-proto@1.0.0: + dependencies: + dunder-proto: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + + shallow-clone@3.0.1: + dependencies: + kind-of: 6.0.3 + + sharp@0.34.4: + dependencies: + '@img/colour': 1.0.0 + detect-libc: 2.1.2 + semver: 7.7.3 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.34.4 + '@img/sharp-darwin-x64': 0.34.4 + '@img/sharp-libvips-darwin-arm64': 1.2.3 + '@img/sharp-libvips-darwin-x64': 1.2.3 + '@img/sharp-libvips-linux-arm': 1.2.3 + '@img/sharp-libvips-linux-arm64': 1.2.3 + '@img/sharp-libvips-linux-ppc64': 1.2.3 + '@img/sharp-libvips-linux-s390x': 1.2.3 + '@img/sharp-libvips-linux-x64': 1.2.3 + '@img/sharp-libvips-linuxmusl-arm64': 1.2.3 + '@img/sharp-libvips-linuxmusl-x64': 1.2.3 + '@img/sharp-linux-arm': 0.34.4 + '@img/sharp-linux-arm64': 0.34.4 + '@img/sharp-linux-ppc64': 0.34.4 + '@img/sharp-linux-s390x': 0.34.4 + '@img/sharp-linux-x64': 0.34.4 + '@img/sharp-linuxmusl-arm64': 0.34.4 + '@img/sharp-linuxmusl-x64': 0.34.4 + '@img/sharp-wasm32': 0.34.4 + '@img/sharp-win32-arm64': 0.34.4 + '@img/sharp-win32-ia32': 0.34.4 + '@img/sharp-win32-x64': 0.34.4 + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + shiki@1.29.2: + dependencies: + '@shikijs/core': 1.29.2 + '@shikijs/engine-javascript': 1.29.2 + '@shikijs/engine-oniguruma': 1.29.2 + '@shikijs/langs': 1.29.2 + '@shikijs/themes': 1.29.2 + '@shikijs/types': 1.29.2 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + + side-channel-list@1.0.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + + signal-exit@4.1.0: {} + + sirv@2.0.4: + dependencies: + '@polka/url': 1.0.0-next.29 + mrmime: 2.0.1 + totalist: 3.0.1 + + slash@3.0.0: {} + + slash@5.1.0: {} + + snake-case@3.0.4: + dependencies: + dot-case: 3.0.4 + tslib: 2.8.1 + + source-map-js@1.2.1: {} + + source-map@0.6.1: + optional: true + + source-map@0.7.6: {} + + space-separated-tokens@2.0.2: {} + + spdx-correct@3.2.0: + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.22 + + spdx-exceptions@2.5.0: {} + + spdx-expression-parse@3.0.1: + dependencies: + spdx-exceptions: 2.5.0 + spdx-license-ids: 3.0.22 + + spdx-license-ids@3.0.22: {} + + speech-rule-engine@4.1.2: + dependencies: + '@xmldom/xmldom': 0.9.8 + commander: 13.1.0 + wicked-good-xpath: 1.3.0 + + sprintf-js@1.0.3: {} + + stop-iteration-iterator@1.1.0: + dependencies: + es-errors: 1.3.0 + internal-slot: 1.1.0 + + streamsearch@1.1.0: {} + + streamx@2.22.1: + dependencies: + fast-fifo: 1.3.2 + text-decoder: 1.2.3 + optionalDependencies: + bare-events: 2.6.1 + + string-collapse-leading-whitespace@7.0.20: {} + + string-env-interpolation@1.0.1: {} + + string-left-right@6.0.32: + dependencies: + codsen-utils: 1.6.19 + rfdc: 1.4.1 + + string-similarity@4.0.4: {} + + string-strip-html@13.4.24: + dependencies: + '@types/lodash-es': 4.17.12 + codsen-utils: 1.6.19 + html-entities: 2.6.0 + lodash-es: 4.17.21 + ranges-apply: 7.0.31 + ranges-push: 7.0.30 + string-left-right: 6.0.32 + + string-trim-spaces-only@5.0.24: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.2 + + string-width@6.1.0: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 10.4.0 + strip-ansi: 7.1.0 + + string.prototype.matchall@4.0.12: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-symbols: 1.1.0 + internal-slot: 1.1.0 + regexp.prototype.flags: 1.5.4 + set-function-name: 2.0.2 + side-channel: 1.1.0 + + string.prototype.repeat@1.0.0: + dependencies: + define-properties: 1.2.1 + es-abstract: 1.24.0 + + string.prototype.trim@1.2.10: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-data-property: 1.1.4 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-object-atoms: 1.1.1 + has-property-descriptors: 1.0.2 + + string.prototype.trimend@1.0.9: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + string.prototype.trimstart@1.0.8: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + stringify-entities@4.0.4: + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.2.0 + + strip-ansi@7.1.2: + dependencies: + ansi-regex: 6.2.2 + + strip-bom-string@1.0.0: {} + + strip-final-newline@3.0.0: {} + + strip-json-comments@3.1.1: {} + + style-mod@4.1.2: {} + + style-mod@4.1.3: {} + + style-to-js@1.1.17: + dependencies: + style-to-object: 1.0.9 + + style-to-object@1.0.9: + dependencies: + inline-style-parser: 0.2.4 + + styled-jsx@5.1.1(@babel/core@7.28.3)(react@18.3.1): + dependencies: + client-only: 0.0.1 + react: 18.3.1 + optionalDependencies: + '@babel/core': 7.28.3 + + stylis@4.3.6: {} + + sucrase@3.35.0: + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + commander: 4.1.1 + glob: 10.4.5 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.7 + ts-interface-checker: 0.1.13 + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-color@9.4.0: {} + + supports-preserve-symlinks-flag@1.0.0: {} + + svg-parser@2.0.4: {} + + svgo@3.3.2: + dependencies: + '@trysound/sax': 0.2.0 + commander: 7.2.0 + css-select: 5.2.2 + css-tree: 2.3.1 + css-what: 6.2.2 + csso: 5.0.5 + picocolors: 1.1.1 + + symbol-tree@3.2.4: {} + + sync-fetch@0.6.0-2: + dependencies: + node-fetch: 3.3.2 + timeout-signal: 2.0.0 + whatwg-mimetype: 4.0.0 + + synckit@0.11.11: + dependencies: + '@pkgr/core': 0.2.9 + + system-architecture@0.1.0: {} + + tabbable@6.2.0: {} + + tailwindcss@3.4.18(tsx@4.20.6)(yaml@2.8.1): + dependencies: + '@alloc/quick-lru': 5.2.0 + arg: 5.0.2 + chokidar: 3.6.0 + didyoumean: 1.2.2 + dlv: 1.1.3 + fast-glob: 3.3.3 + glob-parent: 6.0.2 + is-glob: 4.0.3 + jiti: 1.21.7 + lilconfig: 3.1.3 + micromatch: 4.0.8 + normalize-path: 3.0.0 + object-hash: 3.0.0 + picocolors: 1.1.1 + postcss: 8.5.6 + postcss-import: 15.1.0(postcss@8.5.6) + postcss-js: 4.1.0(postcss@8.5.6) + postcss-load-config: 6.0.1(jiti@1.21.7)(postcss@8.5.6)(tsx@4.20.6)(yaml@2.8.1) + postcss-nested: 6.2.0(postcss@8.5.6) + postcss-selector-parser: 6.1.2 + resolve: 1.22.10 + sucrase: 3.35.0 + transitivePeerDependencies: + - tsx + - yaml + + tar-fs@3.1.0: + dependencies: + pump: 3.0.3 + tar-stream: 3.1.7 + optionalDependencies: + bare-fs: 4.2.1 + bare-path: 3.0.0 + transitivePeerDependencies: + - bare-buffer + + tar-stream@3.1.7: + dependencies: + b4a: 1.6.7 + fast-fifo: 1.3.2 + streamx: 2.22.1 + + text-decoder@1.2.3: + dependencies: + b4a: 1.6.7 + + text-table@0.2.0: {} + + thenify-all@1.6.0: + dependencies: + thenify: 3.3.1 + + thenify@3.3.1: + dependencies: + any-promise: 1.3.0 + + timeago.js@4.0.2: {} + + timeout-signal@2.0.0: {} + + tiny-invariant@1.3.3: {} + + tinyexec@1.0.1: {} + + title@4.0.1: + dependencies: + arg: 5.0.2 + chalk: 5.6.0 + clipboardy: 4.0.0 + + tldts-core@6.1.86: {} + + tldts@6.1.86: + dependencies: + tldts-core: 6.1.86 + + to-object-path@0.3.0: + dependencies: + kind-of: 3.2.2 + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + totalist@3.0.1: {} + + tough-cookie@5.1.2: + dependencies: + tldts: 6.1.86 + + tr46@5.1.1: + dependencies: + punycode: 2.3.1 + + trim-leading-lines@0.1.1: + dependencies: + is-whitespace: 0.3.0 + + trim-lines@3.0.1: {} + + trough@2.2.0: {} + + ts-api-utils@1.4.3(typescript@5.9.3): + dependencies: + typescript: 5.9.3 + + ts-dedent@2.2.0: {} + + ts-interface-checker@0.1.13: {} + + tslib@2.8.1: {} + + tsx@4.20.6: + dependencies: + esbuild: 0.25.10 + get-tsconfig: 4.12.0 + optionalDependencies: + fsevents: 2.3.3 + + twoslash-protocol@0.2.12: {} + + twoslash@0.2.12(typescript@5.9.3): + dependencies: + '@typescript/vfs': 1.6.1(typescript@5.9.3) + twoslash-protocol: 0.2.12 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + type-fest@0.20.2: {} + + type-fest@3.13.1: {} + + typed-array-buffer@1.0.3: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-typed-array: 1.1.15 + + typed-array-byte-length@1.0.3: + dependencies: + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + + typed-array-byte-offset@1.0.4: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + reflect.getprototypeof: 1.0.10 + + typed-array-length@1.0.7: + dependencies: + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + is-typed-array: 1.1.15 + possible-typed-array-names: 1.1.0 + reflect.getprototypeof: 1.0.10 + + typedarray@0.0.6: {} + + typescript@5.9.3: {} + + ufo@1.6.1: {} + + unbox-primitive@1.1.0: + dependencies: + call-bound: 1.0.4 + has-bigints: 1.1.0 + has-symbols: 1.1.0 + which-boxed-primitive: 1.1.1 + + undici-types@6.21.0: {} + + unicode-canonical-property-names-ecmascript@2.0.1: {} + + unicode-match-property-ecmascript@2.0.0: + dependencies: + unicode-canonical-property-names-ecmascript: 2.0.1 + unicode-property-aliases-ecmascript: 2.1.0 + + unicode-match-property-value-ecmascript@2.2.0: {} + + unicode-property-aliases-ecmascript@2.1.0: {} + + unified-engine@11.2.2: + dependencies: + '@types/concat-stream': 2.0.3 + '@types/debug': 4.1.12 + '@types/is-empty': 1.2.3 + '@types/node': 22.18.13 + '@types/unist': 3.0.3 + concat-stream: 2.0.0 + debug: 4.4.1 + extend: 3.0.2 + glob: 10.4.5 + ignore: 6.0.2 + is-empty: 1.2.0 + is-plain-obj: 4.1.0 + load-plugin: 6.0.3 + parse-json: 7.1.1 + trough: 2.2.0 + unist-util-inspect: 8.1.0 + vfile: 6.0.3 + vfile-message: 4.0.3 + vfile-reporter: 8.1.1 + vfile-statistics: 3.0.0 + yaml: 2.8.1 + transitivePeerDependencies: + - bluebird + - supports-color + + unified-lint-rule@2.1.2: + dependencies: + '@types/unist': 2.0.11 + trough: 2.2.0 + unified: 10.1.2 + vfile: 5.3.7 + + unified@10.1.2: + dependencies: + '@types/unist': 2.0.11 + bail: 2.0.2 + extend: 3.0.2 + is-buffer: 2.0.5 + is-plain-obj: 4.1.0 + trough: 2.2.0 + vfile: 5.3.7 + + unified@11.0.5: + dependencies: + '@types/unist': 3.0.3 + bail: 2.0.2 + devlop: 1.1.0 + extend: 3.0.2 + is-plain-obj: 4.1.0 + trough: 2.2.0 + vfile: 6.0.3 + + unist-util-find-after@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 + + unist-util-generated@2.0.1: {} + + unist-util-inspect@8.1.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-is@5.2.1: + dependencies: + '@types/unist': 2.0.11 + + unist-util-is@6.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-modify-children@4.0.0: + dependencies: + '@types/unist': 3.0.3 + array-iterate: 2.0.1 + + unist-util-position-from-estree@2.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-position@5.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-remove-position@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-visit: 5.0.0 + + unist-util-remove@4.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + + unist-util-stringify-position@3.0.3: + dependencies: + '@types/unist': 2.0.11 + + unist-util-stringify-position@4.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-visit-children@3.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-visit-parents@4.1.1: + dependencies: + '@types/unist': 2.0.11 + unist-util-is: 5.2.1 + + unist-util-visit-parents@5.1.3: + dependencies: + '@types/unist': 2.0.11 + unist-util-is: 5.2.1 + + unist-util-visit-parents@6.0.1: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 + + unist-util-visit@3.1.0: + dependencies: + '@types/unist': 2.0.11 + unist-util-is: 5.2.1 + unist-util-visit-parents: 4.1.1 + + unist-util-visit@4.1.2: + dependencies: + '@types/unist': 2.0.11 + unist-util-is: 5.2.1 + unist-util-visit-parents: 5.1.3 + + unist-util-visit@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + + unixify@1.0.0: + dependencies: + normalize-path: 2.1.1 + + update-browserslist-db@1.1.3(browserslist@4.25.3): + dependencies: + browserslist: 4.25.3 + escalade: 3.2.0 + picocolors: 1.1.1 + + upper-case@2.0.2: + dependencies: + tslib: 2.8.1 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + urlpattern-polyfill@10.1.0: {} + + use-query-params@2.2.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + serialize-query-params: 2.0.2 + + use-sync-external-store@1.5.0(react@18.3.1): + dependencies: + react: 18.3.1 + + util-deprecate@1.0.2: {} + + uuid@11.1.0: {} + + uvu@0.5.6: + dependencies: + dequal: 2.0.3 + diff: 5.2.0 + kleur: 4.1.5 + sade: 1.8.1 + + validate-npm-package-license@3.0.4: + dependencies: + spdx-correct: 3.2.0 + spdx-expression-parse: 3.0.1 + + validate-npm-package-name@5.0.1: {} + + vfile-location@5.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile: 6.0.3 + + vfile-message@3.1.4: + dependencies: + '@types/unist': 2.0.11 + unist-util-stringify-position: 3.0.3 + + vfile-message@4.0.3: + dependencies: + '@types/unist': 3.0.3 + unist-util-stringify-position: 4.0.0 + + vfile-reporter@8.1.1: + dependencies: + '@types/supports-color': 8.1.3 + string-width: 6.1.0 + supports-color: 9.4.0 + unist-util-stringify-position: 4.0.0 + vfile: 6.0.3 + vfile-message: 4.0.3 + vfile-sort: 4.0.0 + vfile-statistics: 3.0.0 + + vfile-sort@4.0.0: + dependencies: + vfile: 6.0.3 + vfile-message: 4.0.3 + + vfile-statistics@3.0.0: + dependencies: + vfile: 6.0.3 + vfile-message: 4.0.3 + + vfile@5.3.7: + dependencies: + '@types/unist': 2.0.11 + is-buffer: 2.0.5 + unist-util-stringify-position: 3.0.3 + vfile-message: 3.1.4 + + vfile@6.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile-message: 4.0.3 + + vscode-jsonrpc@8.2.0: {} + + vscode-languageserver-protocol@3.17.5: + dependencies: + vscode-jsonrpc: 8.2.0 + vscode-languageserver-types: 3.17.5 + + vscode-languageserver-textdocument@1.0.12: {} + + vscode-languageserver-types@3.17.5: {} + + vscode-languageserver@9.0.1: + dependencies: + vscode-languageserver-protocol: 3.17.5 + + vscode-uri@3.0.8: {} + + w3c-keyname@2.2.8: {} + + w3c-xmlserializer@5.0.0: + dependencies: + xml-name-validator: 5.0.0 + + walk-up-path@3.0.1: {} + + warning@4.0.3: + dependencies: + loose-envify: 1.4.0 + + web-namespaces@2.0.1: {} + + web-streams-polyfill@3.3.3: {} + + webidl-conversions@7.0.0: {} + + webpack-bundle-analyzer@4.10.1: + dependencies: + '@discoveryjs/json-ext': 0.5.7 + acorn: 8.15.0 + acorn-walk: 8.3.4 + commander: 7.2.0 + debounce: 1.2.1 + escape-string-regexp: 4.0.0 + gzip-size: 6.0.0 + html-escaper: 2.0.2 + is-plain-object: 5.0.0 + opener: 1.5.2 + picocolors: 1.1.1 + sirv: 2.0.4 + ws: 7.5.10 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + whatwg-encoding@3.1.1: + dependencies: + iconv-lite: 0.6.3 + + whatwg-mimetype@4.0.0: {} + + whatwg-url@14.2.0: + dependencies: + tr46: 5.1.1 + webidl-conversions: 7.0.0 + + which-boxed-primitive@1.1.1: + dependencies: + is-bigint: 1.1.0 + is-boolean-object: 1.2.2 + is-number-object: 1.1.1 + is-string: 1.1.1 + is-symbol: 1.1.1 + + which-builtin-type@1.2.1: + dependencies: + call-bound: 1.0.4 + function.prototype.name: 1.1.8 + has-tostringtag: 1.0.2 + is-async-function: 2.1.1 + is-date-object: 1.1.0 + is-finalizationregistry: 1.1.1 + is-generator-function: 1.1.0 + is-regex: 1.2.1 + is-weakref: 1.1.1 + isarray: 2.0.5 + which-boxed-primitive: 1.1.1 + which-collection: 1.0.2 + which-typed-array: 1.1.19 + + which-collection@1.0.2: + dependencies: + is-map: 2.0.3 + is-set: 2.0.3 + is-weakmap: 2.0.2 + is-weakset: 2.0.4 + + which-typed-array@1.1.19: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 + for-each: 0.3.5 + get-proto: 1.0.1 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + which@4.0.0: + dependencies: + isexe: 3.1.1 + + wicked-good-xpath@1.3.0: {} + + word-wrap@1.2.5: {} + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.3 + string-width: 5.1.2 + strip-ansi: 7.1.2 + + wrappy@1.0.2: {} + + ws@7.5.10: {} + + ws@8.18.3: {} + + xml-name-validator@5.0.0: {} + + xml@1.0.1: {} + + xmlchars@2.2.0: {} + + yallist@3.1.1: {} + + yaml@2.8.1: {} + + yocto-queue@0.1.0: {} + + yocto-queue@1.2.1: {} + + zod-validation-error@3.5.3(zod@3.25.76): + dependencies: + zod: 3.25.76 + + zod@3.25.76: {} + + zwitch@2.0.4: {} diff --git a/postcss.config.cjs b/postcss.config.cjs new file mode 100644 index 0000000000..67f8bb3254 --- /dev/null +++ b/postcss.config.cjs @@ -0,0 +1,10 @@ +/* eslint-env node */ + +module.exports = { + plugins: { + "tailwindcss/nesting": {}, + tailwindcss: {}, + autoprefixer: {}, + "postcss-import": {}, + }, +} diff --git a/prettier.config.mjs b/prettier.config.mjs new file mode 100644 index 0000000000..fe9e149744 --- /dev/null +++ b/prettier.config.mjs @@ -0,0 +1,35 @@ +import { dirname, resolve } from "path" +import { fileURLToPath } from "url" + +const __dirname = dirname(fileURLToPath(import.meta.url)) + +/** + * @type {import("prettier").Config} + */ +export default { + arrowParens: "avoid", + semi: false, + singleQuote: false, + useTabs: false, + tabWidth: 2, + overrides: [ + { + files: "*.svg", + options: { parser: "html" }, + }, + { + files: "*.mdx", + options: { + proseWrap: "always", + semi: false, + trailingComma: "none", + }, + }, + ], + // We need the absolute paths here to ensure classes format the same across CI and editors. + plugins: [ + import.meta.resolve("prettier-plugin-pkg").replace("file://", ""), + import.meta.resolve("prettier-plugin-tailwindcss").replace("file://", ""), + ], + tailwindConfig: resolve(__dirname, "./tailwind.config.ts"), +} diff --git a/public/.well-known/atproto-did b/public/.well-known/atproto-did new file mode 100644 index 0000000000..acf7f09a00 --- /dev/null +++ b/public/.well-known/atproto-did @@ -0,0 +1 @@ +did:plc:a65ga6opvhd2h453vwscrvil diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000000..7d8fbdce54 Binary files /dev/null and b/public/favicon.ico differ diff --git a/public/files/GraphQL_Foundation-Participation_Agreement-Preview.pdf b/public/files/GraphQL_Foundation-Participation_Agreement-Preview.pdf new file mode 100644 index 0000000000..5977e7cac7 Binary files /dev/null and b/public/files/GraphQL_Foundation-Participation_Agreement-Preview.pdf differ diff --git a/public/files/LF_Membership-Preview.pdf b/public/files/LF_Membership-Preview.pdf new file mode 100644 index 0000000000..f8526705c2 Binary files /dev/null and b/public/files/LF_Membership-Preview.pdf differ diff --git a/public/files/foundation-participation-agreement-revised-jan-2022.pdf b/public/files/foundation-participation-agreement-revised-jan-2022.pdf new file mode 100644 index 0000000000..b714dd119e Binary files /dev/null and b/public/files/foundation-participation-agreement-revised-jan-2022.pdf differ diff --git a/public/images/next-image-export-optimizer-hashes.json b/public/images/next-image-export-optimizer-hashes.json new file mode 100644 index 0000000000..0a24a53bb1 --- /dev/null +++ b/public/images/next-image-export-optimizer-hashes.json @@ -0,0 +1,192 @@ +{ + "/1.982233db.webp": "DAZPItJcsNWkv9k6YWJRHGDMi+PHF5ASyKfFTfrFrls=", + "/1.9f150adb.webp": "mAmxZUks6dKIsZemF9Mf2li9s3QSJWXb+IXGZiKjGsM=", + "/1.b9d923f4.jpg": "keiubC5QVfPeVlBLL-obe2+O-Br5pxC1J41FhkUkVLU=", + "/10.58399898.webp": "wGhlbDHJv6GR6bOf7l12Ly1XRyWYKpWpDPLNxiSIEHE=", + "/10_53228256862_o.bede884c.jpg": "IY4m-OjhIMpy-8gPjIMeYEZJCyuEgayd1gKBaWX97BM=", + "/11.25c07c94.webp": "emuRlCiEIkq6x1TEcj0o-xqRx2uppHiHrtPdZw2T87c=", + "/11.b8f87c28.webp": "CfMMpl-2L-PdvfKb9PktNcq3FY+iywQ2r-tBPNwTL2c=", + "/11_53229130936_o.11efec5f.jpg": "diSe5JVfbzlK9K0w5GaVx67dAjah9rKBP28CM7RvPdI=", + "/12.1f5de7e8.webp": "0nn5tPRcCBdpHCBNHR8SRNitdBhqPbjMUl77RgWXwmM=", + "/12.80edfe31.webp": "Utp6vJk98yeE3eTUslQ3I36uu0FKLwWlAbJlLNobK6Y=", + "/12_53229130901_o.0594c3d9.jpg": "tBAU5LhNzFBWjvCS+R381Oxv1aLJ4p2lI5Yuyk60Oag=", + "/13.2ed60bb6.webp": "FRuEsjvn5yxf0Xgk0rfri6yHOKeXc8EQsxA-VwrsEao=", + "/13.372592cd.webp": "KIF2PXmz3C1D7MlMkF2m95lrqkjmkqJh0+rzwGknz-4=", + "/13_53229431753_o.312ed4c6.jpg": "UWubZOcIMlv52LYSBZc68bN6cJ21V-bIoONu93fbMxc=", + "/14_53228256817_o.e967eba8.jpg": "I5ISHXYPMPhVvXcapBBJSjiBT-kpugnxPaVb-FLA+Ko=", + "/151_53229506084_o.2e2d8d93.jpg": "HxYTSOHfoDBVCIY2FaaxUcOV6+geraqYKjTq19z0Cgk=", + "/15_53228256787_o.1d94ba72.jpg": "7v+c+tiicq00iZL5pEBtJPvI-uQRSqsAapSIoavX56E=", + "/16_53229629695_o.cead94d8.jpg": "akaD3rXkqvZwBoDZSzPwKNBC3zMRkpMwHzAABA3UrOE=", + "/17_53229431688_o.4c21d256.jpg": "yrv5EILkRoNtrU9XsUL0cFZ9Uw1xLhMh9MB4KSOpRIA=", + "/18_53229629645_o.379c2659.jpg": "ttOW81TbKCtikFu1WUJLgoS2TGUeFXjt6n8DVHxrwHc=", + "/1_53229506279_o.f0bca9c1.jpg": "yHvLYpCAhVTmTg39yDNokfYqQ8S1ZZi86xI26NYQbbU=", + "/2.45dac2f6.webp": "5giIntTvHEtW4YKcvzWyr93T19WbBYiYHZ7-97m8CQ4=", + "/2.4607ed4f.webp": "f2NDIzjfiAUIHTlg3Y+gcWiRNdM8JbN6BA2RXycEBNQ=", + "/2.99d027a1.jpg": "uPiLK06UD56JNe68gW0QEyLoLf446VRNy7Ia0FuQ7HI=", + "/2_53229431883_o.cddf7051.jpg": "Wr8okGNc7WieV3dpspNi5MMv3BXqySV1fDAIJY842gI=", + "/3.2ed01ad0.jpg": "Ftp2218Nf9X1YQA342243Q-iklHDBJ8IdA59-iIDmD4=", + "/3.40539a03.webp": "gAgt3cACfsDGa+uQImhFMzBo-dX7pGtULWRK8po6sgc=", + "/3.8b9a97e4.webp": "mwfpC-0F9HGau5iTkDdxPX4MgEXGSIrrme1AuIjNfZE=", + "/31_53228256917_o.f420933f.jpg": "v33-soBSAXKQGEsKU+XbNNaQqoPwl7kybxfZTsB7sco=", + "/3_53229131021_o.dfd0081f.jpg": "goLNvvOrHmTqYk4K9ZeEGX6KZeXBN6zpSIS3C-GwR+0=", + "/4.9cea345b.webp": "OIJvuaLA+UuPet-VkSw16vOg6E+w6dmqbbKxRnNQLxw=", + "/4.a081ca23.webp": "cdq3dvJh8XnUlcCYS+wilStqck1-6IQ-cvvGBrIlLfc=", + "/4.f41621f8.jpg": "liG36J+08jIQzmQIrMcMsQ5BzjKhxLX5HGclFdDoOIs=", + "/5.5e7fbfc8.jpg": "wjKxQX2w8yb2zbNvWf+-4kkqC3FXw7M6CuUvgGuu0pw=", + "/5.95dd3cfa.webp": "hukBtqFbxuyoVSnFI99BeYqh1esjUfP9gYHMuxHZw7A=", + "/5_53228256882_o.2173b47b.jpg": "vodeR1lNx7CWO6e3j7MsD0MuvPBv8D1Mey+iRA36crU=", + "/6.7cec175d.jpg": "+AGRr5xsz14uZrdLFOZ3nTT7vvhBdg-PgC4Kty1toSs=", + "/6.a9e9ef54.webp": "LoTArxYxGSkkO57CnkKMsZ3+jcxF5DQ74M9TEtoQFLI=", + "/6.f303b2b0.webp": "x+9YVxnjfiZ8eWKUeQvbty82O6IGi-TZSYcjgYP9AmY=", + "/7.5c473a95.webp": "ymbpxb2EUD9eCfSa8Yc+0XQr7AIzn8jUAZCX+JDvS6E=", + "/7.8a7605d4.webp": "dnxvSxaDK0KpDdHIDD02+Sv59R64V3QN9uklMNN-T6Y=", + "/7_53229506199_o.9bbeb0b1.jpg": "JunA4ywMiDM4xmQpFUo6YW8Q03gYrB-6NNj6zfmgk4A=", + "/8.36a60072.webp": "WkLbG000irZwPexBmq4XfB770l0Bx4VNBbbofOIDFsI=", + "/8.9d69d599.webp": "H+BpdMeJnUaUowq8vJvVdDxg9KrJfh+2-rI1ZFeW-cw=", + "/8.eafdc50d.jpg": "Xpw7kJ8jCbKlDu-wLxBevA52CZfp9mlbfQ43ldHeZmw=", + "/8_53229629805_o.290e35be.jpg": "NfsXTg4KKkt1csv79IiZ3FyU3-CW1WTkp4883NgZam4=", + "/9.4a558c85.jpg": "-iUSFWjVs4vunEea7FxDeNMOOvUs4VOEpScXJAwi0DA=", + "/9.844b3dd8.webp": "sw21n8SoYJfqMMmrPDoHuk7rPkgbAcSelf99kZeujmo=", + "/9.aee863a4.webp": "qu+xa-dpm5C8AByc3HChjPET+FKw9VyvztrNKY1QbRY=", + "/Comparison_Method.b12d6d2c.gif": "O9Anxn1Z52YzvH8Ygfb2F485U1maEOTt5LKAk45963I=", + "/annual-report-1.5ebe2b34.png": "HmbFFbaUL79rvnCKQ-2oRSLETM2FFh5v5dZxwWquuVM=", + "/audience.f60c1c99.jpg": "pqx3E31xAO87mNEBlZKqCTX+LRiPlOuQThWQZf08A4A=", + "/banner.10d4d66b.jpg": "9UJqBQ9RQu2sxDdJ5uaQr3crx2ZXrlOKMAmY82R8ZBA=", + "/blur-bean-cropped.62af4aa2.webp": "rdPhhzi5e+RLv-u0B-uPkp-eCYnyGlO84Yn0zCLLG4c=", + "/blur-bean.21b930bd.webp": "eTUigN2JSyvccNXMnRwneZJ1YIeNnrVs3klseGSUa7o=", + "/blur-bean.314cdc4a.webp": "YAysN2NZeYYWHNI8cFCabzsTifCknmbp-r+P1LAs1bE=", + "/blur-bean.d5aa6d13.webp": "30xrtHSB6py7q6r2HxdKzm4gt8WoCiWRownamqyf3wM=", + "/blur-bean.e3e29fde.webp": "P51vlY-ohTlEurj7zyND+Xs2UCfBaUZuNZhj9OEvmq4=", + "/blur-blob.806d2505.webp": "BInXgg69BRLrWxxX-vMwO09WhUgC8umt6F17w9-4lP0=", + "/blur.701b3d8a.webp": "WzjpcF01ReIsRBgeKAs0KyCfB8h6tZk2lzY89i9xlKk=", + "/business_layer.68bf746f.png": "DwCtOs-q1Y-DgBxEj6NqyVaOAiq5zCB8xPF-rZ5Qe1U=", + "/dataloader-query.9c90539e.png": "2xPPUoCjbgMKsH3EPLBAImfsNb-MYPb-Qf6gXg8QCn4=", + "/fernando.8a674f38.webp": "VLcChFQr-iiIKTZ2OftoAAWS8cjUYAaBV0C-U9vcKS4=", + "/frances.033cc832.webp": "WDYuYaN-sUoPKcZWY6udTedmfrgDg80CQW2Jr4LF8ng=", + "/graphql-cover-1_53228256677_o.f1214f00.jpg": "OVKx+JK+SA2wdzmUs3VN+eHR7Fk2CXhTLYdNIyNbehg=", + "/graphql-cover-2_53228256672_o.80b12e74.jpg": "eRqA89yK+I9hdGfjSlv7sIpExOhByCXKn7xY86Lt2yA=", + "/graphql-cover-3_53228256612_o.a5360272.jpg": "MDj38ijAhAyJTMvi0vNE7JVj+uXRXNLUhdSXtZvEMT4=", + "/graphql-org-v0.8990439d.gif": "UuHxSMb-yt4-+HxYB-VRMfNYIa1UaNWQeGwA3Nd+GfI=", + "/graphql-org-v1-learn-page.44ccd7df.png": "GsV1iA47a64oNe+IgjoFKEtcbBKTCqtm1+ZkoARjt+I=", + "/graphql-org-v1.599caf32.gif": "Tp9NHPBhI8WQy7qOonZH5OqlRqtNlAIKnUMi0KefaOE=", + "/graphql-org-v2-learn-page-dark.0eae8efc.png": "cQ+Nj-zFKjn17sZa-W4-ooA-7XYEeqtNRSam4XL2S0c=", + "/graphql-org-v2-learn-page-light.009ff55d.png": "5r1ZoMqy1LQsDD8UvQM1nJKHgGwWa8gnD0ydO+QKZlk=", + "/graphqlconf-202310_53229130641_o.0a9f57a8.jpg": "3JBA7zAJe2Jn7AjB0d90j9sZtuipi1MSlKVKvH5gPQs=", + "/graphqlconf-202311_53229130636_o.8575f45f.jpg": "T8ODamSOqwJPcgfDqiOfpGMP-QFzKVh+KK96I2gttrI=", + "/graphqlconf-202312_53229431468_o.ae2d4d8c.jpg": "LNLPj3ut3nP++OsunMSjs9VMMSFJhG-m42Y5KKiO6RE=", + "/graphqlconf-202313_53229431453_o.ad027cad.jpg": "XLZDonwOK7vR76YQpTDkxe4vvMtE1gn9F14WppGLCGk=", + "/graphqlconf-202314_53228256402_o.2bf2cdae.jpg": "K5EfDBUzt7oCYjqw40Q6Tqa0o9Nbrw8S4uX31SnZgDs=", + "/graphqlconf-202315_53229431418_o.9469c593.jpg": "BCibYMf813sgZe4BF0i7WUzi42vlVU3-h895NNKvJsA=", + "/graphqlconf-202316_53229130551_o.c6b56b39.jpg": "TRnhQmhjeOV0tRMfjofuukBFjZztdpLarhf8NrOGdXI=", + "/graphqlconf-202317_53229431408_o.58596b8b.jpg": "Xg54Bt7hkdzQK7Zh09BqTaAmSuS4tWFw1q9oKlYcIDY=", + "/graphqlconf-202318_53229431413_o.04a6f9b5.jpg": "WpC4jnQ6aW34GAFCQo9QCzuu1Si440lfTYFIQmoAPqw=", + "/graphqlconf-202319_53229505639_o.20199331.jpg": "6yRCn3yb9h2knPOIR+4fp2EmcauJBEFrregEuX4L3EM=", + "/graphqlconf-20231_53229505964_o.9c56a9e4.jpg": "hSJC35GSG-cRZjDiY6CZTVlrqAM603nzbfgR-IxxUik=", + "/graphqlconf-202321_53229504679_o.1718fe3c.jpg": "qgqvh64e3ZgcEGZZqKFIvnsztQmE+34W1wMIj70I6ec=", + "/graphqlconf-202322_53229431348_o.3468cf44.jpg": "4w5eTi3e2LFNikzYp1mNmdWG1v0KNx5VxxLurqQkfT0=", + "/graphqlconf-202323_53229431353_o.23dba57f.jpg": "SmfqwdcPlp9gO3pJH0KfAR1pq8lvMvbqN4hxURddIWs=", + "/graphqlconf-202324_53228255322_o.45bb89d7.jpg": "5CX4AJk4l6AvKsVBbF9seS3uFL+kw8jmVnyjw-Hew58=", + "/graphqlconf-202325_53229628480_o.99d027a1.jpg": "MLV255jm89i43Qi86Hv1bIL7L6wbPPztg24Zzqrkg5o=", + "/graphqlconf-202326_53229504664_o.001fe4fe.jpg": "TVVIOHGx05AMhLDZpasbL80lpcQZgkl0ljKet1DgJwc=", + "/graphqlconf-202327_53229430403_o.b50ec61c.jpg": "K6A-HENwlo-uZsbc4a61SCkD9I7dZjhJC8TtDYNpqPk=", + "/graphqlconf-202328_53229129426_o.4935b165.jpg": "U8L+qtBk6f8btDR8SzYRfiK9FpEl1v+uuSpMB0yhzEs=", + "/graphqlconf-202329_53228255262_o.b7737353.jpg": "SOyZagUbS8kEL-RVhswtkteaSGG5kc8WjeQc1CUIZSw=", + "/graphqlconf-20232_53229629585_o.a005f452.jpg": "CzVWJq1h7Qiblr1ySqlytfMNrZ-GCv3JjQF+egDwWH4=", + "/graphqlconf-202330_53229430393_o.7d716e9e.jpg": "A4Dmyt12lbQTAtn8oGr9A1AA0k8xEZr5keU4JzSuQKA=", + "/graphqlconf-202331_53229430378_o.16d725b1.jpg": "Lq5A2LG7JYWSiXJXvWNMEfS0fcjoBacoZIM2V-s+1F8=", + "/graphqlconf-202332_53228255222_o.236f0447.jpg": "+k03TIGuNVrGVTC8-ye-R+MUs6Z4oeSLxu6vXY7zV14=", + "/graphqlconf-202333_53229504589_o.6dd5899b.jpg": "m+TwTxfkrwkscMSkLRxXFfj6ogsWaIqq8qOUj1LsKMo=", + "/graphqlconf-202334_53229505599_o.a404f647.jpg": "NKeU2rXlJ0MZIq0ysTZ33lpvmveadIOxP75-VzGRAeQ=", + "/graphqlconf-202335_53228256247_o.51c1c212.jpg": "OSa0fZ3qa+0v72yY0ab-V5bjDWavNOc8-Lg69HRepfM=", + "/graphqlconf-202336_53229431263_o.bce162ef.jpg": "20Jbr-zKtdHogrPXVH4DXUKLmvd-0IYsiHiGbB4+fs8=", + "/graphqlconf-202337_53229431268_o.db2f5296.jpg": "7Ff-IX+9XcEsVCLtyYA4cJ2SdenEUphfKqnnrBXMGhs=", + "/graphqlconf-202338_53228256132_o.f68b24c7.jpg": "csTB6zb6EWGfWHVH0IZQr6GkhfT-uF6BOGn3vXr1Iuo=", + "/graphqlconf-202339_53228256117_o.c86b66da.jpg": "dHCXGBKnYnj2WTec15R3zFMP13V9LlxI-RYS6zNe0RE=", + "/graphqlconf-20233_53229431633_o.17086c3b.jpg": "jZPBdBDVGMkbg31GWl75TPLfwVJ6oBHI6YLIAaOKkCg=", + "/graphqlconf-202340_53229431183_o.31494071.jpg": "jUOvmxfwZUDBL71KPg60bWZgGK-eCQ98gIv7qyvOj1A=", + "/graphqlconf-202341_53229629225_o.c86a20d5.jpg": "jjglcO+7Gi9O3otc6bOk5lht6ZKtWZVvlTI3s+N1m3M=", + "/graphqlconf-202342_53229130301_o.5d03e216.jpg": "ioR+6YR52aqJB8i85tVWr58q63a3HKpHTGF8oIU5Axw=", + "/graphqlconf-202343_53229505484_o.063091c7.jpg": "BO2xeM6KTTCYnQMUQMAMPZ6EOu4RTh8136sXW-CGXUw=", + "/graphqlconf-202344_53228256077_o.ac84a9e0.jpg": "L8CYvj-eXAuz5VSAfljuRPtXFbT9bRWLIuAlR84Ne8I=", + "/graphqlconf-202345_53229504499_o.041f7b08.jpg": "oSMqpTY2l5Q5xTsF-r-iwnjKFv8h3nWgKyW3c9E07rw=", + "/graphqlconf-202346_53229629115_o.f026376e.jpg": "ub539BcLc9Q-TvDqH9E5ttiO2rqe8pxwsVZzDQn+0sE=", + "/graphqlconf-202347_53229129301_o.ce3f873f.jpg": "KK-BZKTZ3dVbDbqgMkMkF6cgZmnlCxDbYs7LX1B9-nk=", + "/graphqlconf-202348_53229130226_o.2ac71225.jpg": "tHC+JMx-WD0Tu+3itpXaW32-q5ML3v-9VdHWYAnq1oU=", + "/graphqlconf-202349_53228256032_o.55fa111d.jpg": "lgKh9Gs-fg67wah1VMSe-g0wqlrGOnHz924jDhosnG0=", + "/graphqlconf-20234_53229629525_o.7cec175d.jpg": "fsjZxAIUqdK5tPQwptn7y3oPsNkGLYULqAeMaqDyR70=", + "/graphqlconf-202350_53229130146_o.ed5a0148.jpg": "A3jAZ157qJYjK8JimKshuTEVLz0J4AMA3V5cCa4eiuU=", + "/graphqlconf-202351_53229130151_o.3ce915d2.jpg": "hOIhlTZ+fl1ZRrQHowunyCTYhXlE4YeLXIiCakBgbYs=", + "/graphqlconf-202352_53229629035_o.05b7b814.jpg": "BETFfZqBeK+yn6Ojs92pz7rIC7Bcv0JbH8FTl9mwhWI=", + "/graphqlconf-202353_53228255937_o.63b58806.jpg": "FTmVBw35smbEbOEsB0QJmNyvmQYSV9UWV+ZdX6ANAMA=", + "/graphqlconf-202354_53229430998_o.eb9cfdd1.jpg": "gEw1Hh9Ox3fz1k5wa3PjMjfeLaShQ9ehFtSegXjRBsc=", + "/graphqlconf-202355_53228255882_o.f41621f8.jpg": "S49zUzF4krdajmOCOo3fYGShYYH8b5r6sBAuIs1QZsM=", + "/graphqlconf-202356_53229505199_o.a10d0d9c.jpg": "EVA8r+ki7TJzcUVsrZFsfnQ6P9O1wHedEP-E6+l4Xj0=", + "/graphqlconf-202357_53228255742_o.eba44732.jpg": "Uc9gZLYeNw8OmN++Q0BnL650u+mh-4au28XKv284pxs=", + "/graphqlconf-202358_53229628875_o.d90a314d.jpg": "VVZ736qeZF7zCUMCJ1yayLIQcIBHHblyeW01HoXlxDQ=", + "/graphqlconf-202359_53229129286_o.a7d60456.jpg": "nOP-nEX0BB2o7d2L2g-U8cr9I26WSZ0QvKHMB7l8vSM=", + "/graphqlconf-20235_53229505904_o.70448c14.jpg": "YOd6dSC0omsDmyDS7rHCOrA1G5MeDmvQRtWKKaOPRuk=", + "/graphqlconf-202360_53229430883_o.c956c861.jpg": "5dafjcrAGDoNVG1A01tfqSz2B0i1c1Jv4gsR8z-bFn8=", + "/graphqlconf-202361_53229628295_o.7d239d57.jpg": "uvm2SxK8SWaVOaA5iS+WkR9jBDbQFmVqpyyMYwj6TSU=", + "/graphqlconf-202362_53229430868_o.d6685132.jpg": "ktqQdqwn8ZMaNV+QF-tiCk3ssfbmuId1RI6KpvBYthM=", + "/graphqlconf-202363_53229505084_o.d0dfd52b.jpg": "d5tL1slRZdKtxsl0-czV3T8+fmPg5zU-+rd-970WSto=", + "/graphqlconf-202364_53229430858_o.0f85bae9.jpg": "WXJ4WsjYdXvjISqXX3OAVuwaaMens4tMbgH+oNR+3yo=", + "/graphqlconf-202365_53229430258_o.79cb0cd6.jpg": "9eZEmdHJPXvjaIbxGgDpkzjieZUqmb+7-UXVkgZsPxE=", + "/graphqlconf-202366_53229628825_o.2ed01ad0.jpg": "1Rl3Mm1yQ1EVHhy28qc6TO0C1PWQht+CHRuN9XBitj4=", + "/graphqlconf-202367_53229430268_o.99d027a1.jpg": "nbljN14MRyuAnUYyaseG+llnw8n6Z2dDilYpjwGFJo0=", + "/graphqlconf-202368_53229430823_o.b9d923f4.jpg": "tuzgDsDCc5CYN6OkoVW1DaNHCuaEvj7gap-ds2YGD1Q=", + "/graphqlconf-202369_53229628795_o.f37fecb1.jpg": "VqOYA+c5DbCm9Z60DeVJ5qLk4lNYe6Q40mtVyBzFTUo=", + "/graphqlconf-20236_53229431543_o.7613bf28.jpg": "6aYMWbMtsuyIQ6O300jlg8owiaOoO3wkpuF9-f1ejL4=", + "/graphqlconf-202370_53228255572_o.d32f275d.jpg": "TB4RRfvR2bSMJHgXHMPYcqc2b9S+LgM+-tC4kngNnMg=", + "/graphqlconf-202371_53229628710_o.b50decfa.jpg": "rP2JvxcXaZEoKtVugK8EZtgqxSFR2z5vZse8z6tlPos=", + "/graphqlconf-202372_53229628695_o.1f2523ca.jpg": "VOeo8FNz9YKmoLs+yB2nreZRosfQtXnuIeUjmU99lKA=", + "/graphqlconf-202373_53229430683_o.afbfd335.jpg": "BCes26J0rsM1kHVXI5cGOtLzyNDI8EGIIuMiKkOTDCc=", + "/graphqlconf-202374_53228255537_o.e77067db.jpg": "yJdkzssSiUbUX4xcLpUhqOSk8rHL7vf49i3yvUyf5Ic=", + "/graphqlconf-202375_53228255527_o.f2d9cb5e.jpg": "iFZmX0uK2EpmyAWcZL+nwV-VejsQ75YE4HjWZ5aInt8=", + "/graphqlconf-202376_53229628665_o.7588ad1e.jpg": "EyJFwVFs3Z2h28oBeKtO44J9NLs6cG7LYACkTuwO90E=", + "/graphqlconf-202377_53229430648_o.e972a067.jpg": "qwyjZyFFhOBkzFwhgfyeturahaGTB8ObS8590H+2PtY=", + "/graphqlconf-202378_53228255107_o.440701ab.jpg": "ArJEB814-odLpTYcso68-P5P5C0ifIrB2y3MAvb724M=", + "/graphqlconf-202379_53228255097_o.049e6aca.jpg": "mXNbt+YVaOA1iRZMek0AhvllUsbr7ai5mVHd14RfeU0=", + "/graphqlconf-20237_53229629480_o.965ea827.jpg": "SYmnfHQtfu1u4dOZZ7ZskNmAiIm3Kibua7ylV5OP69c=", + "/graphqlconf-202380_53229430623_o.6b50a026.jpg": "tlNf4P5Qld4jgqyu7NFyRa+v-D9OaJAiD6rdriR2xmw=", + "/graphqlconf-202381_53228255092_o.6362027c.jpg": "mmtkGxDYZDDJt2LT6ZEh9VBLG2r+L6UGnuSj8erY4Ds=", + "/graphqlconf-202383_53228255462_o.230755c9.jpg": "4O57eNYz0Ghh+KDETwDCAmx4M4YaDswho0zfabUTanA=", + "/graphqlconf-202384_53229129586_o.c94f152f.jpg": "f4Z5HsL4XYnKbfnEZr-C2tJ23+UaPHYnsg1ixNEJTKY=", + "/graphqlconf-202385_53229504819_o.87e52ba9.jpg": "TSAQloW4jmmpXJm4ggTUsTI1cMks9wBI6XW0I60GkEc=", + "/graphqlconf-202386_53229129601_o.2bcfa035.jpg": "euKGFUm7wwFz6cL2gG3tkWqkI0Qf27dMrNcv9HBIA1A=", + "/graphqlconf-202387_53229628600_o.50b80a2c.jpg": "Gc0WkCkjWcqNnKdEMv+ZAy1lQW8Llsc99Ygr3Nkm1Js=", + "/graphqlconf-202388_53229430518_o.322da773.jpg": "Wo4IRc+t6D5pVNENI5HNtebMfm4ST6e3GyftsAySh4E=", + "/graphqlconf-202389_53229129526_o.8e8c981e.jpg": "p8M41uzqzWkbbNfmtQcjrcaFW7FnFRhFmpLdgc+1m-g=", + "/graphqlconf-20238_53228256482_o.c7580736.jpg": "-IU2PYAUUY0R5d6J3sD35KlXKbNGe0Abqn3E-XZsLNQ=", + "/graphqlconf-202390_53229628530_o.347e0dfd.jpg": "WVjLGYygGS3WTRTj-WgX8fSIz5WYHVmusEklFf8OLk8=", + "/graphqlconf-202391_53229504714_o.eceeece4.jpg": "vLBZ3tXHxTMXCNlygVSlAUrn4pRej04aFbu+t8vJe-8=", + "/graphqlconf-202392_53229430473_o.a2f47b33.jpg": "uVRxbX9-CXzp4FyB1ToCpRc6uTwb57G-6FSfiMkeU8w=", + "/graphqlconf-202393_53229129511_o.f8a226ff.jpg": "2UY-mQE0aBJlJNMiFLlch0UtNRXXDAQdhA8t2J8uzns=", + "/graphqlconf-202394_53228255057_o.7db0c51f.jpg": "PNxi4-OUDbB6s+kftRy-fZJXH7yJVR34DkigAUdNg9g=", + "/graphqlconf-202395_53229430163_o.83d6ce30.jpg": "wGPGuLNhdPy1AKSdem7dB2U3hCnLNt0m7A697OKpMLA=", + "/graphqlconf-202396_53229628185_o.e02e8158.jpg": "CwcPIFPl3qMN77xrq3PNo3IDu2xdE5t-XAmqMN7vvrA=", + "/graphqlconf-2023graphqlconf-2023_53228255062_o.29b776c3.jpg": "iXr9Z8xwKZhM1pUZPRRTFEHbvwYlw81k6ZIqW5zh3x4=", + "/hero-photo.19f66b71.jpeg": "+1M5NcPmN+FvAM3dalHY2LN1vv+LNURKJEVZUw-yEZo=", + "/hero1.2c973c2e.jpg": "jY1RePeWthuOOa5c59Yl4TQD4J731poNxeaqzKDFmfg=", + "/hero2.fa425ea9.jpg": "siZR-Q3HPEB5l2gU0DAbheWVVUOCsrOuOv-Ch0xCR7M=", + "/idit.feda6f62.jpg": "9oybNQ8aiuV++33v8KDL8ZgIL0H2T5UF3EjnhsksM5g=", + "/layers-2x.9859cd12.png": "3D8k4Go-oWvQTcmIDFOwHTfm1eagZIqjwar3vFcoZY8=", + "/layers.ef6db872.png": "fbR0XaZWR0olI2fUKeOWruBZ6HxRDSEYGXCzktrW4XA=", + "/lee.dfa51298.png": "rG86vKMradTmaq1FH-F2-zwDzRkcw-qXK18Slp34VPs=", + "/leebyron.4adb0a93.jpg": "poBi-hIdozz-Mn2PIKun7ZpX9q200f7m-5SkUt1XU-0=", + "/location-photo.8c4a71ef.webp": "D2r5lWoyQSdcclBUQB0bcxPdRdbfaiizSWJocmD7uZ4=", + "/logo-blurred.94c9eff4.webp": "+MCg5-u6UTMKypwln1HeLvrNm-13OHneZ8fkK8A1fjs=", + "/logo-mask.1694fb96.webp": "w1mI242Cka6-grRJCeOT5lWF2uf5hol5IRLjTwlqFZA=", + "/marcandre.b8692933.jpg": "mUbreFySTVojHKZTl0VKcMQ9gHdSVCL47mSBnUYITBI=", + "/marker-icon.d577052a.png": "L15ETF3vWj9pjeLgXar+ibZOYNJYXoQal5lJmpTWTbA=", + "/mask.d8b3d3a1.webp": "ooHSo7veWXOjMT0Db6aLQN+zHXY7gzxQlsdLnBLk2es=", + "/pathological-query.2de43465.png": "Xoi58Mnu6FqfvNp4+gXgt-IyMDdMpdbqPUyNzlH5YJQ=", + "/playground-transition-banner.2458871d.png": "ffm4o7utOWkmwaWC2KVVHPOz9zsaD6fG2P269pHT8uQ=", + "/rest-api-people.c2b56e20.png": "KDbPJA1rAhVT43LeGLckdesx+bISV+6g0q9fJQNl5Tg=", + "/speaker.5a4b04b3.webp": "rm++82SXr9oqVCuxwkK345jZeh0SmcJUoNDEMSOk2Bk=", + "/speaker.674c5b86.jpg": "ISlnB9At3nuMk70rfRuMAu+k9aEhUNSwp7XgFMx5Bls=", + "/trudie.02ae47d4.webp": "usfvAbw1lOVGAmQ3-F5HNJJ33x7npr7aC1KKO4WgyeY=", + "/unconf.651492c3.jpg": "mlpvU8glWqqsRn2n3-pgwRI+Jnk3sT7VQjsCL01e30c=", + "/uri.387cb001.jpg": "kSx4huEjQidwIg6bF8UEWLiPACDl0nQ0aqxA2R2LIe0=", + "/whiteboard.60eac8e3.jpg": "NodBqUaO+IanhuPaP9o5jCIe+gSrwyZ9TZ3QUdlWbBg=", + "/workshop.e02e3501.jpg": "D9ON1z6-vKcjxv50gOH+5XS9HTEWUpc4UgIPW5OXHxE=" +} \ No newline at end of file diff --git a/public/img/__og-image/2023/017d9954f1be1c7e2ab2696c2abe6b9b.png b/public/img/__og-image/2023/017d9954f1be1c7e2ab2696c2abe6b9b.png new file mode 100644 index 0000000000..1b96ab2a39 Binary files /dev/null and b/public/img/__og-image/2023/017d9954f1be1c7e2ab2696c2abe6b9b.png differ diff --git a/public/img/__og-image/2023/09bc04c42310bfe14024455bce46d781.png b/public/img/__og-image/2023/09bc04c42310bfe14024455bce46d781.png new file mode 100644 index 0000000000..d719309308 Binary files /dev/null and b/public/img/__og-image/2023/09bc04c42310bfe14024455bce46d781.png differ diff --git a/public/img/__og-image/2023/0b5f6bcbfc77f97f4cdc6cdf4a171f82.png b/public/img/__og-image/2023/0b5f6bcbfc77f97f4cdc6cdf4a171f82.png new file mode 100644 index 0000000000..4ce5363c76 Binary files /dev/null and b/public/img/__og-image/2023/0b5f6bcbfc77f97f4cdc6cdf4a171f82.png differ diff --git a/public/img/__og-image/2023/0bea54e1f79d706f2da4c802f8581ae5.png b/public/img/__og-image/2023/0bea54e1f79d706f2da4c802f8581ae5.png new file mode 100644 index 0000000000..34d3f8be2f Binary files /dev/null and b/public/img/__og-image/2023/0bea54e1f79d706f2da4c802f8581ae5.png differ diff --git a/public/img/__og-image/2023/0f57893e761e683f58c4ace9e766c3bf.png b/public/img/__og-image/2023/0f57893e761e683f58c4ace9e766c3bf.png new file mode 100644 index 0000000000..20d5276f80 Binary files /dev/null and b/public/img/__og-image/2023/0f57893e761e683f58c4ace9e766c3bf.png differ diff --git a/public/img/__og-image/2023/118f99976647d953d6554bac33dbf3bf.png b/public/img/__og-image/2023/118f99976647d953d6554bac33dbf3bf.png new file mode 100644 index 0000000000..8915072bde Binary files /dev/null and b/public/img/__og-image/2023/118f99976647d953d6554bac33dbf3bf.png differ diff --git a/public/img/__og-image/2023/158baff7d8c21cc0c210f805baa3e383.png b/public/img/__og-image/2023/158baff7d8c21cc0c210f805baa3e383.png new file mode 100644 index 0000000000..a6d8df3baf Binary files /dev/null and b/public/img/__og-image/2023/158baff7d8c21cc0c210f805baa3e383.png differ diff --git a/public/img/__og-image/2023/17f150667d13a57f28bae524443f4c60.png b/public/img/__og-image/2023/17f150667d13a57f28bae524443f4c60.png new file mode 100644 index 0000000000..5872a65f91 Binary files /dev/null and b/public/img/__og-image/2023/17f150667d13a57f28bae524443f4c60.png differ diff --git a/public/img/__og-image/2023/1e7a35fbd833d9be1aa9719f77c86fb7.png b/public/img/__og-image/2023/1e7a35fbd833d9be1aa9719f77c86fb7.png new file mode 100644 index 0000000000..a823e3f8c3 Binary files /dev/null and b/public/img/__og-image/2023/1e7a35fbd833d9be1aa9719f77c86fb7.png differ diff --git a/public/img/__og-image/2023/217cf30afd15a724ebb42c4d82169a26.png b/public/img/__og-image/2023/217cf30afd15a724ebb42c4d82169a26.png new file mode 100644 index 0000000000..2de66b9dc6 Binary files /dev/null and b/public/img/__og-image/2023/217cf30afd15a724ebb42c4d82169a26.png differ diff --git a/public/img/__og-image/2023/247898ad29d5e594611af3cecf82f5e3.png b/public/img/__og-image/2023/247898ad29d5e594611af3cecf82f5e3.png new file mode 100644 index 0000000000..c9117d6e7e Binary files /dev/null and b/public/img/__og-image/2023/247898ad29d5e594611af3cecf82f5e3.png differ diff --git a/public/img/__og-image/2023/2517f7a1d13ad3c0652e1b3cc5b65714.png b/public/img/__og-image/2023/2517f7a1d13ad3c0652e1b3cc5b65714.png new file mode 100644 index 0000000000..bf4462857e Binary files /dev/null and b/public/img/__og-image/2023/2517f7a1d13ad3c0652e1b3cc5b65714.png differ diff --git a/public/img/__og-image/2023/275443caa2eda5df06699b724efa533c.png b/public/img/__og-image/2023/275443caa2eda5df06699b724efa533c.png new file mode 100644 index 0000000000..2be214d663 Binary files /dev/null and b/public/img/__og-image/2023/275443caa2eda5df06699b724efa533c.png differ diff --git a/public/img/__og-image/2023/2816d4a81204283289584830acda7826.png b/public/img/__og-image/2023/2816d4a81204283289584830acda7826.png new file mode 100644 index 0000000000..90ac61fa91 Binary files /dev/null and b/public/img/__og-image/2023/2816d4a81204283289584830acda7826.png differ diff --git a/public/img/__og-image/2023/295679e18701aa2be84f329db1118637.png b/public/img/__og-image/2023/295679e18701aa2be84f329db1118637.png new file mode 100644 index 0000000000..1f5c5467fb Binary files /dev/null and b/public/img/__og-image/2023/295679e18701aa2be84f329db1118637.png differ diff --git a/public/img/__og-image/2023/2b7518a6d8f2b72122c17beb92af8c89.png b/public/img/__og-image/2023/2b7518a6d8f2b72122c17beb92af8c89.png new file mode 100644 index 0000000000..cb54fb471c Binary files /dev/null and b/public/img/__og-image/2023/2b7518a6d8f2b72122c17beb92af8c89.png differ diff --git a/public/img/__og-image/2023/3045d1849811f05cc2afaf690ea474a5.png b/public/img/__og-image/2023/3045d1849811f05cc2afaf690ea474a5.png new file mode 100644 index 0000000000..1a6dd59739 Binary files /dev/null and b/public/img/__og-image/2023/3045d1849811f05cc2afaf690ea474a5.png differ diff --git a/public/img/__og-image/2023/34bdd9b21a3cf2db6600a5ef840b3fb3.png b/public/img/__og-image/2023/34bdd9b21a3cf2db6600a5ef840b3fb3.png new file mode 100644 index 0000000000..dfa33a9926 Binary files /dev/null and b/public/img/__og-image/2023/34bdd9b21a3cf2db6600a5ef840b3fb3.png differ diff --git a/public/img/__og-image/2023/38cb4033d5cfed2d5b508f08374ebe9b.png b/public/img/__og-image/2023/38cb4033d5cfed2d5b508f08374ebe9b.png new file mode 100644 index 0000000000..5777bbe1af Binary files /dev/null and b/public/img/__og-image/2023/38cb4033d5cfed2d5b508f08374ebe9b.png differ diff --git a/public/img/__og-image/2023/3a88eedac57e223aa69979407cfcc8f0.png b/public/img/__og-image/2023/3a88eedac57e223aa69979407cfcc8f0.png new file mode 100644 index 0000000000..85a822eaf1 Binary files /dev/null and b/public/img/__og-image/2023/3a88eedac57e223aa69979407cfcc8f0.png differ diff --git a/public/img/__og-image/2023/3d167cf84012c4ff2dcca8fca736b0dd.png b/public/img/__og-image/2023/3d167cf84012c4ff2dcca8fca736b0dd.png new file mode 100644 index 0000000000..ebccb68e93 Binary files /dev/null and b/public/img/__og-image/2023/3d167cf84012c4ff2dcca8fca736b0dd.png differ diff --git a/public/img/__og-image/2023/3e70d76748962770972c5c80e45ee9d7.png b/public/img/__og-image/2023/3e70d76748962770972c5c80e45ee9d7.png new file mode 100644 index 0000000000..bd05cea429 Binary files /dev/null and b/public/img/__og-image/2023/3e70d76748962770972c5c80e45ee9d7.png differ diff --git a/public/img/__og-image/2023/47c1bf50ce5556edcae9a84795485a8f.png b/public/img/__og-image/2023/47c1bf50ce5556edcae9a84795485a8f.png new file mode 100644 index 0000000000..00890b1467 Binary files /dev/null and b/public/img/__og-image/2023/47c1bf50ce5556edcae9a84795485a8f.png differ diff --git a/public/img/__og-image/2023/48f4e69c465b793750b5aa47bb7f2b6e.png b/public/img/__og-image/2023/48f4e69c465b793750b5aa47bb7f2b6e.png new file mode 100644 index 0000000000..96fdd7d4fd Binary files /dev/null and b/public/img/__og-image/2023/48f4e69c465b793750b5aa47bb7f2b6e.png differ diff --git a/public/img/__og-image/2023/4a4e842d1cd0c06083f484d31225abd1.png b/public/img/__og-image/2023/4a4e842d1cd0c06083f484d31225abd1.png new file mode 100644 index 0000000000..bd03007340 Binary files /dev/null and b/public/img/__og-image/2023/4a4e842d1cd0c06083f484d31225abd1.png differ diff --git a/public/img/__og-image/2023/4feef977ceb883c69c91ccd2dd607aec.png b/public/img/__og-image/2023/4feef977ceb883c69c91ccd2dd607aec.png new file mode 100644 index 0000000000..cd46f85623 Binary files /dev/null and b/public/img/__og-image/2023/4feef977ceb883c69c91ccd2dd607aec.png differ diff --git a/public/img/__og-image/2023/50005edb4a441b0335d1b80b4ad62b1a.png b/public/img/__og-image/2023/50005edb4a441b0335d1b80b4ad62b1a.png new file mode 100644 index 0000000000..06ae5227f0 Binary files /dev/null and b/public/img/__og-image/2023/50005edb4a441b0335d1b80b4ad62b1a.png differ diff --git a/public/img/__og-image/2023/504049f2217d6c59b9f67eba97089bfe.png b/public/img/__og-image/2023/504049f2217d6c59b9f67eba97089bfe.png new file mode 100644 index 0000000000..7d16102ee1 Binary files /dev/null and b/public/img/__og-image/2023/504049f2217d6c59b9f67eba97089bfe.png differ diff --git a/public/img/__og-image/2023/520b70cfea27170fd6ed21d79f6b0357.png b/public/img/__og-image/2023/520b70cfea27170fd6ed21d79f6b0357.png new file mode 100644 index 0000000000..24931c9148 Binary files /dev/null and b/public/img/__og-image/2023/520b70cfea27170fd6ed21d79f6b0357.png differ diff --git a/public/img/__og-image/2023/55dd5ef56bd778955509d08ea81903ea.png b/public/img/__og-image/2023/55dd5ef56bd778955509d08ea81903ea.png new file mode 100644 index 0000000000..08fa933bfa Binary files /dev/null and b/public/img/__og-image/2023/55dd5ef56bd778955509d08ea81903ea.png differ diff --git a/public/img/__og-image/2023/5684f90e0472771532ed5ee2b237300f.png b/public/img/__og-image/2023/5684f90e0472771532ed5ee2b237300f.png new file mode 100644 index 0000000000..e67f4af1fc Binary files /dev/null and b/public/img/__og-image/2023/5684f90e0472771532ed5ee2b237300f.png differ diff --git a/public/img/__og-image/2023/58b45c125046c6c7a8c35ec084bfbb19.png b/public/img/__og-image/2023/58b45c125046c6c7a8c35ec084bfbb19.png new file mode 100644 index 0000000000..ddef1156fd Binary files /dev/null and b/public/img/__og-image/2023/58b45c125046c6c7a8c35ec084bfbb19.png differ diff --git a/public/img/__og-image/2023/5a0c1b8ab4957bfd83f55480c1508fe5.png b/public/img/__og-image/2023/5a0c1b8ab4957bfd83f55480c1508fe5.png new file mode 100644 index 0000000000..f39a3f8eba Binary files /dev/null and b/public/img/__og-image/2023/5a0c1b8ab4957bfd83f55480c1508fe5.png differ diff --git a/public/img/__og-image/2023/5bf24cd6483a63e62a2276fe38effb82.png b/public/img/__og-image/2023/5bf24cd6483a63e62a2276fe38effb82.png new file mode 100644 index 0000000000..b0e73f5428 Binary files /dev/null and b/public/img/__og-image/2023/5bf24cd6483a63e62a2276fe38effb82.png differ diff --git a/public/img/__og-image/2023/5d6afee232e35ba1880e7b25d810ef49.png b/public/img/__og-image/2023/5d6afee232e35ba1880e7b25d810ef49.png new file mode 100644 index 0000000000..920120c685 Binary files /dev/null and b/public/img/__og-image/2023/5d6afee232e35ba1880e7b25d810ef49.png differ diff --git a/public/img/__og-image/2023/5f920cd134d4dea87fce5e59bc4418dc.png b/public/img/__og-image/2023/5f920cd134d4dea87fce5e59bc4418dc.png new file mode 100644 index 0000000000..54bcc8884e Binary files /dev/null and b/public/img/__og-image/2023/5f920cd134d4dea87fce5e59bc4418dc.png differ diff --git a/public/img/__og-image/2023/61b9efc6ff8e0f295be6c65c08871c23.png b/public/img/__og-image/2023/61b9efc6ff8e0f295be6c65c08871c23.png new file mode 100644 index 0000000000..9f839b6daa Binary files /dev/null and b/public/img/__og-image/2023/61b9efc6ff8e0f295be6c65c08871c23.png differ diff --git a/public/img/__og-image/2023/6543e60efc3f0c20d24a40cffef29558.png b/public/img/__og-image/2023/6543e60efc3f0c20d24a40cffef29558.png new file mode 100644 index 0000000000..a69479004b Binary files /dev/null and b/public/img/__og-image/2023/6543e60efc3f0c20d24a40cffef29558.png differ diff --git a/public/img/__og-image/2023/66e332f155e04efea896d5bd5dcd2ba5.png b/public/img/__og-image/2023/66e332f155e04efea896d5bd5dcd2ba5.png new file mode 100644 index 0000000000..047465a281 Binary files /dev/null and b/public/img/__og-image/2023/66e332f155e04efea896d5bd5dcd2ba5.png differ diff --git a/public/img/__og-image/2023/675c416b16ad2b0c519b1ec894353fc5.png b/public/img/__og-image/2023/675c416b16ad2b0c519b1ec894353fc5.png new file mode 100644 index 0000000000..f859fd5d89 Binary files /dev/null and b/public/img/__og-image/2023/675c416b16ad2b0c519b1ec894353fc5.png differ diff --git a/public/img/__og-image/2023/6c2eefe955e288e974a9182dac06f8fa.png b/public/img/__og-image/2023/6c2eefe955e288e974a9182dac06f8fa.png new file mode 100644 index 0000000000..f3f9f95102 Binary files /dev/null and b/public/img/__og-image/2023/6c2eefe955e288e974a9182dac06f8fa.png differ diff --git a/public/img/__og-image/2023/6d07d593f16320c810d6aba8553199ed.png b/public/img/__og-image/2023/6d07d593f16320c810d6aba8553199ed.png new file mode 100644 index 0000000000..81cb3af09b Binary files /dev/null and b/public/img/__og-image/2023/6d07d593f16320c810d6aba8553199ed.png differ diff --git a/public/img/__og-image/2023/70f9e59dc60cf417aa38eb890b2a8abe.png b/public/img/__og-image/2023/70f9e59dc60cf417aa38eb890b2a8abe.png new file mode 100644 index 0000000000..c44027c7f7 Binary files /dev/null and b/public/img/__og-image/2023/70f9e59dc60cf417aa38eb890b2a8abe.png differ diff --git a/public/img/__og-image/2023/72ac8d3f7585f86cb9acc77b9eb22241.png b/public/img/__og-image/2023/72ac8d3f7585f86cb9acc77b9eb22241.png new file mode 100644 index 0000000000..91eb148e31 Binary files /dev/null and b/public/img/__og-image/2023/72ac8d3f7585f86cb9acc77b9eb22241.png differ diff --git a/public/img/__og-image/2023/77623920b158a75435d48896a8d56b35.png b/public/img/__og-image/2023/77623920b158a75435d48896a8d56b35.png new file mode 100644 index 0000000000..18f638300c Binary files /dev/null and b/public/img/__og-image/2023/77623920b158a75435d48896a8d56b35.png differ diff --git a/public/img/__og-image/2023/7a87fe1cfc351a993ed40e01d384e3c6.png b/public/img/__og-image/2023/7a87fe1cfc351a993ed40e01d384e3c6.png new file mode 100644 index 0000000000..9e9362cbe8 Binary files /dev/null and b/public/img/__og-image/2023/7a87fe1cfc351a993ed40e01d384e3c6.png differ diff --git a/public/img/__og-image/2023/7bb96b3d5660f2d285220d7cdd59eb7f.png b/public/img/__og-image/2023/7bb96b3d5660f2d285220d7cdd59eb7f.png new file mode 100644 index 0000000000..4059ec6eaf Binary files /dev/null and b/public/img/__og-image/2023/7bb96b3d5660f2d285220d7cdd59eb7f.png differ diff --git a/public/img/__og-image/2023/7d2491dd9142a830ac0c3ff1477636d8.png b/public/img/__og-image/2023/7d2491dd9142a830ac0c3ff1477636d8.png new file mode 100644 index 0000000000..00a3ed4046 Binary files /dev/null and b/public/img/__og-image/2023/7d2491dd9142a830ac0c3ff1477636d8.png differ diff --git a/public/img/__og-image/2023/80869c56bb59f51de6ac8468c18eecdc.png b/public/img/__og-image/2023/80869c56bb59f51de6ac8468c18eecdc.png new file mode 100644 index 0000000000..2b1bc141e2 Binary files /dev/null and b/public/img/__og-image/2023/80869c56bb59f51de6ac8468c18eecdc.png differ diff --git a/public/img/__og-image/2023/81daf0dd0b26efdc784ba0a530e54a68.png b/public/img/__og-image/2023/81daf0dd0b26efdc784ba0a530e54a68.png new file mode 100644 index 0000000000..0a46bd8f2f Binary files /dev/null and b/public/img/__og-image/2023/81daf0dd0b26efdc784ba0a530e54a68.png differ diff --git a/public/img/__og-image/2023/888b77af90aa0ff776adc9669a29cb3f.png b/public/img/__og-image/2023/888b77af90aa0ff776adc9669a29cb3f.png new file mode 100644 index 0000000000..c073210575 Binary files /dev/null and b/public/img/__og-image/2023/888b77af90aa0ff776adc9669a29cb3f.png differ diff --git a/public/img/__og-image/2023/88bbc65fe92d08a0404215429f06c113.png b/public/img/__og-image/2023/88bbc65fe92d08a0404215429f06c113.png new file mode 100644 index 0000000000..71c12cd37c Binary files /dev/null and b/public/img/__og-image/2023/88bbc65fe92d08a0404215429f06c113.png differ diff --git a/public/img/__og-image/2023/8a1158bda6933f83f43b704bff54ff63.png b/public/img/__og-image/2023/8a1158bda6933f83f43b704bff54ff63.png new file mode 100644 index 0000000000..33e2b329e9 Binary files /dev/null and b/public/img/__og-image/2023/8a1158bda6933f83f43b704bff54ff63.png differ diff --git a/public/img/__og-image/2023/94d334f99906d3fc2669fc804e5fae41.png b/public/img/__og-image/2023/94d334f99906d3fc2669fc804e5fae41.png new file mode 100644 index 0000000000..92d8684662 Binary files /dev/null and b/public/img/__og-image/2023/94d334f99906d3fc2669fc804e5fae41.png differ diff --git a/public/img/__og-image/2023/95e6219a5e20a9e2f9381822460932ac.png b/public/img/__og-image/2023/95e6219a5e20a9e2f9381822460932ac.png new file mode 100644 index 0000000000..e6c3221aa2 Binary files /dev/null and b/public/img/__og-image/2023/95e6219a5e20a9e2f9381822460932ac.png differ diff --git a/public/img/__og-image/2023/9836184d78d14978c0c49f1e2b900bb9.png b/public/img/__og-image/2023/9836184d78d14978c0c49f1e2b900bb9.png new file mode 100644 index 0000000000..edc6856fd1 Binary files /dev/null and b/public/img/__og-image/2023/9836184d78d14978c0c49f1e2b900bb9.png differ diff --git a/public/img/__og-image/2023/9836d339aaf014a7ced7f87141fcee67.png b/public/img/__og-image/2023/9836d339aaf014a7ced7f87141fcee67.png new file mode 100644 index 0000000000..6683b842a8 Binary files /dev/null and b/public/img/__og-image/2023/9836d339aaf014a7ced7f87141fcee67.png differ diff --git a/public/img/__og-image/2023/9a543325b8802fd94cc9ed81908dc888.png b/public/img/__og-image/2023/9a543325b8802fd94cc9ed81908dc888.png new file mode 100644 index 0000000000..499ede16fc Binary files /dev/null and b/public/img/__og-image/2023/9a543325b8802fd94cc9ed81908dc888.png differ diff --git a/public/img/__og-image/2023/a44cec64a01063d4c6a11e54cc8d24d3.png b/public/img/__og-image/2023/a44cec64a01063d4c6a11e54cc8d24d3.png new file mode 100644 index 0000000000..187dacbbfa Binary files /dev/null and b/public/img/__og-image/2023/a44cec64a01063d4c6a11e54cc8d24d3.png differ diff --git a/public/img/__og-image/2023/a638dad8443a364e12ed29b3bc50d128.png b/public/img/__og-image/2023/a638dad8443a364e12ed29b3bc50d128.png new file mode 100644 index 0000000000..3d4ce3a919 Binary files /dev/null and b/public/img/__og-image/2023/a638dad8443a364e12ed29b3bc50d128.png differ diff --git a/public/img/__og-image/2023/a6d43808900bc56bb2ebd675544ee5a3.png b/public/img/__og-image/2023/a6d43808900bc56bb2ebd675544ee5a3.png new file mode 100644 index 0000000000..a5376f7bcc Binary files /dev/null and b/public/img/__og-image/2023/a6d43808900bc56bb2ebd675544ee5a3.png differ diff --git a/public/img/__og-image/2023/a6f436251a88bb94d5e79099742c9d75.png b/public/img/__og-image/2023/a6f436251a88bb94d5e79099742c9d75.png new file mode 100644 index 0000000000..aa3e0d9553 Binary files /dev/null and b/public/img/__og-image/2023/a6f436251a88bb94d5e79099742c9d75.png differ diff --git a/public/img/__og-image/2023/abbottry.png b/public/img/__og-image/2023/abbottry.png new file mode 100644 index 0000000000..aed0fd1f8f Binary files /dev/null and b/public/img/__og-image/2023/abbottry.png differ diff --git a/public/img/__og-image/2023/acarlson29.png b/public/img/__og-image/2023/acarlson29.png new file mode 100644 index 0000000000..d700f94b90 Binary files /dev/null and b/public/img/__og-image/2023/acarlson29.png differ diff --git a/public/img/__og-image/2023/adam.sayah.png b/public/img/__og-image/2023/adam.sayah.png new file mode 100644 index 0000000000..bedd5bf2a9 Binary files /dev/null and b/public/img/__og-image/2023/adam.sayah.png differ diff --git a/public/img/__og-image/2023/afefc1feb47ec68ca6031cfec2e7d46b.png b/public/img/__og-image/2023/afefc1feb47ec68ca6031cfec2e7d46b.png new file mode 100644 index 0000000000..17b28f2d34 Binary files /dev/null and b/public/img/__og-image/2023/afefc1feb47ec68ca6031cfec2e7d46b.png differ diff --git a/public/img/__og-image/2023/ajhingran.png b/public/img/__og-image/2023/ajhingran.png new file mode 100644 index 0000000000..d2f06225c6 Binary files /dev/null and b/public/img/__og-image/2023/ajhingran.png differ diff --git a/public/img/__og-image/2023/alec102.png b/public/img/__og-image/2023/alec102.png new file mode 100644 index 0000000000..ac419eed5f Binary files /dev/null and b/public/img/__og-image/2023/alec102.png differ diff --git a/public/img/__og-image/2023/alexsandra.sikora.png b/public/img/__og-image/2023/alexsandra.sikora.png new file mode 100644 index 0000000000..a2cafc5031 Binary files /dev/null and b/public/img/__og-image/2023/alexsandra.sikora.png differ diff --git a/public/img/__og-image/2023/amy1908.png b/public/img/__og-image/2023/amy1908.png new file mode 100644 index 0000000000..5860d06644 Binary files /dev/null and b/public/img/__og-image/2023/amy1908.png differ diff --git a/public/img/__og-image/2023/andreas.heiberg.png b/public/img/__og-image/2023/andreas.heiberg.png new file mode 100644 index 0000000000..7f30f2747b Binary files /dev/null and b/public/img/__og-image/2023/andreas.heiberg.png differ diff --git a/public/img/__og-image/2023/annyce.davis.png b/public/img/__og-image/2023/annyce.davis.png new file mode 100644 index 0000000000..4b65a41371 Binary files /dev/null and b/public/img/__og-image/2023/annyce.davis.png differ diff --git a/public/img/__og-image/2023/antoine.carossio.png b/public/img/__og-image/2023/antoine.carossio.png new file mode 100644 index 0000000000..fb2a9482a3 Binary files /dev/null and b/public/img/__og-image/2023/antoine.carossio.png differ diff --git a/public/img/__og-image/2023/ardatanrikulu.png b/public/img/__og-image/2023/ardatanrikulu.png new file mode 100644 index 0000000000..91f26deda3 Binary files /dev/null and b/public/img/__og-image/2023/ardatanrikulu.png differ diff --git a/public/img/__og-image/2023/arkenflame.png b/public/img/__og-image/2023/arkenflame.png new file mode 100644 index 0000000000..4639911ddd Binary files /dev/null and b/public/img/__og-image/2023/arkenflame.png differ diff --git a/public/img/__og-image/2023/ashpak_shaikh.png b/public/img/__og-image/2023/ashpak_shaikh.png new file mode 100644 index 0000000000..a6584912a3 Binary files /dev/null and b/public/img/__og-image/2023/ashpak_shaikh.png differ diff --git a/public/img/__og-image/2023/b2390bef466348cbe435b14cf34c99a5.png b/public/img/__og-image/2023/b2390bef466348cbe435b14cf34c99a5.png new file mode 100644 index 0000000000..9556f9fafc Binary files /dev/null and b/public/img/__og-image/2023/b2390bef466348cbe435b14cf34c99a5.png differ diff --git a/public/img/__og-image/2023/b38ed79c29a2d0602160d9407bfa3422.png b/public/img/__og-image/2023/b38ed79c29a2d0602160d9407bfa3422.png new file mode 100644 index 0000000000..621c971056 Binary files /dev/null and b/public/img/__og-image/2023/b38ed79c29a2d0602160d9407bfa3422.png differ diff --git a/public/img/__og-image/2023/b3a3fa420d7467c46c215fa09cd548e0.png b/public/img/__og-image/2023/b3a3fa420d7467c46c215fa09cd548e0.png new file mode 100644 index 0000000000..91c62d72af Binary files /dev/null and b/public/img/__og-image/2023/b3a3fa420d7467c46c215fa09cd548e0.png differ diff --git a/public/img/__og-image/2023/b57a1a6027fdab59c05c42c9d0515e71.png b/public/img/__og-image/2023/b57a1a6027fdab59c05c42c9d0515e71.png new file mode 100644 index 0000000000..31ff6a4e72 Binary files /dev/null and b/public/img/__og-image/2023/b57a1a6027fdab59c05c42c9d0515e71.png differ diff --git a/public/img/__og-image/2023/b84ea942d55fb7406e53e3af0c78017e.png b/public/img/__og-image/2023/b84ea942d55fb7406e53e3af0c78017e.png new file mode 100644 index 0000000000..f68f17c6f6 Binary files /dev/null and b/public/img/__og-image/2023/b84ea942d55fb7406e53e3af0c78017e.png differ diff --git a/public/img/__og-image/2023/b9e35d673e7b541421d45ce2043dc05e.png b/public/img/__og-image/2023/b9e35d673e7b541421d45ce2043dc05e.png new file mode 100644 index 0000000000..6afba66d0e Binary files /dev/null and b/public/img/__og-image/2023/b9e35d673e7b541421d45ce2043dc05e.png differ diff --git a/public/img/__og-image/2023/badurinadenis.png b/public/img/__og-image/2023/badurinadenis.png new file mode 100644 index 0000000000..5ed8433617 Binary files /dev/null and b/public/img/__og-image/2023/badurinadenis.png differ diff --git a/public/img/__og-image/2023/bastiankistner.png b/public/img/__og-image/2023/bastiankistner.png new file mode 100644 index 0000000000..44294c8258 Binary files /dev/null and b/public/img/__og-image/2023/bastiankistner.png differ diff --git a/public/img/__og-image/2023/bc5623fa38b3e2a58b357b35d3209023.png b/public/img/__og-image/2023/bc5623fa38b3e2a58b357b35d3209023.png new file mode 100644 index 0000000000..22f302d792 Binary files /dev/null and b/public/img/__og-image/2023/bc5623fa38b3e2a58b357b35d3209023.png differ diff --git a/public/img/__og-image/2023/benjie3.png b/public/img/__og-image/2023/benjie3.png new file mode 100644 index 0000000000..70412e7496 Binary files /dev/null and b/public/img/__og-image/2023/benjie3.png differ diff --git a/public/img/__og-image/2023/blacknumber.png b/public/img/__og-image/2023/blacknumber.png new file mode 100644 index 0000000000..d5feec7e9d Binary files /dev/null and b/public/img/__og-image/2023/blacknumber.png differ diff --git a/public/img/__og-image/2023/brandon.r.minnick.png b/public/img/__og-image/2023/brandon.r.minnick.png new file mode 100644 index 0000000000..5b03870663 Binary files /dev/null and b/public/img/__og-image/2023/brandon.r.minnick.png differ diff --git a/public/img/__og-image/2023/bryan.robinson2.png b/public/img/__og-image/2023/bryan.robinson2.png new file mode 100644 index 0000000000..c52fdc4193 Binary files /dev/null and b/public/img/__og-image/2023/bryan.robinson2.png differ diff --git a/public/img/__og-image/2023/bsklar.png b/public/img/__og-image/2023/bsklar.png new file mode 100644 index 0000000000..f96c19b56d Binary files /dev/null and b/public/img/__og-image/2023/bsklar.png differ diff --git a/public/img/__og-image/2023/bsy.png b/public/img/__og-image/2023/bsy.png new file mode 100644 index 0000000000..dd51ea3672 Binary files /dev/null and b/public/img/__og-image/2023/bsy.png differ diff --git a/public/img/__og-image/2023/c6bcac25dc965b289bda158441311f23.png b/public/img/__og-image/2023/c6bcac25dc965b289bda158441311f23.png new file mode 100644 index 0000000000..8505f39977 Binary files /dev/null and b/public/img/__og-image/2023/c6bcac25dc965b289bda158441311f23.png differ diff --git a/public/img/__og-image/2023/c6cba5c5a91fb3f916acec7de9692bd7.png b/public/img/__og-image/2023/c6cba5c5a91fb3f916acec7de9692bd7.png new file mode 100644 index 0000000000..1db6cfef64 Binary files /dev/null and b/public/img/__og-image/2023/c6cba5c5a91fb3f916acec7de9692bd7.png differ diff --git a/public/img/__og-image/2023/c915230f50de5c93eb5c2bbbee3610e6.png b/public/img/__og-image/2023/c915230f50de5c93eb5c2bbbee3610e6.png new file mode 100644 index 0000000000..6dbf9eda6a Binary files /dev/null and b/public/img/__og-image/2023/c915230f50de5c93eb5c2bbbee3610e6.png differ diff --git a/public/img/__og-image/2023/cb1f116f01ae3d2ddf5100a18792abc2.png b/public/img/__og-image/2023/cb1f116f01ae3d2ddf5100a18792abc2.png new file mode 100644 index 0000000000..b45ccd0d2b Binary files /dev/null and b/public/img/__og-image/2023/cb1f116f01ae3d2ddf5100a18792abc2.png differ diff --git a/public/img/__og-image/2023/cc02f7be2a6fe1dc49f87fa63dec5041.png b/public/img/__og-image/2023/cc02f7be2a6fe1dc49f87fa63dec5041.png new file mode 100644 index 0000000000..52f787a979 Binary files /dev/null and b/public/img/__og-image/2023/cc02f7be2a6fe1dc49f87fa63dec5041.png differ diff --git a/public/img/__og-image/2023/cc22599d768dc636a67a0e93cd74bab2.png b/public/img/__og-image/2023/cc22599d768dc636a67a0e93cd74bab2.png new file mode 100644 index 0000000000..2f691a7ba9 Binary files /dev/null and b/public/img/__og-image/2023/cc22599d768dc636a67a0e93cd74bab2.png differ diff --git a/public/img/__og-image/2023/cc423d9ba6bacb53c1b24490cb208c17.png b/public/img/__og-image/2023/cc423d9ba6bacb53c1b24490cb208c17.png new file mode 100644 index 0000000000..38392fb487 Binary files /dev/null and b/public/img/__og-image/2023/cc423d9ba6bacb53c1b24490cb208c17.png differ diff --git a/public/img/__og-image/2023/ce430c038efa9a9c19743d1ccc702de9.png b/public/img/__og-image/2023/ce430c038efa9a9c19743d1ccc702de9.png new file mode 100644 index 0000000000..c5c0df0758 Binary files /dev/null and b/public/img/__og-image/2023/ce430c038efa9a9c19743d1ccc702de9.png differ diff --git a/public/img/__og-image/2023/christian.ernst.png b/public/img/__og-image/2023/christian.ernst.png new file mode 100644 index 0000000000..861397e2c3 Binary files /dev/null and b/public/img/__og-image/2023/christian.ernst.png differ diff --git a/public/img/__og-image/2023/d53044f7df10bcb5a53e6908670c41c1.png b/public/img/__og-image/2023/d53044f7df10bcb5a53e6908670c41c1.png new file mode 100644 index 0000000000..baf2b1546a Binary files /dev/null and b/public/img/__og-image/2023/d53044f7df10bcb5a53e6908670c41c1.png differ diff --git a/public/img/__og-image/2023/david3103.png b/public/img/__og-image/2023/david3103.png new file mode 100644 index 0000000000..769c87aed2 Binary files /dev/null and b/public/img/__og-image/2023/david3103.png differ diff --git a/public/img/__og-image/2023/dd289f7ecf487b271e0495ff09bba26e.png b/public/img/__og-image/2023/dd289f7ecf487b271e0495ff09bba26e.png new file mode 100644 index 0000000000..d8ca50b1d7 Binary files /dev/null and b/public/img/__og-image/2023/dd289f7ecf487b271e0495ff09bba26e.png differ diff --git a/public/img/__og-image/2023/de1472b4294ac91745f3648d9228d8f2.png b/public/img/__og-image/2023/de1472b4294ac91745f3648d9228d8f2.png new file mode 100644 index 0000000000..707fc958be Binary files /dev/null and b/public/img/__og-image/2023/de1472b4294ac91745f3648d9228d8f2.png differ diff --git a/public/img/__og-image/2023/de614df0c21b5227fff20767aa065de8.png b/public/img/__og-image/2023/de614df0c21b5227fff20767aa065de8.png new file mode 100644 index 0000000000..e0a731e2e6 Binary files /dev/null and b/public/img/__og-image/2023/de614df0c21b5227fff20767aa065de8.png differ diff --git a/public/img/__og-image/2023/de9b490bff0d1e234ec4e19bc03392b5.png b/public/img/__og-image/2023/de9b490bff0d1e234ec4e19bc03392b5.png new file mode 100644 index 0000000000..bb818c1ced Binary files /dev/null and b/public/img/__og-image/2023/de9b490bff0d1e234ec4e19bc03392b5.png differ diff --git a/public/img/__og-image/2023/doc.jones.png b/public/img/__og-image/2023/doc.jones.png new file mode 100644 index 0000000000..3b0b6ab275 Binary files /dev/null and b/public/img/__og-image/2023/doc.jones.png differ diff --git a/public/img/__og-image/2023/donnasiqizhou.png b/public/img/__og-image/2023/donnasiqizhou.png new file mode 100644 index 0000000000..8b687c0896 Binary files /dev/null and b/public/img/__og-image/2023/donnasiqizhou.png differ diff --git a/public/img/__og-image/2023/dotansimha.png b/public/img/__og-image/2023/dotansimha.png new file mode 100644 index 0000000000..e518f92796 Binary files /dev/null and b/public/img/__og-image/2023/dotansimha.png differ diff --git a/public/img/__og-image/2023/e0985f6bdb4bbf07a5ca5ba72fbcc39c.png b/public/img/__og-image/2023/e0985f6bdb4bbf07a5ca5ba72fbcc39c.png new file mode 100644 index 0000000000..7031a9e5a3 Binary files /dev/null and b/public/img/__og-image/2023/e0985f6bdb4bbf07a5ca5ba72fbcc39c.png differ diff --git a/public/img/__og-image/2023/e29bf518adeb99b2319fa8cb70d8f445.png b/public/img/__og-image/2023/e29bf518adeb99b2319fa8cb70d8f445.png new file mode 100644 index 0000000000..7aa9ee5420 Binary files /dev/null and b/public/img/__og-image/2023/e29bf518adeb99b2319fa8cb70d8f445.png differ diff --git a/public/img/__og-image/2023/e3320ba552ee773065a1a132304a36e0.png b/public/img/__og-image/2023/e3320ba552ee773065a1a132304a36e0.png new file mode 100644 index 0000000000..3a53abf137 Binary files /dev/null and b/public/img/__og-image/2023/e3320ba552ee773065a1a132304a36e0.png differ diff --git a/public/img/__og-image/2023/e3a855088054e180ec6e046bf3d8be8a.png b/public/img/__og-image/2023/e3a855088054e180ec6e046bf3d8be8a.png new file mode 100644 index 0000000000..d787e768a3 Binary files /dev/null and b/public/img/__og-image/2023/e3a855088054e180ec6e046bf3d8be8a.png differ diff --git a/public/img/__og-image/2023/e447a52591ed66a452e04d6ce3e3f09e.png b/public/img/__og-image/2023/e447a52591ed66a452e04d6ce3e3f09e.png new file mode 100644 index 0000000000..a2588aeffb Binary files /dev/null and b/public/img/__og-image/2023/e447a52591ed66a452e04d6ce3e3f09e.png differ diff --git a/public/img/__og-image/2023/eb08683c706380e0236adb2097358f4c.png b/public/img/__og-image/2023/eb08683c706380e0236adb2097358f4c.png new file mode 100644 index 0000000000..8675d6104d Binary files /dev/null and b/public/img/__og-image/2023/eb08683c706380e0236adb2097358f4c.png differ diff --git a/public/img/__og-image/2023/ebee6213b39b87437eb7cc9c41ea972b.png b/public/img/__og-image/2023/ebee6213b39b87437eb7cc9c41ea972b.png new file mode 100644 index 0000000000..cd0a186b83 Binary files /dev/null and b/public/img/__og-image/2023/ebee6213b39b87437eb7cc9c41ea972b.png differ diff --git a/public/img/__og-image/2023/edcb92ba1f2478b935124038ec1b20f0.png b/public/img/__og-image/2023/edcb92ba1f2478b935124038ec1b20f0.png new file mode 100644 index 0000000000..a4f875d16e Binary files /dev/null and b/public/img/__og-image/2023/edcb92ba1f2478b935124038ec1b20f0.png differ diff --git a/public/img/__og-image/2023/eitan15.png b/public/img/__og-image/2023/eitan15.png new file mode 100644 index 0000000000..77320099ce Binary files /dev/null and b/public/img/__og-image/2023/eitan15.png differ diff --git a/public/img/__og-image/2023/en3m.png b/public/img/__og-image/2023/en3m.png new file mode 100644 index 0000000000..435aea08e6 Binary files /dev/null and b/public/img/__og-image/2023/en3m.png differ diff --git a/public/img/__og-image/2023/ernie.turner1.png b/public/img/__og-image/2023/ernie.turner1.png new file mode 100644 index 0000000000..73eccec9c5 Binary files /dev/null and b/public/img/__og-image/2023/ernie.turner1.png differ diff --git a/public/img/__og-image/2023/eruf.png b/public/img/__og-image/2023/eruf.png new file mode 100644 index 0000000000..fff1d7fada Binary files /dev/null and b/public/img/__og-image/2023/eruf.png differ diff --git a/public/img/__og-image/2023/events172.png b/public/img/__og-image/2023/events172.png new file mode 100644 index 0000000000..73c6912128 Binary files /dev/null and b/public/img/__og-image/2023/events172.png differ diff --git a/public/img/__og-image/2023/f11fd521e00f5b8eedf463781f893c5e.png b/public/img/__og-image/2023/f11fd521e00f5b8eedf463781f893c5e.png new file mode 100644 index 0000000000..0b17c0a5c7 Binary files /dev/null and b/public/img/__og-image/2023/f11fd521e00f5b8eedf463781f893c5e.png differ diff --git a/public/img/__og-image/2023/f319907e1e15ee620a33d3cbf01f323a.png b/public/img/__og-image/2023/f319907e1e15ee620a33d3cbf01f323a.png new file mode 100644 index 0000000000..753ae21637 Binary files /dev/null and b/public/img/__og-image/2023/f319907e1e15ee620a33d3cbf01f323a.png differ diff --git a/public/img/__og-image/2023/f485ec8e2dc60c435e8a3a90185d73bf.png b/public/img/__og-image/2023/f485ec8e2dc60c435e8a3a90185d73bf.png new file mode 100644 index 0000000000..441194e1c0 Binary files /dev/null and b/public/img/__og-image/2023/f485ec8e2dc60c435e8a3a90185d73bf.png differ diff --git a/public/img/__og-image/2023/f653b9931d85c7958993ca62e7853972.png b/public/img/__og-image/2023/f653b9931d85c7958993ca62e7853972.png new file mode 100644 index 0000000000..abc6c6f510 Binary files /dev/null and b/public/img/__og-image/2023/f653b9931d85c7958993ca62e7853972.png differ diff --git a/public/img/__og-image/2023/f802d22f97a3d3d9d2733bf637758f56.png b/public/img/__og-image/2023/f802d22f97a3d3d9d2733bf637758f56.png new file mode 100644 index 0000000000..225086c289 Binary files /dev/null and b/public/img/__og-image/2023/f802d22f97a3d3d9d2733bf637758f56.png differ diff --git a/public/img/__og-image/2023/f8a4d2b939980ffadf787715033e2b4f.png b/public/img/__og-image/2023/f8a4d2b939980ffadf787715033e2b4f.png new file mode 100644 index 0000000000..c7f680706d Binary files /dev/null and b/public/img/__og-image/2023/f8a4d2b939980ffadf787715033e2b4f.png differ diff --git a/public/img/__og-image/2023/fc1e6c878fc02b6c2b7534ddebfac6ff.png b/public/img/__og-image/2023/fc1e6c878fc02b6c2b7534ddebfac6ff.png new file mode 100644 index 0000000000..79e8e7dded Binary files /dev/null and b/public/img/__og-image/2023/fc1e6c878fc02b6c2b7534ddebfac6ff.png differ diff --git a/public/img/__og-image/2023/ff6a2ae37d87e74c9f7739a1331804a1.png b/public/img/__og-image/2023/ff6a2ae37d87e74c9f7739a1331804a1.png new file mode 100644 index 0000000000..e1a1ddc664 Binary files /dev/null and b/public/img/__og-image/2023/ff6a2ae37d87e74c9f7739a1331804a1.png differ diff --git a/public/img/__og-image/2023/gerard.klijs.png b/public/img/__og-image/2023/gerard.klijs.png new file mode 100644 index 0000000000..ccc4a89f94 Binary files /dev/null and b/public/img/__og-image/2023/gerard.klijs.png differ diff --git a/public/img/__og-image/2023/gilgardosh.png b/public/img/__og-image/2023/gilgardosh.png new file mode 100644 index 0000000000..9328c2e460 Binary files /dev/null and b/public/img/__og-image/2023/gilgardosh.png differ diff --git a/public/img/__og-image/2023/gonenj.png b/public/img/__og-image/2023/gonenj.png new file mode 100644 index 0000000000..7eb5c4f6f7 Binary files /dev/null and b/public/img/__og-image/2023/gonenj.png differ diff --git a/public/img/__og-image/2023/hello2358.png b/public/img/__og-image/2023/hello2358.png new file mode 100644 index 0000000000..9e6ba99e49 Binary files /dev/null and b/public/img/__og-image/2023/hello2358.png differ diff --git a/public/img/__og-image/2023/idit_levine.25krdj4u.png b/public/img/__og-image/2023/idit_levine.25krdj4u.png new file mode 100644 index 0000000000..583ee9ef1c Binary files /dev/null and b/public/img/__og-image/2023/idit_levine.25krdj4u.png differ diff --git a/public/img/__og-image/2023/igorgassmann.png b/public/img/__og-image/2023/igorgassmann.png new file mode 100644 index 0000000000..9ac06aaa48 Binary files /dev/null and b/public/img/__og-image/2023/igorgassmann.png differ diff --git a/public/img/__og-image/2023/jamie855.png b/public/img/__og-image/2023/jamie855.png new file mode 100644 index 0000000000..8e665f42c2 Binary files /dev/null and b/public/img/__og-image/2023/jamie855.png differ diff --git a/public/img/__og-image/2023/jared_cheney.7rad60v.png b/public/img/__og-image/2023/jared_cheney.7rad60v.png new file mode 100644 index 0000000000..ebc0577790 Binary files /dev/null and b/public/img/__og-image/2023/jared_cheney.7rad60v.png differ diff --git a/public/img/__og-image/2023/jeff.auriemma.png b/public/img/__og-image/2023/jeff.auriemma.png new file mode 100644 index 0000000000..166da5f301 Binary files /dev/null and b/public/img/__og-image/2023/jeff.auriemma.png differ diff --git a/public/img/__og-image/2023/jens63.png b/public/img/__og-image/2023/jens63.png new file mode 100644 index 0000000000..5d5a7e1bff Binary files /dev/null and b/public/img/__og-image/2023/jens63.png differ diff --git a/public/img/__og-image/2023/jhorner3208.png b/public/img/__og-image/2023/jhorner3208.png new file mode 100644 index 0000000000..95955d419c Binary files /dev/null and b/public/img/__og-image/2023/jhorner3208.png differ diff --git a/public/img/__og-image/2023/jim.barton.png b/public/img/__og-image/2023/jim.barton.png new file mode 100644 index 0000000000..58dfae1983 Binary files /dev/null and b/public/img/__og-image/2023/jim.barton.png differ diff --git a/public/img/__og-image/2023/kamilkisiela.png b/public/img/__og-image/2023/kamilkisiela.png new file mode 100644 index 0000000000..f902ac3205 Binary files /dev/null and b/public/img/__og-image/2023/kamilkisiela.png differ diff --git a/public/img/__og-image/2023/keerthan.ekbote.png b/public/img/__og-image/2023/keerthan.ekbote.png new file mode 100644 index 0000000000..d4bed21a15 Binary files /dev/null and b/public/img/__og-image/2023/keerthan.ekbote.png differ diff --git a/public/img/__og-image/2023/keith.babo.png b/public/img/__og-image/2023/keith.babo.png new file mode 100644 index 0000000000..4672ce23bc Binary files /dev/null and b/public/img/__og-image/2023/keith.babo.png differ diff --git a/public/img/__og-image/2023/kevin1700.png b/public/img/__og-image/2023/kevin1700.png new file mode 100644 index 0000000000..0ff8bf48e5 Binary files /dev/null and b/public/img/__og-image/2023/kevin1700.png differ diff --git a/public/img/__og-image/2023/laurent57.png b/public/img/__og-image/2023/laurent57.png new file mode 100644 index 0000000000..b157628820 Binary files /dev/null and b/public/img/__og-image/2023/laurent57.png differ diff --git a/public/img/__og-image/2023/laurent_broudoux.25mh5hbq.png b/public/img/__og-image/2023/laurent_broudoux.25mh5hbq.png new file mode 100644 index 0000000000..b157628820 Binary files /dev/null and b/public/img/__og-image/2023/laurent_broudoux.25mh5hbq.png differ diff --git a/public/img/__og-image/2023/laurinquast.png b/public/img/__og-image/2023/laurinquast.png new file mode 100644 index 0000000000..9affc7f3c9 Binary files /dev/null and b/public/img/__og-image/2023/laurinquast.png differ diff --git a/public/img/__og-image/2023/lee_byron.25krdom6.png b/public/img/__og-image/2023/lee_byron.25krdom6.png new file mode 100644 index 0000000000..62371b415b Binary files /dev/null and b/public/img/__og-image/2023/lee_byron.25krdom6.png differ diff --git a/public/img/__og-image/2023/lerenzo.png b/public/img/__og-image/2023/lerenzo.png new file mode 100644 index 0000000000..6806eb81cb Binary files /dev/null and b/public/img/__og-image/2023/lerenzo.png differ diff --git a/public/img/__og-image/2023/lthomas70.png b/public/img/__og-image/2023/lthomas70.png new file mode 100644 index 0000000000..d14d4cc4d0 Binary files /dev/null and b/public/img/__og-image/2023/lthomas70.png differ diff --git a/public/img/__og-image/2023/lucy_shen.png b/public/img/__og-image/2023/lucy_shen.png new file mode 100644 index 0000000000..5a593240ec Binary files /dev/null and b/public/img/__og-image/2023/lucy_shen.png differ diff --git a/public/img/__og-image/2023/lyonwj1.png b/public/img/__og-image/2023/lyonwj1.png new file mode 100644 index 0000000000..a4974b25f3 Binary files /dev/null and b/public/img/__og-image/2023/lyonwj1.png differ diff --git a/public/img/__og-image/2023/marc_andre_giroux.25krdfz9.png b/public/img/__og-image/2023/marc_andre_giroux.25krdfz9.png new file mode 100644 index 0000000000..f6c70708c7 Binary files /dev/null and b/public/img/__og-image/2023/marc_andre_giroux.25krdfz9.png differ diff --git a/public/img/__og-image/2023/marion84.png b/public/img/__og-image/2023/marion84.png new file mode 100644 index 0000000000..4af41925a3 Binary files /dev/null and b/public/img/__og-image/2023/marion84.png differ diff --git a/public/img/__og-image/2023/meenakshi.dhanani1.png b/public/img/__og-image/2023/meenakshi.dhanani1.png new file mode 100644 index 0000000000..52cb65f3e7 Binary files /dev/null and b/public/img/__og-image/2023/meenakshi.dhanani1.png differ diff --git a/public/img/__og-image/2023/mgiroux7.png b/public/img/__og-image/2023/mgiroux7.png new file mode 100644 index 0000000000..0c389b10a0 Binary files /dev/null and b/public/img/__og-image/2023/mgiroux7.png differ diff --git a/public/img/__og-image/2023/michael2685.png b/public/img/__og-image/2023/michael2685.png new file mode 100644 index 0000000000..b4970c1fb2 Binary files /dev/null and b/public/img/__og-image/2023/michael2685.png differ diff --git a/public/img/__og-image/2023/michael_staib.23xujj9p.png b/public/img/__og-image/2023/michael_staib.23xujj9p.png new file mode 100644 index 0000000000..558987cef6 Binary files /dev/null and b/public/img/__og-image/2023/michael_staib.23xujj9p.png differ diff --git a/public/img/__og-image/2023/patrick.arminio.png b/public/img/__og-image/2023/patrick.arminio.png new file mode 100644 index 0000000000..8c13213827 Binary files /dev/null and b/public/img/__og-image/2023/patrick.arminio.png differ diff --git a/public/img/__og-image/2023/plgah.png b/public/img/__og-image/2023/plgah.png new file mode 100644 index 0000000000..319b01f4cd Binary files /dev/null and b/public/img/__og-image/2023/plgah.png differ diff --git a/public/img/__og-image/2023/pooja.mistry.png b/public/img/__og-image/2023/pooja.mistry.png new file mode 100644 index 0000000000..dc01cc9180 Binary files /dev/null and b/public/img/__og-image/2023/pooja.mistry.png differ diff --git a/public/img/__og-image/2023/pooja_mistry.25kvpbvt.png b/public/img/__og-image/2023/pooja_mistry.25kvpbvt.png new file mode 100644 index 0000000000..db49e8ec73 Binary files /dev/null and b/public/img/__og-image/2023/pooja_mistry.25kvpbvt.png differ diff --git a/public/img/__og-image/2023/qkw1221.png b/public/img/__og-image/2023/qkw1221.png new file mode 100644 index 0000000000..be57213a97 Binary files /dev/null and b/public/img/__og-image/2023/qkw1221.png differ diff --git a/public/img/__og-image/2023/ramhadda.png b/public/img/__og-image/2023/ramhadda.png new file mode 100644 index 0000000000..a9141f3cfe Binary files /dev/null and b/public/img/__og-image/2023/ramhadda.png differ diff --git a/public/img/__og-image/2023/rbraun3.png b/public/img/__og-image/2023/rbraun3.png new file mode 100644 index 0000000000..63b343944d Binary files /dev/null and b/public/img/__og-image/2023/rbraun3.png differ diff --git a/public/img/__og-image/2023/robert.balicki.png b/public/img/__og-image/2023/robert.balicki.png new file mode 100644 index 0000000000..9ab5ce475e Binary files /dev/null and b/public/img/__og-image/2023/robert.balicki.png differ diff --git a/public/img/__og-image/2023/s.daniakash.png b/public/img/__og-image/2023/s.daniakash.png new file mode 100644 index 0000000000..772a50eeeb Binary files /dev/null and b/public/img/__og-image/2023/s.daniakash.png differ diff --git a/public/img/__og-image/2023/sdk.bens.png b/public/img/__og-image/2023/sdk.bens.png new file mode 100644 index 0000000000..2c3717548a Binary files /dev/null and b/public/img/__og-image/2023/sdk.bens.png differ diff --git a/public/img/__og-image/2023/serhii.korin.png b/public/img/__og-image/2023/serhii.korin.png new file mode 100644 index 0000000000..eed1875de9 Binary files /dev/null and b/public/img/__og-image/2023/serhii.korin.png differ diff --git a/public/img/__og-image/2023/shahar_binyamin.24vrzgo4.png b/public/img/__og-image/2023/shahar_binyamin.24vrzgo4.png new file mode 100644 index 0000000000..52c836e3b5 Binary files /dev/null and b/public/img/__og-image/2023/shahar_binyamin.24vrzgo4.png differ diff --git a/public/img/__og-image/2023/shweta.12dec.png b/public/img/__og-image/2023/shweta.12dec.png new file mode 100644 index 0000000000..3c1e35f5db Binary files /dev/null and b/public/img/__og-image/2023/shweta.12dec.png differ diff --git a/public/img/__og-image/2023/siddharthsingh1.png b/public/img/__og-image/2023/siddharthsingh1.png new file mode 100644 index 0000000000..5ab1f98283 Binary files /dev/null and b/public/img/__og-image/2023/siddharthsingh1.png differ diff --git a/public/img/__og-image/2023/spencer211.png b/public/img/__og-image/2023/spencer211.png new file mode 100644 index 0000000000..4a28f77889 Binary files /dev/null and b/public/img/__og-image/2023/spencer211.png differ diff --git a/public/img/__og-image/2023/sspalding2.png b/public/img/__og-image/2023/sspalding2.png new file mode 100644 index 0000000000..213f054637 Binary files /dev/null and b/public/img/__og-image/2023/sspalding2.png differ diff --git a/public/img/__og-image/2023/stephanie.saunders2.png b/public/img/__og-image/2023/stephanie.saunders2.png new file mode 100644 index 0000000000..c8e6f0bf94 Binary files /dev/null and b/public/img/__og-image/2023/stephanie.saunders2.png differ diff --git a/public/img/__og-image/2023/suresh_muthu.png b/public/img/__og-image/2023/suresh_muthu.png new file mode 100644 index 0000000000..fa84c27064 Binary files /dev/null and b/public/img/__og-image/2023/suresh_muthu.png differ diff --git a/public/img/__og-image/2023/tanmaig.png b/public/img/__og-image/2023/tanmaig.png new file mode 100644 index 0000000000..4b2168c449 Binary files /dev/null and b/public/img/__og-image/2023/tanmaig.png differ diff --git a/public/img/__og-image/2023/theo93.png b/public/img/__og-image/2023/theo93.png new file mode 100644 index 0000000000..e474eb414c Binary files /dev/null and b/public/img/__og-image/2023/theo93.png differ diff --git a/public/img/__og-image/2023/theo_browne.25qq5dhc.png b/public/img/__og-image/2023/theo_browne.25qq5dhc.png new file mode 100644 index 0000000000..35ca758985 Binary files /dev/null and b/public/img/__og-image/2023/theo_browne.25qq5dhc.png differ diff --git a/public/img/__og-image/2023/thomas.heyenbrock.png b/public/img/__og-image/2023/thomas.heyenbrock.png new file mode 100644 index 0000000000..0c2fd4e8c7 Binary files /dev/null and b/public/img/__og-image/2023/thomas.heyenbrock.png differ diff --git a/public/img/__og-image/2023/tim.hall.engr.png b/public/img/__og-image/2023/tim.hall.engr.png new file mode 100644 index 0000000000..834fbd22c5 Binary files /dev/null and b/public/img/__og-image/2023/tim.hall.engr.png differ diff --git a/public/img/__og-image/2023/tristan119.png b/public/img/__og-image/2023/tristan119.png new file mode 100644 index 0000000000..d962e33ea2 Binary files /dev/null and b/public/img/__og-image/2023/tristan119.png differ diff --git a/public/img/__og-image/2023/twitter7.png b/public/img/__og-image/2023/twitter7.png new file mode 100644 index 0000000000..a421cebfba Binary files /dev/null and b/public/img/__og-image/2023/twitter7.png differ diff --git a/public/img/__og-image/2023/uri_goldshtein.23xujj9a.png b/public/img/__og-image/2023/uri_goldshtein.23xujj9a.png new file mode 100644 index 0000000000..23108eb528 Binary files /dev/null and b/public/img/__og-image/2023/uri_goldshtein.23xujj9a.png differ diff --git a/public/img/__og-image/2023/william_lyon.7rvgomu.png b/public/img/__og-image/2023/william_lyon.7rvgomu.png new file mode 100644 index 0000000000..53aa672860 Binary files /dev/null and b/public/img/__og-image/2023/william_lyon.7rvgomu.png differ diff --git a/public/img/__og-image/2023/yaacovcr.png b/public/img/__og-image/2023/yaacovcr.png new file mode 100644 index 0000000000..07a4d5fcc7 Binary files /dev/null and b/public/img/__og-image/2023/yaacovcr.png differ diff --git a/public/img/__og-image/2023/yassineldeeb94.png b/public/img/__og-image/2023/yassineldeeb94.png new file mode 100644 index 0000000000..1efa44b6a9 Binary files /dev/null and b/public/img/__og-image/2023/yassineldeeb94.png differ diff --git a/public/img/__og-image/2023/yczhu.png b/public/img/__og-image/2023/yczhu.png new file mode 100644 index 0000000000..f2480d1da9 Binary files /dev/null and b/public/img/__og-image/2023/yczhu.png differ diff --git a/public/img/__og-image/2024/00735951e116f34db5e089b0fb4bc928.png b/public/img/__og-image/2024/00735951e116f34db5e089b0fb4bc928.png new file mode 100644 index 0000000000..be864d797b Binary files /dev/null and b/public/img/__og-image/2024/00735951e116f34db5e089b0fb4bc928.png differ diff --git a/public/img/__og-image/2024/0cc847db0ed6bf193da7b5413c7f3e8e.png b/public/img/__og-image/2024/0cc847db0ed6bf193da7b5413c7f3e8e.png new file mode 100644 index 0000000000..dc5c5d99a7 Binary files /dev/null and b/public/img/__og-image/2024/0cc847db0ed6bf193da7b5413c7f3e8e.png differ diff --git a/public/img/__og-image/2024/14632b39fa73ed429cb5e5db6f156ea4.png b/public/img/__og-image/2024/14632b39fa73ed429cb5e5db6f156ea4.png new file mode 100644 index 0000000000..281e1e4a99 Binary files /dev/null and b/public/img/__og-image/2024/14632b39fa73ed429cb5e5db6f156ea4.png differ diff --git a/public/img/__og-image/2024/15ae8e609d80ee7a856469c74c379c55.png b/public/img/__og-image/2024/15ae8e609d80ee7a856469c74c379c55.png new file mode 100644 index 0000000000..d890beedd1 Binary files /dev/null and b/public/img/__og-image/2024/15ae8e609d80ee7a856469c74c379c55.png differ diff --git a/public/img/__og-image/2024/167640984a909380aa61898c90625166.png b/public/img/__og-image/2024/167640984a909380aa61898c90625166.png new file mode 100644 index 0000000000..ff781c8d5e Binary files /dev/null and b/public/img/__og-image/2024/167640984a909380aa61898c90625166.png differ diff --git a/public/img/__og-image/2024/19cf965c68cfae3c7c19c6a9966bcadf.png b/public/img/__og-image/2024/19cf965c68cfae3c7c19c6a9966bcadf.png new file mode 100644 index 0000000000..41ed6b299d Binary files /dev/null and b/public/img/__og-image/2024/19cf965c68cfae3c7c19c6a9966bcadf.png differ diff --git a/public/img/__og-image/2024/1b3086b33b9d1b30790f02a49857cfe0.png b/public/img/__og-image/2024/1b3086b33b9d1b30790f02a49857cfe0.png new file mode 100644 index 0000000000..aa9b9bec4f Binary files /dev/null and b/public/img/__og-image/2024/1b3086b33b9d1b30790f02a49857cfe0.png differ diff --git a/public/img/__og-image/2024/1cf6041f56dd35067e0d34d081e23730.png b/public/img/__og-image/2024/1cf6041f56dd35067e0d34d081e23730.png new file mode 100644 index 0000000000..1596ea91a0 Binary files /dev/null and b/public/img/__og-image/2024/1cf6041f56dd35067e0d34d081e23730.png differ diff --git a/public/img/__og-image/2024/1e8e7ae6eb935636a20fc2acc70c299d.png b/public/img/__og-image/2024/1e8e7ae6eb935636a20fc2acc70c299d.png new file mode 100644 index 0000000000..51eef6fade Binary files /dev/null and b/public/img/__og-image/2024/1e8e7ae6eb935636a20fc2acc70c299d.png differ diff --git a/public/img/__og-image/2024/1f23375107e5a16e08092d69e1b5ba1a.png b/public/img/__og-image/2024/1f23375107e5a16e08092d69e1b5ba1a.png new file mode 100644 index 0000000000..8605153123 Binary files /dev/null and b/public/img/__og-image/2024/1f23375107e5a16e08092d69e1b5ba1a.png differ diff --git a/public/img/__og-image/2024/24100908c07eed48ee464ca2509ef527.png b/public/img/__og-image/2024/24100908c07eed48ee464ca2509ef527.png new file mode 100644 index 0000000000..d43d7b6a6c Binary files /dev/null and b/public/img/__og-image/2024/24100908c07eed48ee464ca2509ef527.png differ diff --git a/public/img/__og-image/2024/260dd09a831d9432aa4122d60df72d21.png b/public/img/__og-image/2024/260dd09a831d9432aa4122d60df72d21.png new file mode 100644 index 0000000000..591a4a8af5 Binary files /dev/null and b/public/img/__og-image/2024/260dd09a831d9432aa4122d60df72d21.png differ diff --git a/public/img/__og-image/2024/26843420d633586e4b750ae4fe01e174.png b/public/img/__og-image/2024/26843420d633586e4b750ae4fe01e174.png new file mode 100644 index 0000000000..ce04b64155 Binary files /dev/null and b/public/img/__og-image/2024/26843420d633586e4b750ae4fe01e174.png differ diff --git a/public/img/__og-image/2024/2b8cf13e46335dc0f98c57dd576551c3.png b/public/img/__og-image/2024/2b8cf13e46335dc0f98c57dd576551c3.png new file mode 100644 index 0000000000..63ff50af5d Binary files /dev/null and b/public/img/__og-image/2024/2b8cf13e46335dc0f98c57dd576551c3.png differ diff --git a/public/img/__og-image/2024/2f44e6cde4172d716d83bcb02809517f.png b/public/img/__og-image/2024/2f44e6cde4172d716d83bcb02809517f.png new file mode 100644 index 0000000000..8803b10e75 Binary files /dev/null and b/public/img/__og-image/2024/2f44e6cde4172d716d83bcb02809517f.png differ diff --git a/public/img/__og-image/2024/2f6808aabe48239c0cccb9db43626aac.png b/public/img/__og-image/2024/2f6808aabe48239c0cccb9db43626aac.png new file mode 100644 index 0000000000..74e466bf24 Binary files /dev/null and b/public/img/__og-image/2024/2f6808aabe48239c0cccb9db43626aac.png differ diff --git a/public/img/__og-image/2024/303433f67a7ffc5e3d31a6edfd8b1f28.png b/public/img/__og-image/2024/303433f67a7ffc5e3d31a6edfd8b1f28.png new file mode 100644 index 0000000000..4ff919f3fe Binary files /dev/null and b/public/img/__og-image/2024/303433f67a7ffc5e3d31a6edfd8b1f28.png differ diff --git a/public/img/__og-image/2024/30ea7a71fd410161e413a6a41eb5902c.png b/public/img/__og-image/2024/30ea7a71fd410161e413a6a41eb5902c.png new file mode 100644 index 0000000000..28ee24c6e7 Binary files /dev/null and b/public/img/__og-image/2024/30ea7a71fd410161e413a6a41eb5902c.png differ diff --git a/public/img/__og-image/2024/370614bdbfb4b73d76ec71db8ce43552.png b/public/img/__og-image/2024/370614bdbfb4b73d76ec71db8ce43552.png new file mode 100644 index 0000000000..f801d3f1f2 Binary files /dev/null and b/public/img/__og-image/2024/370614bdbfb4b73d76ec71db8ce43552.png differ diff --git a/public/img/__og-image/2024/3c81808073ae7f888acc66d832877764.png b/public/img/__og-image/2024/3c81808073ae7f888acc66d832877764.png new file mode 100644 index 0000000000..682b7ff0ab Binary files /dev/null and b/public/img/__og-image/2024/3c81808073ae7f888acc66d832877764.png differ diff --git a/public/img/__og-image/2024/4003c42a935c2de7c19896b6c0351c0d.png b/public/img/__og-image/2024/4003c42a935c2de7c19896b6c0351c0d.png new file mode 100644 index 0000000000..0967ca43b2 Binary files /dev/null and b/public/img/__og-image/2024/4003c42a935c2de7c19896b6c0351c0d.png differ diff --git a/public/img/__og-image/2024/468947db8b153fca9be52febb43beb6e.png b/public/img/__og-image/2024/468947db8b153fca9be52febb43beb6e.png new file mode 100644 index 0000000000..43ce992aa9 Binary files /dev/null and b/public/img/__og-image/2024/468947db8b153fca9be52febb43beb6e.png differ diff --git a/public/img/__og-image/2024/486758a780cbd512a88c6def8f9ba36a.png b/public/img/__og-image/2024/486758a780cbd512a88c6def8f9ba36a.png new file mode 100644 index 0000000000..b27513bdf1 Binary files /dev/null and b/public/img/__og-image/2024/486758a780cbd512a88c6def8f9ba36a.png differ diff --git a/public/img/__og-image/2024/487b5eb466c6367896d32d0006ddad8a.png b/public/img/__og-image/2024/487b5eb466c6367896d32d0006ddad8a.png new file mode 100644 index 0000000000..4b9f2c17a0 Binary files /dev/null and b/public/img/__og-image/2024/487b5eb466c6367896d32d0006ddad8a.png differ diff --git a/public/img/__og-image/2024/4bd0c22887a042cfffec9428d7fc9689.png b/public/img/__og-image/2024/4bd0c22887a042cfffec9428d7fc9689.png new file mode 100644 index 0000000000..47828eb906 Binary files /dev/null and b/public/img/__og-image/2024/4bd0c22887a042cfffec9428d7fc9689.png differ diff --git a/public/img/__og-image/2024/4dc607a403a2316846b59d0c5a9858c9.png b/public/img/__og-image/2024/4dc607a403a2316846b59d0c5a9858c9.png new file mode 100644 index 0000000000..10b8f5cfb6 Binary files /dev/null and b/public/img/__og-image/2024/4dc607a403a2316846b59d0c5a9858c9.png differ diff --git a/public/img/__og-image/2024/4df9dbdef91ea1bc5fce211e6b7e3f52.png b/public/img/__og-image/2024/4df9dbdef91ea1bc5fce211e6b7e3f52.png new file mode 100644 index 0000000000..da0f612f20 Binary files /dev/null and b/public/img/__og-image/2024/4df9dbdef91ea1bc5fce211e6b7e3f52.png differ diff --git a/public/img/__og-image/2024/515c8ade2da6e1fc710e87df182dd8e6.png b/public/img/__og-image/2024/515c8ade2da6e1fc710e87df182dd8e6.png new file mode 100644 index 0000000000..d81423ef66 Binary files /dev/null and b/public/img/__og-image/2024/515c8ade2da6e1fc710e87df182dd8e6.png differ diff --git a/public/img/__og-image/2024/5245297ed1f7b82885c742d77f209bda.png b/public/img/__og-image/2024/5245297ed1f7b82885c742d77f209bda.png new file mode 100644 index 0000000000..f096531f36 Binary files /dev/null and b/public/img/__og-image/2024/5245297ed1f7b82885c742d77f209bda.png differ diff --git a/public/img/__og-image/2024/52854704c6ab04364b24f2bda3991034.png b/public/img/__og-image/2024/52854704c6ab04364b24f2bda3991034.png new file mode 100644 index 0000000000..47828eb906 Binary files /dev/null and b/public/img/__og-image/2024/52854704c6ab04364b24f2bda3991034.png differ diff --git a/public/img/__og-image/2024/5cabf2af855ce1e45161cd36903d41c0.png b/public/img/__og-image/2024/5cabf2af855ce1e45161cd36903d41c0.png new file mode 100644 index 0000000000..1ca6ea1049 Binary files /dev/null and b/public/img/__og-image/2024/5cabf2af855ce1e45161cd36903d41c0.png differ diff --git a/public/img/__og-image/2024/5df1be4f2875d2ba86cd9c3daefadd02.png b/public/img/__og-image/2024/5df1be4f2875d2ba86cd9c3daefadd02.png new file mode 100644 index 0000000000..8c7d576ae6 Binary files /dev/null and b/public/img/__og-image/2024/5df1be4f2875d2ba86cd9c3daefadd02.png differ diff --git a/public/img/__og-image/2024/6204717dd5e10bf10587733c08897dc1.png b/public/img/__og-image/2024/6204717dd5e10bf10587733c08897dc1.png new file mode 100644 index 0000000000..17765176be Binary files /dev/null and b/public/img/__og-image/2024/6204717dd5e10bf10587733c08897dc1.png differ diff --git a/public/img/__og-image/2024/65768f566de8acf5320a4ed1fef47606.png b/public/img/__og-image/2024/65768f566de8acf5320a4ed1fef47606.png new file mode 100644 index 0000000000..4312392a15 Binary files /dev/null and b/public/img/__og-image/2024/65768f566de8acf5320a4ed1fef47606.png differ diff --git a/public/img/__og-image/2024/667270504bb6e511749901460a6e68d1.png b/public/img/__og-image/2024/667270504bb6e511749901460a6e68d1.png new file mode 100644 index 0000000000..321685c831 Binary files /dev/null and b/public/img/__og-image/2024/667270504bb6e511749901460a6e68d1.png differ diff --git a/public/img/__og-image/2024/66a12b5aa41f22c3a7f80a9838488826.png b/public/img/__og-image/2024/66a12b5aa41f22c3a7f80a9838488826.png new file mode 100644 index 0000000000..69df41799f Binary files /dev/null and b/public/img/__og-image/2024/66a12b5aa41f22c3a7f80a9838488826.png differ diff --git a/public/img/__og-image/2024/6e20cd3c4ee36577f15713955444338f.png b/public/img/__og-image/2024/6e20cd3c4ee36577f15713955444338f.png new file mode 100644 index 0000000000..2b06b64696 Binary files /dev/null and b/public/img/__og-image/2024/6e20cd3c4ee36577f15713955444338f.png differ diff --git a/public/img/__og-image/2024/6fd1c120b48d6c62c4544ccbf27a665a.png b/public/img/__og-image/2024/6fd1c120b48d6c62c4544ccbf27a665a.png new file mode 100644 index 0000000000..3e0e88b858 Binary files /dev/null and b/public/img/__og-image/2024/6fd1c120b48d6c62c4544ccbf27a665a.png differ diff --git a/public/img/__og-image/2024/74697b2144c044a7a134bc7e04e190d1.png b/public/img/__og-image/2024/74697b2144c044a7a134bc7e04e190d1.png new file mode 100644 index 0000000000..8f7309eea9 Binary files /dev/null and b/public/img/__og-image/2024/74697b2144c044a7a134bc7e04e190d1.png differ diff --git a/public/img/__og-image/2024/75386a4288d49dcb4aba5b54e475de43.png b/public/img/__og-image/2024/75386a4288d49dcb4aba5b54e475de43.png new file mode 100644 index 0000000000..df92876d4d Binary files /dev/null and b/public/img/__og-image/2024/75386a4288d49dcb4aba5b54e475de43.png differ diff --git a/public/img/__og-image/2024/785671ee20a5e7c63578e83cf84b8a12.png b/public/img/__og-image/2024/785671ee20a5e7c63578e83cf84b8a12.png new file mode 100644 index 0000000000..d7d5a4c4c2 Binary files /dev/null and b/public/img/__og-image/2024/785671ee20a5e7c63578e83cf84b8a12.png differ diff --git a/public/img/__og-image/2024/7c1eba2165f24ed45492801796cbe453.png b/public/img/__og-image/2024/7c1eba2165f24ed45492801796cbe453.png new file mode 100644 index 0000000000..ae970f0c33 Binary files /dev/null and b/public/img/__og-image/2024/7c1eba2165f24ed45492801796cbe453.png differ diff --git a/public/img/__og-image/2024/83cfae91425cec04854a0ebc173d9c77.png b/public/img/__og-image/2024/83cfae91425cec04854a0ebc173d9c77.png new file mode 100644 index 0000000000..61748ec7ae Binary files /dev/null and b/public/img/__og-image/2024/83cfae91425cec04854a0ebc173d9c77.png differ diff --git a/public/img/__og-image/2024/870876ffad45b79d11e09393e7f22587.png b/public/img/__og-image/2024/870876ffad45b79d11e09393e7f22587.png new file mode 100644 index 0000000000..57dc653953 Binary files /dev/null and b/public/img/__og-image/2024/870876ffad45b79d11e09393e7f22587.png differ diff --git a/public/img/__og-image/2024/8866a2e23936ff9882c39f99b71238c5.png b/public/img/__og-image/2024/8866a2e23936ff9882c39f99b71238c5.png new file mode 100644 index 0000000000..f2efb65967 Binary files /dev/null and b/public/img/__og-image/2024/8866a2e23936ff9882c39f99b71238c5.png differ diff --git a/public/img/__og-image/2024/8b3fee2390253e8c920c1df186758b9d.png b/public/img/__og-image/2024/8b3fee2390253e8c920c1df186758b9d.png new file mode 100644 index 0000000000..ef22a85b36 Binary files /dev/null and b/public/img/__og-image/2024/8b3fee2390253e8c920c1df186758b9d.png differ diff --git a/public/img/__og-image/2024/8daaf10ac70360a7fade149a54538bf9.png b/public/img/__og-image/2024/8daaf10ac70360a7fade149a54538bf9.png new file mode 100644 index 0000000000..3967dd9b9b Binary files /dev/null and b/public/img/__og-image/2024/8daaf10ac70360a7fade149a54538bf9.png differ diff --git a/public/img/__og-image/2024/914fd37e2c0bd49ce423fb1cbc326ec8.png b/public/img/__og-image/2024/914fd37e2c0bd49ce423fb1cbc326ec8.png new file mode 100644 index 0000000000..08da091a7c Binary files /dev/null and b/public/img/__og-image/2024/914fd37e2c0bd49ce423fb1cbc326ec8.png differ diff --git a/public/img/__og-image/2024/9485641416d5be1d5846b846ee2c7666.png b/public/img/__og-image/2024/9485641416d5be1d5846b846ee2c7666.png new file mode 100644 index 0000000000..eb514a0255 Binary files /dev/null and b/public/img/__og-image/2024/9485641416d5be1d5846b846ee2c7666.png differ diff --git a/public/img/__og-image/2024/950039dcb680cef826423ad5c0678714.png b/public/img/__og-image/2024/950039dcb680cef826423ad5c0678714.png new file mode 100644 index 0000000000..a7c428fe04 Binary files /dev/null and b/public/img/__og-image/2024/950039dcb680cef826423ad5c0678714.png differ diff --git a/public/img/__og-image/2024/9b4f92f2579d24a3c20e6533686aca6b.png b/public/img/__og-image/2024/9b4f92f2579d24a3c20e6533686aca6b.png new file mode 100644 index 0000000000..dc3f5ad6c2 Binary files /dev/null and b/public/img/__og-image/2024/9b4f92f2579d24a3c20e6533686aca6b.png differ diff --git a/public/img/__og-image/2024/aditi_rajawat@intuit.com.png b/public/img/__og-image/2024/aditi_rajawat@intuit.com.png new file mode 100644 index 0000000000..57f8c007b9 Binary files /dev/null and b/public/img/__og-image/2024/aditi_rajawat@intuit.com.png differ diff --git a/public/img/__og-image/2024/af55205b1d68ec3b3d1b1663e4bd2adf.png b/public/img/__og-image/2024/af55205b1d68ec3b3d1b1663e4bd2adf.png new file mode 100644 index 0000000000..d367c268dd Binary files /dev/null and b/public/img/__og-image/2024/af55205b1d68ec3b3d1b1663e4bd2adf.png differ diff --git a/public/img/__og-image/2024/ajhingran.png b/public/img/__og-image/2024/ajhingran.png new file mode 100644 index 0000000000..fff84c15ab Binary files /dev/null and b/public/img/__og-image/2024/ajhingran.png differ diff --git a/public/img/__og-image/2024/alan.quigley@toasttab.com.png b/public/img/__og-image/2024/alan.quigley@toasttab.com.png new file mode 100644 index 0000000000..1aec71e70b Binary files /dev/null and b/public/img/__og-image/2024/alan.quigley@toasttab.com.png differ diff --git a/public/img/__og-image/2024/andreas.marek@fastmail.fm.png b/public/img/__og-image/2024/andreas.marek@fastmail.fm.png new file mode 100644 index 0000000000..afe1873058 Binary files /dev/null and b/public/img/__og-image/2024/andreas.marek@fastmail.fm.png differ diff --git a/public/img/__og-image/2024/andrei.bocan@gmail.com.png b/public/img/__og-image/2024/andrei.bocan@gmail.com.png new file mode 100644 index 0000000000..46d57c5f60 Binary files /dev/null and b/public/img/__og-image/2024/andrei.bocan@gmail.com.png differ diff --git a/public/img/__og-image/2024/andrew.doyle@mail.house.gov.png b/public/img/__og-image/2024/andrew.doyle@mail.house.gov.png new file mode 100644 index 0000000000..9ccb46ef15 Binary files /dev/null and b/public/img/__og-image/2024/andrew.doyle@mail.house.gov.png differ diff --git a/public/img/__og-image/2024/ango@bol.com.png b/public/img/__og-image/2024/ango@bol.com.png new file mode 100644 index 0000000000..b369a2a7e9 Binary files /dev/null and b/public/img/__og-image/2024/ango@bol.com.png differ diff --git a/public/img/__og-image/2024/ankita25.png b/public/img/__og-image/2024/ankita25.png new file mode 100644 index 0000000000..c2aa4e3f42 Binary files /dev/null and b/public/img/__og-image/2024/ankita25.png differ diff --git a/public/img/__og-image/2024/ankush9.png b/public/img/__og-image/2024/ankush9.png new file mode 100644 index 0000000000..b974d3a8e4 Binary files /dev/null and b/public/img/__og-image/2024/ankush9.png differ diff --git a/public/img/__og-image/2024/anthonymdev@gmail.com.png b/public/img/__og-image/2024/anthonymdev@gmail.com.png new file mode 100644 index 0000000000..15836294e2 Binary files /dev/null and b/public/img/__og-image/2024/anthonymdev@gmail.com.png differ diff --git a/public/img/__og-image/2024/antoine.carossio.png b/public/img/__og-image/2024/antoine.carossio.png new file mode 100644 index 0000000000..4bacfb8f04 Binary files /dev/null and b/public/img/__og-image/2024/antoine.carossio.png differ diff --git a/public/img/__og-image/2024/arkenflame.png b/public/img/__og-image/2024/arkenflame.png new file mode 100644 index 0000000000..bfbf1d9873 Binary files /dev/null and b/public/img/__og-image/2024/arkenflame.png differ diff --git a/public/img/__og-image/2024/b106db6eb7ca1aba331fcfb86dff9f22.png b/public/img/__og-image/2024/b106db6eb7ca1aba331fcfb86dff9f22.png new file mode 100644 index 0000000000..c18fa9ba6c Binary files /dev/null and b/public/img/__og-image/2024/b106db6eb7ca1aba331fcfb86dff9f22.png differ diff --git a/public/img/__og-image/2024/b3cdfe65307832887ded26a9270d1295.png b/public/img/__og-image/2024/b3cdfe65307832887ded26a9270d1295.png new file mode 100644 index 0000000000..6c7b6f61cf Binary files /dev/null and b/public/img/__og-image/2024/b3cdfe65307832887ded26a9270d1295.png differ diff --git a/public/img/__og-image/2024/b43e5c894796be3b0b0f0d0b662d4a5a.png b/public/img/__og-image/2024/b43e5c894796be3b0b0f0d0b662d4a5a.png new file mode 100644 index 0000000000..df500068df Binary files /dev/null and b/public/img/__og-image/2024/b43e5c894796be3b0b0f0d0b662d4a5a.png differ diff --git a/public/img/__og-image/2024/b45e3e5dfce0eec4d5498bedb8c54f04.png b/public/img/__og-image/2024/b45e3e5dfce0eec4d5498bedb8c54f04.png new file mode 100644 index 0000000000..a7a9a79d57 Binary files /dev/null and b/public/img/__og-image/2024/b45e3e5dfce0eec4d5498bedb8c54f04.png differ diff --git a/public/img/__og-image/2024/b5386fb97755f765369c45e5f24094ec.png b/public/img/__og-image/2024/b5386fb97755f765369c45e5f24094ec.png new file mode 100644 index 0000000000..aa0bae08a4 Binary files /dev/null and b/public/img/__og-image/2024/b5386fb97755f765369c45e5f24094ec.png differ diff --git a/public/img/__og-image/2024/badurinadenis.png b/public/img/__og-image/2024/badurinadenis.png new file mode 100644 index 0000000000..5cdfd0bcb1 Binary files /dev/null and b/public/img/__og-image/2024/badurinadenis.png differ diff --git a/public/img/__og-image/2024/bd12197d841d201adbcae218323d713a.png b/public/img/__og-image/2024/bd12197d841d201adbcae218323d713a.png new file mode 100644 index 0000000000..aa8fd650e8 Binary files /dev/null and b/public/img/__og-image/2024/bd12197d841d201adbcae218323d713a.png differ diff --git a/public/img/__og-image/2024/benjie3.png b/public/img/__og-image/2024/benjie3.png new file mode 100644 index 0000000000..0995835fcb Binary files /dev/null and b/public/img/__og-image/2024/benjie3.png differ diff --git a/public/img/__og-image/2024/bleigh@google.com.png b/public/img/__og-image/2024/bleigh@google.com.png new file mode 100644 index 0000000000..2b549e0290 Binary files /dev/null and b/public/img/__og-image/2024/bleigh@google.com.png differ diff --git a/public/img/__og-image/2024/budha1.png b/public/img/__og-image/2024/budha1.png new file mode 100644 index 0000000000..d69b7102b3 Binary files /dev/null and b/public/img/__og-image/2024/budha1.png differ diff --git a/public/img/__og-image/2024/c044cbad42295fda4adedd7018df6b2a.png b/public/img/__og-image/2024/c044cbad42295fda4adedd7018df6b2a.png new file mode 100644 index 0000000000..0599e795eb Binary files /dev/null and b/public/img/__og-image/2024/c044cbad42295fda4adedd7018df6b2a.png differ diff --git a/public/img/__og-image/2024/c117b6cefe3eaa89940b76d68abdc3de.png b/public/img/__og-image/2024/c117b6cefe3eaa89940b76d68abdc3de.png new file mode 100644 index 0000000000..61a25f0565 Binary files /dev/null and b/public/img/__og-image/2024/c117b6cefe3eaa89940b76d68abdc3de.png differ diff --git a/public/img/__og-image/2024/c12a426b75f4851c04a7e16e54135887.png b/public/img/__og-image/2024/c12a426b75f4851c04a7e16e54135887.png new file mode 100644 index 0000000000..1740f6a0a1 Binary files /dev/null and b/public/img/__og-image/2024/c12a426b75f4851c04a7e16e54135887.png differ diff --git a/public/img/__og-image/2024/c13801cab4bdcf1c9e7321fba8daca3f.png b/public/img/__og-image/2024/c13801cab4bdcf1c9e7321fba8daca3f.png new file mode 100644 index 0000000000..3e221dbd06 Binary files /dev/null and b/public/img/__og-image/2024/c13801cab4bdcf1c9e7321fba8daca3f.png differ diff --git a/public/img/__og-image/2024/c291c64196e84d0862ded0b8ef31968a.png b/public/img/__og-image/2024/c291c64196e84d0862ded0b8ef31968a.png new file mode 100644 index 0000000000..ca9842dbc6 Binary files /dev/null and b/public/img/__og-image/2024/c291c64196e84d0862ded0b8ef31968a.png differ diff --git a/public/img/__og-image/2024/c8426c5a3d9418e921f6d8717ff98ac3.png b/public/img/__og-image/2024/c8426c5a3d9418e921f6d8717ff98ac3.png new file mode 100644 index 0000000000..181ad73a9b Binary files /dev/null and b/public/img/__og-image/2024/c8426c5a3d9418e921f6d8717ff98ac3.png differ diff --git a/public/img/__og-image/2024/c9734088ee56ff8e1410bf33e494f71d.png b/public/img/__og-image/2024/c9734088ee56ff8e1410bf33e494f71d.png new file mode 100644 index 0000000000..9b2649bc84 Binary files /dev/null and b/public/img/__og-image/2024/c9734088ee56ff8e1410bf33e494f71d.png differ diff --git a/public/img/__og-image/2024/cernst11@gmail.com.png b/public/img/__og-image/2024/cernst11@gmail.com.png new file mode 100644 index 0000000000..80c57cc64a Binary files /dev/null and b/public/img/__og-image/2024/cernst11@gmail.com.png differ diff --git a/public/img/__og-image/2024/cfp@escape.tech.png b/public/img/__og-image/2024/cfp@escape.tech.png new file mode 100644 index 0000000000..625d001f9b Binary files /dev/null and b/public/img/__og-image/2024/cfp@escape.tech.png differ diff --git a/public/img/__og-image/2024/christian.stangier@moia.io.png b/public/img/__og-image/2024/christian.stangier@moia.io.png new file mode 100644 index 0000000000..95bc44013c Binary files /dev/null and b/public/img/__og-image/2024/christian.stangier@moia.io.png differ diff --git a/public/img/__og-image/2024/d0956581df5caec03d7865766e53412b.png b/public/img/__og-image/2024/d0956581df5caec03d7865766e53412b.png new file mode 100644 index 0000000000..69af18dc32 Binary files /dev/null and b/public/img/__og-image/2024/d0956581df5caec03d7865766e53412b.png differ diff --git a/public/img/__og-image/2024/d834fa1289d62ca14c1d5f67013c6337.png b/public/img/__og-image/2024/d834fa1289d62ca14c1d5f67013c6337.png new file mode 100644 index 0000000000..47828eb906 Binary files /dev/null and b/public/img/__og-image/2024/d834fa1289d62ca14c1d5f67013c6337.png differ diff --git a/public/img/__og-image/2024/daa84da2c7b8efe182514d3f6d6624ec.png b/public/img/__og-image/2024/daa84da2c7b8efe182514d3f6d6624ec.png new file mode 100644 index 0000000000..bb8af07d06 Binary files /dev/null and b/public/img/__og-image/2024/daa84da2c7b8efe182514d3f6d6624ec.png differ diff --git a/public/img/__og-image/2024/dd457152162ecb3609b4adac4026fe02.png b/public/img/__og-image/2024/dd457152162ecb3609b4adac4026fe02.png new file mode 100644 index 0000000000..f3f2f9408d Binary files /dev/null and b/public/img/__og-image/2024/dd457152162ecb3609b4adac4026fe02.png differ diff --git a/public/img/__og-image/2024/ddf5766e2b98ed4a1055c31926575d1b.png b/public/img/__og-image/2024/ddf5766e2b98ed4a1055c31926575d1b.png new file mode 100644 index 0000000000..fce2626cf6 Binary files /dev/null and b/public/img/__og-image/2024/ddf5766e2b98ed4a1055c31926575d1b.png differ diff --git a/public/img/__og-image/2024/de54e458f4da84295d55ce44dade372e.png b/public/img/__og-image/2024/de54e458f4da84295d55ce44dade372e.png new file mode 100644 index 0000000000..8ac4d0ef59 Binary files /dev/null and b/public/img/__og-image/2024/de54e458f4da84295d55ce44dade372e.png differ diff --git a/public/img/__og-image/2024/de8fa563c5beb17fbe9b4f5f23c99e89.png b/public/img/__og-image/2024/de8fa563c5beb17fbe9b4f5f23c99e89.png new file mode 100644 index 0000000000..4dc98d5917 Binary files /dev/null and b/public/img/__og-image/2024/de8fa563c5beb17fbe9b4f5f23c99e89.png differ diff --git a/public/img/__og-image/2024/dman@apollographql.com.png b/public/img/__og-image/2024/dman@apollographql.com.png new file mode 100644 index 0000000000..eddb93632f Binary files /dev/null and b/public/img/__og-image/2024/dman@apollographql.com.png differ diff --git a/public/img/__og-image/2024/e24b8d54971024a028352f5f35930575.png b/public/img/__og-image/2024/e24b8d54971024a028352f5f35930575.png new file mode 100644 index 0000000000..1ff02c683f Binary files /dev/null and b/public/img/__og-image/2024/e24b8d54971024a028352f5f35930575.png differ diff --git a/public/img/__og-image/2024/e456ed2987a18a88a3f6662842d17921.png b/public/img/__og-image/2024/e456ed2987a18a88a3f6662842d17921.png new file mode 100644 index 0000000000..495b461220 Binary files /dev/null and b/public/img/__og-image/2024/e456ed2987a18a88a3f6662842d17921.png differ diff --git a/public/img/__og-image/2024/e61013ca35c75a29e8fa8ce157e320e9.png b/public/img/__og-image/2024/e61013ca35c75a29e8fa8ce157e320e9.png new file mode 100644 index 0000000000..aa39a8666d Binary files /dev/null and b/public/img/__og-image/2024/e61013ca35c75a29e8fa8ce157e320e9.png differ diff --git a/public/img/__og-image/2024/e833ccb06207e185cac37276e65bb927.png b/public/img/__og-image/2024/e833ccb06207e185cac37276e65bb927.png new file mode 100644 index 0000000000..0c143c85ff Binary files /dev/null and b/public/img/__og-image/2024/e833ccb06207e185cac37276e65bb927.png differ diff --git a/public/img/__og-image/2024/eb21b013745069912ee5b95b14aaca24.png b/public/img/__og-image/2024/eb21b013745069912ee5b95b14aaca24.png new file mode 100644 index 0000000000..3b0471de4c Binary files /dev/null and b/public/img/__og-image/2024/eb21b013745069912ee5b95b14aaca24.png differ diff --git a/public/img/__og-image/2024/emily.li@benchling.com.png b/public/img/__og-image/2024/emily.li@benchling.com.png new file mode 100644 index 0000000000..01aef26e2c Binary files /dev/null and b/public/img/__og-image/2024/emily.li@benchling.com.png differ diff --git a/public/img/__og-image/2024/erikwrede2.png b/public/img/__og-image/2024/erikwrede2.png new file mode 100644 index 0000000000..3e85137514 Binary files /dev/null and b/public/img/__og-image/2024/erikwrede2.png differ diff --git a/public/img/__og-image/2024/f02cda18e19887fddeb56b06445ac256.png b/public/img/__og-image/2024/f02cda18e19887fddeb56b06445ac256.png new file mode 100644 index 0000000000..2208e73852 Binary files /dev/null and b/public/img/__og-image/2024/f02cda18e19887fddeb56b06445ac256.png differ diff --git a/public/img/__og-image/2024/f304b62528988d6e67bb74020d97c885.png b/public/img/__og-image/2024/f304b62528988d6e67bb74020d97c885.png new file mode 100644 index 0000000000..9828a990c7 Binary files /dev/null and b/public/img/__og-image/2024/f304b62528988d6e67bb74020d97c885.png differ diff --git a/public/img/__og-image/2024/f37774914d4fb6b5760a4c4811f042be.png b/public/img/__og-image/2024/f37774914d4fb6b5760a4c4811f042be.png new file mode 100644 index 0000000000..bb9f8e6141 Binary files /dev/null and b/public/img/__og-image/2024/f37774914d4fb6b5760a4c4811f042be.png differ diff --git a/public/img/__og-image/2024/f385327bc79231054b3d0d5440b9a47d.png b/public/img/__og-image/2024/f385327bc79231054b3d0d5440b9a47d.png new file mode 100644 index 0000000000..a6d37f50a5 Binary files /dev/null and b/public/img/__og-image/2024/f385327bc79231054b3d0d5440b9a47d.png differ diff --git a/public/img/__og-image/2024/f53d0eed2747a55edea203c97844fe3e.png b/public/img/__og-image/2024/f53d0eed2747a55edea203c97844fe3e.png new file mode 100644 index 0000000000..e5c88d6ec0 Binary files /dev/null and b/public/img/__og-image/2024/f53d0eed2747a55edea203c97844fe3e.png differ diff --git a/public/img/__og-image/2024/gabrielschulhof.png b/public/img/__og-image/2024/gabrielschulhof.png new file mode 100644 index 0000000000..47c9033cbf Binary files /dev/null and b/public/img/__og-image/2024/gabrielschulhof.png differ diff --git a/public/img/__og-image/2024/hello2358.png b/public/img/__og-image/2024/hello2358.png new file mode 100644 index 0000000000..6e3a70dc40 Binary files /dev/null and b/public/img/__og-image/2024/hello2358.png differ diff --git a/public/img/__og-image/2024/jackchuka@tailor.tech.png b/public/img/__og-image/2024/jackchuka@tailor.tech.png new file mode 100644 index 0000000000..a9c057ce2f Binary files /dev/null and b/public/img/__og-image/2024/jackchuka@tailor.tech.png differ diff --git a/public/img/__og-image/2024/janettelc@gmail.com.png b/public/img/__og-image/2024/janettelc@gmail.com.png new file mode 100644 index 0000000000..29ee2ce173 Binary files /dev/null and b/public/img/__og-image/2024/janettelc@gmail.com.png differ diff --git a/public/img/__og-image/2024/jeff.auriemma.png b/public/img/__og-image/2024/jeff.auriemma.png new file mode 100644 index 0000000000..8747a362db Binary files /dev/null and b/public/img/__og-image/2024/jeff.auriemma.png differ diff --git a/public/img/__og-image/2024/jordaneldredge@gmail.com.png b/public/img/__og-image/2024/jordaneldredge@gmail.com.png new file mode 100644 index 0000000000..4138851880 Binary files /dev/null and b/public/img/__og-image/2024/jordaneldredge@gmail.com.png differ diff --git a/public/img/__og-image/2024/kamilkisiela.png b/public/img/__og-image/2024/kamilkisiela.png new file mode 100644 index 0000000000..e950d8aa69 Binary files /dev/null and b/public/img/__og-image/2024/kamilkisiela.png differ diff --git a/public/img/__og-image/2024/kenneth.wussmann@moia.io.png b/public/img/__og-image/2024/kenneth.wussmann@moia.io.png new file mode 100644 index 0000000000..09eddb3e17 Binary files /dev/null and b/public/img/__og-image/2024/kenneth.wussmann@moia.io.png differ diff --git a/public/img/__og-image/2024/kennethstott@gmail.com.png b/public/img/__og-image/2024/kennethstott@gmail.com.png new file mode 100644 index 0000000000..d9efc3607d Binary files /dev/null and b/public/img/__og-image/2024/kennethstott@gmail.com.png differ diff --git a/public/img/__og-image/2024/laurinquast.png b/public/img/__og-image/2024/laurinquast.png new file mode 100644 index 0000000000..10862bcdf1 Binary files /dev/null and b/public/img/__og-image/2024/laurinquast.png differ diff --git a/public/img/__og-image/2024/ldebruijn.png b/public/img/__og-image/2024/ldebruijn.png new file mode 100644 index 0000000000..7b8d4b662c Binary files /dev/null and b/public/img/__og-image/2024/ldebruijn.png differ diff --git a/public/img/__og-image/2024/lee_byron.25jvpjmb.png b/public/img/__og-image/2024/lee_byron.25jvpjmb.png new file mode 100644 index 0000000000..c6ede224f5 Binary files /dev/null and b/public/img/__og-image/2024/lee_byron.25jvpjmb.png differ diff --git a/public/img/__og-image/2024/mahoney.mattj.png b/public/img/__og-image/2024/mahoney.mattj.png new file mode 100644 index 0000000000..a4e6d3ff2d Binary files /dev/null and b/public/img/__og-image/2024/mahoney.mattj.png differ diff --git a/public/img/__og-image/2024/martijn@martijnwalraven.com.png b/public/img/__og-image/2024/martijn@martijnwalraven.com.png new file mode 100644 index 0000000000..65ce7e3f4d Binary files /dev/null and b/public/img/__og-image/2024/martijn@martijnwalraven.com.png differ diff --git a/public/img/__og-image/2024/mauricio.montalvo.guzman@gmail.com.png b/public/img/__og-image/2024/mauricio.montalvo.guzman@gmail.com.png new file mode 100644 index 0000000000..bebf850bc6 Binary files /dev/null and b/public/img/__og-image/2024/mauricio.montalvo.guzman@gmail.com.png differ diff --git a/public/img/__og-image/2024/michael_staib.23xujj9p.png b/public/img/__og-image/2024/michael_staib.23xujj9p.png new file mode 100644 index 0000000000..ddf5fa4c2f Binary files /dev/null and b/public/img/__og-image/2024/michael_staib.23xujj9p.png differ diff --git a/public/img/__og-image/2024/omribruchim@gmail.com.png b/public/img/__og-image/2024/omribruchim@gmail.com.png new file mode 100644 index 0000000000..0d5eee471f Binary files /dev/null and b/public/img/__og-image/2024/omribruchim@gmail.com.png differ diff --git a/public/img/__og-image/2024/pascal@chillicream.com.png b/public/img/__og-image/2024/pascal@chillicream.com.png new file mode 100644 index 0000000000..1f96916c14 Binary files /dev/null and b/public/img/__og-image/2024/pascal@chillicream.com.png differ diff --git a/public/img/__og-image/2024/pooja.mistry1.png b/public/img/__og-image/2024/pooja.mistry1.png new file mode 100644 index 0000000000..9919828253 Binary files /dev/null and b/public/img/__og-image/2024/pooja.mistry1.png differ diff --git a/public/img/__og-image/2024/qkw1221.png b/public/img/__og-image/2024/qkw1221.png new file mode 100644 index 0000000000..f9aeda026a Binary files /dev/null and b/public/img/__og-image/2024/qkw1221.png differ diff --git a/public/img/__og-image/2024/rachit_sengupta@intuit.com.png b/public/img/__og-image/2024/rachit_sengupta@intuit.com.png new file mode 100644 index 0000000000..5614c19589 Binary files /dev/null and b/public/img/__og-image/2024/rachit_sengupta@intuit.com.png differ diff --git a/public/img/__og-image/2024/rama_palaniappan@intuit.com.png b/public/img/__og-image/2024/rama_palaniappan@intuit.com.png new file mode 100644 index 0000000000..f5d017eb94 Binary files /dev/null and b/public/img/__og-image/2024/rama_palaniappan@intuit.com.png differ diff --git a/public/img/__og-image/2024/ramnivas@exograph.dev.png b/public/img/__og-image/2024/ramnivas@exograph.dev.png new file mode 100644 index 0000000000..8d5bbadd67 Binary files /dev/null and b/public/img/__og-image/2024/ramnivas@exograph.dev.png differ diff --git a/public/img/__og-image/2024/rikki.schulte@gmail.com.png b/public/img/__og-image/2024/rikki.schulte@gmail.com.png new file mode 100644 index 0000000000..af88aeced0 Binary files /dev/null and b/public/img/__og-image/2024/rikki.schulte@gmail.com.png differ diff --git a/public/img/__og-image/2024/robert.balicki.png b/public/img/__og-image/2024/robert.balicki.png new file mode 100644 index 0000000000..8c9c6dabca Binary files /dev/null and b/public/img/__og-image/2024/robert.balicki.png differ diff --git a/public/img/__og-image/2024/robrichard87@gmail.com.png b/public/img/__og-image/2024/robrichard87@gmail.com.png new file mode 100644 index 0000000000..633cf3c3da Binary files /dev/null and b/public/img/__og-image/2024/robrichard87@gmail.com.png differ diff --git a/public/img/__og-image/2024/ruben.cagnie@toasttab.com.png b/public/img/__og-image/2024/ruben.cagnie@toasttab.com.png new file mode 100644 index 0000000000..eaaccf486d Binary files /dev/null and b/public/img/__og-image/2024/ruben.cagnie@toasttab.com.png differ diff --git a/public/img/__og-image/2024/sabrina.wasserman@gmail.com.png b/public/img/__og-image/2024/sabrina.wasserman@gmail.com.png new file mode 100644 index 0000000000..bcab1f1ae3 Binary files /dev/null and b/public/img/__og-image/2024/sabrina.wasserman@gmail.com.png differ diff --git a/public/img/__og-image/2024/saihajpreet.singh@gmail.com.png b/public/img/__og-image/2024/saihajpreet.singh@gmail.com.png new file mode 100644 index 0000000000..1eec28ef16 Binary files /dev/null and b/public/img/__og-image/2024/saihajpreet.singh@gmail.com.png differ diff --git a/public/img/__og-image/2024/sasanders26@gmail.com.png b/public/img/__og-image/2024/sasanders26@gmail.com.png new file mode 100644 index 0000000000..4194d133c6 Binary files /dev/null and b/public/img/__og-image/2024/sasanders26@gmail.com.png differ diff --git a/public/img/__og-image/2024/sasha177.png b/public/img/__og-image/2024/sasha177.png new file mode 100644 index 0000000000..67666ce05c Binary files /dev/null and b/public/img/__og-image/2024/sasha177.png differ diff --git a/public/img/__og-image/2024/seiyaizumi.png b/public/img/__og-image/2024/seiyaizumi.png new file mode 100644 index 0000000000..a25c953feb Binary files /dev/null and b/public/img/__og-image/2024/seiyaizumi.png differ diff --git a/public/img/__og-image/2024/siva27.png b/public/img/__og-image/2024/siva27.png new file mode 100644 index 0000000000..a9db43663e Binary files /dev/null and b/public/img/__og-image/2024/siva27.png differ diff --git a/public/img/__og-image/2024/sspalding2.png b/public/img/__og-image/2024/sspalding2.png new file mode 100644 index 0000000000..07f7845c7d Binary files /dev/null and b/public/img/__og-image/2024/sspalding2.png differ diff --git a/public/img/__og-image/2024/stefan239.png b/public/img/__og-image/2024/stefan239.png new file mode 100644 index 0000000000..6b1f92868a Binary files /dev/null and b/public/img/__og-image/2024/stefan239.png differ diff --git a/public/img/__og-image/2024/tushar@tailcall.run.png b/public/img/__og-image/2024/tushar@tailcall.run.png new file mode 100644 index 0000000000..ea3d21bd53 Binary files /dev/null and b/public/img/__og-image/2024/tushar@tailcall.run.png differ diff --git a/public/img/__og-image/2024/tweetamar.png b/public/img/__og-image/2024/tweetamar.png new file mode 100644 index 0000000000..206995fbea Binary files /dev/null and b/public/img/__og-image/2024/tweetamar.png differ diff --git a/public/img/__og-image/2024/twitter7.png b/public/img/__og-image/2024/twitter7.png new file mode 100644 index 0000000000..b848a72d72 Binary files /dev/null and b/public/img/__og-image/2024/twitter7.png differ diff --git a/public/img/__og-image/2024/uri_goldshtein.23xujj9a.png b/public/img/__og-image/2024/uri_goldshtein.23xujj9a.png new file mode 100644 index 0000000000..435dc0dc01 Binary files /dev/null and b/public/img/__og-image/2024/uri_goldshtein.23xujj9a.png differ diff --git a/public/img/__og-image/2024/vincent@teamstarter.co.png b/public/img/__og-image/2024/vincent@teamstarter.co.png new file mode 100644 index 0000000000..b618734b57 Binary files /dev/null and b/public/img/__og-image/2024/vincent@teamstarter.co.png differ diff --git a/public/img/__og-image/2024/watson17.png b/public/img/__og-image/2024/watson17.png new file mode 100644 index 0000000000..13f376a021 Binary files /dev/null and b/public/img/__og-image/2024/watson17.png differ diff --git a/public/img/__og-image/2024/yassineldeeb94.png b/public/img/__og-image/2024/yassineldeeb94.png new file mode 100644 index 0000000000..dd6a356c08 Binary files /dev/null and b/public/img/__og-image/2024/yassineldeeb94.png differ diff --git a/public/img/ambassadors/donna-zhou.jpg b/public/img/ambassadors/donna-zhou.jpg new file mode 100644 index 0000000000..7099b287bb Binary files /dev/null and b/public/img/ambassadors/donna-zhou.jpg differ diff --git a/public/img/ambassadors/itamar-kestenbaum.jpg b/public/img/ambassadors/itamar-kestenbaum.jpg new file mode 100644 index 0000000000..33a84c2988 Binary files /dev/null and b/public/img/ambassadors/itamar-kestenbaum.jpg differ diff --git a/public/img/ambassadors/jamie-barton.jpg b/public/img/ambassadors/jamie-barton.jpg new file mode 100644 index 0000000000..45d9cc2607 Binary files /dev/null and b/public/img/ambassadors/jamie-barton.jpg differ diff --git a/public/img/ambassadors/jeff-auriemma.jpg b/public/img/ambassadors/jeff-auriemma.jpg new file mode 100644 index 0000000000..4bf99a939e Binary files /dev/null and b/public/img/ambassadors/jeff-auriemma.jpg differ diff --git a/public/img/ambassadors/sarah-sanders.jpg b/public/img/ambassadors/sarah-sanders.jpg new file mode 100644 index 0000000000..5cafe14f52 Binary files /dev/null and b/public/img/ambassadors/sarah-sanders.jpg differ diff --git a/public/img/ambassadors/warren-day.jpeg b/public/img/ambassadors/warren-day.jpeg new file mode 100644 index 0000000000..6132f972f2 Binary files /dev/null and b/public/img/ambassadors/warren-day.jpeg differ diff --git a/public/img/bg-graphql-conf.png b/public/img/bg-graphql-conf.png new file mode 100644 index 0000000000..c6bd1ea14c Binary files /dev/null and b/public/img/bg-graphql-conf.png differ diff --git a/public/img/blog/20160502-rest-api-graphql-wrapper/dataloader-query.png b/public/img/blog/20160502-rest-api-graphql-wrapper/dataloader-query.png new file mode 100644 index 0000000000..8da76bae52 Binary files /dev/null and b/public/img/blog/20160502-rest-api-graphql-wrapper/dataloader-query.png differ diff --git a/public/img/blog/20160502-rest-api-graphql-wrapper/pathological-query.png b/public/img/blog/20160502-rest-api-graphql-wrapper/pathological-query.png new file mode 100644 index 0000000000..67ca988f18 Binary files /dev/null and b/public/img/blog/20160502-rest-api-graphql-wrapper/pathological-query.png differ diff --git a/public/img/blog/20160502-rest-api-graphql-wrapper/rest-api-people.png b/public/img/blog/20160502-rest-api-graphql-wrapper/rest-api-people.png new file mode 100644 index 0000000000..ebe9cffd31 Binary files /dev/null and b/public/img/blog/20160502-rest-api-graphql-wrapper/rest-api-people.png differ diff --git a/public/img/blog/2023-08-01-key-insights-from-the-graphql-eu-gathering/banner.jpg b/public/img/blog/2023-08-01-key-insights-from-the-graphql-eu-gathering/banner.jpg new file mode 100644 index 0000000000..631a982d39 Binary files /dev/null and b/public/img/blog/2023-08-01-key-insights-from-the-graphql-eu-gathering/banner.jpg differ diff --git a/public/img/blog/2023-08-01-key-insights-from-the-graphql-eu-gathering/whiteboard.jpg b/public/img/blog/2023-08-01-key-insights-from-the-graphql-eu-gathering/whiteboard.jpg new file mode 100644 index 0000000000..9164761eb2 Binary files /dev/null and b/public/img/blog/2023-08-01-key-insights-from-the-graphql-eu-gathering/whiteboard.jpg differ diff --git a/public/img/brand/do.svg b/public/img/brand/do.svg new file mode 100644 index 0000000000..f396271e38 --- /dev/null +++ b/public/img/brand/do.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/img/brand/dont.svg b/public/img/brand/dont.svg new file mode 100644 index 0000000000..47cfde83f8 --- /dev/null +++ b/public/img/brand/dont.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/img/brand/graphql-brand-assets.zip b/public/img/brand/graphql-brand-assets.zip new file mode 100644 index 0000000000..bc4a53d8ee Binary files /dev/null and b/public/img/brand/graphql-brand-assets.zip differ diff --git a/public/img/brand/logo-dont/dont-add.svg b/public/img/brand/logo-dont/dont-add.svg new file mode 100644 index 0000000000..156fc8cd7d --- /dev/null +++ b/public/img/brand/logo-dont/dont-add.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/public/img/brand/logo-dont/dont-change-typeface.svg b/public/img/brand/logo-dont/dont-change-typeface.svg new file mode 100644 index 0000000000..ce29c568d8 --- /dev/null +++ b/public/img/brand/logo-dont/dont-change-typeface.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/public/img/brand/logo-dont/dont-color-wordmark.svg b/public/img/brand/logo-dont/dont-color-wordmark.svg new file mode 100644 index 0000000000..72a9832b1a --- /dev/null +++ b/public/img/brand/logo-dont/dont-color-wordmark.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/img/brand/logo-dont/dont-color.svg b/public/img/brand/logo-dont/dont-color.svg new file mode 100644 index 0000000000..def2a7b813 --- /dev/null +++ b/public/img/brand/logo-dont/dont-color.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/img/brand/logo-dont/dont-complex-background.jpg b/public/img/brand/logo-dont/dont-complex-background.jpg new file mode 100644 index 0000000000..57db344c50 Binary files /dev/null and b/public/img/brand/logo-dont/dont-complex-background.jpg differ diff --git a/public/img/brand/logo-dont/dont-decorate.svg b/public/img/brand/logo-dont/dont-decorate.svg new file mode 100644 index 0000000000..68e8793623 --- /dev/null +++ b/public/img/brand/logo-dont/dont-decorate.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/public/img/brand/logo-dont/dont-effect.svg b/public/img/brand/logo-dont/dont-effect.svg new file mode 100644 index 0000000000..4d87b456a5 --- /dev/null +++ b/public/img/brand/logo-dont/dont-effect.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/img/brand/logo-dont/dont-gradient.svg b/public/img/brand/logo-dont/dont-gradient.svg new file mode 100644 index 0000000000..1f7ba7cf23 --- /dev/null +++ b/public/img/brand/logo-dont/dont-gradient.svg @@ -0,0 +1,11 @@ + + + + + + + + + diff --git a/public/img/brand/logo-dont/dont-remove.svg b/public/img/brand/logo-dont/dont-remove.svg new file mode 100644 index 0000000000..9cec9791cd --- /dev/null +++ b/public/img/brand/logo-dont/dont-remove.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/public/img/brand/logo-dont/dont-resize-1.svg b/public/img/brand/logo-dont/dont-resize-1.svg new file mode 100644 index 0000000000..2e23ec4837 --- /dev/null +++ b/public/img/brand/logo-dont/dont-resize-1.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/public/img/brand/logo-dont/dont-resize-2.svg b/public/img/brand/logo-dont/dont-resize-2.svg new file mode 100644 index 0000000000..7a734c6c43 --- /dev/null +++ b/public/img/brand/logo-dont/dont-resize-2.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/public/img/brand/logo-dont/dont-resize-wordmark.svg b/public/img/brand/logo-dont/dont-resize-wordmark.svg new file mode 100644 index 0000000000..fa00a534cc --- /dev/null +++ b/public/img/brand/logo-dont/dont-resize-wordmark.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/public/img/brand/logo-dont/dont-rotate.svg b/public/img/brand/logo-dont/dont-rotate.svg new file mode 100644 index 0000000000..a60cf1e7eb --- /dev/null +++ b/public/img/brand/logo-dont/dont-rotate.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/public/img/brand/logo-dont/dont-stretch.svg b/public/img/brand/logo-dont/dont-stretch.svg new file mode 100644 index 0000000000..08c969b0dd --- /dev/null +++ b/public/img/brand/logo-dont/dont-stretch.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/public/img/brand/logos/logo-black.svg b/public/img/brand/logos/logo-black.svg new file mode 100644 index 0000000000..c66fbf3b8d --- /dev/null +++ b/public/img/brand/logos/logo-black.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/img/brand/logos/logo-foundation-stacked.svg b/public/img/brand/logos/logo-foundation-stacked.svg new file mode 100644 index 0000000000..739c279ddb --- /dev/null +++ b/public/img/brand/logos/logo-foundation-stacked.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/img/brand/logos/logo-foundation-wordmark.svg b/public/img/brand/logos/logo-foundation-wordmark.svg new file mode 100644 index 0000000000..c4aa91781c --- /dev/null +++ b/public/img/brand/logos/logo-foundation-wordmark.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/img/brand/logos/logo-space.svg b/public/img/brand/logos/logo-space.svg new file mode 100644 index 0000000000..329e59e53a --- /dev/null +++ b/public/img/brand/logos/logo-space.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/public/img/brand/logos/logo-stacked.svg b/public/img/brand/logos/logo-stacked.svg new file mode 100644 index 0000000000..1dcab45bbd --- /dev/null +++ b/public/img/brand/logos/logo-stacked.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/img/brand/logos/logo-white.svg b/public/img/brand/logos/logo-white.svg new file mode 100644 index 0000000000..dde596a42f --- /dev/null +++ b/public/img/brand/logos/logo-white.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/img/brand/logos/logo-wordmark-space.svg b/public/img/brand/logos/logo-wordmark-space.svg new file mode 100644 index 0000000000..32249c7782 --- /dev/null +++ b/public/img/brand/logos/logo-wordmark-space.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/public/img/brand/logos/logo-wordmark.svg b/public/img/brand/logos/logo-wordmark.svg new file mode 100644 index 0000000000..ba95925aec --- /dev/null +++ b/public/img/brand/logos/logo-wordmark.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/img/brand/logos/logo.svg b/public/img/brand/logos/logo.svg new file mode 100644 index 0000000000..cbf9d25cbe --- /dev/null +++ b/public/img/brand/logos/logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/img/conf/Partners/AmsterdamGraphQL.svg b/public/img/conf/Partners/AmsterdamGraphQL.svg new file mode 100644 index 0000000000..e88562589c --- /dev/null +++ b/public/img/conf/Partners/AmsterdamGraphQL.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/public/img/conf/Partners/BangkokGraphQL.svg b/public/img/conf/Partners/BangkokGraphQL.svg new file mode 100644 index 0000000000..3e0c609b6b --- /dev/null +++ b/public/img/conf/Partners/BangkokGraphQL.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/public/img/conf/Partners/EscapeTechnologies.svg b/public/img/conf/Partners/EscapeTechnologies.svg new file mode 100644 index 0000000000..ee342f9a6c --- /dev/null +++ b/public/img/conf/Partners/EscapeTechnologies.svg @@ -0,0 +1,12 @@ + + + + + + diff --git a/public/img/conf/Partners/GraphQLWeekly.svg b/public/img/conf/Partners/GraphQLWeekly.svg new file mode 100644 index 0000000000..fcfbbb6b30 --- /dev/null +++ b/public/img/conf/Partners/GraphQLWeekly.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/img/conf/Partners/GraphQLwtf.svg b/public/img/conf/Partners/GraphQLwtf.svg new file mode 100644 index 0000000000..cb66ef281d --- /dev/null +++ b/public/img/conf/Partners/GraphQLwtf.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/img/conf/Partners/TypeGraphQL.svg b/public/img/conf/Partners/TypeGraphQL.svg new file mode 100644 index 0000000000..8bcc5b659d --- /dev/null +++ b/public/img/conf/Partners/TypeGraphQL.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/public/img/conf/Sponsors/Apollo.svg b/public/img/conf/Sponsors/Apollo.svg new file mode 100644 index 0000000000..61da635407 --- /dev/null +++ b/public/img/conf/Sponsors/Apollo.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/public/img/conf/Sponsors/Grafbase.svg b/public/img/conf/Sponsors/Grafbase.svg new file mode 100644 index 0000000000..2b99439008 --- /dev/null +++ b/public/img/conf/Sponsors/Grafbase.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/img/conf/Sponsors/Graphabase.svg b/public/img/conf/Sponsors/Graphabase.svg new file mode 100644 index 0000000000..fabc6a552d --- /dev/null +++ b/public/img/conf/Sponsors/Graphabase.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/public/img/conf/Sponsors/Graphweaver.svg b/public/img/conf/Sponsors/Graphweaver.svg new file mode 100644 index 0000000000..084dd8bf38 --- /dev/null +++ b/public/img/conf/Sponsors/Graphweaver.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/img/conf/Sponsors/Hasura.svg b/public/img/conf/Sponsors/Hasura.svg new file mode 100644 index 0000000000..2357c2a537 --- /dev/null +++ b/public/img/conf/Sponsors/Hasura.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/img/conf/Sponsors/Hygraph.svg b/public/img/conf/Sponsors/Hygraph.svg new file mode 100644 index 0000000000..88d397b1d3 --- /dev/null +++ b/public/img/conf/Sponsors/Hygraph.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/public/img/conf/Sponsors/IBM.svg b/public/img/conf/Sponsors/IBM.svg new file mode 100644 index 0000000000..55abf2df9f --- /dev/null +++ b/public/img/conf/Sponsors/IBM.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/img/conf/Sponsors/Inigo.svg b/public/img/conf/Sponsors/Inigo.svg new file mode 100644 index 0000000000..06e7e416e1 --- /dev/null +++ b/public/img/conf/Sponsors/Inigo.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/img/conf/Sponsors/Intuit.svg b/public/img/conf/Sponsors/Intuit.svg new file mode 100644 index 0000000000..a47c4a1736 --- /dev/null +++ b/public/img/conf/Sponsors/Intuit.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/public/img/conf/Sponsors/Meta-dark.svg b/public/img/conf/Sponsors/Meta-dark.svg new file mode 100644 index 0000000000..f43af5931d --- /dev/null +++ b/public/img/conf/Sponsors/Meta-dark.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/img/conf/Sponsors/Meta.svg b/public/img/conf/Sponsors/Meta.svg new file mode 100644 index 0000000000..78448c3b56 --- /dev/null +++ b/public/img/conf/Sponsors/Meta.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/img/conf/Sponsors/Neo4j.svg b/public/img/conf/Sponsors/Neo4j.svg new file mode 100644 index 0000000000..85420437ec --- /dev/null +++ b/public/img/conf/Sponsors/Neo4j.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/img/conf/Sponsors/Netflix.svg b/public/img/conf/Sponsors/Netflix.svg new file mode 100644 index 0000000000..483d2ef6c9 --- /dev/null +++ b/public/img/conf/Sponsors/Netflix.svg @@ -0,0 +1 @@ +Netflix-01.svg \ No newline at end of file diff --git a/public/img/conf/Sponsors/Postman.svg b/public/img/conf/Sponsors/Postman.svg new file mode 100644 index 0000000000..aaa4d2964b --- /dev/null +++ b/public/img/conf/Sponsors/Postman.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/public/img/conf/Sponsors/Solo.svg b/public/img/conf/Sponsors/Solo.svg new file mode 100644 index 0000000000..37badbabd5 --- /dev/null +++ b/public/img/conf/Sponsors/Solo.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/img/conf/Sponsors/Stellate.svg b/public/img/conf/Sponsors/Stellate.svg new file mode 100644 index 0000000000..040dcb6d2d --- /dev/null +++ b/public/img/conf/Sponsors/Stellate.svg @@ -0,0 +1,10 @@ + + + + + diff --git a/public/img/conf/Sponsors/StepZen.svg b/public/img/conf/Sponsors/StepZen.svg new file mode 100644 index 0000000000..f395f6bd69 --- /dev/null +++ b/public/img/conf/Sponsors/StepZen.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/public/img/conf/Sponsors/TheGraph.svg b/public/img/conf/Sponsors/TheGraph.svg new file mode 100644 index 0000000000..ebf5cdb90c --- /dev/null +++ b/public/img/conf/Sponsors/TheGraph.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/public/img/conf/Sponsors/TheGuild.svg b/public/img/conf/Sponsors/TheGuild.svg new file mode 100644 index 0000000000..92a2f76bca --- /dev/null +++ b/public/img/conf/Sponsors/TheGuild.svg @@ -0,0 +1,8 @@ + + + + diff --git a/public/img/conf/Sponsors/Tyk.svg b/public/img/conf/Sponsors/Tyk.svg new file mode 100644 index 0000000000..06fa8b1397 --- /dev/null +++ b/public/img/conf/Sponsors/Tyk.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/public/img/conf/Sponsors/WunderGraph.svg b/public/img/conf/Sponsors/WunderGraph.svg new file mode 100644 index 0000000000..97a67f5b9b --- /dev/null +++ b/public/img/conf/Sponsors/WunderGraph.svg @@ -0,0 +1,151 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/img/conf/conf-bg.png b/public/img/conf/conf-bg.png new file mode 100644 index 0000000000..11733a1486 Binary files /dev/null and b/public/img/conf/conf-bg.png differ diff --git a/public/img/conf/golden-gate-bridge.png b/public/img/conf/golden-gate-bridge.png new file mode 100644 index 0000000000..52ee65aa7b Binary files /dev/null and b/public/img/conf/golden-gate-bridge.png differ diff --git a/public/img/conf/graphql-conf-bg.png b/public/img/conf/graphql-conf-bg.png new file mode 100644 index 0000000000..df7e58c44b Binary files /dev/null and b/public/img/conf/graphql-conf-bg.png differ diff --git a/public/img/conf/graphql-conf-footer.png b/public/img/conf/graphql-conf-footer.png new file mode 100644 index 0000000000..84492ad1c8 Binary files /dev/null and b/public/img/conf/graphql-conf-footer.png differ diff --git a/public/img/conf/graphql-conf-header.svg b/public/img/conf/graphql-conf-header.svg new file mode 100644 index 0000000000..5d60eb3ed6 --- /dev/null +++ b/public/img/conf/graphql-conf-header.svg @@ -0,0 +1,414 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/img/conf/graphql-conf-logo-simple.svg b/public/img/conf/graphql-conf-logo-simple.svg new file mode 100644 index 0000000000..33ef6ed204 --- /dev/null +++ b/public/img/conf/graphql-conf-logo-simple.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/public/img/conf/graphql-conf-logo.svg b/public/img/conf/graphql-conf-logo.svg new file mode 100644 index 0000000000..d897871672 --- /dev/null +++ b/public/img/conf/graphql-conf-logo.svg @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/img/conf/logo-color.png b/public/img/conf/logo-color.png new file mode 100644 index 0000000000..fc9f5112cd Binary files /dev/null and b/public/img/conf/logo-color.png differ diff --git a/public/img/conf/social-pk.jpg b/public/img/conf/social-pk.jpg new file mode 100644 index 0000000000..741ac47a93 Binary files /dev/null and b/public/img/conf/social-pk.jpg differ diff --git a/public/img/conf/speakers/idit.jpg b/public/img/conf/speakers/idit.jpg new file mode 100644 index 0000000000..d5c17db950 Binary files /dev/null and b/public/img/conf/speakers/idit.jpg differ diff --git a/public/img/conf/speakers/leebyron.jpg b/public/img/conf/speakers/leebyron.jpg new file mode 100644 index 0000000000..3377fd7ee3 Binary files /dev/null and b/public/img/conf/speakers/leebyron.jpg differ diff --git a/public/img/conf/speakers/marcandre.jpg b/public/img/conf/speakers/marcandre.jpg new file mode 100644 index 0000000000..93bbcbd723 Binary files /dev/null and b/public/img/conf/speakers/marcandre.jpg differ diff --git a/public/img/conf/speakers/uri.jpg b/public/img/conf/speakers/uri.jpg new file mode 100644 index 0000000000..8965ee3d1f Binary files /dev/null and b/public/img/conf/speakers/uri.jpg differ diff --git a/public/img/diagrams/business_layer.png b/public/img/diagrams/business_layer.png new file mode 100644 index 0000000000..87470e271c Binary files /dev/null and b/public/img/diagrams/business_layer.png differ diff --git a/public/img/downarrow.svg b/public/img/downarrow.svg new file mode 100644 index 0000000000..66d1586245 --- /dev/null +++ b/public/img/downarrow.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/img/edit.svg b/public/img/edit.svg new file mode 100644 index 0000000000..73f71098d5 --- /dev/null +++ b/public/img/edit.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/img/graphiql-dark.mp4 b/public/img/graphiql-dark.mp4 new file mode 100644 index 0000000000..63ad151c26 Binary files /dev/null and b/public/img/graphiql-dark.mp4 differ diff --git a/public/img/graphiql-light.mp4 b/public/img/graphiql-light.mp4 new file mode 100644 index 0000000000..861125bc4f Binary files /dev/null and b/public/img/graphiql-light.mp4 differ diff --git a/site/img/graphiql.mp4 b/public/img/graphiql.mp4 similarity index 100% rename from site/img/graphiql.mp4 rename to public/img/graphiql.mp4 diff --git a/public/img/graphql-conf-logo.svg b/public/img/graphql-conf-logo.svg new file mode 100644 index 0000000000..0fb776ca75 --- /dev/null +++ b/public/img/graphql-conf-logo.svg @@ -0,0 +1,19 @@ + + GraphQLCon-2023__400x425_Event Logo White.svg + + + + + + + + + + + + diff --git a/public/img/graphql_conf-details-white.svg b/public/img/graphql_conf-details-white.svg new file mode 100644 index 0000000000..ba59ed770a --- /dev/null +++ b/public/img/graphql_conf-details-white.svg @@ -0,0 +1,223 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/img/graphql_conf-details.svg b/public/img/graphql_conf-details.svg new file mode 100644 index 0000000000..5dc175f061 --- /dev/null +++ b/public/img/graphql_conf-details.svg @@ -0,0 +1,210 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/img/graphql_foundation-hero.jpg b/public/img/graphql_foundation-hero.jpg new file mode 100644 index 0000000000..b9ecc462fe Binary files /dev/null and b/public/img/graphql_foundation-hero.jpg differ diff --git a/public/img/graphql_foundation-logo-white.svg b/public/img/graphql_foundation-logo-white.svg new file mode 100644 index 0000000000..1f58e2cfba --- /dev/null +++ b/public/img/graphql_foundation-logo-white.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/img/logo-gray.svg b/public/img/logo-gray.svg new file mode 100644 index 0000000000..b0d1234306 --- /dev/null +++ b/public/img/logo-gray.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/img/logo.svg b/public/img/logo.svg new file mode 100644 index 0000000000..cbf9d25cbe --- /dev/null +++ b/public/img/logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/img/logos/discord.svg b/public/img/logos/discord.svg new file mode 100644 index 0000000000..99b89c3379 --- /dev/null +++ b/public/img/logos/discord.svg @@ -0,0 +1,10 @@ + + Discord + + diff --git a/public/img/logos/facebook.svg b/public/img/logos/facebook.svg new file mode 100644 index 0000000000..d3ac4aeae7 --- /dev/null +++ b/public/img/logos/facebook.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + diff --git a/public/img/logos/github.svg b/public/img/logos/github.svg new file mode 100644 index 0000000000..29e6680d00 --- /dev/null +++ b/public/img/logos/github.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/img/logos/gsoc.svg b/public/img/logos/gsoc.svg new file mode 100644 index 0000000000..d8bc8cd4e8 --- /dev/null +++ b/public/img/logos/gsoc.svg @@ -0,0 +1,41 @@ + + + + logo_lockup_summer_of_code_horizontal_Roboto + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/img/logos/instagram.svg b/public/img/logos/instagram.svg new file mode 100644 index 0000000000..d37922b6f7 --- /dev/null +++ b/public/img/logos/instagram.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/img/logos/linkedin.svg b/public/img/logos/linkedin.svg new file mode 100644 index 0000000000..ca3e9675a9 --- /dev/null +++ b/public/img/logos/linkedin.svg @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/public/img/logos/snapchat.svg b/public/img/logos/snapchat.svg new file mode 100644 index 0000000000..a4684fb072 --- /dev/null +++ b/public/img/logos/snapchat.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/img/logos/stackoverflow.svg b/public/img/logos/stackoverflow.svg new file mode 100644 index 0000000000..3e88022c25 --- /dev/null +++ b/public/img/logos/stackoverflow.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/img/logos/twitter.svg b/public/img/logos/twitter.svg new file mode 100644 index 0000000000..a7c65805b2 --- /dev/null +++ b/public/img/logos/twitter.svg @@ -0,0 +1,3 @@ + diff --git a/public/img/menu-white.svg b/public/img/menu-white.svg new file mode 100644 index 0000000000..38f2f03a09 --- /dev/null +++ b/public/img/menu-white.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/img/menu.svg b/public/img/menu.svg new file mode 100644 index 0000000000..b23e0a3c49 --- /dev/null +++ b/public/img/menu.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/img/news/annual-report-1.png b/public/img/news/annual-report-1.png new file mode 100644 index 0000000000..2acb7e540b Binary files /dev/null and b/public/img/news/annual-report-1.png differ diff --git a/public/img/news/annual-report-2.png b/public/img/news/annual-report-2.png new file mode 100644 index 0000000000..8cc7554213 Binary files /dev/null and b/public/img/news/annual-report-2.png differ diff --git a/public/img/news/annual-report-3.png b/public/img/news/annual-report-3.png new file mode 100644 index 0000000000..6600d67828 Binary files /dev/null and b/public/img/news/annual-report-3.png differ diff --git a/public/img/news/annual-report-4.png b/public/img/news/annual-report-4.png new file mode 100644 index 0000000000..ed6e80dee7 Binary files /dev/null and b/public/img/news/annual-report-4.png differ diff --git a/public/img/news/graphiql-parser.png b/public/img/news/graphiql-parser.png new file mode 100644 index 0000000000..44be5b6d25 Binary files /dev/null and b/public/img/news/graphiql-parser.png differ diff --git a/public/img/news/playground-transition-banner.png b/public/img/news/playground-transition-banner.png new file mode 100644 index 0000000000..e5258341f2 Binary files /dev/null and b/public/img/news/playground-transition-banner.png differ diff --git a/public/img/og-graphql-conf-2024.jpeg b/public/img/og-graphql-conf-2024.jpeg new file mode 100644 index 0000000000..ad2dff2c58 Binary files /dev/null and b/public/img/og-graphql-conf-2024.jpeg differ diff --git a/public/img/og-image.png b/public/img/og-image.png new file mode 100644 index 0000000000..466376270b Binary files /dev/null and b/public/img/og-image.png differ diff --git a/public/img/og-logo.png b/public/img/og-logo.png new file mode 100644 index 0000000000..d64cc1b319 Binary files /dev/null and b/public/img/og-logo.png differ diff --git a/public/img/phone.svg b/public/img/phone.svg new file mode 100644 index 0000000000..194c827b44 --- /dev/null +++ b/public/img/phone.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/img/report/amazon-web-services.svg b/public/img/report/amazon-web-services.svg new file mode 100644 index 0000000000..4760c9b813 --- /dev/null +++ b/public/img/report/amazon-web-services.svg @@ -0,0 +1 @@ +Amazon Web Services logo \ No newline at end of file diff --git a/public/img/report/apollo-graphql.svg b/public/img/report/apollo-graphql.svg new file mode 100644 index 0000000000..3ba8f37b61 --- /dev/null +++ b/public/img/report/apollo-graphql.svg @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/img/report/expedia-group.svg b/public/img/report/expedia-group.svg new file mode 100644 index 0000000000..aa42b07ba8 --- /dev/null +++ b/public/img/report/expedia-group.svg @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + diff --git a/public/img/report/facebook.svg b/public/img/report/facebook.svg new file mode 100644 index 0000000000..8bed232831 --- /dev/null +++ b/public/img/report/facebook.svg @@ -0,0 +1 @@ +facebook \ No newline at end of file diff --git a/public/img/report/hasura.svg b/public/img/report/hasura.svg new file mode 100644 index 0000000000..c17349e8cf --- /dev/null +++ b/public/img/report/hasura.svg @@ -0,0 +1 @@ +Hasura Technologies (member) logo \ No newline at end of file diff --git a/public/img/report/ibm.svg b/public/img/report/ibm.svg new file mode 100644 index 0000000000..08bbfc7a58 --- /dev/null +++ b/public/img/report/ibm.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/img/report/novvum.svg b/public/img/report/novvum.svg new file mode 100644 index 0000000000..f92e564e5c --- /dev/null +++ b/public/img/report/novvum.svg @@ -0,0 +1,15 @@ + + + + Novvum SQUARED + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/public/img/report/paypal.svg b/public/img/report/paypal.svg new file mode 100644 index 0000000000..150f7badbc --- /dev/null +++ b/public/img/report/paypal.svg @@ -0,0 +1,39 @@ + +image/svg+xml \ No newline at end of file diff --git a/public/img/report/salsify.svg b/public/img/report/salsify.svg new file mode 100644 index 0000000000..b52588935f --- /dev/null +++ b/public/img/report/salsify.svg @@ -0,0 +1,669 @@ + +image/svg+xml \ No newline at end of file diff --git a/public/img/search.png b/public/img/search.png new file mode 100644 index 0000000000..1701b1acb3 Binary files /dev/null and b/public/img/search.png differ diff --git a/public/img/search.svg b/public/img/search.svg new file mode 100644 index 0000000000..3eb4c178c5 --- /dev/null +++ b/public/img/search.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/img/server.svg b/public/img/server.svg new file mode 100644 index 0000000000..8c305d15bf --- /dev/null +++ b/public/img/server.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/users/logos/1stdibs.png b/public/users/logos/1stdibs.png new file mode 100644 index 0000000000..fd8b9a8119 Binary files /dev/null and b/public/users/logos/1stdibs.png differ diff --git a/public/users/logos/20minutes.png b/public/users/logos/20minutes.png new file mode 100644 index 0000000000..88d22b9f7d Binary files /dev/null and b/public/users/logos/20minutes.png differ diff --git a/public/users/logos/adayroi.png b/public/users/logos/adayroi.png new file mode 100644 index 0000000000..39ab693ba4 Binary files /dev/null and b/public/users/logos/adayroi.png differ diff --git a/public/users/logos/airbnb.png b/public/users/logos/airbnb.png new file mode 100644 index 0000000000..1ad1f2672a Binary files /dev/null and b/public/users/logos/airbnb.png differ diff --git a/public/users/logos/alembic.png b/public/users/logos/alembic.png new file mode 100644 index 0000000000..4a4de76564 Binary files /dev/null and b/public/users/logos/alembic.png differ diff --git a/public/users/logos/allocine.png b/public/users/logos/allocine.png new file mode 100644 index 0000000000..fb0f927aed Binary files /dev/null and b/public/users/logos/allocine.png differ diff --git a/public/users/logos/alphasights.png b/public/users/logos/alphasights.png new file mode 100644 index 0000000000..17fa070c46 Binary files /dev/null and b/public/users/logos/alphasights.png differ diff --git a/site/users/logos/amplitude.png b/public/users/logos/amplitude.png similarity index 100% rename from site/users/logos/amplitude.png rename to public/users/logos/amplitude.png diff --git a/public/users/logos/ants.png b/public/users/logos/ants.png new file mode 100644 index 0000000000..0c3f948671 Binary files /dev/null and b/public/users/logos/ants.png differ diff --git a/public/users/logos/appier.png b/public/users/logos/appier.png new file mode 100644 index 0000000000..7716581171 Binary files /dev/null and b/public/users/logos/appier.png differ diff --git a/public/users/logos/arangodb.png b/public/users/logos/arangodb.png new file mode 100644 index 0000000000..00934e72b5 Binary files /dev/null and b/public/users/logos/arangodb.png differ diff --git a/public/users/logos/artsy.png b/public/users/logos/artsy.png new file mode 100644 index 0000000000..9f8597702f Binary files /dev/null and b/public/users/logos/artsy.png differ diff --git a/public/users/logos/atlassian.png b/public/users/logos/atlassian.png new file mode 100644 index 0000000000..e83a4bff3d Binary files /dev/null and b/public/users/logos/atlassian.png differ diff --git a/public/users/logos/attendify.png b/public/users/logos/attendify.png new file mode 100644 index 0000000000..fe86e546ac Binary files /dev/null and b/public/users/logos/attendify.png differ diff --git a/public/users/logos/bazinga.png b/public/users/logos/bazinga.png new file mode 100644 index 0000000000..870c3a6654 Binary files /dev/null and b/public/users/logos/bazinga.png differ diff --git a/public/users/logos/blenderbottle.png b/public/users/logos/blenderbottle.png new file mode 100644 index 0000000000..485687b87e Binary files /dev/null and b/public/users/logos/blenderbottle.png differ diff --git a/public/users/logos/brewerybuddy.png b/public/users/logos/brewerybuddy.png new file mode 100644 index 0000000000..3b58610a4a Binary files /dev/null and b/public/users/logos/brewerybuddy.png differ diff --git a/public/users/logos/bright.png b/public/users/logos/bright.png new file mode 100644 index 0000000000..c19d918a35 Binary files /dev/null and b/public/users/logos/bright.png differ diff --git a/public/users/logos/buildkite.png b/public/users/logos/buildkite.png new file mode 100644 index 0000000000..d38d6dd2b1 Binary files /dev/null and b/public/users/logos/buildkite.png differ diff --git a/public/users/logos/bynder.png b/public/users/logos/bynder.png new file mode 100644 index 0000000000..90c240ac3f Binary files /dev/null and b/public/users/logos/bynder.png differ diff --git a/public/users/logos/cheddar.png b/public/users/logos/cheddar.png new file mode 100644 index 0000000000..5a8efe2fa2 Binary files /dev/null and b/public/users/logos/cheddar.png differ diff --git a/public/users/logos/circlehd.png b/public/users/logos/circlehd.png new file mode 100644 index 0000000000..9976dbc96a Binary files /dev/null and b/public/users/logos/circlehd.png differ diff --git a/public/users/logos/cloverleaf.png b/public/users/logos/cloverleaf.png new file mode 100644 index 0000000000..82b73ba55c Binary files /dev/null and b/public/users/logos/cloverleaf.png differ diff --git a/site/users/logos/clubmed.png b/public/users/logos/clubmed.png similarity index 100% rename from site/users/logos/clubmed.png rename to public/users/logos/clubmed.png diff --git a/public/users/logos/colectica.png b/public/users/logos/colectica.png new file mode 100644 index 0000000000..ca19452994 Binary files /dev/null and b/public/users/logos/colectica.png differ diff --git a/public/users/logos/commercetools.png b/public/users/logos/commercetools.png new file mode 100644 index 0000000000..d5020ee3e3 Binary files /dev/null and b/public/users/logos/commercetools.png differ diff --git a/public/users/logos/comparaonline.png b/public/users/logos/comparaonline.png new file mode 100644 index 0000000000..e866eb1d4e Binary files /dev/null and b/public/users/logos/comparaonline.png differ diff --git a/public/users/logos/conduit.png b/public/users/logos/conduit.png new file mode 100644 index 0000000000..38d2bf4284 Binary files /dev/null and b/public/users/logos/conduit.png differ diff --git a/public/users/logos/coursera.png b/public/users/logos/coursera.png new file mode 100644 index 0000000000..056f8d9252 Binary files /dev/null and b/public/users/logos/coursera.png differ diff --git a/public/users/logos/creditkarma.png b/public/users/logos/creditkarma.png new file mode 100644 index 0000000000..0c45e8a983 Binary files /dev/null and b/public/users/logos/creditkarma.png differ diff --git a/public/users/logos/curio.png b/public/users/logos/curio.png new file mode 100644 index 0000000000..d68e7a9f6a Binary files /dev/null and b/public/users/logos/curio.png differ diff --git a/public/users/logos/dailymotion.png b/public/users/logos/dailymotion.png new file mode 100644 index 0000000000..97fd2745ec Binary files /dev/null and b/public/users/logos/dailymotion.png differ diff --git a/public/users/logos/digitransit.png b/public/users/logos/digitransit.png new file mode 100644 index 0000000000..bb9d338f77 Binary files /dev/null and b/public/users/logos/digitransit.png differ diff --git a/public/users/logos/directlyrics.png b/public/users/logos/directlyrics.png new file mode 100644 index 0000000000..77f56af00e Binary files /dev/null and b/public/users/logos/directlyrics.png differ diff --git a/public/users/logos/drift.png b/public/users/logos/drift.png new file mode 100644 index 0000000000..4283b6bc40 Binary files /dev/null and b/public/users/logos/drift.png differ diff --git a/public/users/logos/duedil.png b/public/users/logos/duedil.png new file mode 100644 index 0000000000..9154b9a76c Binary files /dev/null and b/public/users/logos/duedil.png differ diff --git a/public/users/logos/eastview.png b/public/users/logos/eastview.png new file mode 100644 index 0000000000..5241bfd920 Binary files /dev/null and b/public/users/logos/eastview.png differ diff --git a/public/users/logos/easycarros.png b/public/users/logos/easycarros.png new file mode 100644 index 0000000000..0d963e5120 Binary files /dev/null and b/public/users/logos/easycarros.png differ diff --git a/public/users/logos/ediket.png b/public/users/logos/ediket.png new file mode 100644 index 0000000000..1abfa48105 Binary files /dev/null and b/public/users/logos/ediket.png differ diff --git a/public/users/logos/etmdb.png b/public/users/logos/etmdb.png new file mode 100644 index 0000000000..f2beadce9d Binary files /dev/null and b/public/users/logos/etmdb.png differ diff --git a/public/users/logos/expert360.png b/public/users/logos/expert360.png new file mode 100644 index 0000000000..bd976f6de5 Binary files /dev/null and b/public/users/logos/expert360.png differ diff --git a/public/users/logos/facebook.png b/public/users/logos/facebook.png new file mode 100644 index 0000000000..fc9906b062 Binary files /dev/null and b/public/users/logos/facebook.png differ diff --git a/public/users/logos/fairfaxmedia.png b/public/users/logos/fairfaxmedia.png new file mode 100644 index 0000000000..4fd8ed02ce Binary files /dev/null and b/public/users/logos/fairfaxmedia.png differ diff --git a/public/users/logos/filejet.png b/public/users/logos/filejet.png new file mode 100644 index 0000000000..b6e9a8e3cb Binary files /dev/null and b/public/users/logos/filejet.png differ diff --git a/public/users/logos/gentux.png b/public/users/logos/gentux.png new file mode 100644 index 0000000000..3ea9ec943b Binary files /dev/null and b/public/users/logos/gentux.png differ diff --git a/site/users/logos/getninjas.png b/public/users/logos/getninjas.png similarity index 100% rename from site/users/logos/getninjas.png rename to public/users/logos/getninjas.png diff --git a/public/users/logos/github.png b/public/users/logos/github.png new file mode 100644 index 0000000000..a118935cc1 Binary files /dev/null and b/public/users/logos/github.png differ diff --git a/public/users/logos/goalify.png b/public/users/logos/goalify.png new file mode 100644 index 0000000000..1171922c45 Binary files /dev/null and b/public/users/logos/goalify.png differ diff --git a/public/users/logos/graphcms.png b/public/users/logos/graphcms.png new file mode 100644 index 0000000000..ce378c5253 Binary files /dev/null and b/public/users/logos/graphcms.png differ diff --git a/public/users/logos/graphcool.png b/public/users/logos/graphcool.png new file mode 100644 index 0000000000..fc63f6bc85 Binary files /dev/null and b/public/users/logos/graphcool.png differ diff --git a/public/users/logos/hackages.png b/public/users/logos/hackages.png new file mode 100644 index 0000000000..7827a0d7f8 Binary files /dev/null and b/public/users/logos/hackages.png differ diff --git a/public/users/logos/hasura.png b/public/users/logos/hasura.png new file mode 100644 index 0000000000..ecef5aa62d Binary files /dev/null and b/public/users/logos/hasura.png differ diff --git a/public/users/logos/hijup.png b/public/users/logos/hijup.png new file mode 100644 index 0000000000..6a83973874 Binary files /dev/null and b/public/users/logos/hijup.png differ diff --git a/public/users/logos/housinganywhere.png b/public/users/logos/housinganywhere.png new file mode 100644 index 0000000000..d885e8cb15 Binary files /dev/null and b/public/users/logos/housinganywhere.png differ diff --git a/public/users/logos/hsl.png b/public/users/logos/hsl.png new file mode 100644 index 0000000000..08e970f09a Binary files /dev/null and b/public/users/logos/hsl.png differ diff --git a/public/users/logos/hudl.png b/public/users/logos/hudl.png new file mode 100644 index 0000000000..f3d1b8f4b1 Binary files /dev/null and b/public/users/logos/hudl.png differ diff --git a/public/users/logos/icon-systems.png b/public/users/logos/icon-systems.png new file mode 100644 index 0000000000..f13d5b65bf Binary files /dev/null and b/public/users/logos/icon-systems.png differ diff --git a/public/users/logos/idobata.png b/public/users/logos/idobata.png new file mode 100644 index 0000000000..2b82bf45db Binary files /dev/null and b/public/users/logos/idobata.png differ diff --git a/public/users/logos/indonesiax.png b/public/users/logos/indonesiax.png new file mode 100644 index 0000000000..6bc8e3de14 Binary files /dev/null and b/public/users/logos/indonesiax.png differ diff --git a/public/users/logos/inerva.png b/public/users/logos/inerva.png new file mode 100644 index 0000000000..b67ef4820c Binary files /dev/null and b/public/users/logos/inerva.png differ diff --git a/public/users/logos/intuit.png b/public/users/logos/intuit.png new file mode 100644 index 0000000000..b1cfa115d9 Binary files /dev/null and b/public/users/logos/intuit.png differ diff --git a/public/users/logos/jusbrasil.png b/public/users/logos/jusbrasil.png new file mode 100644 index 0000000000..de410a9e20 Binary files /dev/null and b/public/users/logos/jusbrasil.png differ diff --git a/public/users/logos/klm.png b/public/users/logos/klm.png new file mode 100644 index 0000000000..cf10edcad5 Binary files /dev/null and b/public/users/logos/klm.png differ diff --git a/public/users/logos/leanix.png b/public/users/logos/leanix.png new file mode 100644 index 0000000000..132289835e Binary files /dev/null and b/public/users/logos/leanix.png differ diff --git a/public/users/logos/legendsoflearning.png b/public/users/logos/legendsoflearning.png new file mode 100644 index 0000000000..eb9fa1ad57 Binary files /dev/null and b/public/users/logos/legendsoflearning.png differ diff --git a/public/users/logos/lelivrescolaire.png b/public/users/logos/lelivrescolaire.png new file mode 100644 index 0000000000..d7ee53ac2b Binary files /dev/null and b/public/users/logos/lelivrescolaire.png differ diff --git a/public/users/logos/letsevents.png b/public/users/logos/letsevents.png new file mode 100644 index 0000000000..197980ed90 Binary files /dev/null and b/public/users/logos/letsevents.png differ diff --git a/public/users/logos/loggi.png b/public/users/logos/loggi.png new file mode 100644 index 0000000000..f782f604d0 Binary files /dev/null and b/public/users/logos/loggi.png differ diff --git a/public/users/logos/m1finance.png b/public/users/logos/m1finance.png new file mode 100644 index 0000000000..667d5de5dd Binary files /dev/null and b/public/users/logos/m1finance.png differ diff --git a/public/users/logos/make-school.png b/public/users/logos/make-school.png new file mode 100644 index 0000000000..5d92bee84e Binary files /dev/null and b/public/users/logos/make-school.png differ diff --git a/public/users/logos/medallia.png b/public/users/logos/medallia.png new file mode 100644 index 0000000000..d476f41b97 Binary files /dev/null and b/public/users/logos/medallia.png differ diff --git a/public/users/logos/meteor.png b/public/users/logos/meteor.png new file mode 100644 index 0000000000..08a5d70843 Binary files /dev/null and b/public/users/logos/meteor.png differ diff --git a/public/users/logos/metric-ai.png b/public/users/logos/metric-ai.png new file mode 100644 index 0000000000..6fabe07e3e Binary files /dev/null and b/public/users/logos/metric-ai.png differ diff --git a/public/users/logos/mixcloud.png b/public/users/logos/mixcloud.png new file mode 100644 index 0000000000..afe0cb9b9f Binary files /dev/null and b/public/users/logos/mixcloud.png differ diff --git a/public/users/logos/mojilala.png b/public/users/logos/mojilala.png new file mode 100644 index 0000000000..0a5c6e746a Binary files /dev/null and b/public/users/logos/mojilala.png differ diff --git a/public/users/logos/myheritage.png b/public/users/logos/myheritage.png new file mode 100644 index 0000000000..b68d1546f8 Binary files /dev/null and b/public/users/logos/myheritage.png differ diff --git a/public/users/logos/myntra.png b/public/users/logos/myntra.png new file mode 100644 index 0000000000..756bac1254 Binary files /dev/null and b/public/users/logos/myntra.png differ diff --git a/public/users/logos/nbc-news-digital.png b/public/users/logos/nbc-news-digital.png new file mode 100644 index 0000000000..6b42b5d4d1 Binary files /dev/null and b/public/users/logos/nbc-news-digital.png differ diff --git a/public/users/logos/neo4j_logo.png b/public/users/logos/neo4j_logo.png new file mode 100644 index 0000000000..6389fe0964 Binary files /dev/null and b/public/users/logos/neo4j_logo.png differ diff --git a/public/users/logos/newspring.png b/public/users/logos/newspring.png new file mode 100644 index 0000000000..d872e21d98 Binary files /dev/null and b/public/users/logos/newspring.png differ diff --git a/public/users/logos/ningensoft.png b/public/users/logos/ningensoft.png new file mode 100644 index 0000000000..9a98274254 Binary files /dev/null and b/public/users/logos/ningensoft.png differ diff --git a/public/users/logos/nova-ideo.png b/public/users/logos/nova-ideo.png new file mode 100644 index 0000000000..c8506e92d9 Binary files /dev/null and b/public/users/logos/nova-ideo.png differ diff --git a/public/users/logos/nyt.png b/public/users/logos/nyt.png new file mode 100644 index 0000000000..fa109d199f Binary files /dev/null and b/public/users/logos/nyt.png differ diff --git a/public/users/logos/okgrow.png b/public/users/logos/okgrow.png new file mode 100644 index 0000000000..33c8862533 Binary files /dev/null and b/public/users/logos/okgrow.png differ diff --git a/public/users/logos/ovos.png b/public/users/logos/ovos.png new file mode 100644 index 0000000000..da946937b3 Binary files /dev/null and b/public/users/logos/ovos.png differ diff --git a/public/users/logos/paypal.png b/public/users/logos/paypal.png new file mode 100644 index 0000000000..69ef56acc8 Binary files /dev/null and b/public/users/logos/paypal.png differ diff --git a/public/users/logos/persado.png b/public/users/logos/persado.png new file mode 100644 index 0000000000..90a7e67d80 Binary files /dev/null and b/public/users/logos/persado.png differ diff --git a/public/users/logos/pinterest.png b/public/users/logos/pinterest.png new file mode 100644 index 0000000000..275c8eb206 Binary files /dev/null and b/public/users/logos/pinterest.png differ diff --git a/public/users/logos/product-hunt.png b/public/users/logos/product-hunt.png new file mode 100644 index 0000000000..93dd571042 Binary files /dev/null and b/public/users/logos/product-hunt.png differ diff --git a/public/users/logos/project-september.png b/public/users/logos/project-september.png new file mode 100644 index 0000000000..d64b9cd8c8 Binary files /dev/null and b/public/users/logos/project-september.png differ diff --git a/public/users/logos/protel.png b/public/users/logos/protel.png new file mode 100644 index 0000000000..f1f850c57d Binary files /dev/null and b/public/users/logos/protel.png differ diff --git a/public/users/logos/prowl.png b/public/users/logos/prowl.png new file mode 100644 index 0000000000..84ebdde065 Binary files /dev/null and b/public/users/logos/prowl.png differ diff --git a/public/users/logos/quri.png b/public/users/logos/quri.png new file mode 100644 index 0000000000..f55d1045af Binary files /dev/null and b/public/users/logos/quri.png differ diff --git a/public/users/logos/redbubble.png b/public/users/logos/redbubble.png new file mode 100644 index 0000000000..53e806759f Binary files /dev/null and b/public/users/logos/redbubble.png differ diff --git a/public/users/logos/reindex.png b/public/users/logos/reindex.png new file mode 100644 index 0000000000..4874260400 Binary files /dev/null and b/public/users/logos/reindex.png differ diff --git a/public/users/logos/restorando.png b/public/users/logos/restorando.png new file mode 100644 index 0000000000..822725ca8b Binary files /dev/null and b/public/users/logos/restorando.png differ diff --git a/public/users/logos/salestock.png b/public/users/logos/salestock.png new file mode 100644 index 0000000000..7aa55d2b58 Binary files /dev/null and b/public/users/logos/salestock.png differ diff --git a/public/users/logos/scaphold.png b/public/users/logos/scaphold.png new file mode 100644 index 0000000000..c2a45b771c Binary files /dev/null and b/public/users/logos/scaphold.png differ diff --git a/public/users/logos/serverless.png b/public/users/logos/serverless.png new file mode 100644 index 0000000000..183a923689 Binary files /dev/null and b/public/users/logos/serverless.png differ diff --git a/public/users/logos/shopify.png b/public/users/logos/shopify.png new file mode 100644 index 0000000000..24311dd489 Binary files /dev/null and b/public/users/logos/shopify.png differ diff --git a/public/users/logos/sky.png b/public/users/logos/sky.png new file mode 100644 index 0000000000..ab70c0bd80 Binary files /dev/null and b/public/users/logos/sky.png differ diff --git a/public/users/logos/skyarchnetworks.png b/public/users/logos/skyarchnetworks.png new file mode 100644 index 0000000000..36e31c2aa7 Binary files /dev/null and b/public/users/logos/skyarchnetworks.png differ diff --git a/public/users/logos/smarkets.png b/public/users/logos/smarkets.png new file mode 100644 index 0000000000..e13b077856 Binary files /dev/null and b/public/users/logos/smarkets.png differ diff --git a/site/users/logos/stackshare.png b/public/users/logos/stackshare.png similarity index 100% rename from site/users/logos/stackshare.png rename to public/users/logos/stackshare.png diff --git a/public/users/logos/startupsco.png b/public/users/logos/startupsco.png new file mode 100644 index 0000000000..95119563d9 Binary files /dev/null and b/public/users/logos/startupsco.png differ diff --git a/public/users/logos/stem.png b/public/users/logos/stem.png new file mode 100644 index 0000000000..1e870dd99a Binary files /dev/null and b/public/users/logos/stem.png differ diff --git a/public/users/logos/swapcard.png b/public/users/logos/swapcard.png new file mode 100644 index 0000000000..cda2f4f452 Binary files /dev/null and b/public/users/logos/swapcard.png differ diff --git a/public/users/logos/syzygy.png b/public/users/logos/syzygy.png new file mode 100644 index 0000000000..8d0e010867 Binary files /dev/null and b/public/users/logos/syzygy.png differ diff --git a/public/users/logos/taller.png b/public/users/logos/taller.png new file mode 100644 index 0000000000..2633c5e4ab Binary files /dev/null and b/public/users/logos/taller.png differ diff --git a/public/users/logos/teacherspayteachers.png b/public/users/logos/teacherspayteachers.png new file mode 100644 index 0000000000..c4119aa30b Binary files /dev/null and b/public/users/logos/teacherspayteachers.png differ diff --git a/public/users/logos/teselagen_logo.png b/public/users/logos/teselagen_logo.png new file mode 100644 index 0000000000..307e21eef4 Binary files /dev/null and b/public/users/logos/teselagen_logo.png differ diff --git a/public/users/logos/thehunt.png b/public/users/logos/thehunt.png new file mode 100644 index 0000000000..380ae4182d Binary files /dev/null and b/public/users/logos/thehunt.png differ diff --git a/public/users/logos/trove.png b/public/users/logos/trove.png new file mode 100644 index 0000000000..773bbb4016 Binary files /dev/null and b/public/users/logos/trove.png differ diff --git a/public/users/logos/twitter.png b/public/users/logos/twitter.png new file mode 100644 index 0000000000..7fac8c5141 Binary files /dev/null and b/public/users/logos/twitter.png differ diff --git a/public/users/logos/uctrends.png b/public/users/logos/uctrends.png new file mode 100644 index 0000000000..357df76d3b Binary files /dev/null and b/public/users/logos/uctrends.png differ diff --git a/public/users/logos/unigraph.png b/public/users/logos/unigraph.png new file mode 100644 index 0000000000..28eb1faf95 Binary files /dev/null and b/public/users/logos/unigraph.png differ diff --git a/public/users/logos/universe.png b/public/users/logos/universe.png new file mode 100644 index 0000000000..69470596a2 Binary files /dev/null and b/public/users/logos/universe.png differ diff --git a/public/users/logos/ustglobal.png b/public/users/logos/ustglobal.png new file mode 100644 index 0000000000..5c435e71b2 Binary files /dev/null and b/public/users/logos/ustglobal.png differ diff --git a/public/users/logos/vanilaio.png b/public/users/logos/vanilaio.png new file mode 100644 index 0000000000..7ff0070850 Binary files /dev/null and b/public/users/logos/vanilaio.png differ diff --git a/public/users/logos/waitlessq.png b/public/users/logos/waitlessq.png new file mode 100644 index 0000000000..16a2432a58 Binary files /dev/null and b/public/users/logos/waitlessq.png differ diff --git a/public/users/logos/waldo-photos.png b/public/users/logos/waldo-photos.png new file mode 100644 index 0000000000..aefe652058 Binary files /dev/null and b/public/users/logos/waldo-photos.png differ diff --git a/public/users/logos/wayfair.png b/public/users/logos/wayfair.png new file mode 100644 index 0000000000..58173ab72a Binary files /dev/null and b/public/users/logos/wayfair.png differ diff --git a/public/users/logos/whitescape.png b/public/users/logos/whitescape.png new file mode 100644 index 0000000000..231169d22c Binary files /dev/null and b/public/users/logos/whitescape.png differ diff --git a/public/users/logos/wirtualnapolska.png b/public/users/logos/wirtualnapolska.png new file mode 100644 index 0000000000..6327946d68 Binary files /dev/null and b/public/users/logos/wirtualnapolska.png differ diff --git a/public/users/logos/wishlife.png b/public/users/logos/wishlife.png new file mode 100644 index 0000000000..5139d194eb Binary files /dev/null and b/public/users/logos/wishlife.png differ diff --git a/public/users/logos/workflowgen.png b/public/users/logos/workflowgen.png new file mode 100644 index 0000000000..5f3d0bf850 Binary files /dev/null and b/public/users/logos/workflowgen.png differ diff --git a/public/users/logos/wowair.png b/public/users/logos/wowair.png new file mode 100644 index 0000000000..be0c04c101 Binary files /dev/null and b/public/users/logos/wowair.png differ diff --git a/public/users/logos/yelp.png b/public/users/logos/yelp.png new file mode 100644 index 0000000000..911172698c Binary files /dev/null and b/public/users/logos/yelp.png differ diff --git a/public/users/logos/zlyde.png b/public/users/logos/zlyde.png new file mode 100644 index 0000000000..4c2979d2a9 Binary files /dev/null and b/public/users/logos/zlyde.png differ diff --git a/public/users/logos/zzish.png b/public/users/logos/zzish.png new file mode 100644 index 0000000000..e23d0b5a39 Binary files /dev/null and b/public/users/logos/zzish.png differ diff --git a/public/videos/graphiql5.webm b/public/videos/graphiql5.webm new file mode 100644 index 0000000000..39c02687f0 Binary files /dev/null and b/public/videos/graphiql5.webm differ diff --git a/renovate.json b/renovate.json new file mode 100644 index 0000000000..dae68d25dd --- /dev/null +++ b/renovate.json @@ -0,0 +1,4 @@ +{ + "extends": ["config:base"], + "schedule": ["every weekend"] +} diff --git a/resources/Site.js b/resources/Site.js deleted file mode 100644 index 82a5447caa..0000000000 --- a/resources/Site.js +++ /dev/null @@ -1,171 +0,0 @@ -/** - * Copyright (c) 2015, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the license found in the - * LICENSE file in the root directory of this source tree. - */ - -var fileWalker = require('./fileWalker'); -var fs = require('fs'); -var path = require('path'); -var writer = require('./writer'); -var yaml = require('js-yaml'); -import { endsWith } from './util'; - -exports.readSite = readSite; -exports.buildSite = buildSite; - -async function readSite(siteRoot) { - var site = { - root: path.resolve(siteRoot), - files: [] - }; - - await fileWalker(site.root, (absPath, stat) => { - var relPath = path.relative(site.root, absPath); - - return readFileData(absPath, relPath, stat).then(data => { - data = normalizeData(data); - var dirName = path.dirname(relPath); - var dirs = dirName === '.' ? [] : dirName.split(path.sep); - // TODO: throw if a dirname is only a number or is called "length" - // TODO: there must be a better data structure that doesn't hack Array - var files = site.files; - files.push(data); - for (var i = 0; i < dirs.length; i++) { - files = files[dirs[i]] || (files[dirs[i]] = []); - files.push(data); - } - }); - }); - - // Cross-link all prev/next pages - var pageByUrl = Object.create(null); - for (var i = 0; i < site.files.length; i++) { - pageByUrl[path.resolve(site.files[i].url)] = site.files[i]; - } - - for (var i = 0; i < site.files.length; i++) { - var page = site.files[i]; - if (page.next) { - page.nextPage = pageByUrl[path.resolve(page.url, page.next)]; - } - } - - return site; -} - -function buildSite(buildRoot, site, filter) { - return Promise.all(site.files - .filter(file => - !filter || - (filter.test ? filter.test(file.absPath) : filter === file.absPath)) - .map(file => writer(buildRoot, file, site)) - ); -} - - - -var PAGEISH = [ '.html.js', '.xml.js', '.md', '.markdown' ]; - -function isPageish(filePath) { - for (var i = 0; i < PAGEISH.length; i++) { - if (endsWith(filePath, PAGEISH[i])) { - return true; - } - } - return false; -} - -var FRONT_MATTER_RX = - /^(---\s*\n(?:(?:[^\n]*\n)(?!---|\.\.\.))*[^\n]*\n)(?:---|\.\.\.)?(?:\s*\n)*/; - -// Given some file information produce a data structure that can be used. -// If a file is page-like, front-matter will be looked for. -function readFileData(absPath, relPath, stat) { - if (stat.size > 100000 || !isPageish(relPath)) { - return Promise.resolve({ absPath, relPath, stat }); - } - return readFile(absPath).then(content => { - var frontMatter = FRONT_MATTER_RX.exec(content); - - if (!frontMatter) { - return { absPath, relPath, stat, content }; - } - return { - ...yaml.load(frontMatter[1]), - absPath, - relPath, - stat, - content: content.slice(frontMatter[0].length) - }; - }); -} - -// Normalize the file data -function normalizeData(file) { - file.isPage = file.content && isPageish(file.relPath); - file.url = urlToFile(file); - var dirname = path.dirname(file.relPath); - file.dir = dirname === '.' ? 'docs' : dirname.split('/')[0]; - file.date = file.date ? - Date.parse(file.date) : - (file.stat.birthtime || file.stat.ctime); - return file; -} - -// The URL with a leading slash to a file. -function urlToFile(file) { - // Determine full url from permalink or the file path. - var url; - if (file.permalink) { - url = file.permalink[0] === '/' ? - file.permalink : - '/' + path.join(path.dirname(file.relPath), file.permalink); - // Ext-less permalinks should have trailing slashes - if (!endsWith(url, '/') && path.extname(url) === '') { - url += '/'; - } - } else { - url = '/' + file.relPath; - - if (endsWith(file.relPath, '.xml.js')) { - url = url.slice(0, -'.js'.length); - } else { - for (var i = 0; i < PAGEISH.length; i++) { - if (endsWith(url, PAGEISH[i])) { - url = url.slice(0, -PAGEISH[i].length) + '.html'; - } - } - } - } - - // Convert .less to .css - if (path.extname(url) === '.less') { - url = url.slice(0, -5) + '.css'; - } - - // Assume index.html stands for the parent directory - if (path.basename(url) === 'index.html') { - url = path.dirname(url); - if (!endsWith(url, '/')) { - url += '/'; - } - } - - return url; -} - -// Simple Promise wrapper around fs.readFile -function readFile(filePath) { - return new Promise((resolve, reject) => { - fs.readFile(filePath, 'utf8', (err, content) => { - if (err) { - reject(err); - } else { - resolve(content); - } - }); - }); -} diff --git a/resources/build.js b/resources/build.js deleted file mode 100644 index c79c408499..0000000000 --- a/resources/build.js +++ /dev/null @@ -1,39 +0,0 @@ -/** - * Copyright (c) 2015, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the license found in the - * LICENSE file in the root directory of this source tree. - */ - -var path = require('path'); -var Site = require('./Site'); - -module.exports = build; - -process.on('unhandledRejection', (error, promise) => { - console.error('Unhandled Promise Rejection:'); - console.error(error && error.stack || error); - console.error(promise); -}); - -var pwd = process.env.PWD; -var sourceDir = process.env.npm_package_site_source || './'; -var buildDir = process.env.npm_package_site_build || './_build'; - -var SITE_ROOT = path.resolve(pwd, sourceDir); -var BUILD_ROOT = path.resolve(pwd, buildDir); - -async function build(filter) { - console.log('building...'); - var site = await Site.readSite(SITE_ROOT); - await Site.buildSite(BUILD_ROOT, site, filter); - console.log('built'); -} - -if (require.main === module) { - build().catch(error => { - console.error(error.stack || error) - process.exit(1); - }); -} diff --git a/resources/fileWalker.js b/resources/fileWalker.js deleted file mode 100644 index de3ecbe089..0000000000 --- a/resources/fileWalker.js +++ /dev/null @@ -1,70 +0,0 @@ -/** - * Copyright (c) 2015, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the license found in the - * LICENSE file in the root directory of this source tree. - */ - -var fs = require('fs'); -var path = require('path'); - -module.exports = fileWalker; - -var IGNORE_RX = - /^(?:_|\.|(?:node_modules|package\.json|README\.(?:md|markdown))$)/; - -var INCLUDE_RX = /^(?:\.nojekyll|\.htaccess|\_redirects)/; - -function fileWalker(dirPath, onVisitFile) { - return new Promise((resolve, reject) => { - fs.readdir(dirPath, (error, files) => { - if (error) { - return reject(error); - } - - var absFiles = files - .filter(fileName => !IGNORE_RX.test(fileName) || INCLUDE_RX.test(fileName)) - .map(fileName => path.join(dirPath, fileName)); - - lstatAll(absFiles, (error, stats) => { - if (error) { - return reject(error); - } - var awaitWalkers = absFiles.reduce((promise, absFileName, index) => { - return promise.then(() => { - if (stats[index].isDirectory()) { - return fileWalker(absFileName, onVisitFile); - } else { - return onVisitFile(absFileName, stats[index]); - } - }); - }, Promise.resolve()); - - awaitWalkers.then(() => resolve(), reject); - }); - }); - }); -} - -function lstatAll(files, cb) { - var count = files.length; - var stats = []; - var success = true; - files.forEach((fileName, index) => { - if (success) { - fs.lstat(fileName, (error, stat) => { - if (success) { - if (error) { - success = false; - return cb(error); - } - stats[index] = stat; - if (--count === 0) { - cb(null, stats); - } - } - }); - } - }); -} diff --git a/resources/publish.sh b/resources/publish.sh deleted file mode 100755 index 6abc355582..0000000000 --- a/resources/publish.sh +++ /dev/null @@ -1,26 +0,0 @@ -#!/bin/bash -e - -# Publishing to NPM is currently supported by Travis CI, which ensures that all -# tests pass first and the deployed module contains the correct file struture. -# In order to prevent inadvertently circumventing this, we ensure that a CI -# environment exists before continuing. -if [ "$CI" != true ]; then - echo "\n\n\n \033[101;30m Only Travis CI can publish to NPM. \033[0m\n\n\n" 1>&2; - exit 1; -fi; - - -# Ensure the website was built -if [ ! -f ./build/index.html ]; then - echo "\n\n\n \033[101;30m Something went wrong, the site does not exist. \033[0m\n\n\n" 1>&2; - exit 1; -fi - -# Commit the website and push it -cd build -git init -git config user.name "Travis CI" -git config user.email "travis@travis-ci.org" -git add . -git commit -a -m "Auto-deploy by Travis CI" -git push --force --quiet "https://$%7BGH_TOKEN%7D@github.com/graphql/graphql.github.io.git" master:master diff --git a/resources/renderReactPage.js b/resources/renderReactPage.js deleted file mode 100644 index dfafb375ae..0000000000 --- a/resources/renderReactPage.js +++ /dev/null @@ -1,48 +0,0 @@ -/** - * Copyright (c) 2015, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the license found in the - * LICENSE file in the root directory of this source tree. - */ - -var ReactDOM = require('react-dom/server') -var React = require('react'); - -module.exports = renderReactPage; - -/** - * Options: - * - * - component: A Component constructor class - * - props: The props to provide to the Component - * - */ -function renderReactPage(options) { - var component = options.component; - var props = options.props; - - var html = ReactDOM.renderToStaticMarkup( - React.createElement(component, props) - ); - - if (html.indexOf('', ''); - - return '' + html; - } - - // Assert correct return - if (html.indexOf('' - ); - } - - // Append DOCTYPE - html = '' + html; - - // Return rendered source - return html; -} diff --git a/resources/server.js b/resources/server.js deleted file mode 100644 index 62c3e957bc..0000000000 --- a/resources/server.js +++ /dev/null @@ -1,23 +0,0 @@ -/** - * Copyright (c) 2015, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the license found in the - * LICENSE file in the root directory of this source tree. - */ - -var path = require('path'); -var express = require('express'); -var watch = require('./watch'); - -var pwd = process.env.PWD; -var buildDir = process.env.npm_package_site_build || './_build'; - -var FILE_SERVE_ROOT = path.resolve(pwd, buildDir); - -var app = express().use(express.static(FILE_SERVE_ROOT)) -app.listen(8444, () => { - watch().then(() => { - console.log('Open http://localhost:8444/'); - }).catch(error => console.error(error.stack || error)); -}); diff --git a/resources/util.js b/resources/util.js deleted file mode 100644 index f0f6183c10..0000000000 --- a/resources/util.js +++ /dev/null @@ -1,14 +0,0 @@ -/** - * Copyright (c) 2015, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the license found in the - * LICENSE file in the root directory of this source tree. - */ - -export function endsWith(string, partial) { - return ( - partial.length <= string.length && - string.substr(string.length - partial.length) === partial - ); -} diff --git a/resources/watch.js b/resources/watch.js deleted file mode 100644 index a80d5ae96b..0000000000 --- a/resources/watch.js +++ /dev/null @@ -1,110 +0,0 @@ -/** - * Copyright (c) 2015, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the license found in the - * LICENSE file in the root directory of this source tree. - */ - -var fs = require('fs'); -var path = require('path'); -var sane = require('sane'); -var build = require('./build'); - -var pwd = process.env.PWD; -var sourceDir = process.env.npm_package_site_source || './'; -var buildDir = process.env.npm_package_site_build || path.join(sourceDir, '_build'); - -var SITE_ROOT = path.resolve(pwd, sourceDir); -var BUILD_ROOT = path.resolve(pwd, buildDir); - -var buildWithinSite = path.relative(SITE_ROOT, BUILD_ROOT); -if (buildWithinSite[0] === '.') { - buildWithinSite = null; -} else if (buildWithinSite.indexOf('/') !== -1) { - // Note: minimatch would not be able to safely ignore watching this directory - // if nested deeply within source. - throw new Error('Cannot watch safely. Build deeply within Source'); -} - -module.exports = watch; - -function watch() { - return build().then(() => { - var globIgnore = - 'node_modules' + (buildWithinSite ? '|' + buildWithinSite : ''); - var watcher = sane(SITE_ROOT, { - // Note: minimatch erroneously negates the entire pattern if the first - // character is a !. This prefix should cause it to not match. - // glob: ['?(%)!(' + globIgnore + ')/**/*', '?(%)!(' + globIgnore + ')'], - // handle node v0.10 bug - watchman: /^v0.10/.test(process.version) - }) - .on('ready', startWatch) - .on('add', changeFile) - .on('delete', deleteFile) - .on('change', changeFile); - }); -} - -function startWatch() { - console.log('watching...'); -} - -function changeFile(fileName) { - enqueue(fileName); -} - -function deleteFile(fileName) { - enqueue(fileName); -} - -const queue = []; - -function enqueue(fileName) { - queue.push(fileName); - if (queue.length === 1) { - rebuild(); - } else { - console.log('queue', fileName); - } -} - -function rebuild() { - const fileName = queue[0]; - const filter = - /_core\//.test(fileName) ? /\.(js|md)$/ : - /\.less$/.test(fileName) ? /\.less$/ : - fileName ? SITE_ROOT + '/' + fileName : - null; - clearCache(fileName); - return build(filter).then( - () => { - queue.shift(); - if (queue.length) { - return rebuild(); - } - }, - error => { - console.error(error.stack || error); - queue.shift(); - if (queue.length) { - return rebuild(); - } - } - ); -} - -function clearCache(causeFileName) { - if (path.extname(causeFileName) === '.js') { - for (var fileName in require.cache) { - if (fileName.indexOf('/node_modules/') === -1) { - delete require.cache[fileName]; - } - } - } -} - -if (require.main === module) { - watch().catch(error => console.error(error.stack || error)); -} diff --git a/resources/writer.js b/resources/writer.js deleted file mode 100644 index 19ac44454c..0000000000 --- a/resources/writer.js +++ /dev/null @@ -1,230 +0,0 @@ -/** - * Copyright (c) 2015, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the license found in the - * LICENSE file in the root directory of this source tree. - */ - -var vm = require('vm'); -var webpack = require('webpack'); -var React = require('react'); -var ReactDOM = require('react-dom/server') -var fs = require('fs'); -var yaml = require('js-yaml'); -var path = require('path'); -var less = require('less'); -var renderReactPage = require('./renderReactPage'); -import { endsWith } from './util'; - - -module.exports = writer; - -async function writer(buildDir, file, site) { - var writePath = getWritePath(buildDir, file); - console.log(' writing', file.relPath); - - // Render Less file - if (endsWith(file.absPath, '.less')) { - const input = await readFile(file.absPath); - const output = await less.render(input, { filename: file.absPath }); - return await writeFile(writePath, output.css); - } - - // Non-modified content - if (!file.content) { - await promiseDirExists(path.dirname(writePath)); - await promisePipeEnds( - fs.createReadStream(file.absPath).pipe(fs.createWriteStream(writePath)) - ); - return; - } - - var data; - - // Render JS file - if (endsWith(file.relPath, '.html.js') || endsWith(file.relPath, '.xml.js')) { - data = renderReactPage({ - component: require(path.resolve(file.absPath)), - props: { site, page: file } - }); - } else if (endsWith(file.relPath, '.md') || - endsWith(file.relPath, '.markdown')) { - var absLayoutPath = path.join(path.dirname(file.absPath), file.layout); - data = renderReactPage({ - component: require(path.resolve(absLayoutPath)), - props: { site, page: file } - }); - } else { - data = file.content; - } - - data = await writeScript(writePath, file, data); - - await writeFile(writePath, data); -} - -var SCRIPT_RX = /` + - `` + - `` - ) - ); - }); - }); - - }); - - }); -} - -function getWritePath(buildDir, file) { - var writePath = file.url; - if (endsWith(writePath, '/')) { - writePath = path.join(writePath, 'index.html'); - } - return path.join(buildDir, writePath.slice(1)); -} - -// Simple Promise wrapper around fs.writeFile -function readFile(filePath, fmt) { - return new Promise((resolve, reject) => - fs.readFile(filePath, fmt || 'utf8', (err, results) => - err ? reject(err) : resolve(results)) - ); -} - -// Ensures directory exists, then writes file -async function writeFile(filePath, data) { - await promiseDirExists(path.dirname(filePath)); - await _writeFile(filePath, data); -} - -// Simple Promise wrapper around fs.writeFile -function _writeFile(filePath, data) { - return new Promise((resolve, reject) => - fs.writeFile(filePath, data, err => err ? reject(err) : resolve()) - ); -} - -function promisePipeEnds(pipe) { - return new Promise((resolve, reject) => { - pipe.on('close', resolve).on('error', reject); - }); -} - -function promiseDirExists(dir) { - return new Promise((resolve, reject) => { - mkdirp(dir, err => err ? reject(err) : resolve()); - }); -} - -function mkdirp(p, cb) { - p = path.resolve(p); - fs.mkdir(p, 511 ^ process.umask(), error => { - if (error && error.code === 'EEXIST') { - return cb(); - } else if (error && error.code === 'ENOENT') { - mkdirp(path.dirname(p), error2 => { - return error2 ? cb(error2) : mkdirp(p, cb); - }); - } else { - cb(error); - } - }); -} diff --git a/scripts/get-github-info/get-github-info.ts b/scripts/get-github-info/get-github-info.ts new file mode 100644 index 0000000000..1dcfeed059 --- /dev/null +++ b/scripts/get-github-info/get-github-info.ts @@ -0,0 +1,108 @@ +import fg from "fast-glob" +import fs from "fs/promises" +import grayMatter from "gray-matter" +import { + getGitHubStats, + type GitHubInfo, +} from "../sort-libraries/get-github-stats" + +const DATA_PATH = new URL("./github-stats.json", import.meta.url).pathname +const LAST_RUN_PATH = new URL("./last-success.isodate", import.meta.url) + .pathname +const CODE_DIR = new URL("../../src/code", import.meta.url).pathname + +async function main() { + const filePaths = await fg("./**/*.md", { cwd: CODE_DIR, absolute: true }) + + const errors: Error[] = [] + + { + // we only sync once every two hours + const TWO_HOURS = 2 * 60 * 60 * 1000 + const lastRun = await fs.readFile(LAST_RUN_PATH, "utf8").catch(() => "") + const twoHoursAgo = new Date(Date.now() - TWO_HOURS) + if (lastRun && new Date(lastRun).getTime() > twoHoursAgo.getTime()) { + console.info( + "Skipping sync of GitHub stars, last run was within two hours.", + ) + return + } + } + + const newState = new Map() + const filePathToRepoName = new Map< + string /* file path */, + string /* repo name */ + >() + + for (const [index, filePath] of filePaths.entries()) { + try { + const content = await fs.readFile(filePath, "utf8") + const { data } = grayMatter(content) + if (data.github) { + // TODO: This needs to be pooled to make the builds faster. + const stats = await getGitHubStats(data.github) + if (stats) { + newState.set(data.github, stats) + } + } + console.info("✅ Done for", filePath, index + 1, "of", filePaths.length) + } catch (err) { + const error = err instanceof Error ? err : new Error(String(err)) + errors.push(error) + console.error( + "❌ Error for", + filePath, + index + 1, + "of", + filePaths.length, + err, + ) + } + } + + if (errors.length > 0) { + if (process.env.VERCEL) { + console.error( + "We don't want to fail the deployment, so we'll use the old github-stats.json file.", + ) + return + } else { + throw new Error("Errors occurred while fetching GitHub stats.") + } + } + + // If a .mdx file was removed, we also remove the package from the JSON. + // If it errored for some reason, we don't do anything. + // If we got it, we overwrite. + { + const data = await fs.readFile(DATA_PATH, "utf8") + const existingStats = JSON.parse(data) as Record + + const result: Record = {} + const brandNewKeys = new Set(newState.keys()) + + for (const [repoName, stats] of Object.entries(existingStats)) { + const mdxFileExists = filePathToRepoName.has(repoName) + if (mdxFileExists) { + brandNewKeys.delete(repoName) + result[repoName] = { + ...stats, + ...newState.get(repoName), + } + } + } + + for (const repoName of brandNewKeys) { + result[repoName] = newState.get(repoName)! + } + + await fs.writeFile(DATA_PATH, JSON.stringify(result, null, 2)) + await fs.writeFile(LAST_RUN_PATH, new Date().toISOString()) + } +} + +main().catch(err => { + console.error(err) + process.exit(1) +}) diff --git a/scripts/get-github-info/github-stats.json b/scripts/get-github-info/github-stats.json new file mode 100644 index 0000000000..453b431d14 --- /dev/null +++ b/scripts/get-github-info/github-stats.json @@ -0,0 +1,1330 @@ +{ + "altair-graphql/altair": { + "hasCommitsInLast3Months": false, + "stars": 5344, + "formattedStars": "5k", + "license": "MIT License", + "lastRelease": "2025-10-18T09:02:01Z", + "formattedLastRelease": "2 days ago" + }, + "apache/apisix": { + "hasCommitsInLast3Months": false, + "stars": 15738, + "formattedStars": "16k", + "license": "Apache License 2.0", + "lastRelease": "2025-10-16T07:54:57Z", + "formattedLastRelease": "4 days ago" + }, + "apollographql/apollo-studio-community": { + "hasCommitsInLast3Months": false, + "stars": 259, + "formattedStars": "259", + "license": "Unknown", + "lastRelease": "", + "formattedLastRelease": "" + }, + "ChilliCream/hotchocolate": { + "hasCommitsInLast3Months": false, + "stars": 5615, + "formattedStars": "6k", + "license": "MIT License", + "lastRelease": "2025-10-20T15:01:39Z", + "formattedLastRelease": "8 hours ago" + }, + "dgraph-io/dgraph": { + "hasCommitsInLast3Months": false, + "stars": 21301, + "formattedStars": "21k", + "license": "Apache License 2.0", + "lastRelease": "2025-10-07T20:50:36Z", + "formattedLastRelease": "1 week ago" + }, + "yahoo/elide": { + "hasCommitsInLast3Months": false, + "stars": 1017, + "formattedStars": "1k", + "license": "Other", + "lastRelease": "2025-09-01T03:57:54Z", + "formattedLastRelease": "1 month ago" + }, + "graphapi-io/resources": { + "hasCommitsInLast3Months": false, + "stars": 3, + "formattedStars": "3", + "license": "MIT License", + "lastRelease": "", + "formattedLastRelease": "" + }, + "hasura/graphql-engine": { + "hasCommitsInLast3Months": false, + "stars": 31754, + "formattedStars": "32k", + "license": "Apache License 2.0", + "lastRelease": "2025-10-14T15:20:38Z", + "formattedLastRelease": "6 days ago" + }, + "graphql-hive/platform": { + "hasCommitsInLast3Months": false, + "stars": 463, + "formattedStars": "463", + "license": "MIT License", + "lastRelease": "2025-10-16T10:40:33Z", + "formattedLastRelease": "4 days ago" + }, + "Kong/insomnia": { + "hasCommitsInLast3Months": false, + "stars": 37365, + "formattedStars": "37k", + "license": "Apache License 2.0", + "lastRelease": "2025-09-18T07:30:33Z", + "formattedLastRelease": "1 month ago" + }, + "postmanlabs/postman-app-support": { + "hasCommitsInLast3Months": false, + "stars": 5959, + "formattedStars": "6k", + "license": "Unknown", + "lastRelease": "", + "formattedLastRelease": "" + }, + "stepzen-dev/examples": { + "hasCommitsInLast3Months": false, + "stars": 46, + "formattedStars": "46", + "license": "MIT License", + "lastRelease": "", + "formattedLastRelease": "" + }, + "TykTechnologies/tyk": { + "hasCommitsInLast3Months": false, + "stars": 10425, + "formattedStars": "10k", + "license": "Other", + "lastRelease": "2025-08-07T14:37:50Z", + "formattedLastRelease": "2 months ago" + }, + "twinlogix/typetta": { + "hasCommitsInLast3Months": false, + "stars": 114, + "formattedStars": "114", + "license": "Apache License 2.0", + "lastRelease": "2023-10-16T07:50:50Z", + "formattedLastRelease": "2 years ago" + }, + "webiny/webiny-js": { + "hasCommitsInLast3Months": false, + "stars": 7864, + "formattedStars": "8k", + "license": "Other", + "lastRelease": "2025-09-16T08:29:00Z", + "formattedLastRelease": "1 month ago" + }, + "ballerina-platform/module-ballerina-graphql": { + "hasCommitsInLast3Months": false, + "stars": 139, + "formattedStars": "139", + "license": "Apache License 2.0", + "lastRelease": "2025-04-11T01:29:10Z", + "formattedLastRelease": "6 months ago" + }, + "graphql/libgraphqlparser": { + "hasCommitsInLast3Months": false, + "stars": 1101, + "formattedStars": "1k", + "license": "MIT License", + "lastRelease": "2017-10-16T21:47:42Z", + "formattedLastRelease": "8 years ago" + }, + "burner/graphqld": { + "hasCommitsInLast3Months": false, + "stars": 35, + "formattedStars": "35", + "license": "GNU Lesser General Public License v3.0", + "lastRelease": "2024-05-14T13:42:29Z", + "formattedLastRelease": "1 year ago" + }, + "oliyh/re-graph": { + "hasCommitsInLast3Months": false, + "stars": 466, + "formattedStars": "466", + "license": "Unknown", + "lastRelease": "2022-07-20T09:24:02Z", + "formattedLastRelease": "3 years ago" + }, + "alumbra/alumbra": { + "hasCommitsInLast3Months": false, + "stars": 148, + "formattedStars": "148", + "license": "MIT License", + "lastRelease": "2017-06-12T12:14:25Z", + "formattedLastRelease": "8 years ago" + }, + "tendant/graphql-clj": { + "hasCommitsInLast3Months": false, + "stars": 285, + "formattedStars": "285", + "license": "Eclipse Public License 1.0", + "lastRelease": "", + "formattedLastRelease": "" + }, + "walmartlabs/lacinia": { + "hasCommitsInLast3Months": false, + "stars": 1840, + "formattedStars": "2k", + "license": "Other", + "lastRelease": "", + "formattedLastRelease": "" + }, + "graphql-dotnet/graphql-client": { + "hasCommitsInLast3Months": false, + "stars": 644, + "formattedStars": "1k", + "license": "MIT License", + "lastRelease": "2024-05-21T07:06:30Z", + "formattedLastRelease": "1 year ago" + }, + "bkniffler/graphql-net-client": { + "hasCommitsInLast3Months": false, + "stars": 94, + "formattedStars": "94", + "license": "MIT License", + "lastRelease": "", + "formattedLastRelease": "" + }, + "linq2graphql/linq2graphql.client": { + "hasCommitsInLast3Months": false, + "stars": 8, + "formattedStars": "8", + "license": "MIT License", + "lastRelease": "2025-10-07T07:20:37Z", + "formattedLastRelease": "1 week ago" + }, + "sahb1239/SAHB.GraphQLClient": { + "hasCommitsInLast3Months": false, + "stars": 44, + "formattedStars": "44", + "license": "MIT License", + "lastRelease": "2020-05-17T10:50:58Z", + "formattedLastRelease": "5 years ago" + }, + "byme8/ZeroQL": { + "hasCommitsInLast3Months": false, + "stars": 312, + "formattedStars": "312", + "license": "MIT License", + "lastRelease": "2025-10-14T11:58:44Z", + "formattedLastRelease": "6 days ago" + }, + "annkissam/common_graphql_client": { + "hasCommitsInLast3Months": false, + "stars": 42, + "formattedStars": "42", + "license": "MIT License", + "lastRelease": "2020-05-05T16:48:50Z", + "formattedLastRelease": "5 years ago" + }, + "uesteibar/neuron": { + "hasCommitsInLast3Months": false, + "stars": 333, + "formattedStars": "333", + "license": "Other", + "lastRelease": "", + "formattedLastRelease": "" + }, + "absinthe-graphql/absinthe": { + "hasCommitsInLast3Months": false, + "stars": 4367, + "formattedStars": "4k", + "license": "Other", + "lastRelease": "2025-06-09T16:38:08Z", + "formattedLastRelease": "4 months ago" + }, + "graphql-elixir/graphql": { + "hasCommitsInLast3Months": false, + "stars": 858, + "formattedStars": "1k", + "license": "Other", + "lastRelease": "2016-09-09T04:49:46Z", + "formattedLastRelease": "9 years ago" + }, + "EntityGraphQL/EntityGraphQL": { + "hasCommitsInLast3Months": false, + "stars": 446, + "formattedStars": "446", + "license": "MIT License", + "lastRelease": "2025-09-16T00:35:14Z", + "formattedLastRelease": "1 month ago" + }, + "graphql-dotnet/graphql-dotnet": { + "hasCommitsInLast3Months": false, + "stars": 5969, + "formattedStars": "6k", + "license": "MIT License", + "lastRelease": "2025-09-21T17:57:29Z", + "formattedLastRelease": "4 weeks ago" + }, + "chkimes/graphql-net": { + "hasCommitsInLast3Months": false, + "stars": 888, + "formattedStars": "1k", + "license": "MIT License", + "lastRelease": "", + "formattedLastRelease": "" + }, + "rivantsov/ngraphql": { + "hasCommitsInLast3Months": false, + "stars": 46, + "formattedStars": "46", + "license": "MIT License", + "lastRelease": "", + "formattedLastRelease": "" + }, + "dillonkearns/elm-graphql": { + "hasCommitsInLast3Months": false, + "stars": 782, + "formattedStars": "1k", + "license": "BSD 3-Clause \"New\" or \"Revised\" License", + "lastRelease": "", + "formattedLastRelease": "" + }, + "jlouis/graphql-erlang": { + "hasCommitsInLast3Months": false, + "stars": 314, + "formattedStars": "314", + "license": "Other", + "lastRelease": "2018-06-22T12:35:43Z", + "formattedLastRelease": "7 years ago" + }, + "gql-dart/ferry": { + "hasCommitsInLast3Months": false, + "stars": 628, + "formattedStars": "1k", + "license": "MIT License", + "lastRelease": "", + "formattedLastRelease": "" + }, + "zino-app/graphql-flutter": { + "hasCommitsInLast3Months": false, + "stars": 3269, + "formattedStars": "3k", + "license": "MIT License", + "lastRelease": "2025-09-07T10:05:12Z", + "formattedLastRelease": "1 month ago" + }, + "Khan/genqlient": { + "hasCommitsInLast3Months": false, + "stars": 1254, + "formattedStars": "1k", + "license": "MIT License", + "lastRelease": "2025-05-18T19:09:08Z", + "formattedLastRelease": "5 months ago" + }, + "hasura/go-graphql-client": { + "hasCommitsInLast3Months": false, + "stars": 449, + "formattedStars": "449", + "license": "MIT License", + "lastRelease": "2025-09-29T10:13:43Z", + "formattedLastRelease": "3 weeks ago" + }, + "shurcooL/graphql": { + "hasCommitsInLast3Months": false, + "stars": 727, + "formattedStars": "1k", + "license": "MIT License", + "lastRelease": "", + "formattedLastRelease": "" + }, + "machinebox/graphql": { + "hasCommitsInLast3Months": false, + "stars": 962, + "formattedStars": "1k", + "license": "Apache License 2.0", + "lastRelease": "2018-05-31T14:28:32Z", + "formattedLastRelease": "7 years ago" + }, + "99designs/gqlgen": { + "hasCommitsInLast3Months": false, + "stars": 10546, + "formattedStars": "11k", + "license": "MIT License", + "lastRelease": "2025-09-25T23:00:54Z", + "formattedLastRelease": "3 weeks ago" + }, + "andrewwphillips/eggql": { + "hasCommitsInLast3Months": false, + "stars": 40, + "formattedStars": "40", + "license": "MIT License", + "lastRelease": "", + "formattedLastRelease": "" + }, + "appointy/jaal": { + "hasCommitsInLast3Months": false, + "stars": 78, + "formattedStars": "78", + "license": "MIT License", + "lastRelease": "2020-04-18T08:53:19Z", + "formattedLastRelease": "5 years ago" + }, + "graph-gophers/graphql-go": { + "hasCommitsInLast3Months": false, + "stars": 4727, + "formattedStars": "5k", + "license": "BSD 2-Clause \"Simplified\" License", + "lastRelease": "2025-09-09T11:37:07Z", + "formattedLastRelease": "1 month ago" + }, + "graphql-go/graphql": { + "hasCommitsInLast3Months": false, + "stars": 10117, + "formattedStars": "10k", + "license": "MIT License", + "lastRelease": "2023-04-10T18:20:23Z", + "formattedLastRelease": "2 years ago" + }, + "graphql-go/relay": { + "hasCommitsInLast3Months": false, + "stars": 426, + "formattedStars": "426", + "license": "MIT License", + "lastRelease": "", + "formattedLastRelease": "" + }, + "samsarahq/thunder": { + "hasCommitsInLast3Months": false, + "stars": 1579, + "formattedStars": "2k", + "license": "MIT License", + "lastRelease": "", + "formattedLastRelease": "" + }, + "wundergraph/graphql-go-tools": { + "hasCommitsInLast3Months": false, + "stars": 787, + "formattedStars": "1k", + "license": "MIT License", + "lastRelease": "2025-10-20T13:49:14Z", + "formattedLastRelease": "9 hours ago" + }, + "dosco/graphjin": { + "hasCommitsInLast3Months": false, + "stars": 2996, + "formattedStars": "3k", + "license": "Apache License 2.0", + "lastRelease": "2025-09-18T06:22:50Z", + "formattedLastRelease": "1 month ago" + }, + "grails/gorm-graphql": { + "hasCommitsInLast3Months": false, + "stars": 81, + "formattedStars": "81", + "license": "Unknown", + "lastRelease": "2023-12-08T10:48:05Z", + "formattedLastRelease": "1 year ago" + }, + "grooviter/gql": { + "hasCommitsInLast3Months": false, + "stars": 49, + "formattedStars": "49", + "license": "Apache License 2.0", + "lastRelease": "2024-11-05T10:13:23Z", + "formattedLastRelease": "11 months ago" + }, + "morpheusgraphql/morpheus-graphql": { + "hasCommitsInLast3Months": false, + "stars": 416, + "formattedStars": "416", + "license": "MIT License", + "lastRelease": "2024-06-10T08:34:35Z", + "formattedLastRelease": "1 year ago" + }, + "jasonsychau/graphql-w-persistent": { + "hasCommitsInLast3Months": false, + "stars": 10, + "formattedStars": "10", + "license": "Unknown", + "lastRelease": "", + "formattedLastRelease": "" + }, + "higherkindness/mu-haskell": { + "hasCommitsInLast3Months": false, + "stars": 335, + "formattedStars": "335", + "license": "Apache License 2.0", + "lastRelease": "2021-01-11T11:19:38Z", + "formattedLastRelease": "4 years ago" + }, + "apollographql/apollo-kotlin": { + "hasCommitsInLast3Months": false, + "stars": 3911, + "formattedStars": "4k", + "license": "MIT License", + "lastRelease": "2025-08-21T15:31:08Z", + "formattedLastRelease": "1 month ago" + }, + "ExpediaGroup/graphql-kotlin": { + "hasCommitsInLast3Months": false, + "stars": 1784, + "formattedStars": "2k", + "license": "Apache License 2.0", + "lastRelease": "2025-06-16T17:02:18Z", + "formattedLastRelease": "4 months ago" + }, + "americanexpress/nodes": { + "hasCommitsInLast3Months": false, + "stars": 307, + "formattedStars": "307", + "license": "Apache License 2.0", + "lastRelease": "2019-07-13T22:47:01Z", + "formattedLastRelease": "6 years ago" + }, + "graphql-calculator/graphql-calculator": { + "hasCommitsInLast3Months": false, + "stars": 112, + "formattedStars": "112", + "license": "Apache License 2.0", + "lastRelease": "2021-09-03T01:56:25Z", + "formattedLastRelease": "4 years ago" + }, + "graphql-java-kickstart/graphql-spring-boot": { + "hasCommitsInLast3Months": false, + "stars": 1514, + "formattedStars": "2k", + "license": "MIT License", + "lastRelease": "2023-12-07T11:07:47Z", + "formattedLastRelease": "1 year ago" + }, + "graphql-java/graphql-java": { + "hasCommitsInLast3Months": false, + "stars": 6216, + "formattedStars": "6k", + "license": "MIT License", + "lastRelease": "2025-10-12T21:04:23Z", + "formattedLastRelease": "1 week ago" + }, + "babyfish-ct/jimmer": { + "hasCommitsInLast3Months": false, + "stars": 1514, + "formattedStars": "2k", + "license": "Apache License 2.0", + "lastRelease": "2025-10-18T13:30:49Z", + "formattedLastRelease": "2 days ago" + }, + "aPureBase/KGraphQL": { + "hasCommitsInLast3Months": false, + "stars": 307, + "formattedStars": "307", + "license": "MIT License", + "lastRelease": "2023-01-27T10:09:55Z", + "formattedLastRelease": "2 years ago" + }, + "eclipse/microprofile-graphql": { + "hasCommitsInLast3Months": false, + "stars": 101, + "formattedStars": "101", + "license": "Apache License 2.0", + "lastRelease": "2022-03-21T18:26:51Z", + "formattedLastRelease": "3 years ago" + }, + "netflix/dgs-framework": { + "hasCommitsInLast3Months": false, + "stars": 3267, + "formattedStars": "3k", + "license": "Apache License 2.0", + "lastRelease": "2025-10-15T19:54:58Z", + "formattedLastRelease": "5 days ago" + }, + "spring-projects/spring-graphql": { + "hasCommitsInLast3Months": false, + "stars": 1573, + "formattedStars": "2k", + "license": "Apache License 2.0", + "lastRelease": "2025-09-16T15:48:43Z", + "formattedLastRelease": "1 month ago" + }, + "graphql-java-generator/graphql-gradle-plugin-project": { + "hasCommitsInLast3Months": false, + "stars": 56, + "formattedStars": "56", + "license": "MIT License", + "lastRelease": "", + "formattedLastRelease": "" + }, + "neomatrixcode/Diana.jl": { + "hasCommitsInLast3Months": false, + "stars": 117, + "formattedStars": "117", + "license": "MIT License", + "lastRelease": "2022-08-16T03:22:22Z", + "formattedLastRelease": "3 years ago" + }, + "DeloitteDigitalAPAC/GraphQLClient.jl": { + "hasCommitsInLast3Months": false, + "stars": 47, + "formattedStars": "47", + "license": "Other", + "lastRelease": "2022-10-26T16:48:16Z", + "formattedLastRelease": "2 years ago" + }, + "andreas/ocaml-graphql-server": { + "hasCommitsInLast3Months": false, + "stars": 622, + "formattedStars": "1k", + "license": "MIT License", + "lastRelease": "2022-07-08T16:26:45Z", + "formattedLastRelease": "3 years ago" + }, + "graphql-perl/graphql-perl": { + "hasCommitsInLast3Months": false, + "stars": 73, + "formattedStars": "73", + "license": "Unknown", + "lastRelease": "", + "formattedLastRelease": "" + }, + "api-platform/api-platform": { + "hasCommitsInLast3Months": false, + "stars": 9029, + "formattedStars": "9k", + "license": "MIT License", + "lastRelease": "2025-03-11T16:15:41Z", + "formattedLastRelease": "7 months ago" + }, + "GatoGraphQL/GatoGraphQL": { + "hasCommitsInLast3Months": false, + "stars": 374, + "formattedStars": "374", + "license": "GNU General Public License v2.0", + "lastRelease": "2025-10-17T15:10:13Z", + "formattedLastRelease": "3 days ago" + }, + "infinityloop-dev/graphpinator": { + "hasCommitsInLast3Months": false, + "stars": 45, + "formattedStars": "45", + "license": "MIT License", + "lastRelease": "2025-06-26T12:08:01Z", + "formattedLastRelease": "3 months ago" + }, + "jerowork/graphql-attribute-schema": { + "hasCommitsInLast3Months": false, + "stars": 16, + "formattedStars": "16", + "license": "MIT License", + "lastRelease": "2025-10-11T09:19:14Z", + "formattedLastRelease": "1 week ago" + }, + "webonyx/graphql-php": { + "hasCommitsInLast3Months": false, + "stars": 4694, + "formattedStars": "5k", + "license": "MIT License", + "lastRelease": "2025-10-08T10:30:00Z", + "formattedLastRelease": "1 week ago" + }, + "ivome/graphql-relay-php": { + "hasCommitsInLast3Months": false, + "stars": 271, + "formattedStars": "271", + "license": "BSD 3-Clause \"New\" or \"Revised\" License", + "lastRelease": "2021-04-24T19:40:30Z", + "formattedLastRelease": "4 years ago" + }, + "overblog/GraphQLBundle": { + "hasCommitsInLast3Months": false, + "stars": 792, + "formattedStars": "1k", + "license": "MIT License", + "lastRelease": "2024-12-19T15:48:59Z", + "formattedLastRelease": "10 months ago" + }, + "thecodingmachine/graphqlite": { + "hasCommitsInLast3Months": false, + "stars": 564, + "formattedStars": "1k", + "license": "MIT License", + "lastRelease": "2025-09-04T16:39:26Z", + "formattedLastRelease": "1 month ago" + }, + "nuwave/lighthouse": { + "hasCommitsInLast3Months": false, + "stars": 3459, + "formattedStars": "3k", + "license": "MIT License", + "lastRelease": "2025-09-11T08:07:50Z", + "formattedLastRelease": "1 month ago" + }, + "railt/railt": { + "hasCommitsInLast3Months": false, + "stars": 361, + "formattedStars": "361", + "license": "MIT License", + "lastRelease": "2019-03-01T15:20:44Z", + "formattedLastRelease": "6 years ago" + }, + "kepawni/serge": { + "hasCommitsInLast3Months": false, + "stars": 6, + "formattedStars": "6", + "license": "GNU General Public License v3.0", + "lastRelease": "", + "formattedLastRelease": "" + }, + "leocavalcante/siler": { + "hasCommitsInLast3Months": false, + "stars": 1114, + "formattedStars": "1k", + "license": "MIT License", + "lastRelease": "2021-01-27T19:41:57Z", + "formattedLastRelease": "4 years ago" + }, + "wp-graphql/wp-graphql": { + "hasCommitsInLast3Months": false, + "stars": 3750, + "formattedStars": "4k", + "license": "GNU General Public License v3.0", + "lastRelease": "2025-10-14T17:40:19Z", + "formattedLastRelease": "6 days ago" + }, + "mirumee/ariadne-codegen": { + "hasCommitsInLast3Months": false, + "stars": 354, + "formattedStars": "354", + "license": "BSD 3-Clause \"New\" or \"Revised\" License", + "lastRelease": "2025-10-13T06:38:02Z", + "formattedLastRelease": "1 week ago" + }, + "graphql-python/gql": { + "hasCommitsInLast3Months": false, + "stars": 1639, + "formattedStars": "2k", + "license": "MIT License", + "lastRelease": "2025-09-05T14:22:54Z", + "formattedLastRelease": "1 month ago" + }, + "denisart/graphql-query": { + "hasCommitsInLast3Months": false, + "stars": 66, + "formattedStars": "66", + "license": "MIT License", + "lastRelease": "2024-07-31T10:54:53Z", + "formattedLastRelease": "1 year ago" + }, + "prisma-labs/python-graphql-client": { + "hasCommitsInLast3Months": false, + "stars": 156, + "formattedStars": "156", + "license": "MIT License", + "lastRelease": "", + "formattedLastRelease": "" + }, + "dsal3389/ql": { + "hasCommitsInLast3Months": false, + "stars": 9, + "formattedStars": "9", + "license": "Unknown", + "lastRelease": "2025-02-04T17:36:51Z", + "formattedLastRelease": "8 months ago" + }, + "qlient-org/python-qlient": { + "hasCommitsInLast3Months": false, + "stars": 46, + "formattedStars": "46", + "license": "MIT License", + "lastRelease": "2022-07-29T16:10:08Z", + "formattedLastRelease": "3 years ago" + }, + "profusion/sgqlc": { + "hasCommitsInLast3Months": false, + "stars": 543, + "formattedStars": "1k", + "license": "ISC License", + "lastRelease": "", + "formattedLastRelease": "" + }, + "mirumee/ariadne": { + "hasCommitsInLast3Months": false, + "stars": 2298, + "formattedStars": "2k", + "license": "BSD 3-Clause \"New\" or \"Revised\" License", + "lastRelease": "2025-04-18T08:27:47Z", + "formattedLastRelease": "6 months ago" + }, + "yefeza/django-graphbox": { + "hasCommitsInLast3Months": false, + "stars": 15, + "formattedStars": "15", + "license": "MIT License", + "lastRelease": "2024-03-23T21:41:41Z", + "formattedLastRelease": "1 year ago" + }, + "juanjcardona13/graphene_django_cruddals": { + "hasCommitsInLast3Months": false, + "stars": 16, + "formattedStars": "16", + "license": "Apache License 2.0", + "lastRelease": "", + "formattedLastRelease": "" + }, + "graphql-python/graphene": { + "hasCommitsInLast3Months": false, + "stars": 8226, + "formattedStars": "8k", + "license": "MIT License", + "lastRelease": "2024-11-09T20:43:58Z", + "formattedLastRelease": "11 months ago" + }, + "strawberry-graphql/strawberry": { + "hasCommitsInLast3Months": false, + "stars": 4445, + "formattedStars": "4k", + "license": "MIT License", + "lastRelease": "2025-10-18T20:31:24Z", + "formattedLastRelease": "2 days ago" + }, + "tartiflette/tartiflette": { + "hasCommitsInLast3Months": false, + "stars": 857, + "formattedStars": "1k", + "license": "MIT License", + "lastRelease": "2021-11-15T11:05:03Z", + "formattedLastRelease": "3 years ago" + }, + "ropensci/ghql": { + "hasCommitsInLast3Months": false, + "stars": 148, + "formattedStars": "148", + "license": "Other", + "lastRelease": "2025-09-08T08:41:00Z", + "formattedLastRelease": "1 month ago" + }, + "ohler55/agoo": { + "hasCommitsInLast3Months": false, + "stars": 922, + "formattedStars": "1k", + "license": "MIT License", + "lastRelease": "2025-09-24T22:20:23Z", + "formattedLastRelease": "3 weeks ago" + }, + "rmosolgo/graphql-ruby": { + "hasCommitsInLast3Months": false, + "stars": 5424, + "formattedStars": "5k", + "license": "MIT License", + "lastRelease": "2025-07-19T17:15:49Z", + "formattedLastRelease": "3 months ago" + }, + "virtualshield/rails-graphql": { + "hasCommitsInLast3Months": false, + "stars": 187, + "formattedStars": "187", + "license": "MIT License", + "lastRelease": "2025-08-25T17:53:38Z", + "formattedLastRelease": "1 month ago" + }, + "apollographql/apollo-client": { + "hasCommitsInLast3Months": false, + "stars": 19658, + "formattedStars": "20k", + "license": "MIT License", + "lastRelease": "2025-10-10T15:51:43Z", + "formattedLastRelease": "1 week ago" + }, + "aws-amplify/amplify-js": { + "hasCommitsInLast3Months": false, + "stars": 9560, + "formattedStars": "10k", + "license": "Apache License 2.0", + "lastRelease": "2025-09-29T15:51:39Z", + "formattedLastRelease": "3 weeks ago" + }, + "Houfeng/gq-loader": { + "hasCommitsInLast3Months": false, + "stars": 59, + "formattedStars": "59", + "license": "Unknown", + "lastRelease": "", + "formattedLastRelease": "" + }, + "gqty-dev/gqty": { + "hasCommitsInLast3Months": false, + "stars": 1026, + "formattedStars": "1k", + "license": "MIT License", + "lastRelease": "2025-10-09T07:29:27Z", + "formattedLastRelease": "1 week ago" + }, + "grafoojs/grafoo": { + "hasCommitsInLast3Months": false, + "stars": 274, + "formattedStars": "274", + "license": "MIT License", + "lastRelease": "2018-06-20T15:21:00Z", + "formattedLastRelease": "7 years ago" + }, + "badbatch/graphql-box": { + "hasCommitsInLast3Months": false, + "stars": 28, + "formattedStars": "28", + "license": "MIT License", + "lastRelease": "", + "formattedLastRelease": "" + }, + "nearform/graphql-hooks": { + "hasCommitsInLast3Months": false, + "stars": 1890, + "formattedStars": "2k", + "license": "Other", + "lastRelease": "2025-01-08T18:45:52Z", + "formattedLastRelease": "9 months ago" + }, + "graphql/graphql-http": { + "hasCommitsInLast3Months": false, + "stars": 354, + "formattedStars": "354", + "license": "MIT License", + "lastRelease": "2025-01-17T14:16:52Z", + "formattedLastRelease": "9 months ago" + }, + "jasonkuhrt/graphql-request": { + "hasCommitsInLast3Months": false, + "stars": 6058, + "formattedStars": "6k", + "license": "MIT License", + "lastRelease": "2025-10-18T20:40:58Z", + "formattedLastRelease": "2 days ago" + }, + "enisdenjo/graphql-sse": { + "hasCommitsInLast3Months": false, + "stars": 432, + "formattedStars": "432", + "license": "MIT License", + "lastRelease": "2025-01-10T11:57:20Z", + "formattedLastRelease": "9 months ago" + }, + "babyfish-ct/graphql-ts-client": { + "hasCommitsInLast3Months": false, + "stars": 149, + "formattedStars": "149", + "license": "MIT License", + "lastRelease": "2023-12-14T03:06:21Z", + "formattedLastRelease": "1 year ago" + }, + "enisdenjo/graphql-ws": { + "hasCommitsInLast3Months": false, + "stars": 1837, + "formattedStars": "2k", + "license": "MIT License", + "lastRelease": "2025-07-14T12:15:37Z", + "formattedLastRelease": "3 months ago" + }, + "hasura/graphqurl": { + "hasCommitsInLast3Months": false, + "stars": 3374, + "formattedStars": "3k", + "license": "Apache License 2.0", + "lastRelease": "", + "formattedLastRelease": "" + }, + "kadirahq/lokka": { + "hasCommitsInLast3Months": false, + "stars": 1529, + "formattedStars": "2k", + "license": "MIT License", + "lastRelease": "", + "formattedLastRelease": "" + }, + "choojs/nanographql": { + "hasCommitsInLast3Months": false, + "stars": 420, + "formattedStars": "420", + "license": "MIT License", + "lastRelease": "", + "formattedLastRelease": "" + }, + "facebook/relay": { + "hasCommitsInLast3Months": false, + "stars": 18870, + "formattedStars": "19k", + "license": "MIT License", + "lastRelease": "2025-08-06T23:45:00Z", + "formattedLastRelease": "2 months ago" + }, + "FormidableLabs/urql": { + "hasCommitsInLast3Months": false, + "stars": 8876, + "formattedStars": "9k", + "license": "MIT License", + "lastRelease": "2025-08-29T08:06:41Z", + "formattedLastRelease": "1 month ago" + }, + "apollographql/apollo-server": { + "hasCommitsInLast3Months": false, + "stars": 13916, + "formattedStars": "14k", + "license": "MIT License", + "lastRelease": "2025-07-17T16:58:26Z", + "formattedLastRelease": "3 months ago" + }, + "graphql/graphql-js": { + "hasCommitsInLast3Months": false, + "stars": 20261, + "formattedStars": "20k", + "license": "MIT License", + "lastRelease": "2025-06-11T16:37:17Z", + "formattedLastRelease": "4 months ago" + }, + "dotansimha/graphql-yoga": { + "hasCommitsInLast3Months": false, + "stars": 8442, + "formattedStars": "8k", + "license": "MIT License", + "lastRelease": "2025-09-19T16:33:06Z", + "formattedLastRelease": "1 month ago" + }, + "mercurius-js/mercurius": { + "hasCommitsInLast3Months": false, + "stars": 2446, + "formattedStars": "2k", + "license": "MIT License", + "lastRelease": "2025-10-10T09:11:58Z", + "formattedLastRelease": "1 week ago" + }, + "getcronit/pylon": { + "hasCommitsInLast3Months": false, + "stars": 341, + "formattedStars": "341", + "license": "Apache License 2.0", + "lastRelease": "2025-10-01T08:35:15Z", + "formattedLastRelease": "2 weeks ago" + }, + "obmarg/cynic": { + "hasCommitsInLast3Months": false, + "stars": 435, + "formattedStars": "435", + "license": "Mozilla Public License 2.0", + "lastRelease": "2025-08-19T19:37:22Z", + "formattedLastRelease": "2 months ago" + }, + "arthurkhlghatyan/gql-client-rs": { + "hasCommitsInLast3Months": false, + "stars": 51, + "formattedStars": "51", + "license": "MIT License", + "lastRelease": "2025-06-07T14:31:10Z", + "formattedLastRelease": "4 months ago" + }, + "networkimprov/brangr": { + "hasCommitsInLast3Months": false, + "stars": 4, + "formattedStars": "4", + "license": "Mozilla Public License 2.0", + "lastRelease": "2023-06-02T09:20:18Z", + "formattedLastRelease": "2 years ago" + }, + "hayes/giraphql": { + "hasCommitsInLast3Months": false, + "stars": 2539, + "formattedStars": "3k", + "license": "ISC License", + "lastRelease": "2025-10-20T17:43:11Z", + "formattedLastRelease": "5 hours ago" + }, + "graphql/graphiql": { + "hasCommitsInLast3Months": false, + "stars": 16666, + "formattedStars": "17k", + "license": "MIT License", + "lastRelease": "2025-07-19T17:43:48Z", + "formattedLastRelease": "3 months ago" + }, + "Urigo/graphql-cli": { + "hasCommitsInLast3Months": false, + "stars": 2018, + "formattedStars": "2k", + "license": "MIT License", + "lastRelease": "2020-10-07T12:54:45Z", + "formattedLastRelease": "5 years ago" + }, + "dotansimha/graphql-code-generator": { + "hasCommitsInLast3Months": false, + "stars": 11161, + "formattedStars": "11k", + "license": "MIT License", + "lastRelease": "2025-10-06T11:42:38Z", + "formattedLastRelease": "2 weeks ago" + }, + "kamilkisiela/graphql-config": { + "hasCommitsInLast3Months": false, + "stars": 1193, + "formattedStars": "1k", + "license": "MIT License", + "lastRelease": "2025-04-28T15:15:29Z", + "formattedLastRelease": "5 months ago" + }, + "dimaMachina/graphql-eslint/": { + "hasCommitsInLast3Months": false, + "stars": 831, + "formattedStars": "1k", + "license": "MIT License", + "lastRelease": "2025-03-26T14:11:23Z", + "formattedLastRelease": "6 months ago" + }, + "kamilkisiela/graphql-inspector": { + "hasCommitsInLast3Months": false, + "stars": 1725, + "formattedStars": "2k", + "license": "MIT License", + "lastRelease": "2024-12-09T13:34:14Z", + "formattedLastRelease": "10 months ago" + }, + "graphql/graphql-language-service": { + "hasCommitsInLast3Months": false, + "stars": 418, + "formattedStars": "418", + "license": "Unknown", + "lastRelease": "", + "formattedLastRelease": "" + }, + "n1ru4l/graphql-live-query": { + "hasCommitsInLast3Months": false, + "stars": 438, + "formattedStars": "438", + "license": "MIT License", + "lastRelease": "2022-07-29T09:27:53Z", + "formattedLastRelease": "3 years ago" + }, + "Urigo/graphql-mesh": { + "hasCommitsInLast3Months": false, + "stars": 3443, + "formattedStars": "3k", + "license": "MIT License", + "lastRelease": "2025-10-14T12:56:40Z", + "formattedLastRelease": "6 days ago" + }, + "maticzav/graphql-middleware": { + "hasCommitsInLast3Months": false, + "stars": 1149, + "formattedStars": "1k", + "license": "MIT License", + "lastRelease": "2023-07-07T16:38:02Z", + "formattedLastRelease": "2 years ago" + }, + "Urigo/graphql-modules": { + "hasCommitsInLast3Months": false, + "stars": 1330, + "formattedStars": "1k", + "license": "MIT License", + "lastRelease": "2025-02-19T10:43:37Z", + "formattedLastRelease": "8 months ago" + }, + "Urigo/graphql-scalars": { + "hasCommitsInLast3Months": false, + "stars": 1922, + "formattedStars": "2k", + "license": "MIT License", + "lastRelease": "2025-10-14T23:00:24Z", + "formattedLastRelease": "6 days ago" + }, + "maticzav/graphql-shield": { + "hasCommitsInLast3Months": false, + "stars": 3566, + "formattedStars": "4k", + "license": "MIT License", + "lastRelease": "2022-11-22T19:08:37Z", + "formattedLastRelease": "2 years ago" + }, + "ardatan/graphql-tools": { + "hasCommitsInLast3Months": false, + "stars": 5413, + "formattedStars": "5k", + "license": "MIT License", + "lastRelease": "2025-09-22T19:23:14Z", + "formattedLastRelease": "4 weeks ago" + }, + "anvilco/graphql-introspection-tools": { + "hasCommitsInLast3Months": false, + "stars": 35, + "formattedStars": "35", + "license": "MIT License", + "lastRelease": "", + "formattedLastRelease": "" + }, + "graphile/postgraphile": { + "hasCommitsInLast3Months": false, + "stars": 12826, + "formattedStars": "13k", + "license": "Other", + "lastRelease": "2023-10-05T16:27:00Z", + "formattedLastRelease": "2 years ago" + }, + "Urigo/SOFA": { + "hasCommitsInLast3Months": false, + "stars": 1108, + "formattedStars": "1k", + "license": "MIT License", + "lastRelease": "2024-12-16T10:06:41Z", + "formattedLastRelease": "10 months ago" + }, + "anvilco/spectaql": { + "hasCommitsInLast3Months": false, + "stars": 1185, + "formattedStars": "1k", + "license": "MIT License", + "lastRelease": "", + "formattedLastRelease": "" + }, + "async-graphql/async-graphql": { + "hasCommitsInLast3Months": false, + "stars": 3582, + "formattedStars": "4k", + "license": "Apache License 2.0", + "lastRelease": "", + "formattedLastRelease": "" + }, + "graphql-rust/juniper": { + "hasCommitsInLast3Months": false, + "stars": 5887, + "formattedStars": "6k", + "license": "Other", + "lastRelease": "2025-09-08T23:23:40Z", + "formattedLastRelease": "1 month ago" + }, + "ghostdogpr/caliban": { + "hasCommitsInLast3Months": false, + "stars": 977, + "formattedStars": "1k", + "license": "Apache License 2.0", + "lastRelease": "2025-07-14T00:24:20Z", + "formattedLastRelease": "3 months ago" + }, + "sangria-graphql/sangria": { + "hasCommitsInLast3Months": false, + "stars": 1958, + "formattedStars": "2k", + "license": "Apache License 2.0", + "lastRelease": "2025-10-20T11:40:30Z", + "formattedLastRelease": "11 hours ago" + }, + "apollographql/apollo-ios": { + "hasCommitsInLast3Months": false, + "stars": 3996, + "formattedStars": "4k", + "license": "MIT License", + "lastRelease": "2025-10-14T16:43:14Z", + "formattedLastRelease": "6 days ago" + }, + "nerdsupremacist/Graphaello": { + "hasCommitsInLast3Months": false, + "stars": 500, + "formattedStars": "1k", + "license": "MIT License", + "lastRelease": "2021-12-19T22:21:30Z", + "formattedLastRelease": "3 years ago" + }, + "funcompany/graphql-ios": { + "hasCommitsInLast3Months": false, + "stars": 60, + "formattedStars": "60", + "license": "MIT License", + "lastRelease": "", + "formattedLastRelease": "" + }, + "maticzav/swift-graphql": { + "hasCommitsInLast3Months": false, + "stars": 620, + "formattedStars": "1k", + "license": "MIT License", + "lastRelease": "2024-05-06T20:00:06Z", + "formattedLastRelease": "1 year ago" + }, + "GraphQLSwift/Graphiti": { + "hasCommitsInLast3Months": false, + "stars": 552, + "formattedStars": "1k", + "license": "MIT License", + "lastRelease": "2025-08-21T19:30:20Z", + "formattedLastRelease": "1 month ago" + }, + "nerdsupremacist/GraphZahl": { + "hasCommitsInLast3Months": false, + "stars": 146, + "formattedStars": "146", + "license": "MIT License", + "lastRelease": "2021-05-17T12:51:10Z", + "formattedLastRelease": "4 years ago" + }, + "apollographql/router": { + "hasCommitsInLast3Months": false, + "stars": 934, + "formattedStars": "1k", + "license": "Other", + "lastRelease": "2025-10-01T17:36:59Z", + "formattedLastRelease": "2 weeks ago" + }, + "eerimoq/gqt": { + "hasCommitsInLast3Months": false, + "stars": 470, + "formattedStars": "470", + "license": "MIT License", + "lastRelease": "", + "formattedLastRelease": "" + }, + "Escape-Technologies/graphql-armor": { + "hasCommitsInLast3Months": false, + "stars": 550, + "formattedStars": "1k", + "license": "MIT License", + "lastRelease": "2025-08-22T13:32:40Z", + "formattedLastRelease": "1 month ago" + }, + "ldebruijn/graphql-protect": { + "hasCommitsInLast3Months": false, + "stars": 34, + "formattedStars": "34", + "license": "MIT License", + "lastRelease": "2025-09-09T20:03:39Z", + "formattedLastRelease": "1 month ago" + }, + "graphql-hive/gateway": { + "hasCommitsInLast3Months": false, + "stars": 62, + "formattedStars": "62", + "license": "MIT License", + "lastRelease": "2025-10-13T09:50:34Z", + "formattedLastRelease": "1 week ago" + }, + "microcks/microcks": { + "hasCommitsInLast3Months": false, + "stars": 1725, + "formattedStars": "2k", + "license": "Apache License 2.0", + "lastRelease": "2025-07-21T12:44:11Z", + "formattedLastRelease": "3 months ago" + }, + "glideapps/quicktype": { + "hasCommitsInLast3Months": false, + "stars": 13375, + "formattedStars": "13k", + "license": "Apache License 2.0", + "lastRelease": "", + "formattedLastRelease": "" + }, + "schemathesis/schemathesis": { + "hasCommitsInLast3Months": false, + "stars": 2786, + "formattedStars": "3k", + "license": "MIT License", + "lastRelease": "2025-10-20T22:30:18Z", + "formattedLastRelease": "54 minutes ago" + }, + "wundergraph/cosmo": { + "hasCommitsInLast3Months": false, + "stars": 1097, + "formattedStars": "1k", + "license": "Apache License 2.0", + "lastRelease": "2025-10-20T15:08:25Z", + "formattedLastRelease": "8 hours ago" + } +} \ No newline at end of file diff --git a/scripts/get-github-info/index.ts b/scripts/get-github-info/index.ts new file mode 100644 index 0000000000..bdb29b7d3a --- /dev/null +++ b/scripts/get-github-info/index.ts @@ -0,0 +1 @@ +import "./get-github-info" diff --git a/scripts/get-github-info/last-success.isodate b/scripts/get-github-info/last-success.isodate new file mode 100644 index 0000000000..51a2963d36 --- /dev/null +++ b/scripts/get-github-info/last-success.isodate @@ -0,0 +1 @@ +2025-10-20T23:24:23.459Z \ No newline at end of file diff --git a/scripts/sort-libraries/get-gem-stats.ts b/scripts/sort-libraries/get-gem-stats.ts new file mode 100644 index 0000000000..b3e2373382 --- /dev/null +++ b/scripts/sort-libraries/get-gem-stats.ts @@ -0,0 +1,54 @@ +type GemStatsFetchRespone = { + name: string + downloads: number + version: string + version_created_at: string + version_downloads: number + platform: string + authors: string + info: string + licenses: Array + metadata: { + homepage_uri: string + changelog_uri: string + bug_tracker_uri: string + source_code_uri: string + mailing_list_uri: string + } + yanked: boolean + sha: string + gem_uri: string + homepage_uri: string + wiki_uri: string + documentation_uri: string + mailing_list_uri: string + source_code_uri: string + bug_tracker_uri: string + changelog_uri: string + funding_uri: string + dependencies: { + development: Array + runtime: Array + } +} + +export async function getGemStats(packageName: string): Promise { + try { + const response = await fetch( + `https://rubygems.org/api/v1/gems/${encodeURIComponent(packageName)}.json`, + ) + + if (!response.ok) { + console.warn( + `Error fetching GEM stats for ${packageName}. Status: ${response.status}`, + ) + return 0 + } + + const responseJson: GemStatsFetchRespone = await response.json() + return responseJson.downloads ?? 0 + } catch (error) { + console.error(`Exception fetching GEM stats for ${packageName}:`, error) + return 0 + } +} diff --git a/scripts/sort-libraries/get-github-stats.ts b/scripts/sort-libraries/get-github-stats.ts new file mode 100644 index 0000000000..b5e5ee4af4 --- /dev/null +++ b/scripts/sort-libraries/get-github-stats.ts @@ -0,0 +1,258 @@ +import numbro from "numbro" +import { format as timeago } from "timeago.js" + +type GitHubStatsFetchResponse = + | { + errors: [ + { + extensions: { + value: string + problems: [ + { + path: string + explanation: string + }, + ] + } + locations: [ + { + line: number + column: number + }, + ] + message: string + }, + ] + } + | { + data: { + repositoryOwner: { + repository: { + defaultBranchRef: { + target: { + history: { + edges: [ + { + node: { + author: { + name: string + } + pushedDate: string + } + }, + ] + } + } + } + stargazers: { + totalCount: number + } + updatedAt: string + forkCount: number + pullRequests: { + totalCount: number + } + description: string + licenseInfo: { + name: string + } + releases: { + nodes: [ + { + publishedAt: string + }, + ] + } + tags: { + nodes: [ + { + name: string + target: { + target: { + pushedDate: string + } + } + }, + ] + } + } + } + } + } + +export type GitHubInfo = { + hasCommitsInLast3Months: boolean + stars: number + formattedStars: string + license: string + lastRelease: string + formattedLastRelease: string +} + +type Release = { date: string; formattedDate: string } + +export async function getGitHubStats( + githubRepo: string, +): Promise { + const [owner, repoName] = githubRepo.split("/") + const accessToken = process.env.GITHUB_ACCESS_TOKEN + if (!accessToken) { + console.warn( + `No GITHUB_ACCESS_TOKEN environment variable found. Skipping GitHub stats for ${githubRepo}`, + ) + return + } + const query = /* GraphQL */ ` + fragment defaultBranchRefFragment on Ref { + target { + ... on Commit { + history(since: $since) { + edges { + node { + author { + name + } + pushedDate + } + } + } + } + } + } + query GitHubInfo( + $owner: String! + $repoName: String! + $since: GitTimestamp! + ) { + repositoryOwner(login: $owner) { + repository(name: $repoName) { + defaultBranchRef { + ...defaultBranchRefFragment + } + stargazers { + totalCount + } + updatedAt + forkCount + pullRequests { + totalCount + } + description + licenseInfo { + name + } + releases(first: 1) { + nodes { + publishedAt + } + } + tags: refs( + refPrefix: "refs/tags/" + first: 1 + orderBy: { field: TAG_COMMIT_DATE, direction: DESC } + ) { + nodes { + name + target { + ... on Tag { + target { + ... on Commit { + pushedDate + } + } + } + } + } + } + } + } + } + ` + const lastThreeMonths = new Date() + lastThreeMonths.setMonth(lastThreeMonths.getMonth() - 3) + + try { + const response = await fetch("https://github.com/service/https://api.github.com/graphql", { + method: "POST", + body: JSON.stringify({ + query, + variables: { owner, repoName, since: lastThreeMonths.toISOString() }, + }), + headers: { + Authorization: `Bearer ${accessToken}`, + "Content-Type": "application/json", + }, + }) + + if (!response.ok) { + console.warn( + `Error fetching GitHub stats for ${owner}/${repoName}. Status: ${response.status}`, + ) + return undefined + } + + const responseJson: GitHubStatsFetchResponse = await response.json() + + if ("errors" in responseJson) { + console.warn( + `GitHub GraphQL errors for ${owner}/${repoName}:`, + responseJson.errors, + ) + return undefined + } + + const repo = responseJson.data.repositoryOwner?.repository + if (!repo) { + console.warn(`No GitHub repository found for ${owner}/${repoName}`) + return undefined + } + + const hasCommitsInLast3Months = + repo.defaultBranchRef.target.history.edges.some( + edge => new Date(edge.node.pushedDate) > lastThreeMonths, + ) + const formattedStars = numbro(repo.stargazers.totalCount).format({ + average: true, + }) + + const lastRelease = getLastRelease(repo) + + return { + hasCommitsInLast3Months, + stars: repo.stargazers.totalCount, + formattedStars, + license: repo.licenseInfo?.name ?? "Unknown", + lastRelease: lastRelease?.date ?? "", + formattedLastRelease: lastRelease?.formattedDate ?? "", + } + } catch (error) { + console.error(`Exception fetching GitHub stats for ${githubRepo}:`, error) + return undefined + } +} + +function getLastRelease(repo: any): Release | undefined { + const releases: Release[] = [] + + repo.tags.nodes.forEach((node: any) => { + if (node.target.target?.pushedDate) { + releases.push({ + date: node.target.target.pushedDate, + formattedDate: timeago(node.target.target.pushedDate), + }) + } + }) + + repo.releases.nodes.forEach((node: any) => { + if (node.publishedAt) { + releases.push({ + date: node.publishedAt, + formattedDate: timeago(node.publishedAt), + }) + } + }) + + return releases.sort( + (a, b) => new Date(b.date).getTime() - new Date(a.date).getTime(), + )[0] +} diff --git a/scripts/sort-libraries/get-http-score.ts b/scripts/sort-libraries/get-http-score.ts new file mode 100644 index 0000000000..3c3edd8967 --- /dev/null +++ b/scripts/sort-libraries/get-http-score.ts @@ -0,0 +1,34 @@ +type HttpScoreFetchResponse = { + total: number + pass: number + errors: number + warnings: number +} + +export async function getHttpScore(packageName: string): Promise { + try { + const url = `https://raw.githubusercontent.com/graphql/graphql-http/main/implementations/${encodeURIComponent( + packageName, + )}/report.json` + const response = await fetch(url) + + if (!response.ok) { + if (response.status === 404) { + console.warn( + `Resource not found for package ${packageName} at URL: ${url}`, + ) + } else { + console.warn( + `invalid response from HTTP score for ${packageName}. Status: ${response.status}`, + ) + } + return 0 + } + + const responseJson: HttpScoreFetchResponse = await response.json() + return responseJson.total ?? 0 + } catch (error) { + console.error(`Error fetching HTTP score for ${packageName}:`, error) + return 0 + } +} diff --git a/scripts/sort-libraries/get-npm-stats.ts b/scripts/sort-libraries/get-npm-stats.ts new file mode 100644 index 0000000000..f55889a7fe --- /dev/null +++ b/scripts/sort-libraries/get-npm-stats.ts @@ -0,0 +1,36 @@ +type NpmStatsFetchResponse = + | { + downloads?: number + start: string + end: string + package: string + } + | { error: string } + +export async function getNpmStats(packageName: string): Promise { + try { + const response = await fetch( + `https://api.npmjs.org/downloads/point/last-week/${encodeURIComponent( + packageName, + )}`, + ) + + if (!response.ok) { + console.warn( + `Error fetching NPM stats for ${packageName}. Status: ${response.status}`, + ) + return 0 + } + + const responseJson: NpmStatsFetchResponse = await response.json() + if ("error" in responseJson) { + console.warn(`NPM Stats error for ${packageName}: ${responseJson.error}`) + return 0 + } + + return responseJson.downloads ?? 0 + } catch (error) { + console.error(`Exception fetching NPM stats for ${packageName}:`, error) + return 0 + } +} diff --git a/scripts/sort-libraries/sort-libraries.ts b/scripts/sort-libraries/sort-libraries.ts new file mode 100644 index 0000000000..c6abfba8b6 --- /dev/null +++ b/scripts/sort-libraries/sort-libraries.ts @@ -0,0 +1,77 @@ +import { getGemStats } from "./get-gem-stats" +import { getGitHubStats } from "./get-github-stats" +import { getHttpScore } from "./get-http-score" +import { getNpmStats } from "./get-npm-stats" + +export interface Library { + name: string + description: string + howto: string + url: string + github: string | undefined + npm: string | undefined + gem: string | undefined + sourcePath: string +} + +export async function sortLibs( + libraries: Library[], +): Promise<{ sortedLibs: Library[]; totalStars: number }> { + let totalStars = 0 + const libsWithScores = await Promise.all( + libraries.map(async lib => { + const [npmStats, gemStars, githubStats, httpScore] = await Promise.all([ + lib.npm ? getNpmStats(lib.npm) : undefined, + lib.gem ? getGemStats(lib.gem) : undefined, + lib.github ? getGitHubStats(lib.github) : undefined, + lib.name ? getHttpScore(lib.name) : undefined, + ]) + + const result = { + ...lib, + downloadCount: npmStats ?? gemStars ?? 0, + stars: githubStats?.stars ?? 0, + httpScore: httpScore ?? 0, + ...githubStats, + } + totalStars += result.stars + return result + }), + ) + const sortedLibs = libsWithScores.sort((a, b) => { + let aScore = 0, + bScore = 0 + if (a.downloadCount > b.downloadCount) { + aScore += 36 + } else if (b.downloadCount > a.downloadCount) { + bScore += 36 + } + + if (a.httpScore > b.httpScore) { + aScore += 10 + } else if (b.httpScore > a.httpScore) { + bScore += 10 + } + + if ("hasCommitsInLast3Months" in a && a.hasCommitsInLast3Months) { + aScore += 28 + } + if ("hasCommitsInLast3Months" in b && b.hasCommitsInLast3Months) { + bScore += 28 + } + if (a.stars > b.stars) { + aScore += 36 + } else if (a.stars < b.stars) { + bScore += 36 + } + if (bScore > aScore) { + return 1 + } + if (bScore < aScore) { + return -1 + } + return 0 + }) + + return { sortedLibs, totalStars } +} diff --git a/scripts/sync-sched/count-speakers-without-details.ts b/scripts/sync-sched/count-speakers-without-details.ts new file mode 100644 index 0000000000..c38f6ea164 --- /dev/null +++ b/scripts/sync-sched/count-speakers-without-details.ts @@ -0,0 +1,40 @@ +#!/usr/bin/env tsx + +import { join } from "node:path" +import { readFile } from "node:fs/promises" + +import type { SchedSpeaker } from "@/app/conf/_api/sched-types" + +/** + * We count the number of speakers we didn't sync details for + * to make sure we have social URLs for everybody. + */ +;(async function main() { + try { + const speakersFilePath = join(import.meta.dirname, "speakers.json") + + console.log("Reading speakers.json...") + + const speakersData = await readFile(speakersFilePath, "utf-8") + const speakers: SchedSpeaker[] = JSON.parse(speakersData).speakers + + const speakersWithoutDetails = speakers.filter( + speaker => !speaker["~syncedDetailsAt"], + ) + + console.log(`Total speakers: ${speakers.length}`) + console.log( + `Speakers without ~syncedDetailsAt: ${speakersWithoutDetails.length}`, + ) + + if (speakersWithoutDetails.length > 0) { + console.log("\nSpeakers missing details:") + for (const speaker of speakersWithoutDetails) { + console.log(`- ${speaker.username} (${speaker.name || "No name"})`) + } + } + } catch (error) { + console.error("Error:", error) + process.exit(1) + } +})() diff --git a/scripts/sync-sched/schedule-2023.json b/scripts/sync-sched/schedule-2023.json new file mode 100644 index 0000000000..6bcdc9ba5f --- /dev/null +++ b/scripts/sync-sched/schedule-2023.json @@ -0,0 +1,4323 @@ +[ + { + "event_key": "511231", + "active": "Y", + "pinned": "N", + "name": "Registration & Badge Pick-Up", + "event_start": "2023-09-19 10:00", + "event_end": "2023-09-19 16:30", + "event_type": "Registration + Badge Pick-Up", + "goers": "66", + "seats": "0", + "invite_only": "N", + "venue": "Grand Peninsula Foyer", + "id": "247898ad29d5e594611af3cecf82f5e3", + "venue_id": "1749431", + "event_start_year": "2023", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "19", + "event_start_weekday": "Tuesday", + "event_start_weekday_short": "Tue", + "event_start_time": "10:00am", + "event_end_year": "2023", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "19", + "event_end_weekday": "Tuesday", + "event_end_weekday_short": "Tue", + "event_end_time": "4:30pm", + "start_date": "2023-09-19", + "start_time": "10:00:00", + "start_time_ts": 1695142800, + "end_date": "2023-09-19", + "end_time": "16:30:00", + "description": "" + }, + { + "event_key": "511227", + "active": "Y", + "pinned": "N", + "name": "Unconference Planning Session", + "event_start": "2023-09-19 10:30", + "event_end": "2023-09-19 12:00", + "event_type": "Unconference", + "description": "An unconference is a participant-driven, informal event where attendees collaboratively create the agenda and lead discussions. Unlike the predetermined schedules and speakers of a traditional conference, an unconference allows for spontaneous and dynamic interactions, fostering an open and inclusive learning environment.\n\nHow to Prepare to Attend an Unconference", + "goers": "16", + "seats": "0", + "invite_only": "N", + "venue": "Sandpebble A&B", + "id": "d53044f7df10bcb5a53e6908670c41c1", + "venue_id": "1749449", + "event_start_year": "2023", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "19", + "event_start_weekday": "Tuesday", + "event_start_weekday_short": "Tue", + "event_start_time": "10:30am", + "event_end_year": "2023", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "19", + "event_end_weekday": "Tuesday", + "event_end_weekday_short": "Tue", + "event_end_time": "12:00pm", + "start_date": "2023-09-19", + "start_time": "10:30:00", + "start_time_ts": 1695144600, + "end_date": "2023-09-19", + "end_time": "12:00:00" + }, + { + "event_key": "491989", + "active": "Y", + "pinned": "N", + "name": "Carmen San Diego GraphQL API Federation Challenge: Hunt for the Elusive Master Thief! - LeRenzo Malcom, Miro [Pre-Registration Required]", + "event_start": "2023-09-19 10:30", + "event_end": "2023-09-19 12:00", + "event_type": "Workshops", + "event_subtype": "Spec Fusion", + "description": "Embark on an exciting adventure in the world of GraphQL API federation with a thrilling twist inspired by Carmen San Diego! In this immersive workshop, students will be divided into teams and compete to find Carmen San Diego before anyone else using their GraphQL skills. The workshop starts off with an introduction to GraphQL API federation, where students will learn about the power and flexibility of GraphQL and its federation capabilities. Then the teams will be formed, and the competition scenario will be revealed—finding Carmen San Diego! Each team will create their own HQ and extend the federated graph, adding new services, connections, and data sources to gather clues and track down Carmen. They can also try to thwart other teams by giving them false clues. Real-time collaboration and problem-solving will be crucial to stay ahead. Join us for an unforgettable workshop that brings together technology and adventure, all while honing your GraphQL expertise. Can your team solve the mystery and emerge as the ultimate Carmen San Diego catchers? The race is on!", + "goers": "16", + "seats": "0", + "invite_only": "N", + "venue": "Grand Peninsula G", + "audience": "Beginner", + "geo_area": "Yes", + "id": "88bbc65fe92d08a0404215429f06c113", + "venue_id": "1762202", + "speakers": [ + { + "username": "lerenzo", + "id": "5604312", + "name": "LeRenzo Malcom", + "company": "Miro", + "custom_order": 0 + } + ], + "event_start_year": "2023", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "19", + "event_start_weekday": "Tuesday", + "event_start_weekday_short": "Tue", + "event_start_time": "10:30am", + "event_end_year": "2023", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "19", + "event_end_weekday": "Tuesday", + "event_end_weekday_short": "Tue", + "event_end_time": "12:00pm", + "start_date": "2023-09-19", + "start_time": "10:30:00", + "start_time_ts": 1695144600, + "end_date": "2023-09-19", + "end_time": "12:00:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf23/cb/Workshop_%20Carmen%20SanDiego.pdf", + "name": "Workshop_ Carmen SanDiego.pdf" + } + ] + }, + { + "event_key": "501260", + "active": "Y", + "pinned": "N", + "name": "Rust-Powered Fullstack GraphQL: From Actix-Web & Juniper Server to WASM Yew Client - Yassin Eldeeb, The Guild [Pre-Registration Required]", + "event_start": "2023-09-19 10:30", + "event_end": "2023-09-19 12:00", + "event_type": "Workshops", + "event_subtype": "Beyond Javascript", + "description": "Rust's ecosystem is known for its speed, efficiency, and type-safety. In this hands-on workshop we'll start by setting up a high-performance GraphQL server, all the way to a WASM-powered frontend client. We'll see how the various components interact seamlessly, and understand how Rust provides an edge with its efficiency. Are you ready to explore the robustness of Rust in full-stack GraphQL applications? Join me in this exciting journey!", + "goers": "15", + "seats": "0", + "invite_only": "N", + "venue": "Grand Peninsula F", + "audience": "Intermediate", + "id": "0b5f6bcbfc77f97f4cdc6cdf4a171f82", + "venue_id": "1762200", + "speakers": [ + { + "username": "yassineldeeb94", + "id": "18743822", + "name": "Yassin Eldeeb", + "company": "The Guild", + "custom_order": 0 + } + ], + "event_start_year": "2023", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "19", + "event_start_weekday": "Tuesday", + "event_start_weekday_short": "Tue", + "event_start_time": "10:30am", + "event_end_year": "2023", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "19", + "event_end_weekday": "Tuesday", + "event_end_weekday_short": "Tue", + "event_end_time": "12:00pm", + "start_date": "2023-09-19", + "start_time": "10:30:00", + "start_time_ts": 1695144600, + "end_date": "2023-09-19", + "end_time": "12:00:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf23/ac/SF%20GraphQL%20Conf%202023.pdf", + "name": "SF GraphQL Conf 2023.pdf" + } + ] + }, + { + "event_key": "1", + "active": "Y", + "pinned": "N", + "name": "Safely Evolve Your (Federated) GraphQL Schema with GraphQL Hive - Laurin Quast & Kamil Kisiela, The Guild [Pre-Registration Required]", + "event_start": "2023-09-19 10:30", + "event_end": "2023-09-19 12:00", + "event_type": "Workshops", + "description": "Do you struggle with unexpected breaking changes of your GraphQL clients? Do you want to know how your GraphQL schema is used and when it is safe to remove deprecated fields? Learn all about the open-source platform GraphQL Hive and its recommended workflow for scaling GraphQL across teams and organisations, including a full example of integrating Hive within your CI/CD pipeline on GitHub Actions. Laurin will teach you all about breaking changes, breaking change detection, and conditional breaking changes.", + "goers": "47", + "seats": "0", + "invite_only": "N", + "venue": "Grand Peninsula E", + "geo_area": "Yes", + "id": "55dd5ef56bd778955509d08ea81903ea", + "venue_id": "1762196", + "speakers": [ + { + "username": "laurinquast", + "id": "18743819", + "name": "Laurin Quast", + "company": "The Guild", + "custom_order": 0 + }, + { + "username": "kamilkisiela", + "id": "19082388", + "name": "Kamil Kisiela", + "company": "The Guild", + "custom_order": 1 + } + ], + "event_start_year": "2023", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "19", + "event_start_weekday": "Tuesday", + "event_start_weekday_short": "Tue", + "event_start_time": "10:30am", + "event_end_year": "2023", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "19", + "event_end_weekday": "Tuesday", + "event_end_weekday_short": "Tue", + "event_end_time": "12:00pm", + "start_date": "2023-09-19", + "start_time": "10:30:00", + "start_time_ts": 1695144600, + "end_date": "2023-09-19", + "end_time": "12:00:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf23/c9/GraphQL%20Hive%20Workshop.pdf", + "name": "GraphQL Hive Workshop.pdf" + } + ] + }, + { + "event_key": "8", + "active": "Y", + "pinned": "N", + "name": "Lunch", + "event_start": "2023-09-19 12:00", + "event_end": "2023-09-19 13:00", + "event_type": "Breaks", + "goers": "62", + "seats": "0", + "invite_only": "N", + "venue": "Grand Peninsula Foyer", + "id": "38cb4033d5cfed2d5b508f08374ebe9b", + "venue_id": "1749431", + "event_start_year": "2023", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "19", + "event_start_weekday": "Tuesday", + "event_start_weekday_short": "Tue", + "event_start_time": "12:00pm", + "event_end_year": "2023", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "19", + "event_end_weekday": "Tuesday", + "event_end_weekday_short": "Tue", + "event_end_time": "1:00pm", + "start_date": "2023-09-19", + "start_time": "12:00:00", + "start_time_ts": 1695150000, + "end_date": "2023-09-19", + "end_time": "13:00:00", + "description": "" + }, + { + "event_key": "511229", + "active": "Y", + "pinned": "N", + "name": "Unconference Discussion Session #1", + "event_start": "2023-09-19 13:00", + "event_end": "2023-09-19 14:30", + "event_type": "Unconference", + "description": "An unconference is a participant-driven, informal event where attendees collaboratively create the agenda and lead discussions. Unlike the predetermined schedules and speakers of a traditional conference, an unconference allows for spontaneous and dynamic interactions, fostering an open and inclusive learning environment.\n\nHow to Prepare to Attend an Unconference", + "goers": "24", + "seats": "0", + "invite_only": "N", + "venue": "Sandpebble A&B", + "id": "6543e60efc3f0c20d24a40cffef29558", + "venue_id": "1749449", + "event_start_year": "2023", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "19", + "event_start_weekday": "Tuesday", + "event_start_weekday_short": "Tue", + "event_start_time": "1:00pm", + "event_end_year": "2023", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "19", + "event_end_weekday": "Tuesday", + "event_end_weekday_short": "Tue", + "event_end_time": "2:30pm", + "start_date": "2023-09-19", + "start_time": "13:00:00", + "start_time_ts": 1695153600, + "end_date": "2023-09-19", + "end_time": "14:30:00" + }, + { + "event_key": "2", + "active": "Y", + "pinned": "N", + "name": "GraphQL Mesh - A Federated Gateway for Any API Protocol - GraphQL, OpenAPI, gRPC and More - Arda Tanrikulu & Gil Gardosh, The Guild [Pre-Registration Required]", + "event_start": "2023-09-19 13:00", + "event_end": "2023-09-19 14:30", + "event_type": "Workshops", + "description": "The GraphQL Mesh platform changes a lot of the traditional ideas about GraphQL and its relationship with other API protocols.\n\nIt can automatically generate a GraphQL API from OpenAPI/Swagger, gRPC, SOAP, oData and many other sources/protocols without changing the source.\n\nThe Guild has used GraphQL Mesh and its individual capabilities to help developers integrate and adopt GraphQL in places they never thought were possible and in extreme quickness, thanks to the fact that\nYou don't need to migrate your existing none GraphQL services in order to benefit from GraphQL You can federate any service, even if its not GraphQL Transform and manipulate services data (Naming Conventions, filter, middlewares) Add powerful gateway plugins (caching, tracing, security) Create a powerful gateway and run it anywhere (Cloudflare Workers, Deno, etc...) And even run it all on the client side\nIn this workshop, we will go through the many novel ideas behind GraphQL Mesh, see them in action and learn how to use this complete API platform today on your existing codebase.\n\nWe will leave time for an open Q&A session where we can talk in-depth about your current setups and how you could leverage The Guild's ecosystem of tools.", + "goers": "48", + "seats": "0", + "invite_only": "N", + "venue": "Grand Peninsula F&G", + "id": "de9b490bff0d1e234ec4e19bc03392b5", + "venue_id": "1762208", + "speakers": [ + { + "username": "ardatanrikulu", + "id": "18982310", + "name": "Arda Tanrıkulu", + "company": "The Guild", + "custom_order": 0 + }, + { + "username": "gilgardosh", + "id": "19070448", + "name": "Gil Gardosh", + "company": "The Guild", + "custom_order": 1 + } + ], + "event_start_year": "2023", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "19", + "event_start_weekday": "Tuesday", + "event_start_weekday_short": "Tue", + "event_start_time": "1:00pm", + "event_end_year": "2023", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "19", + "event_end_weekday": "Tuesday", + "event_end_weekday_short": "Tue", + "event_end_time": "2:30pm", + "start_date": "2023-09-19", + "start_time": "13:00:00", + "start_time_ts": 1695153600, + "end_date": "2023-09-19", + "end_time": "14:30:00" + }, + { + "event_key": "488403", + "active": "Y", + "pinned": "N", + "name": "Mr. Toad’s Wild Ride: A Rollicking, Declarative GraphQL Workshop with Envoy and Kubernetes - Jim Barton & Adam Sayah, Solo.io [Pre-Registration Required]", + "event_start": "2023-09-19 13:00", + "event_end": "2023-09-19 14:30", + "event_type": "Workshops", + "event_subtype": "Platform and Backend", + "description": "Many GraphQL adopters today use both API gateways and separate GraphQL servers to secure and route traffic to their service endpoints. GraphQL provides a consistent API for clients, but it's expensive to build and operate distinct GraphQL servers. Developers are often required to write custom code to provide platform features like security, caching, and resilience. What if there were another way? What if you could meld GraphQL server capabilities into an Envoy gateway without separate server deployments? And without disturbing upstream application services? In this fast-paced, hands-on workshop, every attendee can use their own sandboxed environment to explore these topics together: • Discovery: Inspect existing service contracts and derive GraphQL schema. • Declarative: Create IaC resolvers that consume OpenAPI services. • Stitching: Execute GraphQL queries across multiple services with a unified supergraph. • Gateway Integration: Use declarative policies to mix in gateway features like authNZ and data loss prevention. Buckle your seat belts! This Wild Ride will help you accelerate GraphQL adoption using infrastructure-as-code principles in a cloud-native environment.", + "goers": "18", + "seats": "0", + "invite_only": "N", + "venue": "Grand Peninsula E", + "audience": "Beginner", + "geo_area": "Yes", + "id": "f11fd521e00f5b8eedf463781f893c5e", + "venue_id": "1762196", + "speakers": [ + { + "username": "jim.barton", + "id": "12615290", + "name": "Jim Barton", + "company": "Solo.io", + "custom_order": 0 + }, + { + "username": "adam.sayah", + "id": "12615405", + "name": "Adam Sayah", + "company": "Solo.io", + "custom_order": 1 + } + ], + "event_start_year": "2023", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "19", + "event_start_weekday": "Tuesday", + "event_start_weekday_short": "Tue", + "event_start_time": "1:00pm", + "event_end_year": "2023", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "19", + "event_end_weekday": "Tuesday", + "event_end_weekday_short": "Tue", + "event_end_time": "2:30pm", + "start_date": "2023-09-19", + "start_time": "13:00:00", + "start_time_ts": 1695153600, + "end_date": "2023-09-19", + "end_time": "14:30:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf23/35/GraphQLConf%202023%20Mr%20Toad%20Workshop.pdf", + "name": "GraphQLConf 2023 Mr Toad Workshop.pdf" + } + ] + }, + { + "event_key": "10", + "active": "Y", + "pinned": "N", + "name": "Break", + "event_start": "2023-09-19 14:30", + "event_end": "2023-09-19 15:00", + "event_type": "Breaks", + "goers": "53", + "seats": "0", + "invite_only": "N", + "venue": "Grand Peninsula Foyer", + "id": "61b9efc6ff8e0f295be6c65c08871c23", + "venue_id": "1749431", + "event_start_year": "2023", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "19", + "event_start_weekday": "Tuesday", + "event_start_weekday_short": "Tue", + "event_start_time": "2:30pm", + "event_end_year": "2023", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "19", + "event_end_weekday": "Tuesday", + "event_end_weekday_short": "Tue", + "event_end_time": "3:00pm", + "start_date": "2023-09-19", + "start_time": "14:30:00", + "start_time_ts": 1695159000, + "end_date": "2023-09-19", + "end_time": "15:00:00", + "description": "" + }, + { + "event_key": "511228", + "active": "Y", + "pinned": "N", + "name": "Unconference Discussion Session #2", + "event_start": "2023-09-19 15:00", + "event_end": "2023-09-19 16:30", + "event_type": "Unconference", + "description": "An unconference is a participant-driven, informal event where attendees collaboratively create the agenda and lead discussions. Unlike the predetermined schedules and speakers of a traditional conference, an unconference allows for spontaneous and dynamic interactions, fostering an open and inclusive learning environment.\n\nHow to Prepare to Attend an Unconference", + "goers": "15", + "seats": "0", + "invite_only": "N", + "venue": "Sandpebble A&B", + "id": "edcb92ba1f2478b935124038ec1b20f0", + "venue_id": "1749449", + "event_start_year": "2023", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "19", + "event_start_weekday": "Tuesday", + "event_start_weekday_short": "Tue", + "event_start_time": "3:00pm", + "event_end_year": "2023", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "19", + "event_end_weekday": "Tuesday", + "event_end_weekday_short": "Tue", + "event_end_time": "4:30pm", + "start_date": "2023-09-19", + "start_time": "15:00:00", + "start_time_ts": 1695160800, + "end_date": "2023-09-19", + "end_time": "16:30:00" + }, + { + "event_key": "4", + "active": "Y", + "pinned": "N", + "name": "Build and Deploy Instant GraphQL APIs to the Edge - Jamie Barton, Grafbase [Pre-Registration Required]", + "event_start": "2023-09-19 15:00", + "event_end": "2023-09-19 16:30", + "event_type": "Workshops", + "description": "Learn how to generate instant GraphQL APIs using a data source connector (GraphQL and non-GraphQL sources), extend and join them both with custom resolvers and deploy to the edge without leaving the code editor.", + "goers": "39", + "seats": "0", + "invite_only": "N", + "venue": "Grand Peninsula F&G", + "id": "295679e18701aa2be84f329db1118637", + "venue_id": "1762208", + "speakers": [ + { + "username": "jamie855", + "id": "18743804", + "name": "Jamie Barton", + "company": "Grafbase", + "custom_order": 0 + } + ], + "event_start_year": "2023", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "19", + "event_start_weekday": "Tuesday", + "event_start_weekday_short": "Tue", + "event_start_time": "3:00pm", + "event_end_year": "2023", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "19", + "event_end_weekday": "Tuesday", + "event_end_weekday_short": "Tue", + "event_end_time": "4:30pm", + "start_date": "2023-09-19", + "start_time": "15:00:00", + "start_time_ts": 1695160800, + "end_date": "2023-09-19", + "end_time": "16:30:00" + }, + { + "event_key": "511225", + "active": "Y", + "pinned": "N", + "name": "RSC + GraphQL + RedwoodJS: A New Era in Full-Stack Development - Amy Dutton, RedwoodJS [Pre-Registration Required]", + "event_start": "2023-09-19 15:00", + "event_end": "2023-09-19 16:30", + "event_type": "Workshops", + "event_subtype": "GraphQL and Data", + "description": "How can you ensure that your development workflow and process can accommodate growth? With the potential for more choices and complexity introduced by React Server Components, is it possible to avoid “analysis paralysis” due to more options? In this 1-2 hour workshop, we will explore a new workflow for dynamic full-stack applications using React Server Components (RSC) and GraphQL. Our focus will be on how RSC and GraphQL can co-exist and complement each other, allowing data to flow through your application and enabling it to scale and evolve as more features are added. We will cover server-side fetching with React Server components, how to use Redwood cells, and migrating to fragments. Additionally, we’ll review GraphQL fundamentals inside Redwood, including security concerns and best practices, directives, and authentication. You’ll leave this workshop with a workflow and process for designing and building full-stack applications in Redwood with scalability and simplicity.", + "goers": "29", + "seats": "0", + "invite_only": "N", + "venue": "Grand Peninsula E", + "audience": "Intermediate", + "id": "b38ed79c29a2d0602160d9407bfa3422", + "venue_id": "1762196", + "speakers": [ + { + "username": "amy1908", + "id": "16832327", + "name": "Amy Dutton", + "company": "RedwoodJS", + "custom_order": 0 + } + ], + "event_start_year": "2023", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "19", + "event_start_weekday": "Tuesday", + "event_start_weekday_short": "Tue", + "event_start_time": "3:00pm", + "event_end_year": "2023", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "19", + "event_end_weekday": "Tuesday", + "event_end_weekday_short": "Tue", + "event_end_time": "4:30pm", + "start_date": "2023-09-19", + "start_time": "15:00:00", + "start_time_ts": 1695160800, + "end_date": "2023-09-19", + "end_time": "16:30:00" + }, + { + "event_key": "511240", + "active": "Y", + "pinned": "N", + "name": "Light Continental Breakfast", + "event_start": "2023-09-20 07:30", + "event_end": "2023-09-20 09:00", + "event_type": "Breaks", + "goers": "55", + "seats": "0", + "invite_only": "N", + "venue": "Grand Peninsula Foyer", + "id": "66e332f155e04efea896d5bd5dcd2ba5", + "venue_id": "1749431", + "event_start_year": "2023", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "20", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "7:30am", + "event_end_year": "2023", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "20", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "9:00am", + "start_date": "2023-09-20", + "start_time": "07:30:00", + "start_time_ts": 1695220200, + "end_date": "2023-09-20", + "end_time": "09:00:00", + "description": "" + }, + { + "event_key": "511230", + "active": "Y", + "pinned": "N", + "name": "Registration & Badge Pick-Up", + "event_start": "2023-09-20 07:30", + "event_end": "2023-09-20 18:30", + "event_type": "Registration + Badge Pick-Up", + "goers": "28", + "seats": "0", + "invite_only": "N", + "venue": "Grand Peninsula Foyer", + "id": "9836184d78d14978c0c49f1e2b900bb9", + "venue_id": "1749431", + "event_start_year": "2023", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "20", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "7:30am", + "event_end_year": "2023", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "20", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "6:30pm", + "start_date": "2023-09-20", + "start_time": "07:30:00", + "start_time_ts": 1695220200, + "end_date": "2023-09-20", + "end_time": "18:30:00", + "description": "" + }, + { + "event_key": "20", + "active": "Y", + "pinned": "N", + "name": "Welcome Remarks - Lee Byron, GraphQL Foundation", + "event_start": "2023-09-20 09:00", + "event_end": "2023-09-20 09:15", + "event_type": "Keynote Sessions", + "goers": "80", + "seats": "0", + "invite_only": "N", + "venue": "Grand Peninsula A,B,C", + "id": "94d334f99906d3fc2669fc804e5fae41", + "venue_id": "1749452", + "speakers": [ + { + "username": "lee_byron.25krdom6", + "id": "18769956", + "name": "Lee Byron", + "company": "GraphQL Foundation", + "custom_order": 0 + } + ], + "event_start_year": "2023", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "20", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "9:00am", + "event_end_year": "2023", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "20", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "9:15am", + "start_date": "2023-09-20", + "start_time": "09:00:00", + "start_time_ts": 1695225600, + "end_date": "2023-09-20", + "end_time": "09:15:00", + "description": "" + }, + { + "event_key": "21", + "active": "Y", + "pinned": "N", + "name": "8 Years of GraphQL: Unraveling the Trade-Offs - Marc-Andre Giroux, Author of Production Ready GraphQL, GraphQL TSC", + "event_start": "2023-09-20 09:15", + "event_end": "2023-09-20 09:35", + "event_type": "Keynote Sessions", + "description": "In the world of GraphQL, there's been a whirlwind of choices over the past 8 years: Federation or GraphQL Monolith? Code-first or SDL-first? What's the best way to load data? In this session, we'll dive into these hot topics, peel back the layers, and chat about what works at scale and some hard-earned lessons.", + "goers": "70", + "seats": "0", + "invite_only": "N", + "venue": "Grand Peninsula A,B,C", + "id": "017d9954f1be1c7e2ab2696c2abe6b9b", + "venue_id": "1749452", + "speakers": [ + { + "username": "mgiroux7", + "id": "19075775", + "name": "Marc-Andre Giroux", + "company": "Netflix", + "custom_order": 0 + } + ], + "event_start_year": "2023", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "20", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "9:15am", + "event_end_year": "2023", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "20", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "9:35am", + "start_date": "2023-09-20", + "start_time": "09:15:00", + "start_time_ts": 1695226500, + "end_date": "2023-09-20", + "end_time": "09:35:00" + }, + { + "event_key": "22", + "active": "Y", + "pinned": "N", + "name": "Evolution of Application Networking Patterns with GraphQL - Keith Babo, Solo.io.", + "event_start": "2023-09-20 09:35", + "event_end": "2023-09-20 09:40", + "event_type": "Keynote Sessions", + "description": "As the adoption of GraphQL has grown, so too have the prevailing patterns for how GraphQL APIs are developed and deployed. Gone are the days where every GraphQL API was a development task to code, deploy, and manage GraphQL middleware connected to your data sources. Increasingly, GraphQL is supported as a native API for data sources, integrated directly in gateway routers and application sidecars, and provided directly in edge compute platforms and CDN providers. While this level of optimization is common as application protocols and languages reach widespread adoption, it’s critically important to understand the best practices and patterns for how GraphQL should be used at each layer of your application networking architecture. This talk will provide a survey of existing and emerging trends for application networking architectures with GraphQL, providing concrete examples and advice on how to build scalable and performant architectures for your GraphQL APIs.", + "goers": "64", + "seats": "0", + "invite_only": "N", + "venue": "Grand Peninsula A,B,C", + "id": "b84ea942d55fb7406e53e3af0c78017e", + "venue_id": "1749452", + "speakers": [ + { + "username": "keith.babo", + "id": "19071264", + "name": "Keith Babo", + "company": "Solo.io", + "custom_order": 0 + } + ], + "event_start_year": "2023", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "20", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "9:35am", + "event_end_year": "2023", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "20", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "9:40am", + "start_date": "2023-09-20", + "start_time": "09:35:00", + "start_time_ts": 1695227700, + "end_date": "2023-09-20", + "end_time": "09:40:00" + }, + { + "event_key": "23", + "active": "Y", + "pinned": "N", + "name": "The “Right Size” For GraphQL - Theo Browne, Ping Labs", + "event_start": "2023-09-20 09:40", + "event_end": "2023-09-20 10:00", + "event_type": "Keynote Sessions", + "description": "GraphQL ushered in a new era of DX. It challenged developers to think more about the relationships between their servers and clients.\n\nThis innovation sparked a lot of innovation outside of GraphQL, from better OpenAPI tools to tRPC to React Server Components. There are more options than ever before. Is GraphQL still the right choice?\n\nYes. Sometimes. Let’s talk about the “right size” and fit for GraphQL.", + "goers": "68", + "seats": "0", + "invite_only": "N", + "venue": "Grand Peninsula A,B,C", + "id": "b57a1a6027fdab59c05c42c9d0515e71", + "venue_id": "1749452", + "speakers": [ + { + "username": "theo93", + "id": "19108367", + "name": "Theo Browne", + "company": "Ping Labs", + "custom_order": 0 + } + ], + "event_start_year": "2023", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "20", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "9:40am", + "event_end_year": "2023", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "20", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "10:00am", + "start_date": "2023-09-20", + "start_time": "09:40:00", + "start_time_ts": 1695228000, + "end_date": "2023-09-20", + "end_time": "10:00:00" + }, + { + "event_key": "24", + "active": "Y", + "pinned": "N", + "name": "Spoiled for Choice: Picking the Right Federation Technique for Your Project - Bryan Robinson, Hygraph", + "event_start": "2023-09-20 10:00", + "event_end": "2023-09-20 10:05", + "event_type": "Keynote Sessions", + "description": "Federation is a hot topic right now. Whether it’s Apollo, GraphQL Mesh, Platform-level services, Content Federation, or one of many other philosophies, we’re seeing everyone talking about API federation. There’s no singular right answer for your project. Instead, it’s a developer’s best friend response: It Depends. In this talk, we’ll go over the various techniques to federate your API and which one is right for your project and team.", + "goers": "69", + "seats": "0", + "invite_only": "N", + "venue": "Grand Peninsula A,B,C", + "geo_area": "Yes", + "id": "2b7518a6d8f2b72122c17beb92af8c89", + "venue_id": "1749452", + "speakers": [ + { + "username": "bryan.robinson2", + "id": "19076363", + "name": "Bryan Robinson", + "company": "Hygraph", + "custom_order": 0 + } + ], + "event_start_year": "2023", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "20", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "10:00am", + "event_end_year": "2023", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "20", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "10:05am", + "start_date": "2023-09-20", + "start_time": "10:00:00", + "start_time_ts": 1695229200, + "end_date": "2023-09-20", + "end_time": "10:05:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf23/a9/Spoiled%20for%20choice%20(sent).pptx.pdf", + "name": "Spoiled for choice (sent).pptx.pdf" + } + ] + }, + { + "event_key": "25", + "active": "Y", + "pinned": "N", + "name": "Open Federation - Open Remote Schema Specifications with Other Specs (OpenAPI, etc.) - Uri Goldshtein, The Guild", + "event_start": "2023-09-20 10:05", + "event_end": "2023-09-20 10:15", + "event_type": "Keynote Sessions", + "description": "In order to have a thriving ecosystem, and for you to choose your solutions and stack for the future, with the worry of a vendor lock, we must have open standards and specs across all of our architecture and solutions.\n\nLet's talk about the parts that weren't open till today and see how we are tackling these parts with collaborations from many different GraphQL Vendors across the whole ecosystem.", + "goers": "71", + "seats": "0", + "invite_only": "N", + "venue": "Grand Peninsula A,B,C", + "id": "e29bf518adeb99b2319fa8cb70d8f445", + "venue_id": "1749452", + "speakers": [ + { + "username": "uri_goldshtein.23xujj9a", + "id": "14900013", + "name": "Uri Goldshtein", + "company": "The Guild", + "custom_order": 0 + } + ], + "event_start_year": "2023", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "20", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "10:05am", + "event_end_year": "2023", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "20", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "10:15am", + "start_date": "2023-09-20", + "start_time": "10:05:00", + "start_time_ts": 1695229500, + "end_date": "2023-09-20", + "end_time": "10:15:00" + }, + { + "event_key": "26", + "active": "Y", + "pinned": "N", + "name": "Closing Remarks - Lee Byron, GraphQL Foundation", + "event_start": "2023-09-20 10:15", + "event_end": "2023-09-20 10:30", + "event_type": "Keynote Sessions", + "goers": "66", + "seats": "0", + "invite_only": "N", + "venue": "Grand Peninsula A,B,C", + "id": "80869c56bb59f51de6ac8468c18eecdc", + "venue_id": "1749452", + "speakers": [ + { + "username": "lee_byron.25krdom6", + "id": "18769956", + "name": "Lee Byron", + "company": "GraphQL Foundation", + "custom_order": 0 + } + ], + "event_start_year": "2023", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "20", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "10:15am", + "event_end_year": "2023", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "20", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "10:30am", + "start_date": "2023-09-20", + "start_time": "10:15:00", + "start_time_ts": 1695230100, + "end_date": "2023-09-20", + "end_time": "10:30:00", + "description": "" + }, + { + "event_key": "16", + "active": "Y", + "pinned": "N", + "name": "Break", + "event_start": "2023-09-20 10:30", + "event_end": "2023-09-20 10:50", + "event_type": "Breaks", + "goers": "42", + "seats": "0", + "invite_only": "N", + "venue": "Grand Peninsula D", + "id": "c6cba5c5a91fb3f916acec7de9692bd7", + "venue_id": "1749440", + "event_start_year": "2023", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "20", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "10:30am", + "event_end_year": "2023", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "20", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "10:50am", + "start_date": "2023-09-20", + "start_time": "10:30:00", + "start_time_ts": 1695231000, + "end_date": "2023-09-20", + "end_time": "10:50:00", + "description": "" + }, + { + "event_key": "511234", + "active": "Y", + "pinned": "N", + "name": "Sponsor Showcase", + "event_start": "2023-09-20 10:30", + "event_end": "2023-09-20 19:00", + "event_type": "Sponsor Showcase", + "goers": "24", + "seats": "0", + "invite_only": "N", + "venue": "Grand Peninsula D", + "id": "77623920b158a75435d48896a8d56b35", + "venue_id": "1749440", + "event_start_year": "2023", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "20", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "10:30am", + "event_end_year": "2023", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "20", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "7:00pm", + "start_date": "2023-09-20", + "start_time": "10:30:00", + "start_time_ts": 1695231000, + "end_date": "2023-09-20", + "end_time": "19:00:00", + "description": "" + }, + { + "event_key": "5", + "active": "Y", + "pinned": "N", + "name": "Can GraphQL be FAIR? - Pascal Heus, AI/Data Lead, Postman", + "event_start": "2023-09-20 10:50", + "event_end": "2023-09-20 11:20", + "event_type": "Session Presentations", + "description": "Join us for an exciting  presentation that explores the intersection of Findable-Accessible-Interoperable-Reusable (FAIR) data and GraphQL.\n\n(FAIR)[https://www.go-fair.org/fair-principles/] is a set of principles that have been endorsed by the data producers, custodians, researchers, and scientific communities worldwide, emphasizing the importance of machine-actionability, metadata, unique identifiers, standardization, and related best practices. GraphQL, as a groundbreaking data query language and API, is ideally positioned to support such principles.\n\nIn this talk, we will provide an overview of FAIR and open the discussion around potential integration and synergies with GraphQL to help turn the FAIR vision into reality. Such integration would also expose GraphQL to new audiences and drive its adoption.\n\nAs a bonus topic, we will also explore the potential relationship and synergies between GraphQL and SPARQL, the RDF Query Language, such as exposing SPARQL endpoints as GraphQL APIs and integrating semantic RDF data into the GraphQL data graph.", + "goers": "20", + "seats": "0", + "invite_only": "N", + "venue": "Grand Peninsula F&G", + "geo_area": "Yes", + "id": "c915230f50de5c93eb5c2bbbee3610e6", + "venue_id": "1762208", + "speakers": [ + { + "username": "plgah", + "id": "15289322", + "name": "Pascal Heus", + "company": "Postman", + "custom_order": 0 + } + ], + "event_start_year": "2023", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "20", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "10:50am", + "event_end_year": "2023", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "20", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "11:20am", + "start_date": "2023-09-20", + "start_time": "10:50:00", + "start_time_ts": 1695232200, + "end_date": "2023-09-20", + "end_time": "11:20:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf23/8e/202309_GraphQL_PH_FAIR.pdf", + "name": "202309_GraphQL_PH_FAIR.pdf" + } + ] + }, + { + "event_key": "474923", + "active": "Y", + "pinned": "N", + "name": "GraphQL Security Vulnerabilities in the Wild - Antoine Carossio & Tristan Kalos, Escape", + "event_start": "2023-09-20 10:50", + "event_end": "2023-09-20 11:20", + "event_type": "Session Presentations", + "event_subtype": "GraphQL Security", + "description": "Join Escape's co-founders Tristan Kalos and Antoine Carossio, leaders in GraphQL Security Testing, for an incisive look at GraphQL vulnerabilities. This groundbreaking research, involving a scan of over 1500 GraphQL endpoints, revealed a staggering 46,000+ security issues and sensitive data leaks, all accessible without authentication and with 10% classified as critical. In this session, Tristan and Antoine will share their unique testing methodology and delve into the most common GraphQL vulnerabilities unearthed during their research. They'll expose GraphQL-specific vulnerabilities, including complexity issues and schema leaks, alongside persistent standard API security threats like injections and server errors. They'll also highlight the often-underestimated problem of data leaks, including sensitive personal information and tokens. But, they won't leave you in the trenches; they'll showcase practical remediation strategies, introducing tools like GraphQL Armor and a handy security checklist for developers. Don't miss this crucial session at the GraphQL Conf 2023.", + "goers": "35", + "seats": "0", + "invite_only": "N", + "venue": "Grand Peninsula A,B,C", + "audience": "Beginner", + "id": "5bf24cd6483a63e62a2276fe38effb82", + "venue_id": "1749452", + "speakers": [ + { + "username": "antoine.carossio", + "id": "18743834", + "name": "Antoine Carossio", + "company": "Escape.tech", + "custom_order": 0 + }, + { + "username": "tristan119", + "id": "19011005", + "name": "Tristan Kalos", + "company": "Escape", + "custom_order": 1 + } + ], + "event_start_year": "2023", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "20", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "10:50am", + "event_end_year": "2023", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "20", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "11:20am", + "start_date": "2023-09-20", + "start_time": "10:50:00", + "start_time_ts": 1695232200, + "end_date": "2023-09-20", + "end_time": "11:20:00" + }, + { + "event_key": "496594", + "active": "Y", + "pinned": "N", + "name": "The Future of Efficiency Is Here: Add Planning to Your Schema! - Benjie Gillam, Graphile", + "event_start": "2023-09-20 10:50", + "event_end": "2023-09-20 11:20", + "event_type": "Session Presentations", + "event_subtype": "Platform and Backend", + "description": "Discover an entirely new approach to GraphQL execution that enables engineers to build next-level efficiency into new or existing GraphQL APIs – improving application performance, reducing operational costs, and delivering delightful user experiences. Learn how, by using a declarative analog to resolvers, your schema can gain a full understanding of the incoming GraphQL request and optimize communications with your business logic, enabling fewer and more efficient operations against your backend services and data sources. A passion project of one of the top contributors to the GraphQL specification, this MIT-licensed open source technology will support JavaScript at launch and, with the help of the community, is hopefully coming to other programming languages soon!", + "goers": "56", + "seats": "0", + "invite_only": "N", + "venue": "Grand Peninsula E", + "audience": "Intermediate", + "geo_area": "Yes", + "id": "275443caa2eda5df06699b724efa533c", + "venue_id": "1762196", + "speakers": [ + { + "username": "benjie3", + "id": "18743846", + "name": "Benjie Gillam", + "company": "Graphile", + "custom_order": 0 + } + ], + "event_start_year": "2023", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "20", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "10:50am", + "event_end_year": "2023", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "20", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "11:20am", + "start_date": "2023-09-20", + "start_time": "10:50:00", + "start_time_ts": 1695232200, + "end_date": "2023-09-20", + "end_time": "11:20:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf23/41/Future_of_Efficiency.pdf", + "name": "Future_of_Efficiency.pdf" + } + ] + }, + { + "event_key": "496479", + "active": "Y", + "pinned": "N", + "name": "GraphQL Fusion: Rethinking Distributed GraphQL - Michael Staib, ChilliCream Inc", + "event_start": "2023-09-20 11:30", + "event_end": "2023-09-20 12:00", + "event_type": "Session Presentations", + "event_subtype": "GraphQL in Production", + "description": "In this talk, we're unpacking GraphQL Fusion, a new approach that makes building distributed GraphQL APIs easier. We'll explore how this approach lets your teams work independently by owning different parts of the company's graph and cover how you can reshape subgraphs to follow your company's rules. Come learn about this powerful tool that brings efficiency and customization to your GraphQL operations.", + "goers": "59", + "seats": "0", + "invite_only": "N", + "venue": "Grand Peninsula F&G", + "audience": "Intermediate", + "id": "4a4e842d1cd0c06083f484d31225abd1", + "venue_id": "1762208", + "speakers": [ + { + "username": "michael_staib.23xujj9p", + "id": "14900031", + "name": "Michael Staib", + "company": "ChilliCream", + "custom_order": 0 + } + ], + "event_start_year": "2023", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "20", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "11:30am", + "event_end_year": "2023", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "20", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "12:00pm", + "start_date": "2023-09-20", + "start_time": "11:30:00", + "start_time_ts": 1695234600, + "end_date": "2023-09-20", + "end_time": "12:00:00" + }, + { + "event_key": "501216", + "active": "Y", + "pinned": "N", + "name": "The New GraphiQL and the Future of Open GraphQL IDEs - Dimitri Postolov, The Guild; Thomas Heyenbrock, Stellate", + "event_start": "2023-09-20 11:30", + "event_end": "2023-09-20 12:00", + "event_type": "Session Presentations", + "event_subtype": "GraphQL Clients", + "description": "Since we’ve joined the GraphiQL maintainers team, we’ve been shipping many new features and improvements to GraphiQL itself, its components and the language server. In this talk, we will talk about the wonderful collaborative work of the GraphiQL team, sharing work between many different GraphQL companies working together, show all the recent new features that we added and show cool new upcoming features from the GraphiQL roadmap you can already try out and give feedback today!", + "goers": "34", + "seats": "0", + "invite_only": "N", + "venue": "Grand Peninsula E", + "audience": "Beginner", + "id": "e0985f6bdb4bbf07a5ca5ba72fbcc39c", + "venue_id": "1762196", + "speakers": [ + { + "username": "thomas.heyenbrock", + "id": "14989332", + "name": "Thomas Heyenbrock", + "company": "Stellate", + "custom_order": 0 + }, + { + "username": "en3m", + "id": "18743843", + "name": "Dimitri Postolov", + "company": "The Guild", + "custom_order": 1 + } + ], + "event_start_year": "2023", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "20", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "11:30am", + "event_end_year": "2023", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "20", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "12:00pm", + "start_date": "2023-09-20", + "start_time": "11:30:00", + "start_time_ts": 1695234600, + "end_date": "2023-09-20", + "end_time": "12:00:00" + }, + { + "event_key": "511243", + "active": "Y", + "pinned": "N", + "name": "Unlocking Insights: Navigating the World of GraphQL Observability - Eitan Joffe, Inigo", + "event_start": "2023-09-20 11:30", + "event_end": "2023-09-20 12:00", + "event_type": "Session Presentations", + "description": "In this talk we'll take a deep dive into the world of GraphQL analytics and observability.\nDiscover what sets it apart from conventional APIs and uncover the valuable answers it provides.\nDelve into how GraphQL analytics unveils inefficiencies in query resolvers, uncovers error patterns, and reveals usage insights. Gain the ability to pinpoint bottlenecks, fine-tune queries, and enhance user experiences through well-informed decisions.\n\nLearn the essential strategies for successfully managing a GraphQL production deployment, ensuring your API operates at its best.", + "goers": "30", + "seats": "0", + "invite_only": "N", + "venue": "Grand Peninsula A,B,C", + "id": "f8a4d2b939980ffadf787715033e2b4f", + "venue_id": "1749452", + "speakers": [ + { + "username": "eitan15", + "id": "17700131", + "name": "Eitan Joffe", + "company": "Inigo", + "custom_order": 0 + } + ], + "event_start_year": "2023", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "20", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "11:30am", + "event_end_year": "2023", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "20", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "12:00pm", + "start_date": "2023-09-20", + "start_time": "11:30:00", + "start_time_ts": 1695234600, + "end_date": "2023-09-20", + "end_time": "12:00:00" + }, + { + "event_key": "9", + "active": "Y", + "pinned": "N", + "name": "Lunch", + "event_start": "2023-09-20 12:00", + "event_end": "2023-09-20 13:30", + "event_type": "Breaks", + "goers": "61", + "seats": "0", + "invite_only": "N", + "venue": "Grand Peninsula D", + "id": "0f57893e761e683f58c4ace9e766c3bf", + "venue_id": "1749440", + "event_start_year": "2023", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "20", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "12:00pm", + "event_end_year": "2023", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "20", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "1:30pm", + "start_date": "2023-09-20", + "start_time": "12:00:00", + "start_time_ts": 1695236400, + "end_date": "2023-09-20", + "end_time": "13:30:00", + "description": "" + }, + { + "event_key": "490988", + "active": "Y", + "pinned": "N", + "name": "GraphQL IRL: Pitfalls, Surprises and Successes - Kewei Qu, Meta Platforms", + "event_start": "2023-09-20 13:30", + "event_end": "2023-09-20 13:40", + "event_type": "Lightning Talks", + "event_subtype": "GraphQL in Production", + "description": "This talk goes through some interesting development around Meta’s performance and reliability improvement around GraphQL. Through several interesting case studies: surprising backward incompatible schema changes, error handling framework and ever evolving recommendations on how to use @defer and @stream, I hope to share these knowledge with the GraphQL community and build awesome and robust Apps users enjoy.", + "goers": "56", + "seats": "0", + "invite_only": "N", + "venue": "Grand Peninsula E", + "audience": "Intermediate", + "geo_area": "Yes", + "id": "cc423d9ba6bacb53c1b24490cb208c17", + "venue_id": "1762196", + "speakers": [ + { + "username": "qkw1221", + "id": "18743864", + "name": "Kewei Qu", + "company": "Meta", + "custom_order": 0 + } + ], + "event_start_year": "2023", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "20", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "1:30pm", + "event_end_year": "2023", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "20", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "1:40pm", + "start_date": "2023-09-20", + "start_time": "13:30:00", + "start_time_ts": 1695241800, + "end_date": "2023-09-20", + "end_time": "13:40:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf23/a6/GraphQL%20IRL.pdf", + "name": "GraphQL IRL.pdf" + } + ] + }, + { + "event_key": "502295", + "active": "Y", + "pinned": "N", + "name": "Argo: Designing a Compact and Compressible Binary Serialization Format for GraphQL - Mike Solomon", + "event_start": "2023-09-20 13:30", + "event_end": "2023-09-20 14:00", + "event_type": "Session Presentations", + "event_subtype": "Platform and Backend", + "description": "GraphQL uses JSON by default, but other serialization formats may be used instead.In this session, we start from scratch and construct a purpose-built binary serialization format for GraphQL. Come and learn about the tradeoffs involved when designing serialization formats, and see if the resulting compact format (Argo) is a good fit for your GraphQL API! Choose compelling design goals for a serialization format Build up a format with distinct advantages over JSON Compare and analyze the practical tradeoffs between JSON and a purpose-built format By the end of the session, we will have built up to Argo: a compact and compressible binary serialization format for GraphQL. After the session, more details can be found in Argo’s open source specification, design notes, and reference implementation.\nThis talk assumes significant familiarity with GraphQL (particularly the Schema Definition Language) and JSON.\nSee Argo on GitHub, Argo homepage (including link to Argo spec), or Mike's website.", + "goers": "14", + "seats": "0", + "invite_only": "N", + "venue": "Grand Peninsula F&G", + "audience": "Advanced", + "geo_area": "Yes", + "id": "504049f2217d6c59b9f67eba97089bfe", + "venue_id": "1762208", + "speakers": [ + { + "username": "arkenflame", + "id": "18743867", + "name": "Mike Solomon", + "company": "-", + "custom_order": 0 + } + ], + "event_start_year": "2023", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "20", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "1:30pm", + "event_end_year": "2023", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "20", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "2:00pm", + "start_date": "2023-09-20", + "start_time": "13:30:00", + "start_time_ts": 1695241800, + "end_date": "2023-09-20", + "end_time": "14:00:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf23/a4/Argo.pdf", + "name": "Argo.pdf" + } + ] + }, + { + "event_key": "501215", + "active": "Y", + "pinned": "N", + "name": "GraphQL Over Internet - Denis Badurina, The Guild", + "event_start": "2023-09-20 13:30", + "event_end": "2023-09-20 14:00", + "event_type": "Session Presentations", + "event_subtype": "GraphQL Core", + "description": "GraphQL is transport agnostic. That means it is very powerful and could be used for many different use cases. But that also means that there are extra steps we need to think about for each transport we use. In this talk I will cover the different transports GraphQL can be use in, including real-time and HTTP, the different libraries out there that could help you implement your solution and the undergoing standardisation efforts that are happening around each of these transports.", + "goers": "33", + "seats": "0", + "invite_only": "N", + "venue": "Grand Peninsula A,B,C", + "audience": "Beginner", + "geo_area": "Yes", + "id": "6c2eefe955e288e974a9182dac06f8fa", + "venue_id": "1749452", + "speakers": [ + { + "username": "badurinadenis", + "id": "18743810", + "name": "Denis Badurina", + "company": "The Guild", + "custom_order": 0 + } + ], + "event_start_year": "2023", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "20", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "1:30pm", + "event_end_year": "2023", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "20", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "2:00pm", + "start_date": "2023-09-20", + "start_time": "13:30:00", + "start_time_ts": 1695241800, + "end_date": "2023-09-20", + "end_time": "14:00:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf23/f9/GraphQL%20over%20Internet.pdf", + "name": "GraphQL over Internet.pdf" + } + ] + }, + { + "event_key": "496208", + "active": "Y", + "pinned": "N", + "name": "How @Defer and @Stream Will Improve GraphQL Caching - Andreas Heiberg, Stellate", + "event_start": "2023-09-20 13:45", + "event_end": "2023-09-20 13:55", + "event_type": "Lightning Talks", + "event_subtype": "Scaling", + "description": "These directives were created to improve time to first paint without splitting fast resolving query fragments into a separate network request. However, their implications on the DX and cache hit rate of GraphQL query caching is immense. Let’s explore the future ahead!", + "goers": "67", + "seats": "0", + "invite_only": "N", + "venue": "Grand Peninsula E", + "audience": "Intermediate", + "geo_area": "Yes", + "id": "a6f436251a88bb94d5e79099742c9d75", + "venue_id": "1762196", + "speakers": [ + { + "username": "andreas.heiberg", + "id": "18743801", + "name": "Andreas Heiberg", + "company": "Stellate", + "custom_order": 0 + } + ], + "event_start_year": "2023", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "20", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "1:45pm", + "event_end_year": "2023", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "20", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "1:55pm", + "start_date": "2023-09-20", + "start_time": "13:45:00", + "start_time_ts": 1695242700, + "end_date": "2023-09-20", + "end_time": "13:55:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf23/37/GraphQLConf_Defer_Caching_v2.pdf", + "name": "GraphQLConf_Defer_Caching_v2.pdf" + } + ] + }, + { + "event_key": "36", + "active": "Y", + "pinned": "N", + "name": "Consuming GraphQL using C# - Brandon Minnick, AWS", + "event_start": "2023-09-20 14:10", + "event_end": "2023-09-20 14:40", + "event_type": "Session Presentations", + "event_subtype": "GraphQL Clients", + "description": "GraphQL has become a staple technology in the JavaScript community, but it is still relatively new and unknown in the C# world.\n\nJoin me as we explore the GraphQL tools available for .NET developers, like HotChocolate + Strawberry Shake, and how these tools make it easy to consume GraphQL APIs in C#!", + "goers": "8", + "seats": "0", + "invite_only": "N", + "venue": "Grand Peninsula E", + "audience": "Beginner", + "geo_area": "Yes", + "id": "5f920cd134d4dea87fce5e59bc4418dc", + "venue_id": "1762196", + "speakers": [ + { + "username": "brandon.r.minnick", + "id": "9493345", + "name": "Brandon Minnick", + "company": "AWS", + "custom_order": 0 + } + ], + "event_start_year": "2023", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "20", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "2:10pm", + "event_end_year": "2023", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "20", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "2:40pm", + "start_date": "2023-09-20", + "start_time": "14:10:00", + "start_time_ts": 1695244200, + "end_date": "2023-09-20", + "end_time": "14:40:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf23/e3/Consuming%20GraphQL%20APIs%20in%20C#.pptx%20(1).pdf", + "name": "Consuming GraphQL APIs in C#.pptx (1).pdf" + } + ] + }, + { + "event_key": "484427", + "active": "Y", + "pinned": "N", + "name": "Mutating Meetup with GraphQL - Annyce Davis, Meetup", + "event_start": "2023-09-20 14:10", + "event_end": "2023-09-20 14:40", + "event_type": "Session Presentations", + "event_subtype": "GraphQL in Production", + "description": "Over the past three years, Meetup has undergone a transformation from relying on REST APIs to fully embracing GraphQL. Despite the many benefits, it hasn't been without its challenges.\n\nIn this talk, I'll cover the benefits of using GraphQL in production, such as how it can streamline API development and improve data retrieval. I'll also discuss common challenges that arise when implementing GraphQL in production and share best practices for addressing them. Specifically, I'll touch on:\n\n* Schema design considerations\n* Caching strategies\n* Monitoring and performance optimization\n* Tools and frameworks for implementing GraphQL in production\n\nLook forward to gaining valuable insights and practical advice for implementing GraphQL in production!", + "goers": "35", + "seats": "0", + "invite_only": "N", + "venue": "Grand Peninsula F&G", + "audience": "Beginner", + "geo_area": "Yes", + "id": "3a88eedac57e223aa69979407cfcc8f0", + "venue_id": "1762208", + "speakers": [ + { + "username": "annyce.davis", + "id": "2147992", + "name": "Annyce Davis", + "company": "Meetup", + "custom_order": 0 + } + ], + "event_start_year": "2023", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "20", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "2:10pm", + "event_end_year": "2023", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "20", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "2:40pm", + "start_date": "2023-09-20", + "start_time": "14:10:00", + "start_time_ts": 1695244200, + "end_date": "2023-09-20", + "end_time": "14:40:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf23/e2/mutating_meetup_with_graphql.pdf", + "name": "mutating_meetup_with_graphql.pdf" + } + ] + }, + { + "event_key": "498279", + "active": "Y", + "pinned": "N", + "name": "Semi-Concurrent Deduplicated Incremental Delivery - Yaacov Rydzinski", + "event_start": "2023-09-20 14:10", + "event_end": "2023-09-20 14:40", + "event_type": "Session Presentations", + "event_subtype": "GraphQL Core", + "description": "Curious about what's new in Incremental Delivery in 2023? Want to learn more about the proposed new response format and the recently released implementation in `graphql-js`?\n\nIn this talk, we will: Explore the goals and challenges of incremental delivery with a focus on providing eager maximally-concurrent execution of deduplicated, deferred fields. Elaborate on the distinction between Incremental Data vs. Incremental / Subsequent Results. Overview the new CollectFields algorithm that performs deduplication => at build vs execution time! Discuss potential pitfalls with early execution and tools to mitigate them (resolver helpers, Paraloader, resource frameworks). Call for feedback from the community! Special thanks to Rob Richard, the champion for incremental delivery, and Benjie Gillam, who together with Rob authored the new response format!", + "goers": "29", + "seats": "0", + "invite_only": "N", + "venue": "Grand Peninsula A,B,C", + "audience": "Intermediate", + "geo_area": "Yes", + "id": "fc1e6c878fc02b6c2b7534ddebfac6ff", + "venue_id": "1749452", + "speakers": [ + { + "username": "yaacovcr", + "id": "18743840", + "name": "Yaacov Rydzinski", + "company": "Open Source", + "custom_order": 0 + } + ], + "event_start_year": "2023", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "20", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "2:10pm", + "event_end_year": "2023", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "20", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "2:40pm", + "start_date": "2023-09-20", + "start_time": "14:10:00", + "start_time_ts": 1695244200, + "end_date": "2023-09-20", + "end_time": "14:40:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf23/cd/Deduplicated%20Incremental%20Delivery.pdf", + "name": "Deduplicated Incremental Delivery.pdf" + } + ] + }, + { + "event_key": "511236", + "active": "Y", + "pinned": "N", + "name": "4 Steps to a Successful GraphQL API Program - Suresh Muthu & Jared Cheney, Intuit", + "event_start": "2023-09-20 14:50", + "event_end": "2023-09-20 15:20", + "event_type": "Session Presentations", + "event_subtype": "Scaling", + "description": "This session provides a concise and practical guide for businesses looking to create a successful GraphQL API program. Attendees will learn about the key components required to develop a well-defined and well-governed API program, including API specifications, governance and consistency, dev community & help, and closed-loop feedback. While there are a lot of guidelines and best practices for REST APIs in the industry, there are not yet as many guidelines for GraphQL. Intuit made over 56 million transactions with GraphQL over the 2023 tax peak season, and that number will only get larger from here. GraphQL adoption at this scale required us to build a robust API program with a centralized set of guidelines on how the schema should be composed, along with a community-driven review process and a firm but flexible governance framework. In this session, we will share insights and lessons learned using real-life examples from our GraphQL API Program, enabling attendees to apply these learnings to their own businesses. This session offers a valuable opportunity for businesses to develop their API programs and stay competitive.", + "goers": "32", + "seats": "0", + "invite_only": "N", + "venue": "Grand Peninsula E", + "audience": "Beginner", + "geo_area": "Yes", + "id": "de614df0c21b5227fff20767aa065de8", + "venue_id": "1762196", + "speakers": [ + { + "username": "jared_cheney.7rad60v", + "id": "18775617", + "name": "Jared Cheney", + "company": "Intuit", + "custom_order": 0 + }, + { + "username": "suresh_muthu", + "id": "18743849", + "name": "Suresh Muthu", + "company": "Intuit", + "custom_order": 1 + } + ], + "event_start_year": "2023", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "20", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "2:50pm", + "event_end_year": "2023", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "20", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "3:20pm", + "start_date": "2023-09-20", + "start_time": "14:50:00", + "start_time_ts": 1695246600, + "end_date": "2023-09-20", + "end_time": "15:20:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf23/aa/4%20Steps%20to%20a%20Successful%20GraphQL%20API%20Program.pdf", + "name": "4 Steps to a Successful GraphQL API Program.pdf" + } + ] + }, + { + "event_key": "502901", + "active": "Y", + "pinned": "N", + "name": "Go Beyond the Spec With Custom Directives - Roy Derks, StepZen, an IBM Company", + "event_start": "2023-09-20 14:50", + "event_end": "2023-09-20 15:20", + "event_type": "Session Presentations", + "event_subtype": "GraphQL Core", + "description": "The GraphQL Specification is a great document for everyone building and using GraphQL APIs, and always in development. For a reason! One thing where GraphQL services and client tooling are good at, is introducing new and better ways to use GraphQL. Often, they make use of custom directives to extend GraphQL with custom or experimental behavior. In this talk I'll share best practices on using directives in GraphQL, and how builders can use custom directives to add new configurable execution capabilities to GraphQL.", + "goers": "18", + "seats": "0", + "invite_only": "N", + "venue": "Grand Peninsula A,B,C", + "audience": "Advanced", + "id": "eb08683c706380e0236adb2097358f4c", + "venue_id": "1749452", + "speakers": [ + { + "username": "hello2358", + "id": "16832291", + "name": "Roy Derks", + "company": "IBM", + "custom_order": 0 + } + ], + "event_start_year": "2023", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "20", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "2:50pm", + "event_end_year": "2023", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "20", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "3:20pm", + "start_date": "2023-09-20", + "start_time": "14:50:00", + "start_time_ts": 1695246600, + "end_date": "2023-09-20", + "end_time": "15:20:00" + }, + { + "event_key": "501204", + "active": "Y", + "pinned": "N", + "name": "The Graph of Everything - Federated Architecture for Any API Service - Uri Goldshtein, The Guild", + "event_start": "2023-09-20 14:50", + "event_end": "2023-09-20 15:20", + "event_type": "Session Presentations", + "event_subtype": "Spec Fusion", + "description": "We debate and talk a lot about the differences between GraphQL and other API technologies. What if we could interop between all of these? What would that mean for the strength and weaknesses? What would that mean for the adoption story? In this talk I will demonstrate a few technologies that help us automatically interact from GraphQL to others API technologies and the other way around. I will show how these technologies effected how The Guild thinks about the architecture of GraphQL, where and when to use it and all the new use cases that this unfolds for our users. and one more thing - I will also demonstrate how it opens the doors for GraphQL tool developers to offer solutions for other API ecosystems.", + "goers": "59", + "seats": "0", + "invite_only": "N", + "venue": "Grand Peninsula F&G", + "audience": "Intermediate", + "id": "7a87fe1cfc351a993ed40e01d384e3c6", + "venue_id": "1762208", + "speakers": [ + { + "username": "uri_goldshtein.23xujj9a", + "id": "14900013", + "name": "Uri Goldshtein", + "company": "The Guild", + "custom_order": 0 + } + ], + "event_start_year": "2023", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "20", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "2:50pm", + "event_end_year": "2023", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "20", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "3:20pm", + "start_date": "2023-09-20", + "start_time": "14:50:00", + "start_time_ts": 1695246600, + "end_date": "2023-09-20", + "end_time": "15:20:00" + }, + { + "event_key": "19", + "active": "Y", + "pinned": "N", + "name": "Break", + "event_start": "2023-09-20 15:20", + "event_end": "2023-09-20 15:40", + "event_type": "Breaks", + "goers": "44", + "seats": "0", + "invite_only": "N", + "venue": "Grand Peninsula D", + "id": "3e70d76748962770972c5c80e45ee9d7", + "venue_id": "1749440", + "event_start_year": "2023", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "20", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "3:20pm", + "event_end_year": "2023", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "20", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "3:40pm", + "start_date": "2023-09-20", + "start_time": "15:20:00", + "start_time_ts": 1695248400, + "end_date": "2023-09-20", + "end_time": "15:40:00", + "description": "" + }, + { + "event_key": "493683", + "active": "Y", + "pinned": "N", + "name": "@Defer All the Slow Things - Alessia Bellisario, Apollo GraphQL", + "event_start": "2023-09-20 15:40", + "event_end": "2023-09-20 15:50", + "event_type": "Lightning Talks", + "event_subtype": "GraphQL Clients", + "description": "With GraphQL, clients can describe the data they require and receive nothing more, nothing less. This also means a single GraphQL query is as slow as its slowest field(s)… that is until @defer 🎉 Learn about a proposed directive that solves this problem and its underlying incremental transport mechanism.", + "goers": "41", + "seats": "0", + "invite_only": "N", + "venue": "Grand Peninsula E", + "audience": "Beginner", + "geo_area": "Yes", + "id": "cc22599d768dc636a67a0e93cd74bab2", + "venue_id": "1762196", + "speakers": [ + { + "username": "twitter7", + "id": "18743837", + "name": "Alessia Bellisario", + "company": "Apollo", + "custom_order": 0 + } + ], + "event_start_year": "2023", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "20", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "3:40pm", + "event_end_year": "2023", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "20", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "3:50pm", + "start_date": "2023-09-20", + "start_time": "15:40:00", + "start_time_ts": 1695249600, + "end_date": "2023-09-20", + "end_time": "15:50:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf23/ef/@defer%20all%20the%20slow%20things.pdf", + "name": "@defer all the slow things.pdf" + } + ] + }, + { + "event_key": "483848", + "active": "Y", + "pinned": "N", + "name": "Launching a Public GraphQL API and Client for Open Source Lightning Web Components - Ben Sklar, Salesforce", + "event_start": "2023-09-20 15:40", + "event_end": "2023-09-20 16:10", + "event_type": "Session Presentations", + "event_subtype": "GraphQL in Production", + "description": "Learn how and why Salesforce decided to launch a public GraphQL API. You will learn about best practices, real world use cases, hear success stories, failures, challenges, and overall lessons learned from a real production deployment of a GraphQL API. This API is unique in that every user of the API may have different views of the schema due to a strict field-level and object-level security model. You'll also get to hear about upcoming new features to the API, and how you can leverage this API with our open source Lightning Web Components framework, allowing you to insert GraphQL queries directly with Lightning Web Components.", + "goers": "27", + "seats": "0", + "invite_only": "N", + "venue": "Grand Peninsula F&G", + "audience": "Beginner", + "geo_area": "Yes", + "id": "72ac8d3f7585f86cb9acc77b9eb22241", + "venue_id": "1762208", + "speakers": [ + { + "username": "bsklar", + "id": "18743813", + "name": "Ben Sklar", + "company": "Salesforce", + "custom_order": 0 + } + ], + "event_start_year": "2023", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "20", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "3:40pm", + "event_end_year": "2023", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "20", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "4:10pm", + "start_date": "2023-09-20", + "start_time": "15:40:00", + "start_time_ts": 1695249600, + "end_date": "2023-09-20", + "end_time": "16:10:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf23/8a/GraphQL%20Conf%20Presentation%202023%20-%20LWC%20&%20UI%20API.pdf", + "name": "GraphQL Conf Presentation 2023 - LWC & UI API.pdf" + } + ] + }, + { + "event_key": "483029", + "active": "Y", + "pinned": "N", + "name": "Streamlining Access to NASA Earth Science Data with GraphQL - Ryan Abbott, Element 84", + "event_start": "2023-09-20 15:40", + "event_end": "2023-09-20 16:10", + "event_type": "Session Presentations", + "event_subtype": "GraphQL and Data", + "description": "The Common Metadata Repository (CMR), NASA's datastore for Earth science metadata offers multiple API's that allow users to access the underlying data in many ways. With the launch of recent missions, CMR's usage has increased exponentially; this usage and the features added to support new capabilities have made it increasingly difficult to keep it's response formats and capabilities consistent and performant. Unfortunately agency requirements and existing CMR client implementations limit our ability to change our APIs. In our research for a solution that would allow us to work within these limitations, the use of GraphQL as an abstraction layer would mean that our existing APIs could remain unchanged. Additionally, this would allow us to offer new functionality via a self-documenting, specification based approach. Our introduction of GraphQL has allowed us to normalize the ways that users communicate with our APIs and enabled us to make changes to our core APIs with no impact to clients. In this talk, I'll discuss the challenges, wins, losses, and lessons learned in wrapping CMR's API with GraphQL and how it's being utilized today.", + "goers": "30", + "seats": "0", + "invite_only": "N", + "venue": "Grand Peninsula A,B,C", + "audience": "Beginner", + "geo_area": "Yes", + "id": "2816d4a81204283289584830acda7826", + "venue_id": "1749452", + "speakers": [ + { + "username": "abbottry", + "id": "18680304", + "name": "Ryan Abbott", + "company": "NASA EED-3 / Element 84", + "custom_order": 0 + } + ], + "event_start_year": "2023", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "20", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "3:40pm", + "event_end_year": "2023", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "20", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "4:10pm", + "start_date": "2023-09-20", + "start_time": "15:40:00", + "start_time_ts": 1695249600, + "end_date": "2023-09-20", + "end_time": "16:10:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf23/02/GraphQL%20Conf.pdf", + "name": "GraphQL Conf.pdf" + } + ] + }, + { + "event_key": "488856", + "active": "Y", + "pinned": "N", + "name": "How to Make Your First Open Source Contribution - Donna Zhou, Atlassian", + "event_start": "2023-09-20 15:55", + "event_end": "2023-09-20 16:05", + "event_type": "Lightning Talks", + "description": "Have you always wanted to make an open source contribution, but not sure where to start? Getting started with open source is much easier than it seems. A year ago, I started regularly contributing to GraphQL Java and the GraphQL Scalars project. I caught the open source bug and made it a habit, and now I’m a maintainer of GraphQL Java. It has been an incredible learning experience, and it has been very rewarding to meet the engineers using the library all over the world. But it wasn’t always an open source fairytale! Many years ago I tried to contribute to another project, and it was a total failure. I didn’t have a great experience and it put me off open source for a long time. In this talk, I want to explain what I did differently to succeed this time around.", + "goers": "32", + "seats": "0", + "invite_only": "N", + "venue": "Grand Peninsula E", + "audience": "Beginner", + "geo_area": "Yes", + "id": "81daf0dd0b26efdc784ba0a530e54a68", + "venue_id": "1762196", + "speakers": [ + { + "username": "donnasiqizhou", + "id": "18743879", + "name": "Donna Zhou", + "company": "Atlassian", + "custom_order": 0 + } + ], + "event_start_year": "2023", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "20", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "3:55pm", + "event_end_year": "2023", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "20", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "4:05pm", + "start_date": "2023-09-20", + "start_time": "15:55:00", + "start_time_ts": 1695250500, + "end_date": "2023-09-20", + "end_time": "16:05:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf23/39/Open%20source.pdf", + "name": "Open source.pdf" + } + ] + }, + { + "event_key": "7", + "active": "Y", + "pinned": "N", + "name": "Easily Access Blockchain Data with Subgraphs - Kevin Jones, The Graph", + "event_start": "2023-09-20 16:20", + "event_end": "2023-09-20 16:50", + "event_type": "Session Presentations", + "description": "Have you ever wanted to dip your toes into web3 development and blockchain data but don't know how? Join us to learn how blockchain data can be easily queried with GraphQL!\n\nSubgraphs APIs and the tooling built around them are all open source, making it easy for developers to build decentralized applications (dapps). Within the world of web3 there are many different ways to use smart contracts, so Subgraphs are modular APIs enabling developers to build for any use case. These subgraphs can be queried via The Graph, a decentralized network for accessing blockchain data.\n\nIn this presentation we will explore: Practical aspects of accessing blockchain data using Subgraphs, including the basics of building a GraphQL schema Discuss efficient Data optimization Utility of GraphQL for blockchain data Elements of decentralization and data\nLearn how Subgraphs simplify the data extraction from blockchains, optimize data handling, and enhance query flexibility. Join us to understand how these elements work together to make blockchain data more accessible and manageable.", + "goers": "12", + "seats": "0", + "invite_only": "N", + "venue": "Grand Peninsula A,B,C", + "geo_area": "Yes", + "id": "ebee6213b39b87437eb7cc9c41ea972b", + "venue_id": "1749452", + "speakers": [ + { + "username": "kevin1700", + "id": "19150962", + "name": "Kevin Jones", + "company": "The Graph", + "custom_order": 0 + } + ], + "event_start_year": "2023", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "20", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "4:20pm", + "event_end_year": "2023", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "20", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "4:50pm", + "start_date": "2023-09-20", + "start_time": "16:20:00", + "start_time_ts": 1695252000, + "end_date": "2023-09-20", + "end_time": "16:50:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf23/17/Querying%20Blockchain%20Data%20with%20GraphQL%20-%20shared.pdf", + "name": "Querying Blockchain Data with GraphQL - shared.pdf" + } + ] + }, + { + "event_key": "496520", + "active": "Y", + "pinned": "N", + "name": "Isograph — Rethink GraphQL-Powered React Apps - Robert Balicki, Pinterest", + "event_start": "2023-09-20 16:20", + "event_end": "2023-09-20 16:50", + "event_type": "Session Presentations", + "event_subtype": "GraphQL Clients", + "description": "Isograph is a framework for building GraphQL-backed React apps with a radically redesigned developer experience. Find out how you can build entire applications through the graph, and the vision for how Isograph will enable extremely performant and powerful apps.", + "goers": "42", + "seats": "0", + "invite_only": "N", + "venue": "Grand Peninsula E", + "audience": "Beginner", + "geo_area": "Yes", + "id": "2517f7a1d13ad3c0652e1b3cc5b65714", + "venue_id": "1762196", + "speakers": [ + { + "username": "robert.balicki", + "id": "18743858", + "name": "Robert Balicki", + "company": "Pinterest", + "custom_order": 0 + } + ], + "event_start_year": "2023", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "20", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "4:20pm", + "event_end_year": "2023", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "20", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "4:50pm", + "start_date": "2023-09-20", + "start_time": "16:20:00", + "start_time_ts": 1695252000, + "end_date": "2023-09-20", + "end_time": "16:50:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf23/6c/GraphQL%20Conf%202023.pdf", + "name": "GraphQL Conf 2023.pdf" + } + ] + }, + { + "event_key": "496782", + "active": "Y", + "pinned": "N", + "name": "Supercharging GraphQL with Envoy: Unveiling the Efficiency of Declarative GraphQL - Sai Ekbote, solo.io", + "event_start": "2023-09-20 16:20", + "event_end": "2023-09-20 16:50", + "event_type": "Session Presentations", + "event_subtype": "GraphQL in Production", + "description": "Over the past decade of GraphQL, many implementations have emerged from the community, primarily that of imperative approaches to GraphQL. However, recently we have seen an uptick in implementations that allow for declarative configuration of GraphQL schemas and resolvers. These declarative approaches offer new possibilities in terms of managing and scaling GraphQL APIs. In this talk, we will dive into the challenges of implementing a declarative API for GraphQL and explore the solutions that exist in the ecosystem. Firstly, we will introduce several prominent solutions that enable declarative configuration of GraphQL APIs, such as Gloo GraphQL, GraphQL Mesh, and StepZen. We will compare and contrast these solutions, highlighting their unique features, capabilities, and integration possibilities with existing infrastructure. We will then delve into the more technical aspects and challenges of implementing a highly performant GraphQL server that we built-in as a component of the industry standard Envoy proxy. By the end of this talk, attendees will be left with a comprehensive understanding of declarative GraphQL and the solutions available in the ecosystem.", + "goers": "35", + "seats": "0", + "invite_only": "N", + "venue": "Grand Peninsula F&G", + "audience": "Intermediate", + "geo_area": "Yes", + "id": "5d6afee232e35ba1880e7b25d810ef49", + "venue_id": "1762208", + "speakers": [ + { + "username": "keerthan.ekbote", + "id": "14553875", + "name": "Sai Ekbote", + "company": "solo.io", + "custom_order": 0 + } + ], + "event_start_year": "2023", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "20", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "4:20pm", + "event_end_year": "2023", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "20", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "4:50pm", + "start_date": "2023-09-20", + "start_time": "16:20:00", + "start_time_ts": 1695252000, + "end_date": "2023-09-20", + "end_time": "16:50:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf23/54/graphqlconf.pdf", + "name": "graphqlconf.pdf" + } + ] + }, + { + "event_key": "491650", + "active": "N", + "pinned": "N", + "name": "CANCELED: Building Mission Control: A More Reliable, Better Performing, Drop-in Replacement for Apollo Uplink. - Michael Edelman, EdelOrg", + "event_start": "2023-09-20 17:00", + "event_end": "2023-09-20 17:30", + "event_type": "Session Presentations", + "event_subtype": "GraphQL in Production", + "description": "Mission Control is a drop-in, enterprise-grade solution, written in rust, that, once and for all, solves the reliability, availability, and performance issues that have, up until now, beguiled Apollo's Uplink service and, thus, limited the appeal of \"managed federation\" in mission-critical applications generally. Here, we will discuss the challenges and issues that led us here, our motivation for replacing Apollo Uplink as the single source of truth for our supergraph schemas, the alternative solutions we considered, and, finally, why we decided to take the path that we did--essentially reinventing the wheel--and where we plan to take it going forward. Attendees will leave with a deep understanding of the tradeoffs with respect to managed federation in mission critical environments, specifically as they relate to use of Apollo's Uplink service as a single source of truth. Moreover, attendees will walk away with a general plan for how to mitigate the challenges and limitations above, using Mission Control as the seminal example.", + "goers": "16", + "seats": "0", + "invite_only": "N", + "venue": "Grand Peninsula F&G", + "audience": "Advanced", + "id": "bc5623fa38b3e2a58b357b35d3209023", + "venue_id": "1762208", + "event_start_year": "2023", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "20", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "5:00pm", + "event_end_year": "2023", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "20", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "5:30pm", + "start_date": "2023-09-20", + "start_time": "17:00:00", + "start_time_ts": 1695254400, + "end_date": "2023-09-20", + "end_time": "17:30:00" + }, + { + "event_key": "490843", + "active": "Y", + "pinned": "N", + "name": "GraphQL and CQRS, a Perfect Fit? - Gerard Klijs, AxonIQ", + "event_start": "2023-09-20 17:00", + "event_end": "2023-09-20 17:30", + "event_type": "Session Presentations", + "event_subtype": "GraphQL and Data", + "description": "With an CQRS architecture, the write and read model are separated. The read model is also eventually consistent. This makes it hard to implement GraphQL mutations as they are implemented usually. We can't directly return the updated entity, as that's not available in the write model? But do we need to return this, or can we get away with just returning if the mutation was successful? Are there ways we can still return the updated entity? We will dive deeper into this, and also at the consequences for queries, and subscriptions.", + "goers": "27", + "seats": "0", + "invite_only": "N", + "venue": "Grand Peninsula A,B,C", + "audience": "Intermediate", + "geo_area": "Yes", + "id": "217cf30afd15a724ebb42c4d82169a26", + "venue_id": "1749452", + "speakers": [ + { + "username": "gerard.klijs", + "id": "18743792", + "name": "Gerard Klijs", + "company": "AxonIQ", + "custom_order": 0 + } + ], + "event_start_year": "2023", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "20", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "5:00pm", + "event_end_year": "2023", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "20", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "5:30pm", + "start_date": "2023-09-20", + "start_time": "17:00:00", + "start_time_ts": 1695254400, + "end_date": "2023-09-20", + "end_time": "17:30:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf23/63/GraphQL+CQRS.pdf", + "name": "GraphQL+CQRS.pdf" + } + ] + }, + { + "event_key": "511237", + "active": "Y", + "pinned": "N", + "name": "Why Relay is a Must for your GraphQL APIs - Marion Schleifer, Hasura", + "event_start": "2023-09-20 17:00", + "event_end": "2023-09-20 17:30", + "event_type": "Session Presentations", + "description": "GraphQL has helped the industry realize the benefit of having typed APIs. But does that mean that if we switch over to a typed API like gRPC or OpenAPI then GraphQL is overkill? In this session, I want to discuss how GraphQL with Relay is critical to UI development and GraphQL without Relay leads us to reinventing the wheel on state management and API libraries again and again. And also as a corollary, how using GraphQL without Relay might not really be worth it!", + "goers": "44", + "seats": "0", + "invite_only": "N", + "venue": "Grand Peninsula E", + "geo_area": "Yes", + "id": "34bdd9b21a3cf2db6600a5ef840b3fb3", + "venue_id": "1762196", + "speakers": [ + { + "username": "marion84", + "id": "19150944", + "name": "Marion Schleifer", + "company": "Hasura", + "custom_order": 0 + } + ], + "event_start_year": "2023", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "20", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "5:00pm", + "event_end_year": "2023", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "20", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "5:30pm", + "start_date": "2023-09-20", + "start_time": "17:00:00", + "start_time_ts": 1695254400, + "end_date": "2023-09-20", + "end_time": "17:30:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf23/2d/why_relay_is_a_must_for_your_graphql_api.pdf", + "name": "why_relay_is_a_must_for_your_graphql_api.pdf" + } + ] + }, + { + "event_key": "511233", + "active": "Y", + "pinned": "N", + "name": "Booth Crawl", + "event_start": "2023-09-20 17:30", + "event_end": "2023-09-20 19:00", + "event_type": "Events & Experiences", + "description": "TBA", + "goers": "49", + "seats": "0", + "invite_only": "N", + "venue": "Grand Peninsula D", + "id": "a6d43808900bc56bb2ebd675544ee5a3", + "venue_id": "1749440", + "event_start_year": "2023", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "20", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "5:30pm", + "event_end_year": "2023", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "20", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "7:00pm", + "start_date": "2023-09-20", + "start_time": "17:30:00", + "start_time_ts": 1695256200, + "end_date": "2023-09-20", + "end_time": "19:00:00" + }, + { + "event_key": "511239", + "active": "Y", + "pinned": "N", + "name": "Light Continental Breakfast", + "event_start": "2023-09-21 07:30", + "event_end": "2023-09-21 09:00", + "event_type": "Breaks", + "goers": "38", + "seats": "0", + "invite_only": "N", + "venue": "Grand Peninsula Foyer", + "id": "7bb96b3d5660f2d285220d7cdd59eb7f", + "venue_id": "1749431", + "event_start_year": "2023", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "21", + "event_start_weekday": "Thursday", + "event_start_weekday_short": "Thu", + "event_start_time": "7:30am", + "event_end_year": "2023", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "21", + "event_end_weekday": "Thursday", + "event_end_weekday_short": "Thu", + "event_end_time": "9:00am", + "start_date": "2023-09-21", + "start_time": "07:30:00", + "start_time_ts": 1695306600, + "end_date": "2023-09-21", + "end_time": "09:00:00", + "description": "" + }, + { + "event_key": "511232", + "active": "Y", + "pinned": "N", + "name": "Registration & Badge Pick-Up", + "event_start": "2023-09-21 07:30", + "event_end": "2023-09-21 16:00", + "event_type": "Registration + Badge Pick-Up", + "goers": "13", + "seats": "0", + "invite_only": "N", + "venue": "Grand Peninsula Foyer", + "id": "9a543325b8802fd94cc9ed81908dc888", + "venue_id": "1749431", + "event_start_year": "2023", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "21", + "event_start_weekday": "Thursday", + "event_start_weekday_short": "Thu", + "event_start_time": "7:30am", + "event_end_year": "2023", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "21", + "event_end_weekday": "Thursday", + "event_end_weekday_short": "Thu", + "event_end_time": "4:00pm", + "start_date": "2023-09-21", + "start_time": "07:30:00", + "start_time_ts": 1695306600, + "end_date": "2023-09-21", + "end_time": "16:00:00", + "description": "" + }, + { + "event_key": "27", + "active": "Y", + "pinned": "N", + "name": "Welcome Remarks - Keith Babo, Solo.io", + "event_start": "2023-09-21 09:00", + "event_end": "2023-09-21 09:05", + "event_type": "Keynote Sessions", + "goers": "56", + "seats": "0", + "invite_only": "N", + "venue": "Grand Peninsula A,B,C", + "id": "5a0c1b8ab4957bfd83f55480c1508fe5", + "venue_id": "1749452", + "speakers": [ + { + "username": "keith.babo", + "id": "19071264", + "name": "Keith Babo", + "company": "Solo.io", + "custom_order": 0 + } + ], + "event_start_year": "2023", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "21", + "event_start_weekday": "Thursday", + "event_start_weekday_short": "Thu", + "event_start_time": "9:00am", + "event_end_year": "2023", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "21", + "event_end_weekday": "Thursday", + "event_end_weekday_short": "Thu", + "event_end_time": "9:05am", + "start_date": "2023-09-21", + "start_time": "09:00:00", + "start_time_ts": 1695312000, + "end_date": "2023-09-21", + "end_time": "09:05:00", + "description": "" + }, + { + "event_key": "29", + "active": "Y", + "pinned": "N", + "name": "Is a GraphQL BFF Necessary in a Server Side React World (RSC, SAs)? - Tanmai Gopal, Hasura", + "event_start": "2023-09-21 09:05", + "event_end": "2023-09-21 09:15", + "event_type": "Keynote Sessions", + "description": "With the introduction and rise in adoption of React Server Components and Server Actions (and as other UI frameworks embrace these ideas), is a GraphQL API layer that provides a \"Backend For Frontend\" type of abstraction going to be relevant? Where does GraphQL fit in and how might it evolve over the months to come?\n\nIn this talk, I'll focus on specific technical and developer-experience benefits of a GraphQL and \"server side React\" overlap, along with some code examples. Next, I'll talk about areas where the value provided by GraphQL is orthogonal to the benefits of React Server Components and Server Actions. Finally, through this exploration and these examples, I'll end on an opinionated note that GraphQL's future is with Relay and its usage as a BFD 🤯 (?!), instead of a BFF.", + "goers": "54", + "seats": "0", + "invite_only": "N", + "venue": "Grand Peninsula A,B,C", + "id": "e3320ba552ee773065a1a132304a36e0", + "venue_id": "1749452", + "speakers": [ + { + "username": "tanmaig", + "id": "4968006", + "name": "Tanmai Gopal", + "company": "Hasura", + "custom_order": 0 + } + ], + "event_start_year": "2023", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "21", + "event_start_weekday": "Thursday", + "event_start_weekday_short": "Thu", + "event_start_time": "9:05am", + "event_end_year": "2023", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "21", + "event_end_weekday": "Thursday", + "event_end_weekday_short": "Thu", + "event_end_time": "9:15am", + "start_date": "2023-09-21", + "start_time": "09:05:00", + "start_time_ts": 1695312300, + "end_date": "2023-09-21", + "end_time": "09:15:00" + }, + { + "event_key": "30", + "active": "Y", + "pinned": "N", + "name": "Training and Using Generative AI Models with GraphQL - Idit Levine, Solo.io", + "event_start": "2023-09-21 09:15", + "event_end": "2023-09-21 09:25", + "event_type": "Keynote Sessions", + "goers": "52", + "seats": "0", + "invite_only": "N", + "venue": "Grand Peninsula A,B,C", + "id": "47c1bf50ce5556edcae9a84795485a8f", + "venue_id": "1749452", + "speakers": [ + { + "username": "idit_levine.25krdj4u", + "id": "18769950", + "name": "Idit Levine", + "company": "Solo.io", + "custom_order": 0 + } + ], + "event_start_year": "2023", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "21", + "event_start_weekday": "Thursday", + "event_start_weekday_short": "Thu", + "event_start_time": "9:15am", + "event_end_year": "2023", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "21", + "event_end_weekday": "Thursday", + "event_end_weekday_short": "Thu", + "event_end_time": "9:25am", + "start_date": "2023-09-21", + "start_time": "09:15:00", + "start_time_ts": 1695312900, + "end_date": "2023-09-21", + "end_time": "09:25:00", + "description": "" + }, + { + "event_key": "31", + "active": "Y", + "pinned": "N", + "name": "GraphQL Everywhere - How GraphQL is Being Used in Places You Never Thought Were Possible - Uri Goldshtein, The Guild", + "event_start": "2023-09-21 09:25", + "event_end": "2023-09-21 09:35", + "event_type": "Keynote Sessions", + "description": "GraphQL can be helpful in more places than just client-server communication. I will talk about a number of ways The Guild is using GraphQL in places that help us make a difference with teams that are not the classic GraphQL teams and sometimes don't know what GraphQL is!", + "goers": "60", + "seats": "0", + "invite_only": "N", + "venue": "Grand Peninsula A,B,C", + "id": "b9e35d673e7b541421d45ce2043dc05e", + "venue_id": "1749452", + "speakers": [ + { + "username": "uri_goldshtein.23xujj9a", + "id": "14900013", + "name": "Uri Goldshtein", + "company": "The Guild", + "custom_order": 0 + } + ], + "event_start_year": "2023", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "21", + "event_start_weekday": "Thursday", + "event_start_weekday_short": "Thu", + "event_start_time": "9:25am", + "event_end_year": "2023", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "21", + "event_end_weekday": "Thursday", + "event_end_weekday_short": "Thu", + "event_end_time": "9:35am", + "start_date": "2023-09-21", + "start_time": "09:25:00", + "start_time_ts": 1695313500, + "end_date": "2023-09-21", + "end_time": "09:35:00" + }, + { + "event_key": "28", + "active": "Y", + "pinned": "N", + "name": "GraphQL Saving Lives - Leveraging Federation and Domain Experts to Help People Beat Addiction - David Emanuel Sarabia, inRecovery", + "event_start": "2023-09-21 09:35", + "event_end": "2023-09-21 09:55", + "event_type": "Keynote Sessions", + "description": "Health Tech comes with unique challenges, from data privacy laws, mission-critical uptime, to clinical validation. Further complicated by an industry resistant to change, weighed down by complex legacy enterprise systems and data silos.\n\nLearn valuable insights from our journey as an addiction care startup, transitioning from a monolith MVP engineered in isolation, to GraphQL Federation built alongside clinicians.\n\nBy involving domain experts in design thinking exercises, we not only constructed subgraphs with build-in clinical validation, data governance, and security, but also transformed our clinical end-users into champions for change.", + "goers": "48", + "seats": "0", + "invite_only": "N", + "venue": "Grand Peninsula A,B,C", + "id": "5684f90e0472771532ed5ee2b237300f", + "venue_id": "1749452", + "speakers": [ + { + "username": "david3103", + "id": "13551525", + "name": "David Emanuel Sarabia", + "company": "inRecovery", + "custom_order": 0 + } + ], + "event_start_year": "2023", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "21", + "event_start_weekday": "Thursday", + "event_start_weekday_short": "Thu", + "event_start_time": "9:35am", + "event_end_year": "2023", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "21", + "event_end_weekday": "Thursday", + "event_end_weekday_short": "Thu", + "event_end_time": "9:55am", + "start_date": "2023-09-21", + "start_time": "09:35:00", + "start_time_ts": 1695314100, + "end_date": "2023-09-21", + "end_time": "09:55:00" + }, + { + "event_key": "32", + "active": "Y", + "pinned": "N", + "name": "Navigating the Future: GraphQL’s Expansion, AI Adoption, and Modern Languages - Adapting for Success in 2025 - Uri Goldshtein, The Guild; Idit Levine, Solo.io; Benjie Gillam, Graphile; Lee Byron, GraphQL Foundation; Moderated by Keith Babo, Solo.io", + "event_start": "2023-09-21 09:55", + "event_end": "2023-09-21 10:20", + "event_type": "Keynote Sessions", + "description": "According to Gartner, GraphQL was implemented in just over 10% of enterprises in 2021 and they predict that GraphQL implementations will increase to over 50% of all enterprises by 2025.\n\nThe unprecedented surge in GraphQL’s popularity within enterprise ecosystems calls for an urgent introspective analysis and forward-thinking strategies. This panel discussion delves into the foreseeable future, envisioning GraphQL’s evolution by 2025 in response to expanding horizons, AI integration, and the embrace of contemporary programming languages.\n\nAs GraphQL cements its position as an indispensable tool in enterprise architectures, the necessity for the project to evolve rapidly without compromising consistency becomes apparent. Our esteemed panelists will shed light on the innovations and adaptations necessary for the GraphQL project to flourish. This includes a discussion on evolving governance models, project sustainability, and community engagement to ensure the GraphQL Foundation remains a steward of progress.\n\nAnother focal point is the emergence of AI in API ecosystems. How can GraphQL integrate with AI-driven systems? What challenges and opportunities does AI present for GraphQL APIs? Our experts will discuss the promising avenues where GraphQL and AI can complement each other, and how this synergy could redefine data-fetching paradigms.\n\nAdditionally, the panel will tackle the inevitable shift toward modern programming languages. With languages such as Rust, Kotlin, and Swift gaining traction, the GraphQL ecosystem must adapt. We’ll discuss the opportunities these languages present and how GraphQL can harness their strengths to remain a versatile and powerful tool for contemporary development.\n\nThe final segment will engage the audience in a thought-provoking dialogue on the GraphQL Foundation’s role in these evolving landscapes. Panelists will offer perspectives on what's next for the GraphQL Foundation from today through 2025.", + "goers": "55", + "seats": "0", + "invite_only": "N", + "venue": "Grand Peninsula A,B,C", + "id": "f485ec8e2dc60c435e8a3a90185d73bf", + "venue_id": "1749452", + "speakers": [ + { + "username": "uri_goldshtein.23xujj9a", + "id": "14900013", + "name": "Uri Goldshtein", + "company": "The Guild", + "custom_order": 0 + }, + { + "username": "idit_levine.25krdj4u", + "id": "18769950", + "name": "Idit Levine", + "company": "Solo.io", + "custom_order": 1 + }, + { + "username": "benjie3", + "id": "18743846", + "name": "Benjie Gillam", + "company": "Graphile", + "custom_order": 2 + }, + { + "username": "lee_byron.25krdom6", + "id": "18769956", + "name": "Lee Byron", + "company": "GraphQL Foundation", + "custom_order": 3 + }, + { + "username": "keith.babo", + "id": "19071264", + "name": "Keith Babo", + "company": "Solo.io", + "custom_order": 4 + } + ], + "moderators": [ + { + "username": "keith.babo", + "name": "Keith Babo", + "eventid": "f485ec8e2dc60c435e8a3a90185d73bf", + "role": "moderator", + "company": "Solo.io" + } + ], + "event_start_year": "2023", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "21", + "event_start_weekday": "Thursday", + "event_start_weekday_short": "Thu", + "event_start_time": "9:55am", + "event_end_year": "2023", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "21", + "event_end_weekday": "Thursday", + "event_end_weekday_short": "Thu", + "event_end_time": "10:20am", + "start_date": "2023-09-21", + "start_time": "09:55:00", + "start_time_ts": 1695315300, + "end_date": "2023-09-21", + "end_time": "10:20:00" + }, + { + "event_key": "33", + "active": "Y", + "pinned": "N", + "name": "Closing Remarks - Keith Babo, Solo.io", + "event_start": "2023-09-21 10:20", + "event_end": "2023-09-21 10:30", + "event_type": "Keynote Sessions", + "goers": "53", + "seats": "0", + "invite_only": "N", + "venue": "Grand Peninsula A,B,C", + "id": "b3a3fa420d7467c46c215fa09cd548e0", + "venue_id": "1749452", + "speakers": [ + { + "username": "keith.babo", + "id": "19071264", + "name": "Keith Babo", + "company": "Solo.io", + "custom_order": 0 + } + ], + "event_start_year": "2023", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "21", + "event_start_weekday": "Thursday", + "event_start_weekday_short": "Thu", + "event_start_time": "10:20am", + "event_end_year": "2023", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "21", + "event_end_weekday": "Thursday", + "event_end_weekday_short": "Thu", + "event_end_time": "10:30am", + "start_date": "2023-09-21", + "start_time": "10:20:00", + "start_time_ts": 1695316800, + "end_date": "2023-09-21", + "end_time": "10:30:00", + "description": "" + }, + { + "event_key": "18", + "active": "Y", + "pinned": "N", + "name": "Break", + "event_start": "2023-09-21 10:30", + "event_end": "2023-09-21 10:50", + "event_type": "Breaks", + "goers": "35", + "seats": "0", + "invite_only": "N", + "venue": "Grand Peninsula D", + "id": "6d07d593f16320c810d6aba8553199ed", + "venue_id": "1749440", + "event_start_year": "2023", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "21", + "event_start_weekday": "Thursday", + "event_start_weekday_short": "Thu", + "event_start_time": "10:30am", + "event_end_year": "2023", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "21", + "event_end_weekday": "Thursday", + "event_end_weekday_short": "Thu", + "event_end_time": "10:50am", + "start_date": "2023-09-21", + "start_time": "10:30:00", + "start_time_ts": 1695317400, + "end_date": "2023-09-21", + "end_time": "10:50:00", + "description": "" + }, + { + "event_key": "511235", + "active": "Y", + "pinned": "N", + "name": "Sponsor Showcase", + "event_start": "2023-09-21 10:30", + "event_end": "2023-09-21 17:30", + "event_type": "Sponsor Showcase", + "goers": "18", + "seats": "0", + "invite_only": "N", + "venue": "Grand Peninsula D", + "id": "dd289f7ecf487b271e0495ff09bba26e", + "venue_id": "1749440", + "event_start_year": "2023", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "21", + "event_start_weekday": "Thursday", + "event_start_weekday_short": "Thu", + "event_start_time": "10:30am", + "event_end_year": "2023", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "21", + "event_end_weekday": "Thursday", + "event_end_weekday_short": "Thu", + "event_end_time": "5:30pm", + "start_date": "2023-09-21", + "start_time": "10:30:00", + "start_time_ts": 1695317400, + "end_date": "2023-09-21", + "end_time": "17:30:00", + "description": "" + }, + { + "event_key": "502933", + "active": "Y", + "pinned": "N", + "name": "Building Tooling That Speaks GraphQL - Tim Hall, Postman", + "event_start": "2023-09-21 10:50", + "event_end": "2023-09-21 11:20", + "event_type": "Session Presentations", + "event_subtype": "GraphQL Clients", + "description": "graphql.js underpins most of the clients and servers in the GraphQL ecosystem and it provides great primitives for developing your own tooling for working with GraphQL. In this session we'll take a look at some of the interesting and useful things you can do with parsers, visitors, and ASTs. We'll look at some examples from my experience working on Postman's new GraphQL client, including generating documentation, searching schemas, and building queries.", + "goers": "35", + "seats": "0", + "invite_only": "N", + "venue": "Grand Peninsula E", + "audience": "Intermediate", + "geo_area": "Yes", + "id": "9836d339aaf014a7ced7f87141fcee67", + "venue_id": "1762196", + "speakers": [ + { + "username": "tim.hall.engr", + "id": "18743807", + "name": "Tim Hall", + "company": "Postman", + "custom_order": 0 + } + ], + "event_start_year": "2023", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "21", + "event_start_weekday": "Thursday", + "event_start_weekday_short": "Thu", + "event_start_time": "10:50am", + "event_end_year": "2023", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "21", + "event_end_weekday": "Thursday", + "event_end_weekday_short": "Thu", + "event_end_time": "11:20am", + "start_date": "2023-09-21", + "start_time": "10:50:00", + "start_time_ts": 1695318600, + "end_date": "2023-09-21", + "end_time": "11:20:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf23/b3/Building%20Tooling%20that%20Speaks%20GraphQL.pdf", + "name": "Building Tooling that Speaks GraphQL.pdf" + } + ] + }, + { + "event_key": "499321", + "active": "Y", + "pinned": "N", + "name": "Exposing All of Wix.com APIs via GraphQL Automatically: Centralizing GraphQL Schema Generation - Gonen Jerbi, Wix.com", + "event_start": "2023-09-21 10:50", + "event_end": "2023-09-21 11:20", + "event_type": "Session Presentations", + "event_subtype": "Platform and Backend", + "description": "GraphQL has become a prevalent trend in API development, offering flexible data access. However, manually creating and maintaining GraphQL schemas in large organizations with numerous APIs can be challenging. At Wix, we tackled this issue by automating schema generation using API registry metadata. Join our talk to learn how this approach creates a centralized GraphQL server for all APIs, ensuring consistency, scalability, and ease of maintenance. Discover how this solution empowers Wix to provide platform capabilities without burdening teams with GraphQL expertise.", + "goers": "26", + "seats": "0", + "invite_only": "N", + "venue": "Grand Peninsula F&G", + "audience": "Intermediate", + "id": "f319907e1e15ee620a33d3cbf01f323a", + "venue_id": "1762208", + "speakers": [ + { + "username": "gonenj", + "id": "18743816", + "name": "Gonen Jerbi", + "company": "Wix.com", + "custom_order": 0 + } + ], + "event_start_year": "2023", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "21", + "event_start_weekday": "Thursday", + "event_start_weekday_short": "Thu", + "event_start_time": "10:50am", + "event_end_year": "2023", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "21", + "event_end_weekday": "Thursday", + "event_end_weekday_short": "Thu", + "event_end_time": "11:20am", + "start_date": "2023-09-21", + "start_time": "10:50:00", + "start_time_ts": 1695318600, + "end_date": "2023-09-21", + "end_time": "11:20:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf23/af/GraphQL%20Conf_%20Exposing%20All%20of%20Wix%20APIs%20via%20GraphQL%20Automatically_%20Centralizing%20GraphQL%20Schema%20Generation.pdf", + "name": "GraphQL Conf_ Exposing All of Wix APIs via GraphQL Automatically_ Centralizing GraphQL Schema Generation.pdf" + } + ] + }, + { + "event_key": "490864", + "active": "Y", + "pinned": "N", + "name": "GraphQL Is a Superpower for Your Product Manager and Designer - Jeff Auriemma, Apollo GraphQL", + "event_start": "2023-09-21 10:50", + "event_end": "2023-09-21 11:20", + "event_type": "Session Presentations", + "description": "Good tools help get a job done faster and better. Great tools transform the entire end-to-end workflow from concept to deployment. GraphQL, an open standard and protocol for APIs, is both good and great. It allows your designer to explore the full capabilities of your data so they can conceive of the best user experience possible. GraphQL allows your engineers to say “three weeks” to your product manager where they would have said “two months” before. These enhancements have a practical impact on the relationships that are the foundation of your cross-functional team’s success. In this talk I’ll address some of the challenges product teams face as their understanding of the end user starts to outpace their ability to ship new features (which is healthy). Then, I will give some concrete examples where GraphQL can make a difference. A/B tests and designer productivity will be covered, all drawn from my experiences in both IC and EM roles on product engineering teams. For each of these scenarios I’ll show how GraphQL principles and tooling can give your team a practical advantage.", + "goers": "32", + "seats": "0", + "invite_only": "N", + "venue": "Grand Peninsula A,B,C", + "audience": "Beginner", + "geo_area": "Yes", + "id": "de1472b4294ac91745f3648d9228d8f2", + "venue_id": "1749452", + "speakers": [ + { + "username": "jeff.auriemma", + "id": "18743876", + "name": "Jeff Auriemma", + "company": "Apollo GraphQL", + "custom_order": 0 + } + ], + "event_start_year": "2023", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "21", + "event_start_weekday": "Thursday", + "event_start_weekday_short": "Thu", + "event_start_time": "10:50am", + "event_end_year": "2023", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "21", + "event_end_weekday": "Thursday", + "event_end_weekday_short": "Thu", + "event_end_time": "11:20am", + "start_date": "2023-09-21", + "start_time": "10:50:00", + "start_time_ts": 1695318600, + "end_date": "2023-09-21", + "end_time": "11:20:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf23/48/GraphQL%20is%20a%20superpower%20for%20your%20product%20manager%20and%20designer.pdf", + "name": "GraphQL is a superpower for your product manager and designer.pdf" + } + ] + }, + { + "event_key": "35", + "active": "Y", + "pinned": "N", + "name": "Building Geospatial GraphQL APIs By Leveraging GraphQL Database Integrations - William Lyon, Neo4j", + "event_start": "2023-09-21 11:30", + "event_end": "2023-09-21 12:00", + "event_type": "Session Presentations", + "event_subtype": "GraphQL and Data", + "description": "In this talk we explore how to work with geospatial data in GraphQL with a focus on geospatial database integrations for GraphQL. We will cover how to model spatial data types such as points, lines, and polygons in GraphQL and cover some use cases for working with geospatial data in your API such as spatial search, location-based recommendations, and routing. We will learn how to leverage geospatial database functionality through GraphQL-database integrations such as PostGIS and Neo4j.", + "goers": "13", + "seats": "0", + "invite_only": "N", + "venue": "Grand Peninsula A,B,C", + "audience": "Intermediate", + "id": "a638dad8443a364e12ed29b3bc50d128", + "venue_id": "1749452", + "speakers": [ + { + "username": "lyonwj1", + "id": "3634520", + "name": "William Lyon", + "company": "Neo4j", + "custom_order": 0 + } + ], + "event_start_year": "2023", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "21", + "event_start_weekday": "Thursday", + "event_start_weekday_short": "Thu", + "event_start_time": "11:30am", + "event_end_year": "2023", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "21", + "event_end_weekday": "Thursday", + "event_end_weekday_short": "Thu", + "event_end_time": "12:00pm", + "start_date": "2023-09-21", + "start_time": "11:30:00", + "start_time_ts": 1695321000, + "end_date": "2023-09-21", + "end_time": "12:00:00" + }, + { + "event_key": "493258", + "active": "Y", + "pinned": "N", + "name": "Houdini: A GraphQL-First Application Framework - Alec Aivazis, Arista Networks", + "event_start": "2023-09-21 11:30", + "event_end": "2023-09-21 12:00", + "event_type": "Session Presentations", + "event_subtype": "GraphQL Clients", + "description": "While the wider community is focused on blurring the lines between the server and client, GraphQL applications have been left behind. In this talk, Alec will present his attempt to change that: Houdini, a new application framework that blends GraphQL client, router, and bundler. An odd mix? Maybe. But with it comes the power of a GraphQL compiler, the latest in React's streaming capabilities, and a fresh take on client-side developer experience. Alec will introduce Houdini's basic APIs and demonstrate how it orchestrates your application’s data and asset needs.", + "goers": "29", + "seats": "0", + "invite_only": "N", + "venue": "Grand Peninsula E", + "audience": "Intermediate", + "geo_area": "Yes", + "id": "ce430c038efa9a9c19743d1ccc702de9", + "venue_id": "1762196", + "speakers": [ + { + "username": "alec102", + "id": "18743870", + "name": "Alec Aivazis", + "company": "Arista Networks", + "custom_order": 0 + } + ], + "event_start_year": "2023", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "21", + "event_start_weekday": "Thursday", + "event_start_weekday_short": "Thu", + "event_start_time": "11:30am", + "event_end_year": "2023", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "21", + "event_end_weekday": "Thursday", + "event_end_weekday_short": "Thu", + "event_end_time": "12:00pm", + "start_date": "2023-09-21", + "start_time": "11:30:00", + "start_time_ts": 1695321000, + "end_date": "2023-09-21", + "end_time": "12:00:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf23/d1/Houdini%20A%20GraphQL-First%20Framework.pdf", + "name": "Houdini A GraphQL-First Framework.pdf" + } + ] + }, + { + "event_key": "493431", + "active": "Y", + "pinned": "N", + "name": "Sophisticated Schema Mocking - Stephanie Saunders, Coinbase", + "event_start": "2023-09-21 11:30", + "event_end": "2023-09-21 12:00", + "event_type": "Session Presentations", + "event_subtype": "GraphQL in Production", + "description": "One of the key components to a stellar developer experience is GraphQL schema mocking.\n\nSchema mocking allows developers to:\n- Develop features faster by mocking unit tests with little to no code\n- Simplify e2e testing by mocking the entire schema at the network level\n- Test client data handling by intercepting and modifying server responses at the field level\n- Visualize how your component will look in production by using mocked data directly in Storybook\n\nAt Coinbase, we have iterated over sophisticated schema mocking solutions over the last few years as we have migrated to GraphQL. We’ve had failures and successes, and lots of learning along the way.\n\nIn this talk, we’ll dive deep into the following topics:\n- Out-Of-The-Box Tooling (Nock, MSW, Relay MockPayloadGenerator, graphql-tools/mock)\n- Custom Helpers (Operation Mocking, Data Component Wrappers, Network Middleware)\n- Client Side Data Manipulation (Mocking Single Fields, Client Schema Extensions)\n- Storybook (Loading Live/Mocked Data, Update Field Mocks Dynamically)", + "goers": "53", + "seats": "0", + "invite_only": "N", + "venue": "Grand Peninsula F&G", + "audience": "Intermediate", + "geo_area": "Yes", + "id": "a44cec64a01063d4c6a11e54cc8d24d3", + "venue_id": "1762208", + "speakers": [ + { + "username": "stephanie.saunders2", + "id": "14992671", + "name": "Stephanie Saunders", + "company": "Coinbase", + "custom_order": 0 + } + ], + "event_start_year": "2023", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "21", + "event_start_weekday": "Thursday", + "event_start_weekday_short": "Thu", + "event_start_time": "11:30am", + "event_end_year": "2023", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "21", + "event_end_weekday": "Thursday", + "event_end_weekday_short": "Thu", + "event_end_time": "12:00pm", + "start_date": "2023-09-21", + "start_time": "11:30:00", + "start_time_ts": 1695321000, + "end_date": "2023-09-21", + "end_time": "12:00:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf23/3b/Sophisticated%20Schema%20Mocking.pdf", + "name": "Sophisticated Schema Mocking.pdf" + } + ] + }, + { + "event_key": "17", + "active": "Y", + "pinned": "N", + "name": "Lunch", + "event_start": "2023-09-21 12:00", + "event_end": "2023-09-21 13:30", + "event_type": "Breaks", + "goers": "46", + "seats": "0", + "invite_only": "N", + "venue": "Grand Peninsula D", + "id": "cb1f116f01ae3d2ddf5100a18792abc2", + "venue_id": "1749440", + "event_start_year": "2023", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "21", + "event_start_weekday": "Thursday", + "event_start_weekday_short": "Thu", + "event_start_time": "12:00pm", + "event_end_year": "2023", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "21", + "event_end_weekday": "Thursday", + "event_end_weekday_short": "Thu", + "event_end_time": "1:30pm", + "start_date": "2023-09-21", + "start_time": "12:00:00", + "start_time_ts": 1695322800, + "end_date": "2023-09-21", + "end_time": "13:30:00", + "description": "" + }, + { + "event_key": "482840", + "active": "Y", + "pinned": "N", + "name": "Unify Data Sources with GraphQL at the Edge - Jamie Barton, Grafbase", + "event_start": "2023-09-21 13:30", + "event_end": "2023-09-21 13:40", + "event_type": "Lightning Talks", + "event_subtype": "GraphQL and Data", + "description": "Combine multiple APIs and databases into a single centralized GraphQL API that you can enhance with auth, permissions and caching, fully managed and deployed to the edge with Wasm.", + "goers": "28", + "seats": "0", + "invite_only": "N", + "venue": "Grand Peninsula E", + "audience": "Beginner", + "id": "520b70cfea27170fd6ed21d79f6b0357", + "venue_id": "1762196", + "speakers": [ + { + "username": "jamie855", + "id": "18743804", + "name": "Jamie Barton", + "company": "Grafbase", + "custom_order": 0 + } + ], + "event_start_year": "2023", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "21", + "event_start_weekday": "Thursday", + "event_start_weekday_short": "Thu", + "event_start_time": "1:30pm", + "event_end_year": "2023", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "21", + "event_end_weekday": "Thursday", + "event_end_weekday_short": "Thu", + "event_end_time": "1:40pm", + "start_date": "2023-09-21", + "start_time": "13:30:00", + "start_time_ts": 1695328200, + "end_date": "2023-09-21", + "end_time": "13:40:00" + }, + { + "event_key": "492667", + "active": "Y", + "pinned": "N", + "name": "Scaling Schema Cardinality: Constructing Types at Runtime - Spencer MacKinnon, Okta", + "event_start": "2023-09-21 13:30", + "event_end": "2023-09-21 14:00", + "event_type": "Session Presentations", + "event_subtype": "Platform and Backend", + "description": "Typically, GraphQL schemas are constructed statically, and services will expose one or a set number of schemas depending on the roles of clients that query the system. When the system is highly configurable, allowing the creation of new types and fields at runtime, with different types and fields exposed depending on the clients privileges, building a set of static schemas becomes infeasible. This talk will discuss a technique used to construct types and fields at runtime, reflecting the users level of access within the system. This technique allowed us to scale to millions of schemas which reflected the permissions of the client querying the GraphQL endpoint. I will discuss the interplay between the static parts of the schema available to all clients and the dynamic parts built depending on the users privileges, as well as how to represent this structure with a \"metaschema\". Then, I'll demonstrate a pattern for constructing types at runtime, with a service responsible for safe instantiation that honors the GraphQL spec, interacting with a set of actors that control which types should be instantiated. I'll close with some discussion of how the spec impacts dynamic construction.", + "goers": "27", + "seats": "0", + "invite_only": "N", + "venue": "Grand Peninsula F&G", + "audience": "Advanced", + "geo_area": "Yes", + "id": "e447a52591ed66a452e04d6ce3e3f09e", + "venue_id": "1762208", + "speakers": [ + { + "username": "spencer211", + "id": "18743795", + "name": "Spencer MacKinnon", + "company": "Okta", + "custom_order": 0 + } + ], + "event_start_year": "2023", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "21", + "event_start_weekday": "Thursday", + "event_start_weekday_short": "Thu", + "event_start_time": "1:30pm", + "event_end_year": "2023", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "21", + "event_end_weekday": "Thursday", + "event_end_weekday_short": "Thu", + "event_end_time": "2:00pm", + "start_date": "2023-09-21", + "start_time": "13:30:00", + "start_time_ts": 1695328200, + "end_date": "2023-09-21", + "end_time": "14:00:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf23/cf/Scaling%20Schema%20Cardinality.pdf", + "name": "Scaling Schema Cardinality.pdf" + } + ] + }, + { + "event_key": "493830", + "active": "Y", + "pinned": "N", + "name": "Why Your GraphQL APIs Are (Increasingly) Under Attack - Shahar Binyamin, Inigo", + "event_start": "2023-09-21 13:30", + "event_end": "2023-09-21 14:00", + "event_type": "Session Presentations", + "event_subtype": "GraphQL Security", + "description": "Make no mistake about it: threat actors are increasingly bent on hunting down, attacking, and exploiting your GraphQL APIs. But understanding exactly how these actors go about recognizing where your GraphQL APIs reside—and how their attacks proceed—can put you on the right road to attack-thwarting countermeasures. GraphQL’s declarative query language enables clients to collect information using specialized queries. Threat actors commonly interrogate APIs in order to uncover critical information that could aid in further attacks. These information-gathering and reconnaissance tactics feed into the logic of their scanning tools to determine the location of GraphQL APIs—and what they contain. Session attendees will come away with thorough knowledge of how to detect and mitigate nefarious GraphQL activities, and how to implement a security layer to protect targeted GraphQL APIs and effectively block attacks. Attendees of this GraphQLConf talk will learn: -- The techniques attackers use to gather information on your GraphQL APIs -- The telltale anomalous behavior associated with that reconnaissance, and -- How to surface threats and block those attack paths before exploits occur.", + "goers": "25", + "seats": "0", + "invite_only": "N", + "venue": "Grand Peninsula A,B,C", + "audience": "Intermediate", + "id": "3d167cf84012c4ff2dcca8fca736b0dd", + "venue_id": "1749452", + "speakers": [ + { + "username": "shahar_binyamin.24vrzgo4", + "id": "17274089", + "name": "Shahar Binyamin", + "company": "Inigo", + "custom_order": 0 + } + ], + "event_start_year": "2023", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "21", + "event_start_weekday": "Thursday", + "event_start_weekday_short": "Thu", + "event_start_time": "1:30pm", + "event_end_year": "2023", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "21", + "event_end_weekday": "Thursday", + "event_end_weekday_short": "Thu", + "event_end_time": "2:00pm", + "start_date": "2023-09-21", + "start_time": "13:30:00", + "start_time_ts": 1695328200, + "end_date": "2023-09-21", + "end_time": "14:00:00" + }, + { + "event_key": "511226", + "active": "Y", + "pinned": "N", + "name": "Not Your Regular Rate Limiting - Meenakshi Dhanani, Postman", + "event_start": "2023-09-21 13:45", + "event_end": "2023-09-21 13:55", + "event_type": "Lightning Talks", + "description": "Rate limiting in GraphQL APIs goes beyond the traditional approaches used in REST APIs. Regular techniques fall short when it comes to handling complex queries and preventing abuse. In this lightning talk, we will explore creative strategies for overcoming these challenges within the unique context of GraphQL's single endpoint architecture. We will also discuss practical techniques and dive into real-world examples that demonstrate how to optimize rate limiting in your GraphQL APIs and ensure the scalability and security of your applications.", + "goers": "45", + "seats": "0", + "invite_only": "N", + "venue": "Grand Peninsula E", + "geo_area": "Yes", + "id": "48f4e69c465b793750b5aa47bb7f2b6e", + "venue_id": "1762196", + "speakers": [ + { + "username": "meenakshi.dhanani1", + "id": "18777983", + "name": "Meenakshi Dhanani", + "company": "Postman", + "custom_order": 0 + } + ], + "event_start_year": "2023", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "21", + "event_start_weekday": "Thursday", + "event_start_weekday_short": "Thu", + "event_start_time": "1:45pm", + "event_end_year": "2023", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "21", + "event_end_weekday": "Thursday", + "event_end_weekday_short": "Thu", + "event_end_time": "1:55pm", + "start_date": "2023-09-21", + "start_time": "13:45:00", + "start_time_ts": 1695329100, + "end_date": "2023-09-21", + "end_time": "13:55:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf23/b6/GraphQL%20Conf%202023%20-%20Rate%20Limiting.pdf", + "name": "GraphQL Conf 2023 - Rate Limiting.pdf" + } + ] + }, + { + "event_key": "501214", + "active": "Y", + "pinned": "N", + "name": "AI, GraphQL, and the Rise of Malleable Applications - Aleksandra Sikora, The Guild", + "event_start": "2023-09-21 14:10", + "event_end": "2023-09-21 14:40", + "event_type": "Session Presentations", + "event_subtype": "Emerging Community Trends", + "description": "This presentation will explore how AI makes code writing and development more accessible and highlight the trend of malleable applications. We’ll see how users are becoming architects of their own apps, reshaping them to suit their needs. We will examine existing tools to understand the possibilities, and we'll see how GraphQL fits there.", + "goers": "31", + "seats": "0", + "invite_only": "N", + "venue": "Grand Peninsula E", + "audience": "Beginner", + "id": "4feef977ceb883c69c91ccd2dd607aec", + "venue_id": "1762196", + "speakers": [ + { + "username": "alexsandra.sikora", + "id": "18743798", + "name": "Aleksandra Sikora", + "company": "The Guild", + "custom_order": 0 + } + ], + "event_start_year": "2023", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "21", + "event_start_weekday": "Thursday", + "event_start_weekday_short": "Thu", + "event_start_time": "2:10pm", + "event_end_year": "2023", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "21", + "event_end_weekday": "Thursday", + "event_end_weekday_short": "Thu", + "event_end_time": "2:40pm", + "start_date": "2023-09-21", + "start_time": "14:10:00", + "start_time_ts": 1695330600, + "end_date": "2023-09-21", + "end_time": "14:40:00" + }, + { + "event_key": "495993", + "active": "Y", + "pinned": "N", + "name": "GraphQL in Production: Empowering Efficient Data Retrieval and Unleashing Developer Productivity - Seddik Benaissa, Northeastern University", + "event_start": "2023-09-21 14:10", + "event_end": "2023-09-21 14:40", + "event_type": "Session Presentations", + "event_subtype": "GraphQL in Production", + "description": "Join me in this talk as we delve into the realm of GraphQL in practical applications. Experience firsthand how GraphQL has revolutionized the way we retrieve data. Discover the hurdles encountered with traditional APIs, such as bloated payloads and sluggish response times. Witness the tremendous success and influence of adopting GraphQL, the robust query language for APIs. Unearth real-life examples, best practices, and valuable lessons from implementing GraphQL in a production environment. Gain valuable insights into customizing data queries, optimizing performance, and enhancing developer efficiency. This presentation is essential for software engineers and developers eager to harness the power of GraphQL, conquer data retrieval obstacles, and unleash the full potential of their systems.", + "goers": "26", + "seats": "0", + "invite_only": "N", + "venue": "Grand Peninsula F&G", + "audience": "Intermediate", + "geo_area": "Yes", + "id": "1e7a35fbd833d9be1aa9719f77c86fb7", + "venue_id": "1762208", + "speakers": [ + { + "username": "sdk.bens", + "id": "18743831", + "name": "Seddik Benaissa", + "company": "Northeastern University", + "custom_order": 0 + } + ], + "event_start_year": "2023", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "21", + "event_start_weekday": "Thursday", + "event_start_weekday_short": "Thu", + "event_start_time": "2:10pm", + "event_end_year": "2023", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "21", + "event_end_weekday": "Thursday", + "event_end_weekday_short": "Thu", + "event_end_time": "2:40pm", + "start_date": "2023-09-21", + "start_time": "14:10:00", + "start_time_ts": 1695330600, + "end_date": "2023-09-21", + "end_time": "14:40:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf23/01/Seddik%20Benaissa.pdf", + "name": "Seddik Benaissa.pdf" + } + ] + }, + { + "event_key": "6", + "active": "Y", + "pinned": "N", + "name": "Increase Your Productivity With No-Code GraphQL Mocking - Laurent Broudoux, Microcks & Postman", + "event_start": "2023-09-21 14:10", + "event_end": "2023-09-21 14:40", + "event_type": "Session Presentations", + "description": "You're about to embark on a new adventure that incorporates GraphQL! Here's a filthy method for becoming a 10-x engineer: fake it until you make it!\n\nMocking GraphQL allows you to better serve the business by providing clear descriptions of schemas, types, and examples. This also helps in the separation of front-end and back-end activities and in the testing of your future API. Join this session to learn more about getting started with GraphQL mocking without having to worry about coding or constructing your own fake server, thanks to Microcks!\n\nIn this session, we will illustrate how to: shorten the feedback loop when designing a new API, speed-up development making autonomous teams, make your CI/CD pipeline rock-solid with automated tests inferred from mocks!", + "goers": "33", + "seats": "0", + "invite_only": "N", + "venue": "Grand Peninsula A,B,C", + "id": "95e6219a5e20a9e2f9381822460932ac", + "venue_id": "1749452", + "speakers": [ + { + "username": "laurent57", + "id": "13884588", + "name": "Laurent Broudoux", + "company": "Postman", + "custom_order": 0 + } + ], + "event_start_year": "2023", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "21", + "event_start_weekday": "Thursday", + "event_start_weekday_short": "Thu", + "event_start_time": "2:10pm", + "event_end_year": "2023", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "21", + "event_end_weekday": "Thursday", + "event_end_weekday_short": "Thu", + "event_end_time": "2:40pm", + "start_date": "2023-09-21", + "start_time": "14:10:00", + "start_time_ts": 1695330600, + "end_date": "2023-09-21", + "end_time": "14:40:00" + }, + { + "event_key": "498924", + "active": "Y", + "pinned": "N", + "name": "Adoption of GraphQL in Meta Ads Manager - Bryan Yang & Yuanchao Zhu, Meta", + "event_start": "2023-09-21 14:50", + "event_end": "2023-09-21 15:20", + "event_type": "Session Presentations", + "event_subtype": "GraphQL Clients", + "description": "Within Meta, there are products still adopting GraphQL. Ads Manager is a large product that is iteratively transitioning to GraphQL from a REST-based API, GraphAPI. This talk will cover why we chose to migrate, challenges we faced and strategies to adopt GraphQL iteratively, without a full product rewrite.", + "goers": "16", + "seats": "0", + "invite_only": "N", + "venue": "Grand Peninsula E", + "audience": "Intermediate", + "geo_area": "Yes", + "id": "afefc1feb47ec68ca6031cfec2e7d46b", + "venue_id": "1762196", + "speakers": [ + { + "username": "bsy", + "id": "18743852", + "name": "Bryan Yang", + "company": "Meta Platforms, Inc.", + "custom_order": 0 + }, + { + "username": "yczhu", + "id": "18743882", + "name": "Yuanchao Zhu", + "company": "Meta", + "custom_order": 1 + } + ], + "event_start_year": "2023", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "21", + "event_start_weekday": "Thursday", + "event_start_weekday_short": "Thu", + "event_start_time": "2:50pm", + "event_end_year": "2023", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "21", + "event_end_weekday": "Thursday", + "event_end_weekday_short": "Thu", + "event_end_time": "3:20pm", + "start_date": "2023-09-21", + "start_time": "14:50:00", + "start_time_ts": 1695333000, + "end_date": "2023-09-21", + "end_time": "15:20:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf23/3f/GraphQL%20Conf%202023%20-%20Adoption%20of%20GraphQL%20in%20Ads%20Manager.pdf", + "name": "GraphQL Conf 2023 - Adoption of GraphQL in Ads Manager.pdf" + } + ] + }, + { + "event_key": "502937", + "active": "Y", + "pinned": "N", + "name": "Fixing the Billion Dollar Mistake: Client Controlled Nullability - Stephen Spalding, Netflix", + "event_start": "2023-09-21 14:50", + "event_end": "2023-09-21 15:20", + "event_type": "Session Presentations", + "event_subtype": "GraphQL Core", + "description": "Null has been famously called “the billion dollar mistake”. The Client Controlled Nullability proposal aims to empower client developers to tame nullability in the graph. Come learn how this magic works and why it will rock your world!", + "goers": "47", + "seats": "0", + "invite_only": "N", + "venue": "Grand Peninsula A,B,C", + "audience": "Advanced", + "geo_area": "Yes", + "id": "50005edb4a441b0335d1b80b4ad62b1a", + "venue_id": "1749452", + "speakers": [ + { + "username": "sspalding2", + "id": "18743825", + "name": "Stephen Spalding", + "company": "Netflix", + "custom_order": 0 + } + ], + "event_start_year": "2023", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "21", + "event_start_weekday": "Thursday", + "event_start_weekday_short": "Thu", + "event_start_time": "2:50pm", + "event_end_year": "2023", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "21", + "event_end_weekday": "Thursday", + "event_end_weekday_short": "Thu", + "event_end_time": "3:20pm", + "start_date": "2023-09-21", + "start_time": "14:50:00", + "start_time_ts": 1695333000, + "end_date": "2023-09-21", + "end_time": "15:20:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf23/d0/Stephen%20Spalding%20-%20Fixing%20the%20Billion%20Dollar%20Mistake%20-%20Client%20Controlled%20Nullability.pdf", + "name": "Stephen Spalding - Fixing the Billion Dollar Mistake - Client Controlled Nullability.pdf" + } + ] + }, + { + "event_key": "511238", + "active": "Y", + "pinned": "N", + "name": "Scaling the Data Access by Leveraging GraphQL Federation for Service to Service Communication - Serhii Korin, Booking.com", + "event_start": "2023-09-21 14:50", + "event_end": "2023-09-21 15:20", + "event_type": "Session Presentations", + "event_subtype": "GraphQL in Production", + "description": "At booking.com’s scale rendering the product pages requires retrieving data from hundreds of data sources. This causes a very high load to the data backends. We pre-materialize the data required for rendering the product pages in order to scale data access. Different products have different data needs. Over time this led to the materialization layer becoming a monolithic service with a monolithic schema.\n\nThis talk focuses on how we leveraged the GraphQL Federation technology to let product teams choose which data to materialize and data owners to scale data access to their data without negatively affecting the ownership, network costs and latencies.", + "goers": "24", + "seats": "0", + "invite_only": "N", + "venue": "Grand Peninsula F&G", + "audience": "Intermediate", + "geo_area": "Yes", + "id": "0bea54e1f79d706f2da4c802f8581ae5", + "venue_id": "1762208", + "speakers": [ + { + "username": "serhii.korin", + "id": "19235292", + "name": "Serhii Korin", + "company": "Booking.com", + "custom_order": 0 + } + ], + "event_start_year": "2023", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "21", + "event_start_weekday": "Thursday", + "event_start_weekday_short": "Thu", + "event_start_time": "2:50pm", + "event_end_year": "2023", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "21", + "event_end_weekday": "Thursday", + "event_end_weekday_short": "Thu", + "event_end_time": "3:20pm", + "start_date": "2023-09-21", + "start_time": "14:50:00", + "start_time_ts": 1695333000, + "end_date": "2023-09-21", + "end_time": "15:20:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf23/aa/Scaling%20the%20data%20access%20by%20leveraging%20GraphQL%20Federation%20for%20S2S.pdf", + "name": "Scaling the data access by leveraging GraphQL Federation for S2S.pdf" + } + ] + }, + { + "event_key": "15", + "active": "Y", + "pinned": "N", + "name": "Break", + "event_start": "2023-09-21 15:20", + "event_end": "2023-09-21 15:40", + "event_type": "Breaks", + "goers": "33", + "seats": "0", + "invite_only": "N", + "venue": "Grand Peninsula D", + "id": "e3a855088054e180ec6e046bf3d8be8a", + "venue_id": "1749440", + "event_start_year": "2023", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "21", + "event_start_weekday": "Thursday", + "event_start_weekday_short": "Thu", + "event_start_time": "3:20pm", + "event_end_year": "2023", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "21", + "event_end_weekday": "Thursday", + "event_end_weekday_short": "Thu", + "event_end_time": "3:40pm", + "start_date": "2023-09-21", + "start_time": "15:20:00", + "start_time_ts": 1695334800, + "end_date": "2023-09-21", + "end_time": "15:40:00", + "description": "" + }, + { + "event_key": "501477", + "active": "Y", + "pinned": "N", + "name": "The Evolution of GraphQL Code Generation - Laurin Quast, The Guild", + "event_start": "2023-09-21 15:40", + "event_end": "2023-09-21 15:50", + "event_type": "Lightning Talks", + "event_subtype": "GraphQL Clients", + "description": "As the maintainer of GraphQL Code Generator, Laurin shows how the tool has changed over time and informs you of the most recent best practices that allow you to keep the client code lean and scalable.", + "goers": "35", + "seats": "0", + "invite_only": "N", + "venue": "Grand Peninsula E", + "audience": "Beginner", + "id": "675c416b16ad2b0c519b1ec894353fc5", + "venue_id": "1762196", + "speakers": [ + { + "username": "laurinquast", + "id": "18743819", + "name": "Laurin Quast", + "company": "The Guild", + "custom_order": 0 + } + ], + "event_start_year": "2023", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "21", + "event_start_weekday": "Thursday", + "event_start_weekday_short": "Thu", + "event_start_time": "3:40pm", + "event_end_year": "2023", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "21", + "event_end_weekday": "Thursday", + "event_end_weekday_short": "Thu", + "event_end_time": "3:50pm", + "start_date": "2023-09-21", + "start_time": "15:40:00", + "start_time_ts": 1695336000, + "end_date": "2023-09-21", + "end_time": "15:50:00" + }, + { + "event_key": "494695", + "active": "Y", + "pinned": "N", + "name": "Improving User Experiences with a Nullable Schema - Ernie Turner, Coinbase", + "event_start": "2023-09-21 15:40", + "event_end": "2023-09-21 16:10", + "event_type": "Session Presentations", + "event_subtype": "GraphQL and Data", + "description": "When designing a GraphQL schema, it’s tempting to mark every field as non-null using the \"!\" operator. While it may seem convenient and simplifies code readability, this seemingly innocuous choice can have unforeseen consequences for your applications, especially during service disruptions. Moreover, these downsides might not become apparent until a significant portion of your schema has been marked as non-nullable. In this talk, we will: - Challenge the traditional server-centric approach and advocate for shifting the responsibility of field nullability to the client. - Explore the reasons behind this paradigm shift and introduce existing and upcoming tools that empower clients to determine whether a field can be null or not. - Delve into the Client Controlled Nullability proposal, demonstrating its potential in GraphQL workflows. - Provide practical methods and best practices to safely migrate away from a non-null schema, ensuring compatibility with existing clients without causing disruptions.", + "goers": "31", + "seats": "0", + "invite_only": "N", + "venue": "Grand Peninsula A,B,C", + "audience": "Intermediate", + "geo_area": "Yes", + "id": "888b77af90aa0ff776adc9669a29cb3f", + "venue_id": "1749452", + "speakers": [ + { + "username": "ernie.turner1", + "id": "18743873", + "name": "Ernie Turner", + "company": "Coinbase", + "custom_order": 0 + } + ], + "event_start_year": "2023", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "21", + "event_start_weekday": "Thursday", + "event_start_weekday_short": "Thu", + "event_start_time": "3:40pm", + "event_end_year": "2023", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "21", + "event_end_weekday": "Thursday", + "event_end_weekday_short": "Thu", + "event_end_time": "4:10pm", + "start_date": "2023-09-21", + "start_time": "15:40:00", + "start_time_ts": 1695336000, + "end_date": "2023-09-21", + "end_time": "16:10:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf23/ce/Improving%20User%20Experiences%20with%20a%20Nullable%20Schema_%20GraphQL%20Conf%202023.pdf", + "name": "Improving User Experiences with a Nullable Schema_ GraphQL Conf 2023.pdf" + } + ] + }, + { + "event_key": "13", + "active": "Y", + "pinned": "N", + "name": "Why AI needs GraphQL - Anant Jhingran, IBM", + "event_start": "2023-09-21 15:40", + "event_end": "2023-09-21 16:10", + "event_type": "Session Presentations", + "description": "There is a bright future for AI-driven integration, both in the application of integration to provide access to enterprise data for use by AI tools and also for application of AI to benefit the delivery of integration scenarios. However, AI foundation models must be complemented by integration and API technologies, and GraphQL can be the perfect technology for this. Having founded StepZen (now acquired by IBM) I have a particular bias for GraphQL applications, but in this case they can be especially powerful. AI applications can be trained to call one universal GraphQL API, and not have to deal with the subtleties of formats and authorizations and sideways information passing if the application were to learn multiple backends. In this talk I’ll explain why AI needs GraphQL for integrations, and what the future of AI and GraphQL looks like.", + "goers": "21", + "seats": "0", + "invite_only": "N", + "venue": "Grand Peninsula F&G", + "id": "f802d22f97a3d3d9d2733bf637758f56", + "venue_id": "1762208", + "speakers": [ + { + "username": "ajhingran", + "id": "19225935", + "name": "Anant Jhingran", + "company": "IBM", + "custom_order": 0 + } + ], + "event_start_year": "2023", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "21", + "event_start_weekday": "Thursday", + "event_start_weekday_short": "Thu", + "event_start_time": "3:40pm", + "event_end_year": "2023", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "21", + "event_end_weekday": "Thursday", + "event_end_weekday_short": "Thu", + "event_end_time": "4:10pm", + "start_date": "2023-09-21", + "start_time": "15:40:00", + "start_time_ts": 1695336000, + "end_date": "2023-09-21", + "end_time": "16:10:00" + }, + { + "event_key": "14", + "active": "Y", + "pinned": "N", + "name": "Breaking the Mold: Innovative Approaches to Testing GraphQL APIs - Pooja Mistry, Postman", + "event_start": "2023-09-21 15:55", + "event_end": "2023-09-21 16:05", + "event_type": "Lightning Talks", + "goers": "32", + "seats": "0", + "invite_only": "N", + "venue": "Grand Peninsula E", + "id": "f653b9931d85c7958993ca62e7853972", + "venue_id": "1762196", + "speakers": [ + { + "username": "pooja.mistry", + "id": "15879818", + "name": "Pooja Mistry", + "company": "Postman", + "custom_order": 0 + } + ], + "event_start_year": "2023", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "21", + "event_start_weekday": "Thursday", + "event_start_weekday_short": "Thu", + "event_start_time": "3:55pm", + "event_end_year": "2023", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "21", + "event_end_weekday": "Thursday", + "event_end_weekday_short": "Thu", + "event_end_time": "4:05pm", + "start_date": "2023-09-21", + "start_time": "15:55:00", + "start_time_ts": 1695336900, + "end_date": "2023-09-21", + "end_time": "16:05:00", + "description": "" + }, + { + "event_key": "501218", + "active": "Y", + "pinned": "N", + "name": "Shared Schema Policies and Automatic Standards Across Your Company’s Teams - Dimitri Postolov, The Guild", + "event_start": "2023-09-21 16:10", + "event_end": "2023-09-21 16:20", + "event_type": "Lightning Talks", + "event_subtype": "GraphQL in Production", + "description": "As GraphQL adoption grows inside our companies and more and more teams are adopting it, it gets harder to maintain a consistent way of using it across the company. In this talk, we will share different methods and open-source tools that help you manage GraphQL standardizations and guarantee best practices across your company. Sharing automatic rules from the community and writing your own custom rules for your specific company.", + "goers": "31", + "seats": "0", + "invite_only": "N", + "venue": "Grand Peninsula E", + "audience": "Intermediate", + "id": "ff6a2ae37d87e74c9f7739a1331804a1", + "venue_id": "1762196", + "speakers": [ + { + "username": "en3m", + "id": "18743843", + "name": "Dimitri Postolov", + "company": "The Guild", + "custom_order": 0 + } + ], + "event_start_year": "2023", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "21", + "event_start_weekday": "Thursday", + "event_start_weekday_short": "Thu", + "event_start_time": "4:10pm", + "event_end_year": "2023", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "21", + "event_end_weekday": "Thursday", + "event_end_weekday_short": "Thu", + "event_end_time": "4:20pm", + "start_date": "2023-09-21", + "start_time": "16:10:00", + "start_time_ts": 1695337800, + "end_date": "2023-09-21", + "end_time": "16:20:00" + }, + { + "event_key": "38", + "active": "Y", + "pinned": "N", + "name": "Deep Learnings: Migrating legacy services to Federated GraphQL - Christian Ernst, Booking.com", + "event_start": "2023-09-21 16:20", + "event_end": "2023-09-21 16:50", + "event_type": "Session Presentations", + "event_subtype": "GraphQL in Production", + "description": "At Booking.com we made the decision to move to GraphQL in order to modernize our monolithic front-end data providing services. Our journey started with the monograph, a singular service to provide all GraphQL data as a bridge between legacy and new. This service, owned by a small team, exploded in use receiving countless contributions across the company. We soon realised as a team this would not scale for an entire company.\n\nThis talk focuses on our experience and our journey from our first steps into the world of GraphQL and then our leap to move to a Federated GraphQL layer.\n\nWe will share some of our most important learnings from the challenges we faced, including scaling and resiliency, bringing on legacy services, and multi cloud support and how we are handling these challenges via our ongoing initiatives and what we think the future of GraphQL at Booking.com looks like.", + "goers": "29", + "seats": "0", + "invite_only": "N", + "venue": "Grand Peninsula A,B,C", + "audience": "Beginner", + "geo_area": "Yes", + "id": "8a1158bda6933f83f43b704bff54ff63", + "venue_id": "1749452", + "speakers": [ + { + "username": "christian.ernst", + "id": "19084532", + "name": "Christian Ernst", + "company": "Booking.com", + "custom_order": 0 + } + ], + "event_start_year": "2023", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "21", + "event_start_weekday": "Thursday", + "event_start_weekday_short": "Thu", + "event_start_time": "4:20pm", + "event_end_year": "2023", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "21", + "event_end_weekday": "Thursday", + "event_end_weekday_short": "Thu", + "event_end_time": "4:50pm", + "start_date": "2023-09-21", + "start_time": "16:20:00", + "start_time_ts": 1695338400, + "end_date": "2023-09-21", + "end_time": "16:50:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf23/70/Migrating%20Legacy%20Services%20to%20Federated%20GraphQL.pdf", + "name": "Migrating Legacy Services to Federated GraphQL.pdf" + } + ] + }, + { + "event_key": "501201", + "active": "Y", + "pinned": "N", + "name": "How to Choose a GraphQL Gateway? - Dotan Simha, The Guild", + "event_start": "2023-09-21 16:20", + "event_end": "2023-09-21 16:50", + "event_type": "Session Presentations", + "event_subtype": "Platform and Backend", + "description": "Federation, Stitching, Gateways, so many terms out there and so many options for choosing your GraphQL gateway strategy. In this talk I will demonstrate my open work on comparing different GraphQL gateway solutions, what are the different requirements to take into account and show how many existing solutions fit into this framework for choice.\n\nhttps://the-guild.dev/blog/state-of-graphql-gateways-in-2023", + "goers": "37", + "seats": "0", + "invite_only": "N", + "venue": "Grand Peninsula F&G", + "audience": "Intermediate", + "id": "70f9e59dc60cf417aa38eb890b2a8abe", + "venue_id": "1762208", + "speakers": [ + { + "username": "dotansimha", + "id": "18743828", + "name": "Dotan Simha", + "company": "The Guild", + "custom_order": 0 + } + ], + "event_start_year": "2023", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "21", + "event_start_weekday": "Thursday", + "event_start_weekday_short": "Thu", + "event_start_time": "4:20pm", + "event_end_year": "2023", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "21", + "event_end_weekday": "Thursday", + "event_end_weekday_short": "Thu", + "event_end_time": "4:50pm", + "start_date": "2023-09-21", + "start_time": "16:20:00", + "start_time_ts": 1695338400, + "end_date": "2023-09-21", + "end_time": "16:50:00" + }, + { + "event_key": "511242", + "active": "Y", + "pinned": "N", + "name": "Dataloader 3.0 - An Alternative Algorithm to Solve N+1 Problems - Jens Neuse, WunderGraph", + "event_start": "2023-09-21 17:00", + "event_end": "2023-09-21 17:30", + "event_type": "Session Presentations", + "description": "When you ask GraphQL Developers how they solve N+1 problems, the immediate answer you get is using the \"Dataloader\" pattern.\nWhat actually is the Dataloader pattern? How does it work and how does it solve the problem?\nThis talk dives deep into the topic of efficiently resolving deeply nested data.\nOnce we understand how the Dataloader pattern works,\nwe explore its drawbacks and limitations.\nFinally, we will present an alternative algorithm that uses breadth-first resolving compared to depth-first, which Dataloader builds on top.\nJoin Jens in this talk to learn more about how breadth-first resolving could help GraphQL servers and Gateways resolve N+1 problems more effectively.", + "goers": "46", + "seats": "0", + "invite_only": "N", + "venue": "Grand Peninsula E", + "geo_area": "Yes", + "id": "09bc04c42310bfe14024455bce46d781", + "venue_id": "1762196", + "speakers": [ + { + "username": "jens63", + "id": "19226202", + "name": "Jens Neuse", + "company": "WunderGraph", + "custom_order": 0 + } + ], + "event_start_year": "2023", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "21", + "event_start_weekday": "Thursday", + "event_start_weekday_short": "Thu", + "event_start_time": "5:00pm", + "event_end_year": "2023", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "21", + "event_end_weekday": "Thursday", + "event_end_weekday_short": "Thu", + "event_end_time": "5:30pm", + "start_date": "2023-09-21", + "start_time": "17:00:00", + "start_time_ts": 1695340800, + "end_date": "2023-09-21", + "end_time": "17:30:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf23/c0/Dataloader_3.0_WunderGraph_Jens_Neuse_slides.pdf", + "name": "Dataloader_3.0_WunderGraph_Jens_Neuse_slides.pdf" + }, + { + "path": "https://static.sched.com/hosted_files/graphqlconf23/38/Dataloader_3.0_WunderGraph_Jens_Neuse_algorithm.pdf", + "name": "Dataloader_3.0_WunderGraph_Jens_Neuse_algorithm.pdf" + } + ] + }, + { + "event_key": "511241", + "active": "Y", + "pinned": "N", + "name": "The Benefits of Code First Over Schema First in GraphQL - Patrick Arminio, Apollo", + "event_start": "2023-09-21 17:00", + "event_end": "2023-09-21 17:30", + "event_type": "Session Presentations", + "event_subtype": "GraphQL Core", + "description": "This talk will explore the advantages of using a code-first approach for developing GraphQL APIs over a schema-first approach. GraphQL has gained popularity as a modern API technology that enables developers to build APIs that are flexible, performant, and easy to use. However, one of the challenges of using GraphQL is deciding whether to use a schema-first or a code-first approach.\n\nIn this talk, we will discuss how code-first allows for greater flexibility, scalability, and maintainability in GraphQL API development. We'll explore how it can improve the development process, especially for large teams and complex projects. By using code-first, developers can write code that generates the schema, which provides greater control over the API design and allows for more efficient iteration.Moreover, we'll examine how Strawberry, a GraphQL library built on Python, leverages the power of Python's type system to provide an end-to-end type-safe code-first approach. This approach allows developers to define their GraphQL schema using Python classes, which Strawberry then converts into a GraphQL schema, ensuring type safety throughout the development process.", + "goers": "19", + "seats": "0", + "invite_only": "N", + "venue": "Grand Peninsula F&G", + "audience": "Intermediate", + "id": "118f99976647d953d6554bac33dbf3bf", + "venue_id": "1762208", + "speakers": [ + { + "username": "patrick.arminio", + "id": "19178765", + "name": "Patrick Arminio", + "company": "Apollo", + "custom_order": 0 + } + ], + "event_start_year": "2023", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "21", + "event_start_weekday": "Thursday", + "event_start_weekday_short": "Thu", + "event_start_time": "5:00pm", + "event_end_year": "2023", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "21", + "event_end_weekday": "Thursday", + "event_end_weekday_short": "Thu", + "event_end_time": "5:30pm", + "start_date": "2023-09-21", + "start_time": "17:00:00", + "start_time_ts": 1695340800, + "end_date": "2023-09-21", + "end_time": "17:30:00" + }, + { + "event_key": "37", + "active": "Y", + "pinned": "N", + "name": "The evolution of the GraphQL Orchestrator powering Intuit Consumer Apps - Ashpak Shaikh, Intuit", + "event_start": "2023-09-21 17:00", + "event_end": "2023-09-21 17:30", + "event_type": "Session Presentations", + "event_subtype": "GraphQL in Production", + "description": "This session will talk about the GraphQL journey at Intuit discussing what challenges we faced while scaling the GraphQL ecosystem at Intuit as the number of GraphQL microservices grew. We will focus on the internal GraphQL Orchestrator implementation that powers the Consumer Group, combining 50+ microservices that serve 150+ clients spanning multiple Intuit applications like Mint, TurboTax, Turbo Tax Live, and Virtual Expert Platform.\n\nThe session will cover the following topics\n* The combination of Recursive Schema Stitching + Apollo Federation for schema composition.\n* Inclusion of REST microservices in the GraphQL Ecosystem using declarative Adapters.\n* Securing the unified graph using GraphQL Authorization and user consent checks.\n* Loosely coupled registration of microservices with the GraphQL gateway using AWS S3 as persistence.\n* Our journey to open source the orchestrator implementation.", + "goers": "15", + "seats": "0", + "invite_only": "N", + "venue": "Grand Peninsula A,B,C", + "audience": "Advanced", + "geo_area": "Yes", + "id": "17f150667d13a57f28bae524443f4c60", + "venue_id": "1749452", + "speakers": [ + { + "username": "ashpak_shaikh", + "id": "19084619", + "name": "Ashpak Shaikh", + "company": "Intuit", + "custom_order": 0 + } + ], + "event_start_year": "2023", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "21", + "event_start_weekday": "Thursday", + "event_start_weekday_short": "Thu", + "event_start_time": "5:00pm", + "event_end_year": "2023", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "21", + "event_end_weekday": "Thursday", + "event_end_weekday_short": "Thu", + "event_end_time": "5:30pm", + "start_date": "2023-09-21", + "start_time": "17:00:00", + "start_time_ts": 1695340800, + "end_date": "2023-09-21", + "end_time": "17:30:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf23/a3/ashpak_graphql_conf.pdf", + "name": "ashpak_graphql_conf.pdf" + } + ] + } +] diff --git a/scripts/sync-sched/schedule-2024.json b/scripts/sync-sched/schedule-2024.json new file mode 100644 index 0000000000..f38e68b321 --- /dev/null +++ b/scripts/sync-sched/schedule-2024.json @@ -0,0 +1,4648 @@ +[ + { + "event_key": "706600", + "active": "Y", + "pinned": "N", + "name": "Registration & Badge Pick-up", + "event_start": "2024-09-09 14:00", + "event_end": "2024-09-09 17:00", + "event_type": "Registration & Badge Pick-up", + "goers": "21", + "seats": "0", + "invite_only": "N", + "venue": "Level 2 Foyer", + "id": "2acdefcaf8b375f6a2105cf3d3a4c6e0", + "venue_id": "1944317", + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "9", + "event_start_weekday": "Monday", + "event_start_weekday_short": "Mon", + "event_start_time": "2:00pm", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "9", + "event_end_weekday": "Monday", + "event_end_weekday_short": "Mon", + "event_end_time": "5:00pm", + "start_date": "2024-09-09", + "start_time": "14:00:00", + "start_time_ts": 1725915600, + "end_date": "2024-09-09", + "end_time": "17:00:00", + "description": "" + }, + { + "event_key": "706603", + "active": "Y", + "pinned": "N", + "name": "Registration & Badge Pick-up", + "event_start": "2024-09-10 08:00", + "event_end": "2024-09-10 19:00", + "event_type": "Registration & Badge Pick-up", + "goers": "51", + "seats": "0", + "invite_only": "N", + "venue": "Level 2 Foyer", + "id": "3c81808073ae7f888acc66d832877764", + "venue_id": "1944317", + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Tuesday", + "event_start_weekday_short": "Tue", + "event_start_time": "8:00am", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Tuesday", + "event_end_weekday_short": "Tue", + "event_end_time": "7:00pm", + "start_date": "2024-09-10", + "start_time": "08:00:00", + "start_time_ts": 1725980400, + "end_date": "2024-09-10", + "end_time": "19:00:00", + "description": "" + }, + { + "event_key": "706605", + "active": "Y", + "pinned": "N", + "name": "Welcome & Opening Remarks - Lee Byron, GraphQL Foundation", + "event_start": "2024-09-10 09:00", + "event_end": "2024-09-10 09:15", + "event_type": "Keynote Sessions", + "goers": "83", + "video_stream": "https://www.youtube.com/watch?v=FTzPajvTw4c", + "seats": "0", + "invite_only": "N", + "venue": "Metropolitan Ballroom", + "id": "1b3086b33b9d1b30790f02a49857cfe0", + "venue_id": "1944323", + "speakers": [ + { + "username": "lee_byron.25jvpjmb", + "id": "18743534", + "name": "Lee Byron", + "company": "GraphQL Foundation", + "custom_order": 0 + } + ], + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Tuesday", + "event_start_weekday_short": "Tue", + "event_start_time": "9:00am", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Tuesday", + "event_end_weekday_short": "Tue", + "event_end_time": "9:15am", + "start_date": "2024-09-10", + "start_time": "09:00:00", + "start_time_ts": 1725984000, + "end_date": "2024-09-10", + "end_time": "09:15:00", + "description": "" + }, + { + "event_key": "686029", + "active": "Y", + "pinned": "N", + "name": "Keynote: You're Our Universe: GraphQL Community Update 2024 - Benjie Gillam, Graphile", + "event_start": "2024-09-10 09:15", + "event_end": "2024-09-10 09:25", + "event_type": "Keynote Sessions", + "description": "The GraphQL ecosystem is vast, composed of tools and libraries in many programming languages, people and organizations from across the globe, and a plethora of maintainers, contributors and developers pulling them together. The primary mission of the GraphQL Foundation is to ensure that the GraphQL community is able to focus on the continued evolution of the specification, the shared contract that competitors and collaborators alike implement to enable maximal interoperability. This talk is to thank YOU, the GraphQL community, and highlight some of the heroes that have arisen to heed this call. Find out about their efforts over the last year improving our shared specifications, implementations, documentation, tooling, tests, and websites; about how you can get involved and help shape GraphQL to fit your organization's needs; about the support we have available; and about other community initiatives you may wish to avail yourself of.", + "goers": "81", + "video_stream": "https://www.youtube.com/watch?v=xaTEuk-DKqI", + "seats": "0", + "invite_only": "N", + "venue": "Metropolitan Ballroom", + "company": "Any", + "id": "5245297ed1f7b82885c742d77f209bda", + "venue_id": "1944323", + "speakers": [ + { + "username": "benjie3", + "id": "18743846", + "name": "Benjie Gillam", + "company": "Graphile", + "custom_order": 0 + } + ], + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Tuesday", + "event_start_weekday_short": "Tue", + "event_start_time": "9:15am", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Tuesday", + "event_end_weekday_short": "Tue", + "event_end_time": "9:25am", + "start_date": "2024-09-10", + "start_time": "09:15:00", + "start_time_ts": 1725984900, + "end_date": "2024-09-10", + "end_time": "09:25:00" + }, + { + "event_key": "706606", + "active": "Y", + "pinned": "N", + "name": "Sponsored Keynote: Uri Goldshtein, The Guild", + "event_start": "2024-09-10 09:30", + "event_end": "2024-09-10 09:40", + "event_type": "Keynote Sessions", + "goers": "71", + "video_stream": "https://www.youtube.com/watch?v=Q8l9u5K5VBA", + "seats": "0", + "invite_only": "N", + "venue": "Metropolitan Ballroom", + "id": "0cc847db0ed6bf193da7b5413c7f3e8e", + "venue_id": "1944323", + "speakers": [ + { + "username": "uri_goldshtein.23xujj9a", + "id": "14900013", + "name": "Uri Goldshtein", + "company": "The Guild", + "custom_order": 0 + } + ], + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Tuesday", + "event_start_weekday_short": "Tue", + "event_start_time": "9:30am", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Tuesday", + "event_end_weekday_short": "Tue", + "event_end_time": "9:40am", + "start_date": "2024-09-10", + "start_time": "09:30:00", + "start_time_ts": 1725985800, + "end_date": "2024-09-10", + "end_time": "09:40:00", + "description": "" + }, + { + "event_key": "698207", + "active": "Y", + "pinned": "N", + "name": "Keynote: The State of Distributed GraphQL - Michael Staib, ChilliCream Inc", + "event_start": "2024-09-10 09:40", + "event_end": "2024-09-10 09:55", + "event_type": "Keynote Sessions", + "description": "The GraphQL community has come together to standardize how people can build distributed systems with GraphQL as an orchestrator. In this talk I will explain the general idea that we have for GraphQL as an Orchestrator in this space and how the new specification is tackling this. We will look at the progress we have made since last GraphQL Conf in the GraphQL composite schema working group and also get some sneak peaks at our early RFCs and prototypes. I will outline how this new specification is taking the best ideas of existing solutions in the market to make the next big leap towards mainstream adoption. This will allow anyone to build tooling by implementing the spec or parts of the spec that seamlessly integrate with other vendors.", + "goers": "73", + "video_stream": "https://www.youtube.com/watch?v=A8T1QHJj0WM", + "seats": "0", + "invite_only": "N", + "venue": "Metropolitan Ballroom", + "company": "Intermediate", + "id": "7a165daf8a2402b63ced2f6b49ce9155", + "venue_id": "1944323", + "speakers": [ + { + "username": "michael_staib.23xujj9p", + "id": "14900031", + "name": "Michael Staib", + "company": "ChilliCream", + "custom_order": 0 + } + ], + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Tuesday", + "event_start_weekday_short": "Tue", + "event_start_time": "9:40am", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Tuesday", + "event_end_weekday_short": "Tue", + "event_end_time": "9:55am", + "start_date": "2024-09-10", + "start_time": "09:40:00", + "start_time_ts": 1725986400, + "end_date": "2024-09-10", + "end_time": "09:55:00" + }, + { + "event_key": "13", + "active": "Y", + "pinned": "N", + "name": "Keynote: TSC Panel - Lee Byron, GraphQL Foundation; Kewei Qu, Meta; Rob Richard, 1stDibs; Michael Staib, ChilliCream; Moderated by Sasha Solomon, Staff Software Engineer & Tech Lead", + "event_start": "2024-09-10 09:55", + "event_end": "2024-09-10 10:25", + "event_type": "Keynote Sessions", + "goers": "78", + "video_stream": "https://www.youtube.com/watch?v=3UbcTEV54bI", + "seats": "0", + "invite_only": "N", + "venue": "Metropolitan Ballroom", + "id": "b5386fb97755f765369c45e5f24094ec", + "venue_id": "1944323", + "speakers": [ + { + "username": "michael_staib.23xujj9p", + "id": "14900031", + "name": "Michael Staib", + "company": "ChilliCream", + "custom_order": 0 + }, + { + "username": "lee_byron.25jvpjmb", + "id": "18743534", + "name": "Lee Byron", + "company": "GraphQL Foundation", + "custom_order": 1 + }, + { + "username": "qkw1221", + "id": "18743864", + "name": "Kewei Qu", + "company": "Meta", + "custom_order": 2 + }, + { + "username": "robrichard87", + "id": "21066852", + "name": "Rob Richard", + "company": "1stdibs", + "custom_order": 3 + }, + { + "username": "sasha177", + "id": "21336701", + "name": "Sasha Solomon", + "custom_order": 4 + } + ], + "moderators": [ + { + "username": "sasha177", + "name": "Sasha Solomon", + "eventid": "b5386fb97755f765369c45e5f24094ec", + "role": "moderator" + } + ], + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Tuesday", + "event_start_weekday_short": "Tue", + "event_start_time": "9:55am", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Tuesday", + "event_end_weekday_short": "Tue", + "event_end_time": "10:25am", + "start_date": "2024-09-10", + "start_time": "09:55:00", + "start_time_ts": 1725987300, + "end_date": "2024-09-10", + "end_time": "10:25:00", + "description": "" + }, + { + "event_key": "706615", + "active": "Y", + "pinned": "N", + "name": "Keynote: Closing Remarks - Lee Byron, GraphQL Foundation", + "event_start": "2024-09-10 10:25", + "event_end": "2024-09-10 10:30", + "event_type": "Keynote Sessions", + "goers": "73", + "video_stream": "https://www.youtube.com/watch?v=5DpIO-isCMQ", + "seats": "0", + "invite_only": "N", + "venue": "Metropolitan Ballroom", + "id": "35f3d53159a5c274e8595e9eb4b6d6c7", + "venue_id": "1944323", + "speakers": [ + { + "username": "lee_byron.25jvpjmb", + "id": "18743534", + "name": "Lee Byron", + "company": "GraphQL Foundation", + "custom_order": 0 + } + ], + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Tuesday", + "event_start_weekday_short": "Tue", + "event_start_time": "10:25am", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Tuesday", + "event_end_weekday_short": "Tue", + "event_end_time": "10:30am", + "start_date": "2024-09-10", + "start_time": "10:25:00", + "start_time_ts": 1725989100, + "end_date": "2024-09-10", + "end_time": "10:30:00", + "description": "" + }, + { + "event_key": "9", + "active": "Y", + "pinned": "N", + "name": "Coffee Break", + "event_start": "2024-09-10 10:30", + "event_end": "2024-09-10 11:00", + "event_type": "Breaks & Special Events", + "goers": "42", + "seats": "0", + "invite_only": "N", + "venue": "Level 2 Foyer", + "id": "00735951e116f34db5e089b0fb4bc928", + "venue_id": "1944317", + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Tuesday", + "event_start_weekday_short": "Tue", + "event_start_time": "10:30am", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Tuesday", + "event_end_weekday_short": "Tue", + "event_end_time": "11:00am", + "start_date": "2024-09-10", + "start_time": "10:30:00", + "start_time_ts": 1725989400, + "end_date": "2024-09-10", + "end_time": "11:00:00", + "description": "" + }, + { + "event_key": "706608", + "active": "Y", + "pinned": "N", + "name": "Sponsor Showcase", + "event_start": "2024-09-10 10:30", + "event_end": "2024-09-10 19:00", + "event_type": "Sponsor Showcase", + "description": "Visit the sponsors in the Sponsor Showcase!", + "goers": "23", + "seats": "0", + "invite_only": "N", + "venue": "Level 2 Foyer", + "id": "14632b39fa73ed429cb5e5db6f156ea4", + "venue_id": "1944317", + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Tuesday", + "event_start_weekday_short": "Tue", + "event_start_time": "10:30am", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Tuesday", + "event_end_weekday_short": "Tue", + "event_end_time": "7:00pm", + "start_date": "2024-09-10", + "start_time": "10:30:00", + "start_time_ts": 1725989400, + "end_date": "2024-09-10", + "end_time": "19:00:00" + }, + { + "event_key": "706622", + "active": "Y", + "pinned": "N", + "name": "Sponsored Session: From Prototype to Production: Efficiently Building Custom GraphQL APIs - Kevin Brown, Exogee", + "event_start": "2024-09-10 11:00", + "event_end": "2024-09-10 11:30", + "event_type": "API Platform", + "description": "Building robust and flexible GraphQL APIs can often feel like walking a tightrope between development speed and customization. Using open source tools, we'll rapidly prototype and iterate on a GraphQL API powered by TypeScript and NodeJS together. Topics we'll cover:\nRapid Prototyping: Techniques for quickly generating efficient and extensible APIs. Advanced Data Integration: Strategies for seamlessly joining and managing data from disparate sources. Extreme Flexibility: Extension points that let you customise the generated API and completely override how it works without rebuilding it. Robust Security: Tools to protect the data in the API with advanced role-based access control and more. Join us to learn how you can efficiently deliver high quality GraphQL APIs in TypeScript without sacrificing your ability to build whatever you need in the future.", + "goers": "16", + "video_stream": "https://www.youtube.com/watch?v=ES-wIMcUyfs", + "seats": "0", + "invite_only": "N", + "venue": "Metropolitan B-C", + "id": "3ff1dc8d085dcb2cc5d4ac48aeceaf8e", + "venue_id": "1944308", + "speakers": [ + { + "username": "kevin.brown11", + "id": "21490044", + "name": "Kevin Brown", + "company": "Exogee", + "custom_order": 0 + } + ], + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Tuesday", + "event_start_weekday_short": "Tue", + "event_start_time": "11:00am", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Tuesday", + "event_end_weekday_short": "Tue", + "event_end_time": "11:30am", + "start_date": "2024-09-10", + "start_time": "11:00:00", + "start_time_ts": 1725991200, + "end_date": "2024-09-10", + "end_time": "11:30:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf2024/20/GraphQL%20Conf%202024.pdf", + "name": "GraphQL Conf 2024.pdf" + } + ] + }, + { + "event_key": "699498", + "active": "Y", + "pinned": "N", + "name": "200 Is Not OK: Strategies for Tracing Partial Responses with GraphQL Observability - Aditi Rajawat & Rama Palaniappan, Intuit", + "event_start": "2024-09-10 11:00", + "event_end": "2024-09-10 11:30", + "event_type": "Backend", + "description": "GraphQL is agnostic to the transport layer. Almost all out of the box observability tooling is tailored to REST/HTTP APIs. Major observability challenge with GraphQL over HTTP is the support of partial response and HTTP status with 2XX may have failed. GraphQL Gateway generally fans-out one incoming request to one or many outgoing subgraph requests. It is essential to monitor each subgraph and the GraphQL gateway’s metrics and also to trace a single request across the network stack. This talk will cover how Intuit is reducing Mean Time to Detect (MTTD) and Mean Time to Recover (MTTR) for GraphQL APIs, by capturing Failed Customer Interactions, Golden Signal to determine gateway and subgraph’s health, latency, error rate and other related metrics. This talk will also cover open tracing and logging for GraphQL APIs.", + "goers": "42", + "video_stream": "https://www.youtube.com/watch?v=LbANoddAVic", + "seats": "0", + "invite_only": "N", + "venue": "Skyline B-C - Level 21", + "company": "Intermediate", + "audience": "Session Presentations", + "id": "8b3fee2390253e8c920c1df186758b9d", + "venue_id": "1944314", + "speakers": [ + { + "username": "aditi_rajawat", + "id": "21066788", + "name": "Aditi Rajawat", + "company": "Intuit", + "custom_order": 0 + }, + { + "username": "rama_palaniappan", + "id": "21066845", + "name": "Rama Palaniappan", + "company": "Intuit", + "custom_order": 1 + } + ], + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Tuesday", + "event_start_weekday_short": "Tue", + "event_start_time": "11:00am", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Tuesday", + "event_end_weekday_short": "Tue", + "event_end_time": "11:30am", + "start_date": "2024-09-10", + "start_time": "11:00:00", + "start_time_ts": 1725991200, + "end_date": "2024-09-10", + "end_time": "11:30:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf2024/3f/200_Is_Not_OK.pptx.pdf", + "name": "200_Is_Not_OK.pptx.pdf" + } + ] + }, + { + "event_key": "689668", + "active": "Y", + "pinned": "N", + "name": "Schema-Driven Testing with Mock Service Worker - Alessia Bellisario, Apollo", + "event_start": "2024-09-10 11:00", + "event_end": "2024-09-10 11:30", + "event_type": "GraphQL Clients", + "description": "At last year’s GraphQL Conf, Stephanie Saunders sang the praises of schema mocking in her excellent talk “Sophisticated Schema Mocking”. As Stephanie outlined, tests written using mock schemas have several benefits over ones written with static response mocks (seriously, go back and watch the talk if you haven’t!) Mock schemas are the perfect pair for Mock Service Worker which describes itself as “an API mocking library that allows you to write client-agnostic mocks and reuse them across any frameworks, tools, and environments.” In this talk, I’ll demonstrate how to use mock schemas with MSW using testing tools created by the Apollo Client team. These utilities can be used with any GraphQL client for the web whether it’s Apollo Client, Relay, urql, isograph or even just plain fetch requests to a GraphQL endpoint, and support incremental delivery (@defer/@stream), subscriptions and more. With MSW + your front-end stack of choice + test runner or framework of choice (Jest, Puppeteer, Cypress, Storybook, the list goes on) this talk will teach you how to level up the tests you and your team are writing.", + "goers": "39", + "video_stream": "https://www.youtube.com/watch?v=hFmJgR0vssY", + "seats": "0", + "invite_only": "N", + "venue": "Skyline A - Level 21", + "company": "Intermediate", + "audience": "Session Presentations", + "id": "de54e458f4da84295d55ce44dade372e", + "venue_id": "1944311", + "speakers": [ + { + "username": "twitter7", + "id": "18743837", + "name": "Alessia Bellisario", + "company": "Apollo", + "custom_order": 0 + } + ], + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Tuesday", + "event_start_weekday_short": "Tue", + "event_start_time": "11:00am", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Tuesday", + "event_end_weekday_short": "Tue", + "event_end_time": "11:30am", + "start_date": "2024-09-10", + "start_time": "11:00:00", + "start_time_ts": 1725991200, + "end_date": "2024-09-10", + "end_time": "11:30:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf2024/85/BellisarioGraphQLConf2024.pdf", + "name": "BellisarioGraphQLConf2024.pdf" + } + ] + }, + { + "event_key": "706623", + "active": "Y", + "pinned": "N", + "name": "Converging Paramount EPG Architectures with the Help of GraphQL: Journey, Challenges and Solutions - Giacomo Simmi, Paramount; Satish Chitnis, Paramount / Pluto TV", + "event_start": "2024-09-10 11:00", + "event_end": "2024-09-10 11:30", + "event_type": "GraphQL in Production", + "description": "Paramount is a group of companies including Network Streaming, Paramount+, PlutoTV. Each of these companies has its own distinct tech stack and architecture. \n \nOne of the goals of the Architectural Team is to simplify the architecture of the entire group by converging and merging the solutions while avoiding a big-bang approach that would have a significant impact on the business. \n \nAfter some investigations, the GraphQL Federated Architecture emerged as a strong candidate to initiate this process using a top-down approach, starting with the Paramount EPG services. \n \nIn this session, we will describe:\n\n- The design of each intermediate EPG convergent architecture: we will outline the necessary steps to reach the final solution using a top-down and phased approach. \n- The challenges we faced: this includes choosing between code-first and schema-first approaches, modeling the data, addressing performance issues, deploying each subgraph to different infrastructures, and organizing subgraph teams, roles, and responsibilities. \n- Solutions we tried: we explored various tools and frameworks, such as Apollo and WunderGraph, to address these challenges.", + "goers": "18", + "video_stream": "https://www.youtube.com/watch?v=GnjMUsvDcL4", + "seats": "0", + "invite_only": "N", + "venue": "Metropolitan A", + "company": "Intermediate", + "audience": "Session Presentations", + "id": "0081eba3649c74291a865c903188bfbb", + "venue_id": "1944305", + "speakers": [ + { + "username": "giacomo.simmi", + "id": "21496501", + "name": "Giacomo Simmi", + "company": "Paramount", + "custom_order": 0 + }, + { + "username": "satish.chitnis", + "id": "21496512", + "name": "Satish Chitnis", + "company": "Paramount / Pluto TV", + "custom_order": 1 + } + ], + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Tuesday", + "event_start_weekday_short": "Tue", + "event_start_time": "11:00am", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Tuesday", + "event_end_weekday_short": "Tue", + "event_end_time": "11:30am", + "start_date": "2024-09-10", + "start_time": "11:00:00", + "start_time_ts": 1725991200, + "end_date": "2024-09-10", + "end_time": "11:30:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf2024/48/Converging%20EPG%20architectures%20with%20the%20help%20of%20GraphQL%20-%20Journey,%20Challenges%20and%20Solutions.pdf", + "name": "Converging EPG architectures with the help of GraphQL - Journey, Challenges and Solutions.pdf" + } + ] + }, + { + "event_key": "699439", + "active": "Y", + "pinned": "N", + "name": "GraphQL at the Edge with WebAssembly - Ramnivas Laddad, Exograph, Inc", + "event_start": "2024-09-10 11:40", + "event_end": "2024-09-10 12:10", + "event_type": "Backend", + "description": "WebAssembly is reshaping our approach to software execution units and components. With its ecosystem maturing--the ability to deploy with multiple cloud providers, the standardization of WebAssembly Components, and the rise of WASI--its potential is fast becoming a reality. WebAssembly is especially suitable for running server-side code at the edge, where resource constraints and security concerns are paramount. To realize the full potential of running API servers at the edge--lowered latency, reduced costs, and improved scalability--we must rethink our approach to building and deploying servers. GraphQL is particularly well-suited for edge deployments. It not only reduces the number of trips between the client and the server but also allows implementations to optimize the whole query to reduce round trips to the data server. In this session, we will explore how to target a Rust implementation of GraphQL server to WebAssembly. We'll also look into how this fits within the WebAssembly ecosystem and how you can run these servers even in your browser.", + "goers": "22", + "video_stream": "https://www.youtube.com/watch?v=cEijqq-KQsU", + "seats": "0", + "invite_only": "N", + "venue": "Skyline B-C - Level 21", + "company": "Intermediate", + "audience": "Session Presentations", + "id": "b3cdfe65307832887ded26a9270d1295", + "venue_id": "1944314", + "speakers": [ + { + "username": "ramnivas.laddad", + "id": "21066848", + "name": "Ramnivas Laddad", + "company": "Exograph", + "custom_order": 0 + } + ], + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Tuesday", + "event_start_weekday_short": "Tue", + "event_start_time": "11:40am", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Tuesday", + "event_end_weekday_short": "Tue", + "event_end_time": "12:10pm", + "start_date": "2024-09-10", + "start_time": "11:40:00", + "start_time_ts": 1725993600, + "end_date": "2024-09-10", + "end_time": "12:10:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf2024/f5/graphql-edge-webassembly-ramnivas-laddad.pdf", + "name": "graphql-edge-webassembly-ramnivas-laddad.pdf" + } + ] + }, + { + "event_key": "706588", + "active": "Y", + "pinned": "N", + "name": "6 Years of Distributed GraphQL in Production - Andreas Marek, Atlassian", + "event_start": "2024-09-10 11:40", + "event_end": "2024-09-10 12:10", + "event_type": "Federation and Composite Schemas", + "description": "Atlassian built the first ever distributed GraphQL gateway in 2018 and continues to run and improve until today. We will look at the lessons learned and challenges including: - Schema governance - Company adoption - Running a high availability gateway - Things that didn't work out", + "goers": "55", + "video_stream": "https://www.youtube.com/watch?v=v3dY3Y9VHJ8", + "seats": "0", + "invite_only": "N", + "venue": "Metropolitan B-C", + "company": "Intermediate", + "audience": "Session Presentations", + "id": "f37774914d4fb6b5760a4c4811f042be", + "venue_id": "1944308", + "speakers": [ + { + "username": "andreas.marek1", + "id": "21066795", + "name": "Andreas Marek", + "company": "Atlassian", + "custom_order": 0 + } + ], + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Tuesday", + "event_start_weekday_short": "Tue", + "event_start_time": "11:40am", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Tuesday", + "event_end_weekday_short": "Tue", + "event_end_time": "12:10pm", + "start_date": "2024-09-10", + "start_time": "11:40:00", + "start_time_ts": 1725993600, + "end_date": "2024-09-10", + "end_time": "12:10:00" + }, + { + "event_key": "696986", + "active": "Y", + "pinned": "N", + "name": "The Power of Strongly Coupled GraphQL Queries for Internal APIs - Mary Briskin, Tutored by Teacher", + "event_start": "2024-09-10 11:40", + "event_end": "2024-09-10 12:10", + "event_type": "GraphQL Clients", + "description": "Why settle for over-complicated APIs when you can have exactly what you need? In this talk, we'll write focused, single-use GraphQL queries that are tailored to our exact requirements. Learn how tightly coupling your GraphQL queries with your pages or components can make your front-end cleaner, your back-end faster, and your code easier to maintain. Goodbye unnecessary complexity and generalization—this is all about building APIs that fit like a glove, making your life easier and your code prettier!", + "goers": "22", + "video_stream": "https://www.youtube.com/watch?v=szGCeD_UzmY", + "seats": "0", + "invite_only": "N", + "venue": "Skyline A - Level 21", + "company": "Intermediate", + "audience": "Session Presentations", + "id": "1f23375107e5a16e08092d69e1b5ba1a", + "venue_id": "1944311", + "speakers": [ + { + "username": "marybriskin", + "id": "21457039", + "name": "Mary Briskin", + "company": "Tutored by Teachers", + "custom_order": 0 + } + ], + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Tuesday", + "event_start_weekday_short": "Tue", + "event_start_time": "11:40am", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Tuesday", + "event_end_weekday_short": "Tue", + "event_end_time": "12:10pm", + "start_date": "2024-09-10", + "start_time": "11:40:00", + "start_time_ts": 1725993600, + "end_date": "2024-09-10", + "end_time": "12:10:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf2024/7c/GraphQL%20Talk%20Mary%20Briskin.pdf", + "name": "GraphQL Talk Mary Briskin.pdf" + } + ] + }, + { + "event_key": "693335", + "active": "Y", + "pinned": "N", + "name": "Incrementally Adopting GraphQL and Relay at Pinterest - Mauricio Montalvo, Pinterest", + "event_start": "2024-09-10 11:40", + "event_end": "2024-09-10 12:10", + "event_type": "GraphQL in Production", + "description": "Pinterest is too large to simply “rewrite our app” to use GraphQL in one fell swoop. Even migrating an individual screen takes months, at our scale this is quite challenging, like changing a plane’s engine while flying. Is GraphQL adoption destined to be difficult for large companies? Can this process be made more incremental? Unfortunately, the answer seems to be no. It's hard to imagine how components consuming GraphQL data can coexist on a page that makes network requests to a REST endpoint. And yet, we figured it out. And we had a good time, too! We designed Relay-compatible APIs that allow us to read data either from a GraphQL store or from arbitrary objects (e.g. from Redux.) So, engineers can migrate individual components within a larger tree. These components specify the data they need using a fragment, and receive GraphQL-shaped data, regardless of whether the data came from GraphQL or REST. When a component tree is fully migrated, we're able to A/B test the REST and GraphQL endpoints, and only turn on GraphQL when we're sure doing so won't degrade any metrics. And we're about to release this to open source: adopting GraphQL on the front-end has never been easier!", + "goers": "31", + "video_stream": "https://www.youtube.com/watch?v=9gY1vNw7Kcc", + "seats": "0", + "invite_only": "N", + "venue": "Metropolitan A", + "company": "Beginner", + "audience": "Session Presentations", + "id": "515c8ade2da6e1fc710e87df182dd8e6", + "venue_id": "1944305", + "speakers": [ + { + "username": "mauricio.montalvo.guzman", + "id": "21066831", + "name": "Mauricio Montalvo", + "company": "Pinterest", + "custom_order": 0 + } + ], + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Tuesday", + "event_start_weekday_short": "Tue", + "event_start_time": "11:40am", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Tuesday", + "event_end_weekday_short": "Tue", + "event_end_time": "12:10pm", + "start_date": "2024-09-10", + "start_time": "11:40:00", + "start_time_ts": 1725993600, + "end_date": "2024-09-10", + "end_time": "12:10:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf2024/55/Incrementally%20Adopting%20GraphQL%20and%20Relay%20at%20Pinterest%20-%20Mauricio%20Montalvo.pdf", + "name": "Incrementally Adopting GraphQL and Relay at Pinterest - Mauricio Montalvo.pdf" + } + ] + }, + { + "event_key": "5", + "active": "Y", + "pinned": "N", + "name": "Lunch Break", + "event_start": "2024-09-10 12:10", + "event_end": "2024-09-10 13:30", + "event_type": "Breaks & Special Events", + "goers": "55", + "seats": "0", + "invite_only": "N", + "venue": "Level 3 Lobby + Restaurant", + "id": "c117b6cefe3eaa89940b76d68abdc3de", + "venue_id": "1979828", + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Tuesday", + "event_start_weekday_short": "Tue", + "event_start_time": "12:10pm", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Tuesday", + "event_end_weekday_short": "Tue", + "event_end_time": "1:30pm", + "start_date": "2024-09-10", + "start_time": "12:10:00", + "start_time_ts": 1725995400, + "end_date": "2024-09-10", + "end_time": "13:30:00", + "description": "" + }, + { + "event_key": "691366", + "active": "Y", + "pinned": "N", + "name": "How to Not Break Your GraphQL Clients - Pascal Senn, ChilliCream", + "event_start": "2024-09-10 13:30", + "event_end": "2024-09-10 14:00", + "event_type": "Backend", + "description": "Ever had to explain to the frontend team why their application is no longer working after a release? This session will show you what you can do to never let this happen again, ever! We will start by analysing why it is so easy to do a breaking change in a GraphQL API, what this even means and how to prevent it. Then, we will explore the issues that come once a client application uses your GraphQL API, learn effective ways to prevent the issues from happening and how to apply it in real world complexities. Learn to build resilient GraphQL APIs - today.", + "goers": "43", + "video_stream": "https://www.youtube.com/watch?v=U3m0J8HFuqQ", + "seats": "0", + "invite_only": "N", + "venue": "Skyline B-C - Level 21", + "company": "Intermediate", + "audience": "Session Presentations", + "id": "eb21b013745069912ee5b95b14aaca24", + "venue_id": "1944314", + "speakers": [ + { + "username": "pascal.senn", + "id": "21066839", + "name": "Pascal Senn", + "company": "ChilliCream", + "custom_order": 0 + } + ], + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Tuesday", + "event_start_weekday_short": "Tue", + "event_start_time": "1:30pm", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Tuesday", + "event_end_weekday_short": "Tue", + "event_end_time": "2:00pm", + "start_date": "2024-09-10", + "start_time": "13:30:00", + "start_time_ts": 1726000200, + "end_date": "2024-09-10", + "end_time": "14:00:00" + }, + { + "event_key": "692359", + "active": "Y", + "pinned": "N", + "name": "Unlocking Blockchain Data with GraphQL - Saihajpreet Singh, The Guild", + "event_start": "2024-09-10 13:30", + "event_end": "2024-09-10 13:40", + "event_type": "Federation and Composite Schemas", + "description": "Discover how GraphQL and composite schemas are transforming blockchain data access and management. This talk will highlight innovative techniques that standardize and streamline blockchain data retrieval, making it more accessible and efficient for developers. Explore the future of blockchain data management and how these advancements are setting new industry standards in web3.", + "goers": "5", + "video_stream": "https://www.youtube.com/watch?v=tjmPJGMPZGQ", + "seats": "0", + "invite_only": "N", + "venue": "Metropolitan B-C", + "company": "Beginner", + "audience": "Lightning Talks", + "geo_area": "Yes", + "id": "66a12b5aa41f22c3a7f80a9838488826", + "venue_id": "1944308", + "speakers": [ + { + "username": "saihajpreet.singh", + "id": "21066858", + "name": "Saihajpreet Singh", + "company": "The Guild", + "custom_order": 0 + } + ], + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Tuesday", + "event_start_weekday_short": "Tue", + "event_start_time": "1:30pm", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Tuesday", + "event_end_weekday_short": "Tue", + "event_end_time": "1:40pm", + "start_date": "2024-09-10", + "start_time": "13:30:00", + "start_time_ts": 1726000200, + "end_date": "2024-09-10", + "end_time": "13:40:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf2024/b5/graphql-conf2024-talk.pdf", + "name": "graphql-conf2024-talk.pdf" + } + ] + }, + { + "event_key": "706596", + "active": "Y", + "pinned": "N", + "name": "GraphQL in the Era of React Server Components - Roy Derks, IBM", + "event_start": "2024-09-10 13:30", + "event_end": "2024-09-10 14:00", + "event_type": "GraphQL Clients", + "description": "There's been lots of talks around GraphQL and if it's still relevant now more and more web frameworks are introducing different ways to handle data fetching. Some say we might even be going back to the MVC model. In this new \"RPC world\" we have technologies like tRPC and React Server Components. But what does this mean for GraphQL? In this talk I'll explore the most recent ways to do handle data fetching, how they compare to GraphQL and what benefits GraphQL might still be brining you.", + "goers": "25", + "video_stream": "https://www.youtube.com/watch?v=0IcZGcO9Vm0", + "seats": "0", + "invite_only": "N", + "venue": "Skyline A - Level 21", + "id": "b45e3e5dfce0eec4d5498bedb8c54f04", + "venue_id": "1944311", + "speakers": [ + { + "username": "hello2358", + "id": "16832291", + "name": "Roy Derks", + "company": "IBM", + "custom_order": 0 + } + ], + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Tuesday", + "event_start_weekday_short": "Tue", + "event_start_time": "1:30pm", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Tuesday", + "event_end_weekday_short": "Tue", + "event_end_time": "2:00pm", + "start_date": "2024-09-10", + "start_time": "13:30:00", + "start_time_ts": 1726000200, + "end_date": "2024-09-10", + "end_time": "14:00:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf2024/17/GraphQLServerComponentsRoyDerks.pdf", + "name": "GraphQLServerComponentsRoyDerks.pdf" + } + ] + }, + { + "event_key": "691577", + "active": "Y", + "pinned": "N", + "name": "Building a Serverless GraphQL Subscription Gateway for Event-Driven Architectures - Christian Stangier & Kenneth Wußmann, MOIA GmbH", + "event_start": "2024-09-10 13:30", + "event_end": "2024-09-10 14:00", + "event_type": "GraphQL in Production", + "description": "At MOIA we're working on a new approach to mobility using ride-pooling with autonomous vehicles. Running an autonomous fleet of vehicles requires access to real-time and low-latency telematic data. This data needs to be made accessible to our users on a fleet map to always have a detailed overview of the current fleet state. Using only queries and polling we quickly ran into scalability issues and had to rethink our approach. Therefore we went to the drawing board and designed and built a serverless architecture on top of AWS and GraphQL over WebSocket to support our stream-aligned teams in building serverless subscriptions in a microservice environment. Watch a replay of our journey enabling other teams to effortlessly push updates to their users using a shared subscription gateway.", + "goers": "35", + "video_stream": "https://www.youtube.com/watch?v=kmxy32cDRT8", + "seats": "0", + "invite_only": "N", + "venue": "Metropolitan A", + "company": "Advanced", + "audience": "Session Presentations", + "id": "15ae8e609d80ee7a856469c74c379c55", + "venue_id": "1944305", + "speakers": [ + { + "username": "christian.stangier", + "id": "21066807", + "name": "Christian Stangier", + "company": "MOIA GmbH", + "custom_order": 0 + }, + { + "username": "kenneth.wussmann", + "id": "21066824", + "name": "Kenneth Wußmann", + "company": "MOIA GmbH", + "custom_order": 1 + } + ], + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Tuesday", + "event_start_weekday_short": "Tue", + "event_start_time": "1:30pm", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Tuesday", + "event_end_weekday_short": "Tue", + "event_end_time": "2:00pm", + "start_date": "2024-09-10", + "start_time": "13:30:00", + "start_time_ts": 1726000200, + "end_date": "2024-09-10", + "end_time": "14:00:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf2024/96/Building%20a%20Serverless%20GraphQL%20Subscription%20Gateway.pdf", + "name": "Building a Serverless GraphQL Subscription Gateway.pdf" + } + ] + }, + { + "event_key": "700361", + "active": "Y", + "pinned": "N", + "name": "Ahead-of-Time (AOT) Techniques Help You Write GraphQL Libraries! - Mike Solomon, -", + "event_start": "2024-09-10 13:50", + "event_end": "2024-09-10 14:00", + "event_type": "GraphQL in Production", + "description": "Production-ready GraphQL deployments typically require sophisticated clients, careful telemetry, and high performance. Come see how we can apply techniques used in compilers to help write simpler and more efficient GraphQL frameworks and libraries! During this talk, you will learn: - How to create a simple yet powerful Intermediate Representation (IR) for GraphQL queries and schemas - How this IR can be used to generate client-side code, client and server telemetry, and even reduce payload sizes over the Internet!", + "goers": "35", + "video_stream": "https://www.youtube.com/watch?v=SFQB8F0Ofcg", + "seats": "0", + "invite_only": "N", + "venue": "Metropolitan B-C", + "company": "Intermediate", + "audience": "Lightning Talks", + "id": "5df1be4f2875d2ba86cd9c3daefadd02", + "venue_id": "1944308", + "speakers": [ + { + "username": "arkenflame", + "id": "18743867", + "name": "Mike Solomon", + "company": "-", + "custom_order": 0 + } + ], + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Tuesday", + "event_start_weekday_short": "Tue", + "event_start_time": "1:50pm", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Tuesday", + "event_end_weekday_short": "Tue", + "event_end_time": "2:00pm", + "start_date": "2024-09-10", + "start_time": "13:50:00", + "start_time_ts": 1726001400, + "end_date": "2024-09-10", + "end_time": "14:00:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf2024/be/compiler-techniques-graphqlconf2024.pdf", + "name": "compiler-techniques-graphqlconf2024.pdf" + } + ] + }, + { + "event_key": "671426", + "active": "Y", + "pinned": "N", + "name": "In Memory of Travails - Gabriel Schulhof, Auction.com", + "event_start": "2024-09-10 14:10", + "event_end": "2024-09-10 14:40", + "event_type": "Backend", + "description": "Two aspects of resolvers have an outsized influence on their performance: the size of the execution context, and the way we compute their value. In the Node.js implementation of graphql, promises wrapping primitive values are especially disruptive, since they add a large computing overhead. The context size creates a memory usage baseline that can rise very quickly with even small additions to the context, when there are many concurrent contexts. The execution can create temporary objects, increasing memory usage. Often-run resolvers, such as those responsible for filling out large arrays of objects, can become performance bottlenecks. At Auction.com, our search results page (SRP) requests up to 500 items of roughly 80 fields each. The query resolving these fields was suffering a high latency. We shall examine the tools to instrument our code and identify memory usage and CPU utilization bottlenecks. Our realtime elements (e.g. realtime updates to the status of currently viewed properties) are implemented using a translation of kafka messages to graphql updates. We shall present the tools and procedures to reduce memory usage and CPU usage when fanning out such messages.", + "goers": "11", + "video_stream": "https://www.youtube.com/watch?v=eXWXRF6gYg8", + "seats": "0", + "invite_only": "N", + "venue": "Skyline B-C - Level 21", + "company": "Intermediate", + "audience": "Session Presentations", + "geo_area": "Yes", + "id": "667270504bb6e511749901460a6e68d1", + "venue_id": "1944314", + "speakers": [ + { + "username": "gabrielschulhof", + "id": "13020672", + "name": "Gabriel Schulhof", + "company": "Auction.com", + "custom_order": 0 + } + ], + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Tuesday", + "event_start_weekday_short": "Tue", + "event_start_time": "2:10pm", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Tuesday", + "event_end_weekday_short": "Tue", + "event_end_time": "2:40pm", + "start_date": "2024-09-10", + "start_time": "14:10:00", + "start_time_ts": 1726002600, + "end_date": "2024-09-10", + "end_time": "14:40:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf2024/cd/In.Memory.of.Travails.pptx", + "name": "In.Memory.of.Travails.pptx" + } + ] + }, + { + "event_key": "692293", + "active": "Y", + "pinned": "N", + "name": "Spec Agnostic Executor for Federated GraphQL - Denis Badurina, The Guild", + "event_start": "2024-09-10 14:10", + "event_end": "2024-09-10 14:40", + "event_type": "Federation and Composite Schemas", + "description": "A fresh take on planning and executing federated GraphQL schemas. The executor is zero-dependency, spec and environment agnostic, with stable plans and explanations. Additionally, all of its steps are serializable - allowing for sophisticated caching mechanisms and deterministic plans. It supports all existing, and all future, federated specifications like Apollo Federation and the upcoming GraphQL Composite spec. We'll talk about how the new executor came to be, the challenges it faced, and how TDD expedited the process with confidence in mind.", + "goers": "34", + "video_stream": "https://www.youtube.com/watch?v=voeWmS-48Ag", + "seats": "0", + "invite_only": "N", + "venue": "Metropolitan B-C", + "company": "Intermediate", + "audience": "Session Presentations", + "id": "de8fa563c5beb17fbe9b4f5f23c99e89", + "venue_id": "1944308", + "speakers": [ + { + "username": "badurinadenis", + "id": "18743810", + "name": "Denis Badurina", + "company": "The Guild", + "custom_order": 0 + } + ], + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Tuesday", + "event_start_weekday_short": "Tue", + "event_start_time": "2:10pm", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Tuesday", + "event_end_weekday_short": "Tue", + "event_end_time": "2:40pm", + "start_date": "2024-09-10", + "start_time": "14:10:00", + "start_time_ts": 1726002600, + "end_date": "2024-09-10", + "end_time": "14:40:00" + }, + { + "event_key": "691185", + "active": "Y", + "pinned": "N", + "name": "Sponsored Session: Championing the GraphQL Client in a Modern Platform - Jeff Auriemma, Apollo GraphQL", + "event_start": "2024-09-10 14:10", + "event_end": "2024-09-10 14:40", + "event_type": "GraphQL Clients", + "description": "GraphQL is becoming the preferred choice for enterprise API development. That means that more and more app developers are adopting GraphQL client libraries as part of a larger platform strategy rather than building their own BFFs. Platform owners, engineering leaders, toolmakers, and application developers can leverage this adoption pattern to set their teams up with an easy on-ramp and a roadmap for long-term success. My talk will outline the design features common across GraphQL client libraries and why they are essential for platform engineers to understand. I’ll share insights my team has gathered from our open-source projects, user interviews, and surveys that reveal how GraphQL newcomers and veterans relate to these tools. All of this will be tied together with some practical advice for every stage of the adoption journey: crawl, walk, run.", + "goers": "21", + "video_stream": "https://www.youtube.com/watch?v=lKZMcixWf3o", + "seats": "0", + "invite_only": "N", + "venue": "Skyline A - Level 21", + "company": "Any", + "audience": "Session Presentations", + "id": "f53d0eed2747a55edea203c97844fe3e", + "venue_id": "1944311", + "speakers": [ + { + "username": "jeff.auriemma", + "id": "18743876", + "name": "Jeff Auriemma", + "company": "Apollo GraphQL", + "custom_order": 0 + } + ], + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Tuesday", + "event_start_weekday_short": "Tue", + "event_start_time": "2:10pm", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Tuesday", + "event_end_weekday_short": "Tue", + "event_end_time": "2:40pm", + "start_date": "2024-09-10", + "start_time": "14:10:00", + "start_time_ts": 1726002600, + "end_date": "2024-09-10", + "end_time": "14:40:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf2024/58/[GraphQLConf%202024]%20Championing%20the%20GraphQL%20Client%20in%20a%20Modern%20Platform.pdf", + "name": "[GraphQLConf 2024] Championing the GraphQL Client in a Modern Platform.pdf" + } + ] + }, + { + "event_key": "691570", + "active": "Y", + "pinned": "N", + "name": "GraphQL Pagination at Meta - Sabrina Wasserman, Meta", + "event_start": "2024-09-10 14:10", + "event_end": "2024-09-10 14:40", + "event_type": "GraphQL in Production", + "description": "In this talk, I’ll discuss how we’ve developed client-side pagination frameworks at Meta on top of the Relay GraphQL connection specification to make paginating with GraphQL-backed data simpler for product engineers. Specifically, I’ll cover: - Cursor-based pagination + the Relay GraphQL Connection specification - Generating pagination queries for a given Connection field - Client-side Connection field state management - How we integrate our pagination frameworks with our UI frameworks", + "goers": "54", + "video_stream": "https://www.youtube.com/watch?v=PGBC-0E-kco", + "seats": "0", + "invite_only": "N", + "venue": "Metropolitan A", + "company": "Intermediate", + "audience": "Session Presentations", + "id": "f385327bc79231054b3d0d5440b9a47d", + "venue_id": "1944305", + "speakers": [ + { + "username": "sabrina.wasserman", + "id": "21066857", + "name": "Sabrina Wasserman", + "company": "Meta", + "custom_order": 0 + } + ], + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Tuesday", + "event_start_weekday_short": "Tue", + "event_start_time": "2:10pm", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Tuesday", + "event_end_weekday_short": "Tue", + "event_end_time": "2:40pm", + "start_date": "2024-09-10", + "start_time": "14:10:00", + "start_time_ts": 1726002600, + "end_date": "2024-09-10", + "end_time": "14:40:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf2024/70/Declarative%20Pagination.pdf", + "name": "Declarative Pagination.pdf" + } + ] + }, + { + "event_key": "706611", + "active": "Y", + "pinned": "N", + "name": "What Could Go Wrong with a GraphQL Query and Can OpenTelemetry Help? - Budha Bhattacharya, Tyk", + "event_start": "2024-09-10 14:50", + "event_end": "2024-09-10 15:20", + "event_type": "API Platform", + "description": "APIs are the building blocks of our modern world. As the world becomes more interconnected, we need reliable and performant APIs to ensure the best experience for our end users. Many developers are starting to use GraphQL to provide a monolithic facade on top of their complex microservice architecture. In turn, making their next-generation APIs fast, flexible, and developer-friendly.\nBut using GraphQL also introduces many new challenges when isolating failures and troubleshooting performance issues. Can OpenTelemetry help solve those challenges?\n\nDuring this talk, we will:\n1. Give a brief overview of OpenTelemetry as a technology\n2. Investigate common challenges developers and SREs might encounter when running GraphQL in production\n3. Explore how OpenTelemetry can help deal with these issues\n4. Discuss what needs to be improved to make OTel even more valuable for the community", + "goers": "17", + "video_stream": "https://www.youtube.com/watch?v=Nol_i1wZMOY", + "seats": "0", + "invite_only": "N", + "venue": "Skyline B-C - Level 21", + "company": "Beginner", + "audience": "Session Presentations", + "id": "e61013ca35c75a29e8fa8ce157e320e9", + "venue_id": "1944314", + "speakers": [ + { + "username": "budha1", + "id": "17694866", + "name": "Budhaditya Bhattacharya", + "company": "Tyk", + "custom_order": 0 + } + ], + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Tuesday", + "event_start_weekday_short": "Tue", + "event_start_time": "2:50pm", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Tuesday", + "event_end_weekday_short": "Tue", + "event_end_time": "3:20pm", + "start_date": "2024-09-10", + "start_time": "14:50:00", + "start_time_ts": 1726005000, + "end_date": "2024-09-10", + "end_time": "15:20:00" + }, + { + "event_key": "697562", + "active": "Y", + "pinned": "N", + "name": "GraphQL Is for Client Developers, Not Client Applications - Michael Bleigh, Google", + "event_start": "2024-09-10 14:50", + "event_end": "2024-09-10 15:20", + "event_type": "Developer Experience", + "description": "Many of the most common issues developers run into when building GraphQL APIs (N+1 queries, difficult authorization logic, protecting against arbitrary query complexity) come down to a single problem: when an untrusted client can construct arbitrary queries, lots can go wrong. So what if they just couldn't? The wins of GraphQL aren't in letting *clients* build their own queries but in letting *client developers* build their own queries. When Firebase chose GraphQL as the basis for its new Data Connect product, we introduced \"Connectors\", a new resource type that bundles a group of predefined GraphQL queries and mutations and exposes them at an endpoint. While trusted servers can execute arbitrary queries, untrusted clients can only use predefined queries and mutations. This approach substantially simplifies the security model of building with GraphQL. Rather than worrying about every possible query, you can build authorization and complexity mechanics around well-known predefined queries. Learn the how, the why, and the possible future of \"Connectors\" for GraphQL in Firebase and beyond.", + "goers": "39", + "video_stream": "https://www.youtube.com/watch?v=dDj6FF0y2YA", + "seats": "0", + "invite_only": "N", + "venue": "Metropolitan B-C", + "company": "Intermediate", + "audience": "Session Presentations", + "id": "8866a2e23936ff9882c39f99b71238c5", + "venue_id": "1944308", + "speakers": [ + { + "username": "michael.bleigh", + "id": "21066834", + "name": "Michael Bleigh", + "company": "Google", + "custom_order": 0 + } + ], + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Tuesday", + "event_start_weekday_short": "Tue", + "event_start_time": "2:50pm", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Tuesday", + "event_end_weekday_short": "Tue", + "event_end_time": "3:20pm", + "start_date": "2024-09-10", + "start_time": "14:50:00", + "start_time_ts": 1726005000, + "end_date": "2024-09-10", + "end_time": "15:20:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf2024/2a/GraphQL%20is%20for%20Client%20Developers,%20not%20Client%20Apps.pdf", + "name": "GraphQL is for Client Developers, not Client Apps.pdf" + } + ] + }, + { + "event_key": "691436", + "active": "Y", + "pinned": "N", + "name": "A Wild GraphQL Rollercoaster Ride – an Honest Federated GraphQL Adoption Story in an Enterprise - An Ngo & Lars de Bruijn, bol", + "event_start": "2024-09-10 14:50", + "event_end": "2024-09-10 15:20", + "event_type": "GraphQL in Production", + "description": "Join us in our journey of adopting GraphQL in an Enterprise setting and hear all about how we adopt GraphQL in our organization successfully. Coming from an established enterprise organization with over 800 engineers, who work predominantly with REST, we had a big challenge rolling out our federated GraphQL ambitions at scale in a distributed (micro)service landscape. Besides tech, our journey was also about changing how people work, building expertise and create a strong GraphQL community, for both engineers and product, and getting them invested in our GraphQL journey. We will share with you our hurdles, lessons learned and painful roadblocks and share with you what we wish we knew when we started, so you are well prepared when you start your own GraphQL adoption journey at scale after this talk.", + "goers": "24", + "video_stream": "https://www.youtube.com/watch?v=tuStK4r8AaI", + "seats": "0", + "invite_only": "N", + "venue": "Metropolitan A", + "company": "Any", + "audience": "Session Presentations", + "id": "bd12197d841d201adbcae218323d713a", + "venue_id": "1944305", + "speakers": [ + { + "username": "ldebruijn", + "id": "5922948", + "name": "Lars de Bruijn", + "company": "bol", + "custom_order": 0 + }, + { + "username": "an.ngo", + "id": "21066792", + "name": "An Ngo", + "company": "bol", + "custom_order": 1 + } + ], + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Tuesday", + "event_start_weekday_short": "Tue", + "event_start_time": "2:50pm", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Tuesday", + "event_end_weekday_short": "Tue", + "event_end_time": "3:20pm", + "start_date": "2024-09-10", + "start_time": "14:50:00", + "start_time_ts": 1726005000, + "end_date": "2024-09-10", + "end_time": "15:20:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf2024/13/GraphQLConf24-presentation.pdf", + "name": "GraphQLConf24-presentation.pdf" + } + ] + }, + { + "event_key": "705687", + "active": "Y", + "pinned": "N", + "name": "Improve Application Performance and User Engagement with Advanced GraphQL Features - Kewei Qu, Meta", + "event_start": "2024-09-10 14:50", + "event_end": "2024-09-10 15:00", + "event_type": "Scaling", + "description": "In this talk, I will go through two recent experiments at Meta where we improved Application scroll perf (commonly known as frame drops) and media stalls by developing advanced GraphQL features. 1. Batched @defers. Common UI update cycles with regular defers will introduce increased state updates and may cause unnecessary re-renders. By batching deferred payloads carefully, we can achieved improved latency without introduce frame drops which is commonly associated with decreased engagement. 2. Improved CDN prefetch. Most of the time, the bottleneck to TTI is the media loads, either image load or video load. Commonly, Applications prefetch these media from CDN to improve stalls. We can make the prefetch better by using the visitor pattern which is available in many GraphQL library to enable prefetch during parsing time.", + "goers": "48", + "video_stream": "https://www.youtube.com/watch?v=obMcFwqtvUQ", + "seats": "0", + "invite_only": "N", + "venue": "Skyline A - Level 21", + "company": "Advanced", + "audience": "Lightning Talks", + "id": "260dd09a831d9432aa4122d60df72d21", + "venue_id": "1944311", + "speakers": [ + { + "username": "qkw1221", + "id": "18743864", + "name": "Kewei Qu", + "company": "Meta", + "custom_order": 0 + } + ], + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Tuesday", + "event_start_weekday_short": "Tue", + "event_start_time": "2:50pm", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Tuesday", + "event_end_weekday_short": "Tue", + "event_end_time": "3:00pm", + "start_date": "2024-09-10", + "start_time": "14:50:00", + "start_time_ts": 1726005000, + "end_date": "2024-09-10", + "end_time": "15:00:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf2024/c7/GraphQL%20Conference%202024_%20Improve%20Application%20Performance%20and%20User%20Engagement%20with%20Advanced%20GraphQL%20features.pdf", + "name": "GraphQL Conference 2024_ Improve Application Performance and User Engagement with Advanced GraphQL features.pdf" + } + ] + }, + { + "event_key": "692032", + "active": "Y", + "pinned": "N", + "name": "GraphQL and Newcomers: How an API Can Transform Technical and Functional Onboarding - Vincent Desmares, Teamstarter", + "event_start": "2024-09-10 15:05", + "event_end": "2024-09-10 15:15", + "event_type": "Developer Experience", + "description": "Since 2010, I've onboarded a lot of developers on a lot of projects. Team evolution is a part of the normal life of a project but can be a big challenge. In this lighting talk I will make a restrospective on how GraphQL drasticaly reduced the \"time-to-be-opperational\" and helped get a productive team very quickly. I will share good practices around code, design-patterns, documentation, processes and open-source. To get your next GraphQL project a pleasure to be onboarded on.", + "goers": "39", + "video_stream": "https://www.youtube.com/watch?v=yrhGfVOzxbU", + "seats": "0", + "invite_only": "N", + "venue": "Skyline A - Level 21", + "company": "Beginner", + "audience": "Lightning Talks", + "id": "daa84da2c7b8efe182514d3f6d6624ec", + "venue_id": "1944311", + "speakers": [ + { + "username": "vincent.desmares", + "id": "21066875", + "name": "Vincent Desmares", + "company": "Teamstarter", + "custom_order": 0 + } + ], + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Tuesday", + "event_start_weekday_short": "Tue", + "event_start_time": "3:05pm", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Tuesday", + "event_end_weekday_short": "Tue", + "event_end_time": "3:15pm", + "start_date": "2024-09-10", + "start_time": "15:05:00", + "start_time_ts": 1726005900, + "end_date": "2024-09-10", + "end_time": "15:15:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf2024/47/GraphQL%20and%20Newcomers%20-%20202240910%200848.pdf", + "name": "GraphQL and Newcomers - 202240910 0848.pdf" + } + ] + }, + { + "event_key": "12", + "active": "Y", + "pinned": "N", + "name": "Coffee Break", + "event_start": "2024-09-10 15:20", + "event_end": "2024-09-10 15:40", + "event_type": "Breaks & Special Events", + "goers": "38", + "seats": "0", + "invite_only": "N", + "venue": "Level 2 Foyer", + "id": "785671ee20a5e7c63578e83cf84b8a12", + "venue_id": "1944317", + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Tuesday", + "event_start_weekday_short": "Tue", + "event_start_time": "3:20pm", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Tuesday", + "event_end_weekday_short": "Tue", + "event_end_time": "3:40pm", + "start_date": "2024-09-10", + "start_time": "15:20:00", + "start_time_ts": 1726006800, + "end_date": "2024-09-10", + "end_time": "15:40:00", + "description": "" + }, + { + "event_key": "706621", + "active": "Y", + "pinned": "N", + "name": "Schema First, Code First, or Both? Adopting Schema First Development with Code First Architecture - Dan Adajian, Expedia Group", + "event_start": "2024-09-10 15:40", + "event_end": "2024-09-10 16:10", + "event_type": "Defies Categorization", + "description": "At Expedia Group, we leverage a \"code-first\" approach with GraphQL Kotlin to deliver high quality experiences to travelers globally. This means we let our implementations drive our GraphQL schema. However, our developers have a growing appetite to agree on our schema up front before diving into implementation. This talk will explore how we shifted our architecture to use a schema-first approach within a code-first framework. \n \nOverall, I aim to dispel the notion that using a code-first solution prevents us from defining schema as a first step. I will explore the advantages of doing schema review at scale, as well as highlight an open source GraphQL-Codegen plugin we built to generate Kotlin classes and interfaces from our schema definitions. \n \nI am eager to contribute to the conversation around schema-first vs code-first, which has been the topic of several GraphQLConf talks over the past few years. This approach brings a fresh perspective and should inspire folks to incorporate a schema-first mentality into their GraphQL development cycle.", + "goers": "53", + "video_stream": "https://www.youtube.com/watch?v=kpeVT7J6Bsw", + "seats": "0", + "invite_only": "N", + "venue": "Skyline A - Level 21", + "company": "Intermediate", + "audience": "Session Presentations", + "id": "8cca1430628e1cb303791cee9104cad8", + "venue_id": "1944311", + "speakers": [ + { + "username": "danadajian", + "id": "21487429", + "name": "Dan Adajian", + "company": "Expedia Group", + "custom_order": 0 + } + ], + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Tuesday", + "event_start_weekday_short": "Tue", + "event_start_time": "3:40pm", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Tuesday", + "event_end_weekday_short": "Tue", + "event_end_time": "4:10pm", + "start_date": "2024-09-10", + "start_time": "15:40:00", + "start_time_ts": 1726008000, + "end_date": "2024-09-10", + "end_time": "16:10:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf2024/22/GraphQLConf.pdf", + "name": "GraphQLConf.pdf" + } + ] + }, + { + "event_key": "706624", + "active": "Y", + "pinned": "N", + "name": "Sponsored Session: GraphQL's Future is Rooted in Governance - Adam Malone, Hasura", + "event_start": "2024-09-10 15:40", + "event_end": "2024-09-10 16:10", + "event_type": "Defies Categorization", + "description": "In this talk, we'll explore the future of GraphQL and why its success hinges on our collective ability to address the elephant in the room of governance.\n\nDespite its popularity among developers due to its flexibility and efficiency, GraphQL has yet to fully win over enterprise architects. Their world revolves around REST, model-first abstractions, data lineage, and rigorous compliance standards. To truly gain their trust and drive broader adoption in the enterprise, I'll argue that GraphQL implementations must be metadata-driven, with an emphasis on configuration over code.\n\nHowever, all is not lost! In today’s enterprise landscape, the domain model is predicated on the principle that the teams who own the data should also be responsible for managing it and making it available through agnostic channels. With this in mind, GraphQL is uniquely positioned to excel, thanks to its capabilities in federation and schema stitching. These features enable a paradigm that scales both technically and, more importantly, organizationally, aligning with the goals of managing traceability, lineage, and compliance in a manner that satisfies regulatory demands.\n\nIn this session, we'll delve into how the future of GraphQL, much like the stability of any nation, is rooted in good governance. We'll examine the priorities of enterprise architects and demonstrate how a governance-focused approach can help GraphQL evolve into a robust data access layer within any business.", + "goers": "27", + "video_stream": "https://www.youtube.com/watch?v=x2tnnh9KKVs", + "seats": "0", + "invite_only": "N", + "venue": "Skyline B-C - Level 21", + "audience": "Session Presentations", + "id": "3e7c12e3198b7ee41b80f3a58a9d1e19", + "venue_id": "1944314", + "speakers": [ + { + "username": "adam_malone.2791s6x2", + "id": "21498016", + "name": "Adam Malone", + "company": "Hasura", + "custom_order": 0 + } + ], + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Tuesday", + "event_start_weekday_short": "Tue", + "event_start_time": "3:40pm", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Tuesday", + "event_end_weekday_short": "Tue", + "event_end_time": "4:10pm", + "start_date": "2024-09-10", + "start_time": "15:40:00", + "start_time_ts": 1726008000, + "end_date": "2024-09-10", + "end_time": "16:10:00" + }, + { + "event_key": "699211", + "active": "Y", + "pinned": "N", + "name": "Consuming GraphQL in Type-Safe Languages - Anthony Miller, Apollo GraphQL", + "event_start": "2024-09-10 16:20", + "event_end": "2024-09-10 16:50", + "event_type": "GraphQL Clients", + "description": "GraphQL itself is a type-safe language. A schema is composed of well-defined types, supports nullability, and allows for inheritance through interfaces. The flexibility and expressiveness provided by a GraphQL schema seems to be a perfect fit for use with type-safe coding languages. But there are many challenges to overcome when consuming a GraphQL schema in strictly type-safe languages. This talk will discuss why GraphQL seems to conflict with type safety; explore some of the notable challenges GraphQL client developers face when consuming a GraphQL API; and uncover how the Apollo team has approached solutions for many of these issues in Swift and the Apollo iOS client.", + "goers": "29", + "video_stream": "https://www.youtube.com/watch?v=CFIqWwWLSb8", + "seats": "0", + "invite_only": "N", + "venue": "Skyline B-C - Level 21", + "company": "Intermediate", + "audience": "Session Presentations", + "id": "c9734088ee56ff8e1410bf33e494f71d", + "venue_id": "1944314", + "speakers": [ + { + "username": "anthony_miller1", + "id": "21066803", + "name": "Anthony Miller", + "company": "Apollo GraphQL", + "custom_order": 0 + } + ], + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Tuesday", + "event_start_weekday_short": "Tue", + "event_start_time": "4:20pm", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Tuesday", + "event_end_weekday_short": "Tue", + "event_end_time": "4:50pm", + "start_date": "2024-09-10", + "start_time": "16:20:00", + "start_time_ts": 1726010400, + "end_date": "2024-09-10", + "end_time": "16:50:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf2024/0c/ConsumingGraphQL.key", + "name": "ConsumingGraphQL.key" + } + ] + }, + { + "event_key": "685205", + "active": "Y", + "pinned": "N", + "name": "Lessons from Scaling GraphQL to Half a Billion Requests per Minute - Tushar Mathur, Tailcall", + "event_start": "2024-09-10 16:20", + "event_end": "2024-09-10 16:50", + "event_type": "Scaling", + "description": "Learn about the scaling challenges we faced in terms of infrastructure, organizational growth, and the technological aspects of GraphQL usage within a hyper-growth startup. In September 2016, when our team of ten-odd full-stack engineers adopted GraphQL, we were handling a few thousand requests per second on our GraphQL layer. Fast forward to 2023, the engineering team has grown to 1,000 members managing half a billion requests per minute at peak. In this talk we aim to address critical questions regarding GraphQL's performance, when is the right time to integrate it, exploring whether GraphQL is predominantly a front-end abstraction or if it can also be effectively utilized in back-end operations for service-to-service communication. Drawing from years of extensive GraphQL usage at a significant scale—without the need for federation—we will introduce for the first time an open-source project that helped us elegantly design, streamline, and scale optimal GraphQL APIs.", + "goers": "57", + "video_stream": "https://www.youtube.com/watch?v=Esb7oQ0PuXw", + "seats": "0", + "invite_only": "N", + "venue": "Skyline A - Level 21", + "company": "Intermediate", + "audience": "Session Presentations", + "id": "870876ffad45b79d11e09393e7f22587", + "venue_id": "1944311", + "speakers": [ + { + "username": "tushar.mathur", + "id": "21066872", + "name": "Tushar Mathur", + "company": "Tailcall", + "custom_order": 0 + } + ], + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Tuesday", + "event_start_weekday_short": "Tue", + "event_start_time": "4:20pm", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Tuesday", + "event_end_weekday_short": "Tue", + "event_end_time": "4:50pm", + "start_date": "2024-09-10", + "start_time": "16:20:00", + "start_time_ts": 1726010400, + "end_date": "2024-09-10", + "end_time": "16:50:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf2024/3c/slides.pdf", + "name": "slides.pdf" + } + ] + }, + { + "event_key": "706604", + "active": "Y", + "pinned": "N", + "name": "GraphQL Federation in the Wild - Stefan Avram, Wundergraph", + "event_start": "2024-09-10 17:00", + "event_end": "2024-09-10 17:30", + "event_type": "Federation and Composite Schemas", + "description": "Real-world observations of GraphQL Federation use. \n \nGartner predicts, \"By 2027, 30% of enterprises utilizing GraphQL will employ GraphQL federation, up from less than 5% in 2024.\" The report states, “Federation enables centralized governance, team autonomy (teams can own their subgraphs), composability, and adaptability to evolving requirements at different speeds.” \n \nAs GraphQL Federation continues to redefine how enterprises architect and scale their APIs, 2024 has marked a pivotal year in its adoption and evolution. This session will explore the rising trend of GraphQL Federation, highlighting key insights and success stories from diverse customer and partner bases. \n \nWe will delve into how businesses leverage federation to create more cohesive, efficient, and scalable API landscapes, addressing current challenges and showcasing emerging best practices. \n \nJoin us to understand the broader impact of GraphQL Federation in the tech industry and gather actionable strategies to enhance your organization's API strategies through advanced GraphQL techniques.", + "goers": "46", + "video_stream": "https://www.youtube.com/watch?v=K9HCb5Q2Juc", + "seats": "0", + "invite_only": "N", + "venue": "Skyline A - Level 21", + "company": "Any", + "audience": "Session Presentations", + "geo_area": "Yes", + "id": "9b4f92f2579d24a3c20e6533686aca6b", + "venue_id": "1944311", + "speakers": [ + { + "username": "stefan239", + "id": "21335795", + "name": "Stefan Avram", + "company": "Wundergraph", + "custom_order": 0 + } + ], + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Tuesday", + "event_start_weekday_short": "Tue", + "event_start_time": "5:00pm", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Tuesday", + "event_end_weekday_short": "Tue", + "event_end_time": "5:30pm", + "start_date": "2024-09-10", + "start_time": "17:00:00", + "start_time_ts": 1726012800, + "end_date": "2024-09-10", + "end_time": "17:30:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf2024/1b/GraphQL%20Federation%20in%20the%20Wild.pdf", + "name": "GraphQL Federation in the Wild.pdf" + } + ] + }, + { + "event_key": "698709", + "active": "Y", + "pinned": "N", + "name": "Build Confidently: How @Catch and Error Handling Pave the Way to Confidence in Field Nullability - Itamar Kestenbaum, Meta", + "event_start": "2024-09-10 17:00", + "event_end": "2024-09-10 17:30", + "event_type": "GraphQL Clients", + "description": "In this session - we’ll explore how GraphQL Clients can provide a road for developers to make full use of Semantic Nullability! GraphQL Spec defines that field errors should result in a null value. This makes null values ambiguous - either null due to error - or null due to nullability. Semantic Nullability allows you to define nullability explicitly - see https://github.com/graphql/graphql-wg/discussions/1410 Therefore, GraphQL Clients need to be able to handle errors differently - giving engineers more confidence in how field states are handled. In this session, we'll cover: 1. Why explicitly handling errors can enable us to move to a new normal where all errors are surfaced explicitly (throw-by-default on error) 2. How using @catch directive allows us to differentiate error nulls from true nulls in product code 3. Steps 1 and 2 will require developers to handle errors explicitly - and this opens the door to Semantic Nullability! I’ll also cover how working on the @catch directive helped push the semantic nullability conversation forward, the rollout at Meta, and what future capabilities can be unlocked. Original proposal: https://github.com/facebook/relay/issues/4416", + "goers": "45", + "video_stream": "https://www.youtube.com/watch?v=_TSYKAtaK5A", + "seats": "0", + "invite_only": "N", + "venue": "Skyline B-C - Level 21", + "company": "Any", + "audience": "Session Presentations", + "id": "c8426c5a3d9418e921f6d8717ff98ac3", + "venue_id": "1944314", + "speakers": [ + { + "username": "itamark", + "id": "80829", + "name": "Itamar Kestenbaum", + "company": "Meta", + "custom_order": 0 + } + ], + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Tuesday", + "event_start_weekday_short": "Tue", + "event_start_time": "5:00pm", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Tuesday", + "event_end_weekday_short": "Tue", + "event_end_time": "5:30pm", + "start_date": "2024-09-10", + "start_time": "17:00:00", + "start_time_ts": 1726012800, + "end_date": "2024-09-10", + "end_time": "17:30:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf2024/c0/GraphQLConf%202024%20-%20Relay%20Error%20Handling%20and%20@catch%20(7).pdf", + "name": "GraphQLConf 2024 - Relay Error Handling and @catch (7).pdf" + } + ] + }, + { + "event_key": "706602", + "active": "Y", + "pinned": "N", + "name": "Reception", + "event_start": "2024-09-10 17:30", + "event_end": "2024-09-10 19:00", + "event_type": "Breaks & Special Events", + "goers": "48", + "seats": "0", + "invite_only": "N", + "venue": "Level 2 Foyer", + "id": "4df9dbdef91ea1bc5fce211e6b7e3f52", + "venue_id": "1944317", + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Tuesday", + "event_start_weekday_short": "Tue", + "event_start_time": "5:30pm", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Tuesday", + "event_end_weekday_short": "Tue", + "event_end_time": "7:00pm", + "start_date": "2024-09-10", + "start_time": "17:30:00", + "start_time_ts": 1726014600, + "end_date": "2024-09-10", + "end_time": "19:00:00", + "description": "" + }, + { + "event_key": "706599", + "active": "Y", + "pinned": "N", + "name": "Registration & Badge Pick-up", + "event_start": "2024-09-11 08:00", + "event_end": "2024-09-11 17:00", + "event_type": "Registration & Badge Pick-up", + "goers": "9", + "seats": "0", + "invite_only": "N", + "venue": "Level 2 Foyer", + "id": "c044cbad42295fda4adedd7018df6b2a", + "venue_id": "1944317", + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "11", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "8:00am", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "11", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "5:00pm", + "start_date": "2024-09-11", + "start_time": "08:00:00", + "start_time_ts": 1726066800, + "end_date": "2024-09-11", + "end_time": "17:00:00", + "description": "" + }, + { + "event_key": "706618", + "active": "Y", + "pinned": "N", + "name": "Keynote: Welcome Back & Opening Remarks - Sasha Solomon, Staff Software Engineer/Tech Lead", + "event_start": "2024-09-11 09:00", + "event_end": "2024-09-11 09:05", + "event_type": "Keynote Sessions", + "goers": "64", + "video_stream": "https://www.youtube.com/watch?v=VgndfUI_xKI", + "seats": "0", + "invite_only": "N", + "venue": "Metropolitan Ballroom", + "id": "8a7cb5ace8f6474a756f317f336d549f", + "venue_id": "1944323", + "speakers": [ + { + "username": "sasha177", + "id": "21336701", + "name": "Sasha Solomon", + "custom_order": 0 + } + ], + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "11", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "9:00am", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "11", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "9:05am", + "start_date": "2024-09-11", + "start_time": "09:00:00", + "start_time_ts": 1726070400, + "end_date": "2024-09-11", + "end_time": "09:05:00", + "description": "" + }, + { + "event_key": "706612", + "active": "Y", + "pinned": "N", + "name": "Keynote: Apollo's Journey with GraphQL: Transforming Enterprise APIs for the Future - Matt DeBergalis, Apollo GraphQL", + "event_start": "2024-09-11 09:05", + "event_end": "2024-09-11 09:25", + "event_type": "Keynote Sessions", + "description": "As the tech landscape continues to move into the next frontier, GraphQL is now the most important new API technology in the enterprise. Join Matt DeBergalis, CTO and Co-founder of Apollo GraphQL, to explore how GraphQL is rapidly gaining adoption, revolutionizing API strategies, and readying the enterprise for an AI-driven world.", + "goers": "64", + "video_stream": "https://www.youtube.com/watch?v=QbuRTGdt4fA", + "seats": "0", + "invite_only": "N", + "venue": "Metropolitan Ballroom", + "id": "486758a780cbd512a88c6def8f9ba36a", + "venue_id": "1944323", + "speakers": [ + { + "username": "matt1575", + "id": "7503056", + "name": "Matt DeBergalis", + "company": "Apollo GraphQL", + "custom_order": 0 + } + ], + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "11", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "9:05am", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "11", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "9:25am", + "start_date": "2024-09-11", + "start_time": "09:05:00", + "start_time_ts": 1726070700, + "end_date": "2024-09-11", + "end_time": "09:25:00" + }, + { + "event_key": "706613", + "active": "Y", + "pinned": "N", + "name": "Sponsored Keynote: GraphQL, BFFs and AI - Anant Jhingran, IBM", + "event_start": "2024-09-11 09:25", + "event_end": "2024-09-11 09:35", + "event_type": "Keynote Sessions", + "description": "There is no AI without APIs--after all, whether it is models, vector databases or enterprise systems, they are all behind APIs. GraphQL APIs make it especially convenient to connect to backend systems. BFF patterns supported by GraphQL APIs eliminate the need for enterprise-wide agreements--each LLM powered application can get a magical view of the data it needs.", + "goers": "60", + "video_stream": "https://www.youtube.com/watch?v=vLFWJ5FO7GI", + "seats": "0", + "invite_only": "N", + "venue": "Metropolitan Ballroom", + "company": "Any", + "id": "950039dcb680cef826423ad5c0678714", + "venue_id": "1944323", + "speakers": [ + { + "username": "ajhingran", + "id": "19225935", + "name": "Anant Jhingran", + "company": "IBM", + "custom_order": 0 + } + ], + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "11", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "9:25am", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "11", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "9:35am", + "start_date": "2024-09-11", + "start_time": "09:25:00", + "start_time_ts": 1726071900, + "end_date": "2024-09-11", + "end_time": "09:35:00" + }, + { + "event_key": "693038", + "active": "Y", + "pinned": "N", + "name": "Keynote: GraphQL in the House - Andrew Doyle, U.S. House of Representatives", + "event_start": "2024-09-11 09:35", + "event_end": "2024-09-11 09:55", + "event_type": "Keynote Sessions", + "description": "An overview of how the Office of the Clerk has used GraphQL to modernize a large legacy system used to manage legislative data and processes in the House of Representatives. The talk will cover architecture, technologies, process and an overview of our application. We have moved significant portions of our application from a legacy database management and application framework to a modern relational database with a microservice business logic layer and a single page application client. GraphQL is used to tie the application, data and business logic together in a single API that is shared across multiple applications and modules. The initial approach has evolved into a platform for building applications that host complex data and business logic. We are also evolving our architecture to deliver data from our applications directly to legislative branch partners over a GraphQL endpoint, replacing multiple legacy delivery methods.", + "goers": "61", + "video_stream": "https://www.youtube.com/watch?v=VqVBGM4XEiE", + "seats": "0", + "invite_only": "N", + "venue": "Metropolitan Ballroom", + "company": "Any", + "id": "2b8cf13e46335dc0f98c57dd576551c3", + "venue_id": "1944323", + "speakers": [ + { + "username": "andrew.doyle1", + "id": "21066800", + "name": "Andrew Doyle", + "company": "U.S. House of Representatives", + "custom_order": 0 + } + ], + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "11", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "9:35am", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "11", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "9:55am", + "start_date": "2024-09-11", + "start_time": "09:35:00", + "start_time_ts": 1726072500, + "end_date": "2024-09-11", + "end_time": "09:55:00" + }, + { + "event_key": "706619", + "active": "Y", + "pinned": "N", + "name": "Keynote: GraphQL Clients in 2024 - Jeff Auriemma, Apollo GraphQL", + "event_start": "2024-09-11 09:55", + "event_end": "2024-09-11 10:05", + "event_type": "Keynote Sessions", + "description": "GraphQL is an established and trusted piece of technology in the modern stack. GraphQL client libraries are the bridge connecting your language or framework of choice to your backend, often exposing elegant APIs for features such as state management, caching, and type-safety. The past year has been transformative for GraphQL client users: innovations both within the GraphQL community and in prominent web and mobile frameworks have put more value into users’ hands. In this keynote, you’ll learn what’s new in the open-source GraphQL client world and why it matters more than ever in 2024.", + "goers": "59", + "video_stream": "https://www.youtube.com/watch?v=wqRKO_vLY_c", + "seats": "0", + "invite_only": "N", + "venue": "Metropolitan Ballroom", + "id": "7669ef25b3ab08adabebe712dc0ee19c", + "venue_id": "1944323", + "speakers": [ + { + "username": "jeff.auriemma", + "id": "18743876", + "name": "Jeff Auriemma", + "company": "Apollo GraphQL", + "custom_order": 0 + } + ], + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "11", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "9:55am", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "11", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "10:05am", + "start_date": "2024-09-11", + "start_time": "09:55:00", + "start_time_ts": 1726073700, + "end_date": "2024-09-11", + "end_time": "10:05:00" + }, + { + "event_key": "706630", + "active": "Y", + "pinned": "N", + "name": "Keynote: Empathy Driven Development - Sarah Sanders, Highnote", + "event_start": "2024-09-11 10:05", + "event_end": "2024-09-11 10:15", + "event_type": "Keynote Sessions", + "description": "In this talk, Sarah will guide us as we explore the transformative power of Empathy Driven Development and its impact on creating a rich developer experience. By stepping into the shoes of the developers using our products, we can transform how they interact with our products, schemas, and documentation. Sarah will also touch on the importance of future-oriented thinking in this approach, discussing how rapidly evolving technology is reshaping developer workflows. By anticipating these changes, we can adapt our developer experience strategies to remain relevant and effective. This talk promises to offer valuable insights into fostering a more empathetic, forward-thinking approach to development that improves our current practices and prepares us for the evolution of technology.", + "goers": "46", + "video_stream": "https://www.youtube.com/watch?v=0K_Sp0g1ogc", + "seats": "0", + "invite_only": "N", + "venue": "Metropolitan Ballroom", + "id": "d3f8f96d85291af99ee392ae1e8db596", + "venue_id": "1944323", + "speakers": [ + { + "username": "sasanders26", + "id": "21066861", + "name": "Sarah Sanders", + "company": "Highnote", + "custom_order": 0 + } + ], + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "11", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "10:05am", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "11", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "10:15am", + "start_date": "2024-09-11", + "start_time": "10:05:00", + "start_time_ts": 1726074300, + "end_date": "2024-09-11", + "end_time": "10:15:00" + }, + { + "event_key": "14", + "active": "Y", + "pinned": "N", + "name": "Keynote: Closing Remarks - Sasha Solomon, Staff Software Engineer/Tech Lead", + "event_start": "2024-09-11 10:20", + "event_end": "2024-09-11 10:30", + "event_type": "Keynote Sessions", + "goers": "60", + "video_stream": "https://www.youtube.com/watch?v=t9swX1jpLSU", + "seats": "0", + "invite_only": "N", + "venue": "Metropolitan Ballroom", + "id": "ddf5766e2b98ed4a1055c31926575d1b", + "venue_id": "1944323", + "speakers": [ + { + "username": "sasha177", + "id": "21336701", + "name": "Sasha Solomon", + "custom_order": 0 + } + ], + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "11", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "10:20am", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "11", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "10:30am", + "start_date": "2024-09-11", + "start_time": "10:20:00", + "start_time_ts": 1726075200, + "end_date": "2024-09-11", + "end_time": "10:30:00", + "description": "" + }, + { + "event_key": "11", + "active": "Y", + "pinned": "N", + "name": "Coffee Break", + "event_start": "2024-09-11 10:30", + "event_end": "2024-09-11 11:00", + "event_type": "Breaks & Special Events", + "goers": "34", + "seats": "0", + "invite_only": "N", + "venue": "Level 2 Foyer", + "id": "30ea7a71fd410161e413a6a41eb5902c", + "venue_id": "1944317", + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "11", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "10:30am", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "11", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "11:00am", + "start_date": "2024-09-11", + "start_time": "10:30:00", + "start_time_ts": 1726075800, + "end_date": "2024-09-11", + "end_time": "11:00:00", + "description": "" + }, + { + "event_key": "706607", + "active": "Y", + "pinned": "N", + "name": "Sponsor Showcase", + "event_start": "2024-09-11 10:30", + "event_end": "2024-09-11 17:00", + "event_type": "Sponsor Showcase", + "description": "Visit the sponsors in the Sponsor Showcase!", + "goers": "17", + "seats": "0", + "invite_only": "N", + "venue": "Level 2 Foyer", + "id": "b106db6eb7ca1aba331fcfb86dff9f22", + "venue_id": "1944317", + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "11", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "10:30am", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "11", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "5:00pm", + "start_date": "2024-09-11", + "start_time": "10:30:00", + "start_time_ts": 1726075800, + "end_date": "2024-09-11", + "end_time": "17:00:00" + }, + { + "event_key": "706597", + "active": "Y", + "pinned": "N", + "name": "Why You Should Use Implementation-First to Build Your GraphQL Schema - Erik Wrede, fulfillmenttools", + "event_start": "2024-09-11 11:00", + "event_end": "2024-09-11 11:30", + "event_type": "Backend", + "description": "When we look at GraphQL server implementation approaches, you often see the discussion between code-first and schema-first as a schema building approach. What is overlooked is that Facebook actually built their Hack-based GraphQL server with implementation-first. This approach will infer the GraphQL schema from your code, and by extension from your business layer. In this talk, I will look at various implementations of implementation-first and explain why Facebook chose this approach to build their own GraphQL server and why it is actually the better approach in most projects.", + "goers": "16", + "video_stream": "https://www.youtube.com/watch?v=ZilgUSmo_hA", + "seats": "0", + "invite_only": "N", + "venue": "Skyline B-C - Level 21", + "company": "Intermediate", + "audience": "Session Presentations", + "id": "c13801cab4bdcf1c9e7321fba8daca3f", + "venue_id": "1944314", + "speakers": [ + { + "username": "erikwrede2", + "id": "21102110", + "name": "Erik Wrede", + "company": "fulfillmenttools", + "custom_order": 0 + } + ], + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "11", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "11:00am", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "11", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "11:30am", + "start_date": "2024-09-11", + "start_time": "11:00:00", + "start_time_ts": 1726077600, + "end_date": "2024-09-11", + "end_time": "11:30:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf2024/e0/Implementation-First-GraphQL%20Conf%202024.pdf", + "name": "Implementation-First-GraphQL Conf 2024.pdf" + } + ] + }, + { + "event_key": "691875", + "active": "Y", + "pinned": "N", + "name": "GraphQL Field Discovery and Query Generation Using Generative AI - Rachit Sengupta & Siva Thiru, Intuit", + "event_start": "2024-09-11 11:00", + "event_end": "2024-09-11 11:30", + "event_type": "Developer Experience", + "description": "Discovering GraphQL fields and generating queries is a tedious task for developers. They spend a considerable amount of time finding the appropriate fields in large schemas. To solve this problem at Intuit where we have a super graph consisting of millions of lines we implemented a framework that makes use of Generative AI to help developers with attribute discovery and query generation. The benefits of our approach include being able to work with large schemas without the hassle of going through the whole schema and requiring less back and forth communication between consumers and schema owners, which results in a huge boost in developer productivity. We created chunks of the schema and ingested them into a vector store, we then do a retrieval, dynamically build a minimal schema and perform RAG where the LLM is provided with the minimal schema and the user query. The LLM responds with either a list of discovered attributes or GraphQL query. This framework aims to achieve lower latency and less hallucinations by reducing the size of the schema sent to the LLM, this also results in lower costs and higher accuracy.", + "goers": "35", + "video_stream": "https://www.youtube.com/watch?v=Zjz2ou41-LI", + "seats": "0", + "invite_only": "N", + "venue": "Metropolitan B-C", + "company": "Any", + "audience": "Session Presentations", + "id": "83cfae91425cec04854a0ebc173d9c77", + "venue_id": "1944308", + "speakers": [ + { + "username": "siva27", + "id": "9778144", + "name": "Siva Thiru", + "company": "Intuit", + "custom_order": 0 + }, + { + "username": "rachit_sengupta", + "id": "21066842", + "name": "Rachit Sengupta", + "company": "Intuit", + "custom_order": 1 + } + ], + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "11", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "11:00am", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "11", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "11:30am", + "start_date": "2024-09-11", + "start_time": "11:00:00", + "start_time_ts": 1726077600, + "end_date": "2024-09-11", + "end_time": "11:30:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf2024/9b/GraphQLConf_2024_PPT.pptx.pdf", + "name": "GraphQLConf_2024_PPT.pptx.pdf" + } + ] + }, + { + "event_key": "706620", + "active": "Y", + "pinned": "N", + "name": "Revolutionizing Data Access Using GraphQL in the Oracle Database - Shashank Gugnani, Oracle", + "event_start": "2024-09-11 11:00", + "event_end": "2024-09-11 11:30", + "event_type": "GraphQL in Production", + "description": "We will explore the revolutionary integration of GraphQL with the Oracle Database in this session. The way developers query and interact with the database has been greatly simplified by this integration. We will introduce the concept of Duality Views, a brand-new feature available in Oracle Database 23ai. Using Duality Views, data is still stored in relational tables in a highly efficient normalized format but is accessed by apps in the form of JSON documents. Duality Views are created using an intuitive and flexible GraphQL-like syntax, enhancing developer productivity. \n \nWe will also demonstrate new capabilities in the database to automatically infer the GraphQL schema from existing relational schemas, making it easy to introspect and visualize the relational schema as well as write GraphQL queries against the database. Finally, we will talk about new GraphQL directives to allow calculations, reshaping, and transformations in a GraphQL query that can be executed on a relational database. \n \nCome learn how Oracle's support for GraphQL is transforming data access and providing a powerful and seamless solution for modern application development.", + "goers": "6", + "video_stream": "https://www.youtube.com/watch?v=WUiDRozAcQk", + "seats": "0", + "invite_only": "N", + "venue": "Metropolitan A", + "company": "Intermediate", + "audience": "Session Presentations", + "geo_area": "Yes", + "id": "f766992611ab85a48547edab68f135d2", + "venue_id": "1944305", + "speakers": [ + { + "username": "shashank.gugnani", + "id": "21458022", + "name": "Shashank Gugnani", + "company": "Oracle", + "custom_order": 0 + } + ], + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "11", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "11:00am", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "11", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "11:30am", + "start_date": "2024-09-11", + "start_time": "11:00:00", + "start_time_ts": 1726077600, + "end_date": "2024-09-11", + "end_time": "11:30:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf2024/e1/GraphQLConf-2024-v5-pdf.pdf", + "name": "GraphQLConf-2024-v5-pdf.pdf" + } + ] + }, + { + "event_key": "685433", + "active": "Y", + "pinned": "N", + "name": "State of @Defer and @Stream - Rob Richard, 1stDibs", + "event_start": "2024-09-11 11:00", + "event_end": "2024-09-11 11:30", + "event_type": "GraphQL Spec", + "description": "The @defer and @stream directives are proposed additions to the GraphQL Spec. In this session, you’ll learn about these directives and how you can use them to lower latency in your GraphQL application. The proposal has been in progress for some time now and has gone through many iterations. Learn about the motivation behind these changes and how they will lead to scalable GraphQL servers and efficient clients.", + "goers": "51", + "video_stream": "https://www.youtube.com/watch?v=Ef6qv26fZHk", + "seats": "0", + "invite_only": "N", + "venue": "Skyline A - Level 21", + "company": "Any", + "audience": "Session Presentations", + "id": "dd457152162ecb3609b4adac4026fe02", + "venue_id": "1944311", + "speakers": [ + { + "username": "robrichard87", + "id": "21066852", + "name": "Rob Richard", + "company": "1stdibs", + "custom_order": 0 + } + ], + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "11", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "11:00am", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "11", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "11:30am", + "start_date": "2024-09-11", + "start_time": "11:00:00", + "start_time_ts": 1726077600, + "end_date": "2024-09-11", + "end_time": "11:30:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf2024/64/Defer%20and%20Stream%20GraphQL%20Conf%202024.pdf", + "name": "Defer and Stream GraphQL Conf 2024.pdf" + } + ] + }, + { + "event_key": "691762", + "active": "Y", + "pinned": "N", + "name": "Dynamically Serving a GraphQL API with Custom Types at Runtime - Emily Li, Benchling", + "event_start": "2024-09-11 11:40", + "event_end": "2024-09-11 12:10", + "event_type": "Backend", + "description": "Existing GraphQL frameworks are well designed to handle statically defined types and resolvers. Here at Benchling, we faced the problem of serving a GraphQL API which incorporated customer-defined types at runtime with a dynamically generated graph that varies customer-to-customer. In this talk, I’ll describe some of the challenges in serving this GraphQL API, including dynamic generation of graph components and performance. Then, I’ll describe how we extended Strawberry (the GraphQL framework we decided to use) to handle our use cases as well as a graph-caching strategy that allowed us to dramatically improve the performance of serving the API.", + "goers": "23", + "video_stream": "https://www.youtube.com/watch?v=M3wGkC7rzmE", + "seats": "0", + "invite_only": "N", + "venue": "Skyline B-C - Level 21", + "company": "Intermediate", + "audience": "Session Presentations", + "id": "24100908c07eed48ee464ca2509ef527", + "venue_id": "1944314", + "speakers": [ + { + "username": "emily.li2", + "id": "21066813", + "name": "Emily Li", + "company": "Benchling", + "custom_order": 0 + } + ], + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "11", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "11:40am", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "11", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "12:10pm", + "start_date": "2024-09-11", + "start_time": "11:40:00", + "start_time_ts": 1726080000, + "end_date": "2024-09-11", + "end_time": "12:10:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf2024/ce/Emily_Li_GraphQLConf_2024.pdf", + "name": "Emily_Li_GraphQLConf_2024.pdf" + } + ] + }, + { + "event_key": "681437", + "active": "Y", + "pinned": "N", + "name": "GraphQL Docs: Beyond the Schema - Sarah Sanders, Highnote", + "event_start": "2024-09-11 11:40", + "event_end": "2024-09-11 12:10", + "event_type": "Developer Experience", + "description": "GraphQL Docs: Beyond the Schema is a presentation focusing on how Technical Writers and DevEx teams can enhance developer experience with interactive documentation. I hope to inspire DevEx teams and Technical Writers to consider GraphQL as more than just \"self-documenting.\" The problem I will present is that I want more than a schema as a developer. I want to know how to use the schema to build my product. The solution to the problem will focus on interactive documentation by defining what makes it interactive, for example, embedded code samples linked to a user's sandbox environment. I will then explore how DevEx teams can implement these elements to create interactive documentation for their GraphQL API. I expect the audience to gain insight into exactly how they can create their own interactive GraphQL documentation and best practices. This presentation will help better the ecosystem by highlighting the pain points of GraphQL documentation as it exists today, emphasizing the need to create interactive documentation for developers working with GraphQL, and enforcing the importance of creating rich developer experiences.", + "goers": "29", + "video_stream": "https://www.youtube.com/watch?v=IzJeffH_x_s", + "seats": "0", + "invite_only": "N", + "venue": "Metropolitan B-C", + "company": "Any", + "audience": "Session Presentations", + "id": "65768f566de8acf5320a4ed1fef47606", + "venue_id": "1944308", + "speakers": [ + { + "username": "sasanders26", + "id": "21066861", + "name": "Sarah Sanders", + "company": "Highnote", + "custom_order": 0 + } + ], + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "11", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "11:40am", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "11", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "12:10pm", + "start_date": "2024-09-11", + "start_time": "11:40:00", + "start_time_ts": 1726080000, + "end_date": "2024-09-11", + "end_time": "12:10:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf2024/59/GraphQL%20Docs%20Beyond%20the%20Schema%20(1).pdf", + "name": "GraphQL Docs Beyond the Schema (1).pdf" + } + ] + }, + { + "event_key": "692382", + "active": "Y", + "pinned": "N", + "name": "The Intersection of GraphQL and Design Systems in Product Development - Ruben Cagnie & Alan Quigley, Toast", + "event_start": "2024-09-11 11:40", + "event_end": "2024-09-11 12:10", + "event_type": "GraphQL in Production", + "description": "Introducing GraphQL into the product development lifecycle changes the game. This talk explores the impact of GraphQL on mock data-driven development, highlighting data consistency and discoverability. Learn how GraphQL centralizes UI engineering, streamlining workflows and enhancing collaboration, resulting in superior product design and build quality.", + "goers": "21", + "video_stream": "https://www.youtube.com/watch?v=WZjwk_tRgvA", + "seats": "0", + "invite_only": "N", + "venue": "Metropolitan A", + "company": "Any", + "audience": "Session Presentations", + "id": "19cf965c68cfae3c7c19c6a9966bcadf", + "venue_id": "1944305", + "speakers": [ + { + "username": "alan.quigley", + "id": "21066789", + "name": "Alan Quigley", + "company": "Toast Inc", + "custom_order": 0 + }, + { + "username": "ruben.cagnie", + "id": "21066855", + "name": "Ruben Cagnie", + "company": "Toast", + "custom_order": 1 + } + ], + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "11", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "11:40am", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "11", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "12:10pm", + "start_date": "2024-09-11", + "start_time": "11:40:00", + "start_time_ts": 1726080000, + "end_date": "2024-09-11", + "end_time": "12:10:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf2024/69/presentation.pdf", + "name": "presentation.pdf" + } + ] + }, + { + "event_key": "686002", + "active": "Y", + "pinned": "N", + "name": "Techniques to Protect Your GraphQL API - Benjie Gillam, Graphile", + "event_start": "2024-09-11 11:40", + "event_end": "2024-09-11 12:10", + "event_type": "GraphQL Security", + "description": "GraphQL poses unique challenges when it comes to security due to the nature of its powerful query language. In this talk we'll explore different types of GraphQL APIs and their varying and common security needs. We'll then look at the techniques that can be used to protect these APIs and which techniques pair well with each API type. These techniques are not specific to any one vendor or programming language but general best practices that help protect your servers from threats both known and unknown. Attendees will come away with an understanding of common threats GraphQL APIs face, and suitable techniques to address them.", + "goers": "43", + "video_stream": "https://www.youtube.com/watch?v=W7qIux5BAvs", + "seats": "0", + "invite_only": "N", + "venue": "Skyline A - Level 21", + "company": "Intermediate", + "audience": "Session Presentations", + "id": "4dc607a403a2316846b59d0c5a9858c9", + "venue_id": "1944311", + "speakers": [ + { + "username": "benjie3", + "id": "18743846", + "name": "Benjie Gillam", + "company": "Graphile", + "custom_order": 0 + } + ], + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "11", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "11:40am", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "11", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "12:10pm", + "start_date": "2024-09-11", + "start_time": "11:40:00", + "start_time_ts": 1726080000, + "end_date": "2024-09-11", + "end_time": "12:10:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf2024/3c/graphql-techniques-to-protect.pdf", + "name": "graphql-techniques-to-protect.pdf" + } + ] + }, + { + "event_key": "8", + "active": "Y", + "pinned": "N", + "name": "Lunch Break - Attendees on Own", + "event_start": "2024-09-11 12:10", + "event_end": "2024-09-11 13:40", + "event_type": "Breaks & Special Events", + "description": "Lunch will be on your own. San Francisco offers a variety of dining options nearby to suit different tastes and preferences. Feel free to explore the local area and enjoy your meal. We’ll reconvene at 1:40 PM for the next session.", + "goers": "38", + "seats": "0", + "invite_only": "N", + "venue": "Attendees On Own", + "id": "4003c42a935c2de7c19896b6c0351c0d", + "venue_id": "1979819", + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "11", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "12:10pm", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "11", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "1:40pm", + "start_date": "2024-09-11", + "start_time": "12:10:00", + "start_time_ts": 1726081800, + "end_date": "2024-09-11", + "end_time": "13:40:00" + }, + { + "event_key": "698984", + "active": "Y", + "pinned": "N", + "name": "Dynamic (but Safe) Operations: Using AI to Generate Trusted Operations from Text Prompts - Michael Watson, Apollo GraphQL", + "event_start": "2024-09-11 13:40", + "event_end": "2024-09-11 14:10", + "event_type": "API Platform", + "description": "Platform engineering and internal developer portals have been a growing trend in the tech industry to make developers more efficient. For example, how do we help new developers ship their first feature faster? GraphQL helps Platform API efforts ship features faster, but what about when your schema gets very complex? How can a new developer find what they need quickly? GraphQL already provides a complete and understandable description of the data in our APIs, but what if we provide that context to a LLM? In this talk, we'll journey through GitHub's APIs and explore how a GraphQL schema is a significant advantage in AI-based tooling. We're seeing more AI-based tools generate fetch code based on OpenAPI definitions, and while they may be tempting at first, it could be a decision with unexpected trade-offs. We'll show how to take a standard open-sourced LLM and provide a GraphQL-aware context to generate operations from text input. After this talk, you can safely bring AI to your developer efficiency initiatives with any LLM, 3rd party, or self-hosted!", + "goers": "24", + "video_stream": "https://www.youtube.com/watch?v=3msKy5VOml0", + "seats": "0", + "invite_only": "N", + "venue": "Skyline B-C - Level 21", + "company": "Any", + "audience": "Session Presentations", + "id": "f02cda18e19887fddeb56b06445ac256", + "venue_id": "1944314", + "speakers": [ + { + "username": "watson17", + "id": "19024254", + "name": "Michael Watson", + "company": "Apollo GraphQL", + "custom_order": 0 + } + ], + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "11", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "1:40pm", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "11", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "2:10pm", + "start_date": "2024-09-11", + "start_time": "13:40:00", + "start_time_ts": 1726087200, + "end_date": "2024-09-11", + "end_time": "14:10:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf2024/82/Dynamic%20(but%20Safe)%20Operations.pdf", + "name": "Dynamic (but Safe) Operations.pdf" + } + ] + }, + { + "event_key": "691410", + "active": "Y", + "pinned": "N", + "name": "Schema-Driven UI Components: Revolutionizing Headless ERP with GraphQL - Seiya Izumi & Masanori Uehara, Tailor Inc.", + "event_start": "2024-09-11 13:40", + "event_end": "2024-09-11 14:10", + "event_type": "Developer Experience", + "description": "Modern ERPs must be highly customizable and easily integrated with other systems while generating UI components on top should be seamless. In this talk, we will explore why GraphQL, with its robust and flexible querying capabilities, is exceptionally suited for developing modern ERP solutions. In addition, we’ll explore the technical aspects of generating front-end UI components directly from the GraphQL schema, what we call Schema-Driven UI, not Server-Driven UI. This approach is particularly beneficial in the ERP domain, where dynamic and complex data interactions are common. Automating the process of generating UI components directly from the Schema ensures consistency across systems by keeping everything in sync.", + "goers": "13", + "video_stream": "https://www.youtube.com/watch?v=U4gCky2TFWE", + "seats": "0", + "invite_only": "N", + "venue": "Metropolitan B-C", + "company": "Intermediate", + "audience": "Session Presentations", + "id": "b43e5c894796be3b0b0f0d0b662d4a5a", + "venue_id": "1944308", + "speakers": [ + { + "username": "masanori.uehara", + "id": "21066828", + "name": "Masanori Uehara", + "company": "Tailor Inc.", + "custom_order": 0 + }, + { + "username": "seiyaizumi", + "id": "21066863", + "name": "Seiya Izumi", + "company": "Tailor Inc.", + "custom_order": 1 + } + ], + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "11", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "1:40pm", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "11", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "2:10pm", + "start_date": "2024-09-11", + "start_time": "13:40:00", + "start_time_ts": 1726087200, + "end_date": "2024-09-11", + "end_time": "14:10:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf2024/1b/Schema%20Driven%20UI%20-%20Tailor%20Inc.pdf", + "name": "Schema Driven UI - Tailor Inc.pdf" + } + ] + }, + { + "event_key": "689933", + "active": "Y", + "pinned": "N", + "name": "Identity and GraphQL: More Than You Want to Think About IDs - Matt Mahoney, Meta", + "event_start": "2024-09-11 13:40", + "event_end": "2024-09-11 14:10", + "event_type": "GraphQL in Production", + "description": "IDs are really important to get right, yet GraphQL the language doesn't discuss them at all, besides requiring every single implementation to have a special ID type! At Meta, we found our types all had their own eclectic idea of what an ID really was. Some had three! We'll walk through where in production systems IDs matter, and how Meta attempts to formalize a few core principles to prevent disaster.", + "goers": "36", + "video_stream": "https://www.youtube.com/watch?v=jv8q7kFyxo0", + "seats": "0", + "invite_only": "N", + "venue": "Metropolitan A", + "company": "Intermediate", + "audience": "Session Presentations", + "id": "6204717dd5e10bf10587733c08897dc1", + "venue_id": "1944305", + "speakers": [ + { + "username": "mahoney.mattj", + "id": "19314398", + "name": "Matthew Mahoney", + "company": "Meta", + "custom_order": 0 + } + ], + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "11", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "1:40pm", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "11", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "2:10pm", + "start_date": "2024-09-11", + "start_time": "13:40:00", + "start_time_ts": 1726087200, + "end_date": "2024-09-11", + "end_time": "14:10:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf2024/d9/Identity%20and%20GraphQL_%20More%20Than%20You%20Want%20to%20Think%20About%20IDs%202024.pdf", + "name": "Identity and GraphQL_ More Than You Want to Think About IDs 2024.pdf" + } + ] + }, + { + "event_key": "692702", + "active": "Y", + "pinned": "N", + "name": "Semantic Nullability: A Path Toward Safe Non-Null Fields - Jordan Eldredge, Meta", + "event_start": "2024-09-11 13:40", + "event_end": "2024-09-11 14:10", + "event_type": "GraphQL Spec", + "description": "One of GraphQL’s killer features is field-granular error handling which can dramatically increase the resiliency of network responses. However, this has traditionally come at the cost of developer ergonomics, with client developers being forced to contend with nearly every field potentially being null. In the last year, members of the Nullability Working Group, and engineers at Meta have been exploring how we can untangle nullability and error handling in order to safely allow clients to “see” the true nullability of the server’s resolvers without sacrificing response residency. In this talk we’ll explain the ideas and RFCs that underpin this change, share the work we’ve done at Meta and across the community to validate this approach, and demonstrate Semantic Nullability in action!", + "goers": "43", + "video_stream": "https://www.youtube.com/watch?v=kVYlplb1gKk", + "seats": "0", + "invite_only": "N", + "venue": "Skyline A - Level 21", + "company": "Intermediate", + "audience": "Session Presentations", + "id": "8daaf10ac70360a7fade149a54538bf9", + "venue_id": "1944311", + "speakers": [ + { + "username": "jordaneldredge", + "id": "21066819", + "name": "Jordan Eldredge", + "company": "Meta", + "custom_order": 0 + } + ], + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "11", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "1:40pm", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "11", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "2:10pm", + "start_date": "2024-09-11", + "start_time": "13:40:00", + "start_time_ts": 1726087200, + "end_date": "2024-09-11", + "end_time": "14:10:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf2024/87/Semantic%20Non%20Null%20GraphQL%20Conf%202024.pdf", + "name": "Semantic Non Null GraphQL Conf 2024.pdf" + } + ] + }, + { + "event_key": "692355", + "active": "Y", + "pinned": "N", + "name": "In-House Schema Registry - the Good, the Bad, and the Ugly - Kamil Kisiela, The Guild", + "event_start": "2024-09-11 14:20", + "event_end": "2024-09-11 14:50", + "event_type": "API Platform", + "description": "When working with GraphQL, you might find yourself looking for tools to prevent breaking changes, or in case of Federation, compose GraphQL APIs. At this point, you may be tempted to build your own schema registry, from scratch. I’ve been there, done that, and now I’m going to tell you why I think it is a bad idea and what are the challenges you will most likely face, when developing your won solution.", + "goers": "21", + "video_stream": "https://www.youtube.com/watch?v=jreLGIzgZ9U", + "seats": "0", + "invite_only": "N", + "venue": "Skyline B-C - Level 21", + "company": "Intermediate", + "audience": "Session Presentations", + "id": "af55205b1d68ec3b3d1b1663e4bd2adf", + "venue_id": "1944314", + "speakers": [ + { + "username": "kamilkisiela", + "id": "19082388", + "name": "Kamil Kisiela", + "company": "The Guild", + "custom_order": 0 + } + ], + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "11", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "2:20pm", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "11", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "2:50pm", + "start_date": "2024-09-11", + "start_time": "14:20:00", + "start_time_ts": 1726089600, + "end_date": "2024-09-11", + "end_time": "14:50:00" + }, + { + "event_key": "698734", + "active": "Y", + "pinned": "N", + "name": "Schema Scoring: Ensuring Schema Excellence in GraphQL - Christian Ernst, Booking.com", + "event_start": "2024-09-11 14:20", + "event_end": "2024-09-11 14:50", + "event_type": "Developer Experience", + "description": "At Booking.com we have scaled to over 120+ subgraphs and that number continues to grow rabidly as we modernize our frontend and backend. As subgraphs develop it has begun to be impossible for one to team to oversee all of the changes to the graph because of the rapid changes that occur from teams. As we have grown we created best practices and guidelines fro GraphQL. We soon recognised this was not enough and there was the need to track the quality of schemas over time automatically and in a way that can provide actionable feedback to teams. At Booking.com we have developed the infrastructure to analyse schemas beyond standard linting to help improve the quality of the Graph across the board enabling better developer experience for everyone.", + "goers": "34", + "video_stream": "https://www.youtube.com/watch?v=4xCcSqdablo", + "seats": "0", + "invite_only": "N", + "venue": "Metropolitan B-C", + "company": "Beginner", + "audience": "Session Presentations", + "id": "6e20cd3c4ee36577f15713955444338f", + "venue_id": "1944308", + "speakers": [ + { + "username": "christian.ernst1", + "id": "21066804", + "name": "Christian Ernst", + "company": "Booking.com", + "custom_order": 0 + } + ], + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "11", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "2:20pm", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "11", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "2:50pm", + "start_date": "2024-09-11", + "start_time": "14:20:00", + "start_time_ts": 1726089600, + "end_date": "2024-09-11", + "end_time": "14:50:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf2024/e6/Schema%20Scoring.pdf", + "name": "Schema Scoring.pdf" + } + ] + }, + { + "event_key": "706625", + "active": "Y", + "pinned": "N", + "name": "Blueprints of Successful GraphQL Architectures - Pascal Senn, ChilliCream", + "event_start": "2024-09-11 14:20", + "event_end": "2024-09-11 14:50", + "event_type": "GraphQL in Production", + "description": "This session will take you behind the curtains of a few companies and will show you how enterprises built GraphQL APIs successfully, what challenges they face, and how their architecture influences how they built APIs. In this session, we will start with looking into database-driven GraphQL APIs and end up exploring large-scale enterprise domains, where the size of the organization becomes the challenge.", + "goers": "32", + "video_stream": "https://www.youtube.com/watch?v=45rKrmW7NLA", + "seats": "0", + "invite_only": "N", + "venue": "Skyline A - Level 21", + "company": "Intermediate", + "audience": "Session Presentations", + "id": "106c2abfed7f25a882b98024152b8c48", + "venue_id": "1944311", + "speakers": [ + { + "username": "pascal.senn", + "id": "21066839", + "name": "Pascal Senn", + "company": "ChilliCream", + "custom_order": 0 + } + ], + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "11", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "2:20pm", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "11", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "2:50pm", + "start_date": "2024-09-11", + "start_time": "14:20:00", + "start_time_ts": 1726089600, + "end_date": "2024-09-11", + "end_time": "14:50:00" + }, + { + "event_key": "691729", + "active": "Y", + "pinned": "N", + "name": "The Billion D∅Llar Panel - Nullability in GraphQL - Stephen Spalding, Netflix; Alex Reilly, Independent; Janette Cheng & Jordan Eldredge, Meta; Benjie Gillam, Graphile", + "event_start": "2024-09-11 14:20", + "event_end": "2024-09-11 14:50", + "event_type": "GraphQL Spec", + "description": "Panel discussion on Client Controlled/Semantic Nullability", + "goers": "37", + "video_stream": "https://www.youtube.com/watch?v=CujBv8L6tVQ", + "seats": "0", + "invite_only": "N", + "venue": "Metropolitan A", + "company": "Intermediate", + "audience": "Session Presentations", + "id": "c12a426b75f4851c04a7e16e54135887", + "venue_id": "1944305", + "speakers": [ + { + "username": "alex_reilly.7ldur4l", + "id": "14900019", + "name": "Alex Reilly", + "company": "Independent", + "custom_order": 0 + }, + { + "username": "sspalding2", + "id": "18743825", + "name": "Stephen Spalding", + "company": "Netflix", + "custom_order": 1 + }, + { + "username": "benjie3", + "id": "18743846", + "name": "Benjie Gillam", + "company": "Graphile", + "custom_order": 2 + }, + { + "username": "janette.cheng", + "id": "21066816", + "name": "Janette Cheng", + "company": "Meta", + "custom_order": 3 + }, + { + "username": "jordaneldredge", + "id": "21066819", + "name": "Jordan Eldredge", + "company": "Meta", + "custom_order": 4 + } + ], + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "11", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "2:20pm", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "11", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "2:50pm", + "start_date": "2024-09-11", + "start_time": "14:20:00", + "start_time_ts": 1726089600, + "end_date": "2024-09-11", + "end_time": "14:50:00" + }, + { + "event_key": "699192", + "active": "Y", + "pinned": "N", + "name": "GraphQL as a Data Mesh Access Layer in Global Banking - Kenneth Stott, Hasura, Inc.", + "event_start": "2024-09-11 15:00", + "event_end": "2024-09-11 15:30", + "event_type": "API Platform", + "description": "Discuss the strengths and weaknesses of the GraphQL standard and tooling ecosystem while implementing GraphQL as the primary Data Mesh/Data Access Layer in a Mega-Bank. Review the regulatory challenges, the history of data management and data governance at international financial institutions, its influence on data engineering and data solutions, and how GraphQL stacks up as an API Platform in a highly federated, highly regulated, polyglot data mesh architecture.", + "goers": "12", + "video_stream": "https://www.youtube.com/watch?v=kLUbcEABH0s", + "seats": "0", + "invite_only": "N", + "venue": "Skyline B-C - Level 21", + "company": "Advanced", + "audience": "Session Presentations", + "id": "26843420d633586e4b750ae4fe01e174", + "venue_id": "1944314", + "speakers": [ + { + "username": "kennethstott", + "id": "21066821", + "name": "Kenneth Stott", + "company": "Hasura, Inc.", + "custom_order": 0 + } + ], + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "11", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "3:00pm", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "11", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "3:30pm", + "start_date": "2024-09-11", + "start_time": "15:00:00", + "start_time_ts": 1726092000, + "end_date": "2024-09-11", + "end_time": "15:30:00" + }, + { + "event_key": "697133", + "active": "Y", + "pinned": "N", + "name": "Design Principles of Federated GraphQL - Martijn Walraven, Apollo", + "event_start": "2024-09-11 15:00", + "event_end": "2024-09-11 15:30", + "event_type": "Federation and Composite Schemas", + "description": "GraphQL was conceived as a unified access layer that empowers product teams by providing a common language for exposing and consuming data capabilities. These capabilities were typically implemented in a single schema through a resolver-based model. That poses challenges in environments with diverse microservices managed by various teams however, as found in most large organizations. Recognizing these challenges, we introduced Apollo Federation in 2019 to deliver on the promise of GraphQL within those environments. It respects existing service and team boundaries through a principled schema composition model that supports team collaboration and efficient, query plan-based execution across services. This has allowed GraphQL APIs to effectively scale to large numbers of services and teams. Given the success and common challenges observed, a working group comprising engineers from various organizations has been formed to establish a proposed open standard for federated GraphQL. This initiative aims to unify best practices and design principles. This talk will highlight the key discussions from this group and their implications for the evolving standard.", + "goers": "52", + "video_stream": "https://www.youtube.com/watch?v=eb8EoGGZCjY", + "seats": "0", + "invite_only": "N", + "venue": "Metropolitan B-C", + "company": "Any", + "audience": "Session Presentations", + "id": "e24b8d54971024a028352f5f35930575", + "venue_id": "1944308", + "speakers": [ + { + "username": "martijn.walraven", + "id": "21066825", + "name": "Martijn Walraven", + "company": "Apollo", + "custom_order": 0 + } + ], + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "11", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "3:00pm", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "11", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "3:30pm", + "start_date": "2024-09-11", + "start_time": "15:00:00", + "start_time_ts": 1726092000, + "end_date": "2024-09-11", + "end_time": "15:30:00" + }, + { + "event_key": "690785", + "active": "Y", + "pinned": "N", + "name": "UNSET Fields: Differentiating Between Null and Purposeful Omissions in Your Server Response - Janette Cheng, Meta", + "event_start": "2024-09-11 15:00", + "event_end": "2024-09-11 15:10", + "event_type": "GraphQL in Production", + "description": "You've heard about distinguishing semantic vs error nulls, but what about \"unset\" fields? Unset fields are neither semantic or error nulls because the server has not calculated them. Why would something like this ever come up? - WhatsApp delta updates: When the client wants to tell the server, \"This is the value I have for this field, only bother calculating it again and sending it down if it's out of date.\" - Instagram server migration from a non-GraphQL server: We started with a server that has multiple code paths to resolve a field, and now we are not guaranteed every field we request will always be resolved. Not being able to distinguish between null and unset is a problem we expect is more widespread, and to which we have found a not amazing solution that could be better if we update the spec. How do you distinguish \"unset\" from null? - How you achieve this today (not particularly elegant, but possible) - Omission from server response? (not currently spec-compliant)", + "goers": "29", + "video_stream": "https://www.youtube.com/watch?v=90dc_NelaA0", + "seats": "0", + "invite_only": "N", + "venue": "Metropolitan A", + "company": "Intermediate", + "audience": "Lightning Talks", + "id": "2f6808aabe48239c0cccb9db43626aac", + "venue_id": "1944305", + "speakers": [ + { + "username": "janette.cheng", + "id": "21066816", + "name": "Janette Cheng", + "company": "Meta", + "custom_order": 0 + } + ], + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "11", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "3:00pm", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "11", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "3:10pm", + "start_date": "2024-09-11", + "start_time": "15:00:00", + "start_time_ts": 1726092000, + "end_date": "2024-09-11", + "end_time": "15:10:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf2024/19/Unset%20Fields%20(GraphQL%20Conf'24).pdf", + "name": "Unset Fields (GraphQL Conf '24).pdf" + } + ] + }, + { + "event_key": "706595", + "active": "Y", + "pinned": "N", + "name": "What if ... How to Achieve GraphQL Domination - Andreas Marek, Atlassian", + "event_start": "2024-09-11 15:00", + "event_end": "2024-09-11 15:30", + "event_type": "GraphQL Spec", + "description": "Imaging being free of constraints like time, resources and previous decisions: how could we make the perfect version of GraphQL and achieve ubiquitous GraphQL usage. In this talk we will look at all the things we could do (in theory): - Combine Relay and GraphQL - Simpler Errors - HTTP as first class citizen - No custom or maybe more custom Scalars - GraphQL linter - Dynamic GraphQL schemas", + "goers": "17", + "video_stream": "https://www.youtube.com/watch?v=vb4T51DO3Z4", + "seats": "0", + "invite_only": "N", + "venue": "Skyline A - Level 21", + "company": "Beginner", + "audience": "Session Presentations", + "id": "74697b2144c044a7a134bc7e04e190d1", + "venue_id": "1944311", + "speakers": [ + { + "username": "andreas.marek1", + "id": "21066795", + "name": "Andreas Marek", + "company": "Atlassian", + "custom_order": 0 + } + ], + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "11", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "3:00pm", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "11", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "3:30pm", + "start_date": "2024-09-11", + "start_time": "15:00:00", + "start_time_ts": 1726092000, + "end_date": "2024-09-11", + "end_time": "15:30:00" + }, + { + "event_key": "695423", + "active": "Y", + "pinned": "N", + "name": "Not Your Regular Rate Limiting #GraphQL - Pooja Mistry, Postman", + "event_start": "2024-09-11 15:10", + "event_end": "2024-09-11 15:20", + "event_type": "GraphQL in Production", + "description": "REST APIs are typically endpoint-based, meaning each endpoint has its rate limit, while GraphQL APIs tend to be more flexible and allow for a single endpoint to handle multiple requests. Although more flexible, rate limiting in GraphQL APIs is more complex than rate limiting in REST APIs. This talk discusses popular rate-limiting strategies and helps you choose the strategy that best fits your application's use case and requirements.", + "goers": "34", + "video_stream": "https://www.youtube.com/watch?v=w7ubbGmadso", + "seats": "0", + "invite_only": "N", + "venue": "Metropolitan A", + "company": "Intermediate", + "audience": "Lightning Talks", + "id": "6fd1c120b48d6c62c4544ccbf27a665a", + "venue_id": "1944305", + "speakers": [ + { + "username": "pooja.mistry1", + "id": "21225462", + "name": "Pooja Mistry", + "custom_order": 0 + } + ], + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "11", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "3:10pm", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "11", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "3:20pm", + "start_date": "2024-09-11", + "start_time": "15:10:00", + "start_time_ts": 1726092600, + "end_date": "2024-09-11", + "end_time": "15:20:00" + }, + { + "event_key": "692297", + "active": "Y", + "pinned": "N", + "name": "GraphQL Subscriptions in Production Is Easy, Isn’t It? - Laurin Quast, The Guild", + "event_start": "2024-09-11 15:20", + "event_end": "2024-09-11 15:30", + "event_type": "GraphQL in Production", + "description": "GraphQL Subscriptions can super-charge any application but add layers of complexity. Let's delve into the practical aspects of moving GraphQL Subscriptions from localhost into a production environment! Learn about MesageQueues, PubSub, WebSockets, Server-Sent Events, TCP connection limits, authentication, Browser Windows, and (shared) web workers!", + "goers": "37", + "video_stream": "https://www.youtube.com/watch?v=r4ryfiBfDIQ", + "seats": "0", + "invite_only": "N", + "venue": "Metropolitan A", + "company": "Intermediate", + "audience": "Lightning Talks", + "id": "5cabf2af855ce1e45161cd36903d41c0", + "venue_id": "1944305", + "speakers": [ + { + "username": "laurinquast", + "id": "18743819", + "name": "Laurin Quast", + "company": "The Guild", + "custom_order": 0 + } + ], + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "11", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "3:20pm", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "11", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "3:30pm", + "start_date": "2024-09-11", + "start_time": "15:20:00", + "start_time_ts": 1726093200, + "end_date": "2024-09-11", + "end_time": "15:30:00" + }, + { + "event_key": "10", + "active": "Y", + "pinned": "N", + "name": "Coffee Break", + "event_start": "2024-09-11 15:30", + "event_end": "2024-09-11 15:50", + "event_type": "Breaks & Special Events", + "goers": "34", + "seats": "0", + "invite_only": "N", + "venue": "Level 2 Foyer", + "id": "7c1eba2165f24ed45492801796cbe453", + "venue_id": "1944317", + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "11", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "3:30pm", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "11", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "3:50pm", + "start_date": "2024-09-11", + "start_time": "15:30:00", + "start_time_ts": 1726093800, + "end_date": "2024-09-11", + "end_time": "15:50:00", + "description": "" + }, + { + "event_key": "699163", + "active": "Y", + "pinned": "N", + "name": "Panel: The Composite Schemas Working Group - Kamil Kisiela, The Guild; Pascal Senn, ChilliCream; Martijn Walraven, Apollo; Moderated by Danielle Man, Apollo GraphQL", + "event_start": "2024-09-11 15:50", + "event_end": "2024-09-11 16:20", + "event_type": "Federation and Composite Schemas", + "description": "Join panelists from Apollo, ChilliCream, and The Guild for a conversation about the newest working group in the GraphQL community. Gartner reports that by 2027, production use of federated GraphQL in enterprise systems will grow sixfold. The Composite Schemas specification is the proposed open standard that will ensure this essential technology can be fully leveraged by a robust tooling ecosystem. Hear insights and stories from the engineers and innovators who are collaborating to bring this specification to the community.", + "goers": "40", + "video_stream": "https://www.youtube.com/watch?v=sf8ac2NtwPY", + "seats": "0", + "invite_only": "N", + "venue": "Metropolitan B-C", + "company": "Intermediate", + "audience": "Session Presentations", + "id": "75386a4288d49dcb4aba5b54e475de43", + "venue_id": "1944308", + "speakers": [ + { + "username": "kamilkisiela", + "id": "19082388", + "name": "Kamil Kisiela", + "company": "The Guild", + "custom_order": 0 + }, + { + "username": "danielle.man", + "id": "21066810", + "name": "Danielle Man", + "company": "Apollo GraphQL", + "custom_order": 1 + }, + { + "username": "martijn.walraven", + "id": "21066825", + "name": "Martijn Walraven", + "company": "Apollo", + "custom_order": 2 + }, + { + "username": "pascal.senn", + "id": "21066839", + "name": "Pascal Senn", + "company": "ChilliCream", + "custom_order": 3 + } + ], + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "11", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "3:50pm", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "11", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "4:20pm", + "start_date": "2024-09-11", + "start_time": "15:50:00", + "start_time_ts": 1726095000, + "end_date": "2024-09-11", + "end_time": "16:20:00" + }, + { + "event_key": "699597", + "active": "Y", + "pinned": "N", + "name": "Evolving GraphQL Schemas - Andrei Bocan, Atlassian", + "event_start": "2024-09-11 15:50", + "event_end": "2024-09-11 16:20", + "event_type": "GraphQL in Production", + "description": "The complicated bit when running a GraphQL service isn't putting together the initial schema, it's making sure to leave room for your schema to evolve, and ensuring that you're not painting yourself into a corner. In this session, we'll go through some lessons learned while developing Compass, a product we built from the ground up using GraphQL. We'll lay out some of the guidelines we've established to keep our APIs consistent, some hard and fast rules for backwards compatibility, as well as the processes we put in place to make it easy to keep things aligned. We'll also dive into how we've that all fits in with out GraphQL Gateway, which exposes a federated schema across the plethora of services that Atlassian runs, and the functionality we've isolated to the gateway.", + "goers": "35", + "video_stream": "https://www.youtube.com/watch?v=pVNODy8fDTM", + "seats": "0", + "invite_only": "N", + "venue": "Metropolitan A", + "company": "Intermediate", + "audience": "Session Presentations", + "id": "167640984a909380aa61898c90625166", + "venue_id": "1944305", + "speakers": [ + { + "username": "andrei.bocan", + "id": "21066797", + "name": "Andrei Bocan", + "company": "Atlassian", + "custom_order": 0 + } + ], + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "11", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "3:50pm", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "11", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "4:20pm", + "start_date": "2024-09-11", + "start_time": "15:50:00", + "start_time_ts": 1726095000, + "end_date": "2024-09-11", + "end_time": "16:20:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf2024/af/GraphqlConf%202023.pdf", + "name": "GraphqlConf 2023.pdf" + } + ] + }, + { + "event_key": "692275", + "active": "Y", + "pinned": "N", + "name": "Comparing API Protocols - One Feature at a Time - Uri Goldshtein, The Guild", + "event_start": "2024-09-11 15:50", + "event_end": "2024-09-11 16:20", + "event_type": "GraphQL Spec", + "description": "We've seen so many comparisons between GraphQL, REST, OpenAPI, gRPC and others Usually most of these articles looks very much the same. I want to try to give a different take on the differences. I will make a list of every feature you want from an API and show how to get it in each API protocol. I think the result would be surprising, even for experts in each of the protocols.", + "goers": "18", + "video_stream": "https://www.youtube.com/watch?v=V4CJR_vkELo", + "seats": "0", + "invite_only": "N", + "venue": "Skyline A - Level 21", + "company": "Intermediate", + "audience": "Session Presentations", + "id": "303433f67a7ffc5e3d31a6edfd8b1f28", + "venue_id": "1944311", + "speakers": [ + { + "username": "uri_goldshtein.23xujj9a", + "id": "14900013", + "name": "Uri Goldshtein", + "company": "The Guild", + "custom_order": 0 + } + ], + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "11", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "3:50pm", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "11", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "4:20pm", + "start_date": "2024-09-11", + "start_time": "15:50:00", + "start_time_ts": 1726095000, + "end_date": "2024-09-11", + "end_time": "16:20:00" + }, + { + "event_key": "706610", + "active": "Y", + "pinned": "N", + "name": "CANCELLED: Rethinking GraphQL Batching - Michael Staib, ChilliCream", + "event_start": "2024-09-11 16:30", + "event_end": "2024-09-11 17:00", + "event_type": "Backend", + "description": "While working on the GraphQL composite schema specification, we have explored GraphQL batching and have come up with a variety of new approaches to tackle it. In this talk, I will walk you through why batching is still needed in GraphQL and what problems it solves today. We will also explore some wild experiments with GraphQL batching prototypes that can form business flows to aggregate data, mutate it, and subscribe to updates of the flow with subscriptions. This talk is full of experiments that are to be further explored. So, join me!", + "goers": "23", + "seats": "0", + "invite_only": "N", + "venue": "Skyline A - Level 21", + "company": "Advanced", + "audience": "Session Presentations", + "id": "9485641416d5be1d5846b846ee2c7666", + "venue_id": "1944311", + "speakers": [ + { + "username": "michael_staib.23xujj9p", + "id": "14900031", + "name": "Michael Staib", + "company": "ChilliCream", + "custom_order": 0 + } + ], + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "11", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "4:30pm", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "11", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "5:00pm", + "start_date": "2024-09-11", + "start_time": "16:30:00", + "start_time_ts": 1726097400, + "end_date": "2024-09-11", + "end_time": "17:00:00" + }, + { + "event_key": "697477", + "active": "Y", + "pinned": "N", + "name": "Performing Impossible Feats with Isograph - Robert Balicki, Pinterest", + "event_start": "2024-09-11 16:30", + "event_end": "2024-09-11 17:00", + "event_type": "GraphQL Clients", + "description": "Today's web developers are asked to do the impossible. Fetch just the data needed for a given page, no more and no less, while avoiding network waterfalls. Splitting network requests so that users can see high priority content faster, without fetching the same field twice. Loading the minimal JavaScript. Ensuring that their apps show the latest data, without excessively re-rendering. Ensuring content is garbage collected, but not disposing of resources still in use. Yeesh!\n\nAnd all the while, they're asked to maintain this performance profile while other developers make changes willy nilly.\n\nSounds impossible, and it is! With other frameworks, that is.\n\nFind out how Isograph makes all of this easy — and more!\n\nIsograph is a framework for building React apps powered by GraphQL data. See https://isograph.dev for more!", + "goers": "26", + "video_stream": "https://www.youtube.com/watch?v=ex8dqeWwt5A", + "seats": "0", + "invite_only": "N", + "venue": "Metropolitan A", + "company": "Any", + "audience": "Session Presentations", + "id": "468947db8b153fca9be52febb43beb6e", + "venue_id": "1944305", + "speakers": [ + { + "username": "robert.balicki", + "id": "18743858", + "name": "Robert Balicki", + "company": "Pinterest", + "custom_order": 0 + } + ], + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "11", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "4:30pm", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "11", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "5:00pm", + "start_date": "2024-09-11", + "start_time": "16:30:00", + "start_time_ts": 1726097400, + "end_date": "2024-09-11", + "end_time": "17:00:00" + }, + { + "event_key": "706598", + "active": "Y", + "pinned": "N", + "name": "Top 10 GraphQL Security Checks for Every Developer - Ankita Gupta, Akto.io", + "event_start": "2024-09-11 16:30", + "event_end": "2024-09-11 17:00", + "event_type": "GraphQL Security", + "description": "Why implement GraphQL security?\nWe will set the stage by introducing some examples of critical GraphQL vulnerabilities found in popular softwares.\n\n- CVE-2021-41248: This vulnerability in GraphiQL, a GraphQL IDE, relates to schema introspection responses that could lead to XSS attacks.\n- CVE-2023-38503: In Directus, a real-time API and dashboard for managing SQL database, there was a vulnerability in GraphQL subscriptions where permission filters were not properly checked, leading to unauthorized event notifications.\n- CVE-2023-34047: A vulnerability in Spring for GraphQL where a batch loader function could be exposed to GraphQL context with security context values from a different session, potentially leading to unauthorized access or information disclosure.\n\nTop 10 GraphQL Security Checks\n- #1 Disable Introspection in Production\n- #2 Robust Authentication\n- #3 Limit Query Depths\n- #4 Rate Limiting\n- #5 Input Validation\n- #6 Secure Direct Object References\n- #7 Error Handling\n- #8 Query Complexity Analysis\n- #9 Mass Assignment Checks\n- #10 Excessive Data Exposure\n\nHow to automate GraphQL Security?\n- we will talk about automating the 10 security checks in code and CI/CD", + "goers": "31", + "video_stream": "https://www.youtube.com/watch?v=b45lWgkVLYA", + "seats": "0", + "invite_only": "N", + "venue": "Metropolitan B-C", + "company": "Intermediate", + "id": "f304b62528988d6e67bb74020d97c885", + "venue_id": "1944308", + "speakers": [ + { + "username": "ankita25", + "id": "21265832", + "name": "Ankita Gupta", + "company": "Akto.io", + "custom_order": 0 + } + ], + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "11", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "4:30pm", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "11", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "5:00pm", + "start_date": "2024-09-11", + "start_time": "16:30:00", + "start_time_ts": 1726097400, + "end_date": "2024-09-11", + "end_time": "17:00:00" + }, + { + "event_key": "706601", + "active": "Y", + "pinned": "N", + "name": "Registration & Badge Pick-up", + "event_start": "2024-09-12 08:00", + "event_end": "2024-09-12 15:00", + "event_type": "Registration & Badge Pick-up", + "goers": "3", + "seats": "0", + "invite_only": "N", + "venue": "Level 2 Foyer", + "id": "370614bdbfb4b73d76ec71db8ce43552", + "venue_id": "1944317", + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "12", + "event_start_weekday": "Thursday", + "event_start_weekday_short": "Thu", + "event_start_time": "8:00am", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "12", + "event_end_weekday": "Thursday", + "event_end_weekday_short": "Thu", + "event_end_time": "3:00pm", + "start_date": "2024-09-12", + "start_time": "08:00:00", + "start_time_ts": 1726153200, + "end_date": "2024-09-12", + "end_time": "15:00:00", + "description": "" + }, + { + "event_key": "706609", + "active": "Y", + "pinned": "N", + "name": "Sponsor Showcase", + "event_start": "2024-09-12 08:00", + "event_end": "2024-09-12 12:30", + "event_type": "Sponsor Showcase", + "description": "Visit the sponsors in the Sponsor Showcase!", + "goers": "11", + "seats": "0", + "invite_only": "N", + "venue": "Level 2 Foyer", + "id": "1e8e7ae6eb935636a20fc2acc70c299d", + "venue_id": "1944317", + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "12", + "event_start_weekday": "Thursday", + "event_start_weekday_short": "Thu", + "event_start_time": "8:00am", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "12", + "event_end_weekday": "Thursday", + "event_end_weekday_short": "Thu", + "event_end_time": "12:30pm", + "start_date": "2024-09-12", + "start_time": "08:00:00", + "start_time_ts": 1726153200, + "end_date": "2024-09-12", + "end_time": "12:30:00" + }, + { + "event_key": "692330", + "active": "Y", + "pinned": "N", + "name": "Workshop: Scaling and Securing API Development with a GraphQL Platform - Laurin Quast & Kamil Kisiela, The Guild", + "event_start": "2024-09-12 09:00", + "event_end": "2024-09-12 10:30", + "event_type": "API Platform", + "description": "Building a GraphQL API as a solo developer handling both the front end and back end in a single Git repository can be straightforward. However, in a real-world scenario, you will need to collaborate with other developers, both within your team and externally. There will be API consumers under your control, as well as those you might not even be aware of. If you use composite schemas (such as Federation), many teams will create their subgraphs to compose a supergraph. How can you safely evolve your schema without breaking clients? How do you prevent attackers from sending vulnerable GraphQL operations to your server? A schema registry can assist you and your team in successfully adopting GraphQL at scale. Discover how to gain analytics on your GraphQL API usage, avoid shipping breaking changes through CI/CD integrations, and prevent unwanted GraphQL operations by leveraging Persisted Documents using the open-source MIT-licensed Hive API platform specially designed for GraphQL.", + "goers": "21", + "video_stream": "https://www.youtube.com/watch?v=ZDECb__f4h4", + "seats": "0", + "invite_only": "N", + "venue": "Metropolitan B-C", + "company": "Beginner", + "audience": "Workshops", + "id": "2f44e6cde4172d716d83bcb02809517f", + "venue_id": "1944308", + "speakers": [ + { + "username": "laurinquast", + "id": "18743819", + "name": "Laurin Quast", + "company": "The Guild", + "custom_order": 0 + }, + { + "username": "kamilkisiela", + "id": "19082388", + "name": "Kamil Kisiela", + "company": "The Guild", + "custom_order": 1 + } + ], + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "12", + "event_start_weekday": "Thursday", + "event_start_weekday_short": "Thu", + "event_start_time": "9:00am", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "12", + "event_end_weekday": "Thursday", + "event_end_weekday_short": "Thu", + "event_end_time": "10:30am", + "start_date": "2024-09-12", + "start_time": "09:00:00", + "start_time_ts": 1726156800, + "end_date": "2024-09-12", + "end_time": "10:30:00" + }, + { + "event_key": "706617", + "active": "Y", + "pinned": "N", + "name": "Open GraphQL Foundation Board Meeting", + "event_start": "2024-09-12 09:00", + "event_end": "2024-09-12 10:30", + "event_type": "Defies Categorization", + "description": "Join GraphQL Foundation Board Members and TSC Members for a public meeting and help provide input on what the Foundation's priorities for 2025 should be.", + "goers": "15", + "video_stream": "https://www.youtube.com/watch?v=4XbzBb_YHw0", + "seats": "0", + "invite_only": "N", + "venue": "Skyline A - Level 21", + "company": "Any", + "id": "35c3bece129c4a61d97b9b104ba12d42", + "venue_id": "1944311", + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "12", + "event_start_weekday": "Thursday", + "event_start_weekday_short": "Thu", + "event_start_time": "9:00am", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "12", + "event_end_weekday": "Thursday", + "event_end_weekday_short": "Thu", + "event_end_time": "10:30am", + "start_date": "2024-09-12", + "start_time": "09:00:00", + "start_time_ts": 1726156800, + "end_date": "2024-09-12", + "end_time": "10:30:00" + }, + { + "event_key": "706616", + "active": "Y", + "pinned": "N", + "name": "Workshop: Demand-Driven Schema Design - Michael Watson, Apollo GraphQL", + "event_start": "2024-09-12 09:00", + "event_end": "2024-09-12 10:30", + "event_type": "Defies Categorization", + "description": "One of the main advantages of GraphQL is that you can query for only the data you need. But in order to realize that promise for graph consumers, the schema needs to be thoughtfully designed to support data access requirements for the client apps that will query it. In this workshop, we’ll explore the process of demand-driven schema design and how a “dream query” can be reverse-engineered into a scalable and maintainable GraphQL schema that supports product use cases.\n\nWhat you’ll learn:\nCommon schema design patterns Build queries to display the data your app needs Best practices for designing client-focused queries Practical tips for schema reviews Federation / composite schemas considerations", + "goers": "17", + "video_stream": "https://www.youtube.com/watch?v=8W9N-I1G80o", + "seats": "0", + "invite_only": "N", + "venue": "Metropolitan A", + "audience": "Workshops", + "id": "a9ad5f1632866787f2ae33020dbe8e77", + "venue_id": "1944305", + "speakers": [ + { + "username": "watson17", + "id": "19024254", + "name": "Michael Watson", + "company": "Apollo GraphQL", + "custom_order": 0 + } + ], + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "12", + "event_start_weekday": "Thursday", + "event_start_weekday_short": "Thu", + "event_start_time": "9:00am", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "12", + "event_end_weekday": "Thursday", + "event_end_weekday_short": "Thu", + "event_end_time": "10:30am", + "start_date": "2024-09-12", + "start_time": "09:00:00", + "start_time_ts": 1726156800, + "end_date": "2024-09-12", + "end_time": "10:30:00" + }, + { + "event_key": "706614", + "active": "Y", + "pinned": "N", + "name": "Workshop: Getting Your Data Ready for AI - With a Unified GraphQL and SQL Endpoint - Anushrut Gupta, Hasura", + "event_start": "2024-09-12 09:00", + "event_end": "2024-09-12 10:30", + "event_type": "Defies Categorization", + "description": "As AI technologies like LLMs innovate at an accelerated pace, the importance of robust data foundations has never been greater. Traditional data architectures, designed with apps and APIs in mind, are now being pushed to their limits by the demands of advanced AI applications. This workshop will delve into principles for getting your data ready for AI. One of the main principles is having all your data and business logic under one interface - we will see how to build this using GraphQL (or SQL). We will also see how to incorporate consistent authorization so that your LLM doesn't have to worry about security. Finally, we will plumb all of this together to create a fundamentally powerful data connectivity for your AI applications.\n\nTo get the most out of this workshop, bring an Anthropic account with some credits and an Anthropic API key. You can also use OpenAI, but Anthropic is preferred.", + "goers": "7", + "video_stream": "https://www.youtube.com/watch?v=andRX3esq9s", + "seats": "0", + "invite_only": "N", + "venue": "Skyline B-C - Level 21", + "audience": "Workshops", + "id": "fbc64b2c5b6403612b8ea6c2ed4cbc04", + "venue_id": "1944314", + "speakers": [ + { + "username": "anushrut.gupta", + "id": "21460012", + "name": "Anushrut Gupta", + "company": "Hasura", + "custom_order": 0 + } + ], + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "12", + "event_start_weekday": "Thursday", + "event_start_weekday_short": "Thu", + "event_start_time": "9:00am", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "12", + "event_end_weekday": "Thursday", + "event_end_weekday_short": "Thu", + "event_end_time": "10:30am", + "start_date": "2024-09-12", + "start_time": "09:00:00", + "start_time_ts": 1726156800, + "end_date": "2024-09-12", + "end_time": "10:30:00" + }, + { + "event_key": "6", + "active": "Y", + "pinned": "N", + "name": "Coffee Break", + "event_start": "2024-09-12 10:30", + "event_end": "2024-09-12 11:00", + "event_type": "Breaks & Special Events", + "goers": "24", + "seats": "0", + "invite_only": "N", + "venue": "Level 2 Foyer", + "id": "487b5eb466c6367896d32d0006ddad8a", + "venue_id": "1944317", + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "12", + "event_start_weekday": "Thursday", + "event_start_weekday_short": "Thu", + "event_start_time": "10:30am", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "12", + "event_end_weekday": "Thursday", + "event_end_weekday_short": "Thu", + "event_end_time": "11:00am", + "start_date": "2024-09-12", + "start_time": "10:30:00", + "start_time_ts": 1726162200, + "end_date": "2024-09-12", + "end_time": "11:00:00", + "description": "" + }, + { + "event_key": "694498", + "active": "Y", + "pinned": "N", + "name": "Workshop: Efficient Cross-Platform GraphQL and State Management with React Native - Yassin Eldeeb, The Guild", + "event_start": "2024-09-12 11:00", + "event_end": "2024-09-12 12:30", + "event_type": "GraphQL Clients", + "description": "In this hands-on workshop, we’ll explore building cross-platform applications with GraphQL and React Native. Learn how to create an efficient data management setup that works seamlessly across Windows, iOS, Android, and web platforms. Key takeaways include: - Setting up a GraphQL client in React Native - Managing local and remote state by combining Easy Peasy and React Query - Leveraging offline support, caching, and background fetching - Optimizing performance for mobile applications By the end, you’ll understand how to harness GraphQL to build robust and user-friendly cross-platform apps that are easy to develop and maintain.", + "goers": "21", + "video_stream": "https://www.youtube.com/watch?v=O4I2BhHgYq8", + "seats": "0", + "invite_only": "N", + "venue": "Skyline B-C - Level 21", + "company": "Advanced", + "audience": "Workshops", + "id": "914fd37e2c0bd49ce423fb1cbc326ec8", + "venue_id": "1944314", + "speakers": [ + { + "username": "yassineldeeb94", + "id": "18743822", + "name": "Yassin Eldeeb", + "company": "The Guild", + "custom_order": 0 + } + ], + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "12", + "event_start_weekday": "Thursday", + "event_start_weekday_short": "Thu", + "event_start_time": "11:00am", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "12", + "event_end_weekday": "Thursday", + "event_end_weekday_short": "Thu", + "event_end_time": "12:30pm", + "start_date": "2024-09-12", + "start_time": "11:00:00", + "start_time_ts": 1726164000, + "end_date": "2024-09-12", + "end_time": "12:30:00" + }, + { + "event_key": "706626", + "active": "Y", + "pinned": "N", + "name": "Unconference Kickoff", + "event_start": "2024-09-12 11:00", + "event_end": "2024-09-12 11:15", + "event_type": "Unconference", + "description": "Review of the topics and room schedules for the unconference.", + "goers": "15", + "seats": "0", + "invite_only": "N", + "venue": "Metropolitan A", + "id": "e25c07f23d7396a8120cc0155015f694", + "venue_id": "1944305", + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "12", + "event_start_weekday": "Thursday", + "event_start_weekday_short": "Thu", + "event_start_time": "11:00am", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "12", + "event_end_weekday": "Thursday", + "event_end_weekday_short": "Thu", + "event_end_time": "11:15am", + "start_date": "2024-09-12", + "start_time": "11:00:00", + "start_time_ts": 1726164000, + "end_date": "2024-09-12", + "end_time": "11:15:00" + }, + { + "event_key": "706629", + "active": "Y", + "pinned": "N", + "name": "Unconference Discussions", + "event_start": "2024-09-12 11:15", + "event_end": "2024-09-12 12:30", + "event_type": "Unconference", + "goers": "4", + "seats": "0", + "invite_only": "N", + "venue": "Metropolitan A", + "id": "aec7fe29f8660d0e0180b54af5d9bd3b", + "venue_id": "1944305", + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "12", + "event_start_weekday": "Thursday", + "event_start_weekday_short": "Thu", + "event_start_time": "11:15am", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "12", + "event_end_weekday": "Thursday", + "event_end_weekday_short": "Thu", + "event_end_time": "12:30pm", + "start_date": "2024-09-12", + "start_time": "11:15:00", + "start_time_ts": 1726164900, + "end_date": "2024-09-12", + "end_time": "12:30:00", + "description": "" + }, + { + "event_key": "706627", + "active": "Y", + "pinned": "N", + "name": "Unconference: Lightning Talks", + "event_start": "2024-09-12 11:15", + "event_end": "2024-09-12 12:30", + "event_type": "Unconference", + "description": "Sign up for a lightening talk slot at the GraphQL Foundation Booth in the Sponsor Showcase!", + "goers": "8", + "seats": "0", + "invite_only": "N", + "venue": "Metropolitan B-C", + "id": "e48103dc4df8d88bf37b967a0b22d357", + "venue_id": "1944308", + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "12", + "event_start_weekday": "Thursday", + "event_start_weekday_short": "Thu", + "event_start_time": "11:15am", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "12", + "event_end_weekday": "Thursday", + "event_end_weekday_short": "Thu", + "event_end_time": "12:30pm", + "start_date": "2024-09-12", + "start_time": "11:15:00", + "start_time_ts": 1726164900, + "end_date": "2024-09-12", + "end_time": "12:30:00" + }, + { + "event_key": "706628", + "active": "Y", + "pinned": "N", + "name": "Unconference: TSC Office Hours", + "event_start": "2024-09-12 11:15", + "event_end": "2024-09-12 12:30", + "event_type": "Unconference", + "description": "Have a question about GraphQL? Want to talk to a TSC Member about an RFC? Have an idea for the Working Group? Share it with the GraphQL TSC!", + "goers": "6", + "seats": "0", + "invite_only": "N", + "venue": "Skyline A - Level 21", + "id": "ba56d08028cb125d8c549e7b4b4d198b", + "venue_id": "1944311", + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "12", + "event_start_weekday": "Thursday", + "event_start_weekday_short": "Thu", + "event_start_time": "11:15am", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "12", + "event_end_weekday": "Thursday", + "event_end_weekday_short": "Thu", + "event_end_time": "12:30pm", + "start_date": "2024-09-12", + "start_time": "11:15:00", + "start_time_ts": 1726164900, + "end_date": "2024-09-12", + "end_time": "12:30:00" + }, + { + "event_key": "7", + "active": "Y", + "pinned": "N", + "name": "Lunch Break - Attendees on Own", + "event_start": "2024-09-12 12:30", + "event_end": "2024-09-12 14:00", + "event_type": "Breaks & Special Events", + "description": "Lunch will be on your own. San Francisco offers a variety of dining options nearby to suit different tastes and preferences. Feel free to explore the local area and enjoy your meal. We’ll reconvene at 1:30 PM for the next session.", + "goers": "18", + "seats": "0", + "invite_only": "N", + "venue": "Attendees On Own", + "id": "c291c64196e84d0862ded0b8ef31968a", + "venue_id": "1979819", + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "12", + "event_start_weekday": "Thursday", + "event_start_weekday_short": "Thu", + "event_start_time": "12:30pm", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "12", + "event_end_weekday": "Thursday", + "event_end_weekday_short": "Thu", + "event_end_time": "2:00pm", + "start_date": "2024-09-12", + "start_time": "12:30:00", + "start_time_ts": 1726169400, + "end_date": "2024-09-12", + "end_time": "14:00:00" + }, + { + "event_key": "1", + "active": "Y", + "pinned": "N", + "name": "Unconference Discussions", + "event_start": "2024-09-12 14:00", + "event_end": "2024-09-12 15:30", + "event_type": "Unconference", + "goers": "4", + "seats": "0", + "invite_only": "N", + "venue": "Metropolitan A", + "id": "4bd0c22887a042cfffec9428d7fc9689", + "venue_id": "1944305", + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "12", + "event_start_weekday": "Thursday", + "event_start_weekday_short": "Thu", + "event_start_time": "2:00pm", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "12", + "event_end_weekday": "Thursday", + "event_end_weekday_short": "Thu", + "event_end_time": "3:30pm", + "start_date": "2024-09-12", + "start_time": "14:00:00", + "start_time_ts": 1726174800, + "end_date": "2024-09-12", + "end_time": "15:30:00", + "description": "" + }, + { + "event_key": "4", + "active": "Y", + "pinned": "N", + "name": "Unconference: GraphQL Working Group Topics", + "event_start": "2024-09-12 14:00", + "event_end": "2024-09-12 15:30", + "event_type": "Unconference", + "goers": "6", + "seats": "0", + "invite_only": "N", + "venue": "Metropolitan B-C", + "id": "52854704c6ab04364b24f2bda3991034", + "venue_id": "1944308", + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "12", + "event_start_weekday": "Thursday", + "event_start_weekday_short": "Thu", + "event_start_time": "2:00pm", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "12", + "event_end_weekday": "Thursday", + "event_end_weekday_short": "Thu", + "event_end_time": "3:30pm", + "start_date": "2024-09-12", + "start_time": "14:00:00", + "start_time_ts": 1726174800, + "end_date": "2024-09-12", + "end_time": "15:30:00", + "description": "" + }, + { + "event_key": "3", + "active": "Y", + "pinned": "N", + "name": "Unconference: GraphQL Working Group Topics", + "event_start": "2024-09-12 14:00", + "event_end": "2024-09-12 15:30", + "event_type": "Unconference", + "goers": "6", + "seats": "0", + "invite_only": "N", + "venue": "Skyline B-C - Level 21", + "id": "e456ed2987a18a88a3f6662842d17921", + "venue_id": "1944314", + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "12", + "event_start_weekday": "Thursday", + "event_start_weekday_short": "Thu", + "event_start_time": "2:00pm", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "12", + "event_end_weekday": "Thursday", + "event_end_weekday_short": "Thu", + "event_end_time": "3:30pm", + "start_date": "2024-09-12", + "start_time": "14:00:00", + "start_time_ts": 1726174800, + "end_date": "2024-09-12", + "end_time": "15:30:00", + "description": "" + }, + { + "event_key": "2", + "active": "Y", + "pinned": "N", + "name": "Unconference: Show & Tell", + "event_start": "2024-09-12 14:00", + "event_end": "2024-09-12 15:30", + "event_type": "Unconference", + "description": "Sign up at the GraphQL Foundation Booth in the Sponsor showcase!", + "goers": "3", + "seats": "0", + "invite_only": "N", + "venue": "Skyline A - Level 21", + "id": "d834fa1289d62ca14c1d5f67013c6337", + "venue_id": "1944311", + "event_start_year": "2024", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "12", + "event_start_weekday": "Thursday", + "event_start_weekday_short": "Thu", + "event_start_time": "2:00pm", + "event_end_year": "2024", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "12", + "event_end_weekday": "Thursday", + "event_end_weekday_short": "Thu", + "event_end_time": "3:30pm", + "start_date": "2024-09-12", + "start_time": "14:00:00", + "start_time_ts": 1726174800, + "end_date": "2024-09-12", + "end_time": "15:30:00" + } +] diff --git a/scripts/sync-sched/schedule-2025.json b/scripts/sync-sched/schedule-2025.json new file mode 100644 index 0000000000..dd3ec2e4a2 --- /dev/null +++ b/scripts/sync-sched/schedule-2025.json @@ -0,0 +1,4859 @@ +[ + { + "event_key": "929646", + "active": "Y", + "pinned": "N", + "name": "Canal Cruise - Separate Registration Required by 3 September", + "event_start": "2025-09-07 16:00", + "event_end": "2025-09-07 17:00", + "event_type": "Breaks / Networking / Special Events", + "description": "GraphQLConf Canal Cruise - Separate Registration Required\n\nJoin us on Sunday 7 September for this pre GraphQLConf'25 event, a must-do activity in Amsterdam; a wonderful canal cruise in the historical city centre of Amsterdam.\n\nInitiative by the local Amsterdam GraphQL Meetup group.\n\nA great opportunity to meet your peer-attendees of the GraphQLConf'25 during this great sight-seeing activity.\n\nPlease RSVP by Wednesday September 3rd!\n\nLocation: in the city centre (tba exact location)\nDuration of the canal cruise: 16:00-17:00 on Sunday 7 September\nPlease be 15:45 at the location (to buy the ticket etc).\n\nCost per person: 10-15 euro* (depending on the number of attendees)\n*not included in the conference ticket", + "goers": "4", + "seats": "0", + "invite_only": "N", + "id": "04a893e9dfa070fae1dfa767608ad0c0", + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "7", + "event_start_weekday": "Sunday", + "event_start_weekday_short": "Sun", + "event_start_time": "16:00", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "7", + "event_end_weekday": "Sunday", + "event_end_weekday_short": "Sun", + "event_end_time": "17:00", + "start_date": "2025-09-07", + "start_time": "16:00:00", + "start_time_ts": 1757253600, + "end_date": "2025-09-07", + "end_time": "17:00:00", + "event_subtype": "" + }, + { + "event_key": "929642", + "active": "Y", + "pinned": "N", + "name": "Cloakroom", + "event_start": "2025-09-08 08:00", + "event_end": "2025-09-08 19:15", + "event_type": "Breaks / Networking / Special Events", + "description": "SECURITY NOTICE\nPlease keep all personal belongings in your possession during the conference. GraphQL, The Linux Foundation nor the Pakhuis de Zwijger are responsible for lost or stolen items. If something is misplaced, check in with an Event Staff member at the registration desk.", + "goers": "4", + "seats": "0", + "invite_only": "N", + "venue": "K Floor - Underground Floor", + "id": "1431b61d59a47bd0eb505916e30a5bfa", + "venue_id": "2191087", + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "8", + "event_start_weekday": "Monday", + "event_start_weekday_short": "Mon", + "event_start_time": "08:00", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "8", + "event_end_weekday": "Monday", + "event_end_weekday_short": "Mon", + "event_end_time": "19:15", + "start_date": "2025-09-08", + "start_time": "08:00:00", + "start_time_ts": 1757311200, + "end_date": "2025-09-08", + "end_time": "19:15:00", + "event_subtype": "" + }, + { + "event_key": "1", + "active": "Y", + "pinned": "N", + "name": "Registration + Badge Pick-up", + "event_start": "2025-09-08 08:00", + "event_end": "2025-09-08 18:30", + "event_type": "Registration + Badge Pick-up", + "goers": "15", + "seats": "0", + "invite_only": "N", + "venue": "BG Foyer - Ground Floor", + "id": "aa6a893426a3d92bcbc4b140abeb56c6", + "venue_id": "2152797", + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "8", + "event_start_weekday": "Monday", + "event_start_weekday_short": "Mon", + "event_start_time": "08:00", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "8", + "event_end_weekday": "Monday", + "event_end_weekday_short": "Mon", + "event_end_time": "18:30", + "start_date": "2025-09-08", + "start_time": "08:00:00", + "start_time_ts": 1757311200, + "end_date": "2025-09-08", + "end_time": "18:30:00", + "event_subtype": "", + "description": "" + }, + { + "event_key": "929634", + "active": "Y", + "pinned": "N", + "name": "Keynote: Welcome Remarks - Sarah Sanders, Technical Writer, Docker", + "event_start": "2025-09-08 09:00", + "event_end": "2025-09-08 09:05", + "event_type": "Keynote Sessions", + "goers": "19", + "seats": "0", + "invite_only": "N", + "venue": "Grote Zaal - 2nd Floor", + "audience": "Any", + "id": "0f0bfc4c4d1b1add1df92c8c7a693949", + "venue_id": "2152800", + "speakers": [ + { + "username": "sasanders26", + "id": "21066861", + "name": "Sarah Sanders", + "company": "Docker", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "8", + "event_start_weekday": "Monday", + "event_start_weekday_short": "Mon", + "event_start_time": "09:00", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "8", + "event_end_weekday": "Monday", + "event_end_weekday_short": "Mon", + "event_end_time": "09:05", + "start_date": "2025-09-08", + "start_time": "09:00:00", + "start_time_ts": 1757314800, + "end_date": "2025-09-08", + "end_time": "09:05:00", + "event_subtype": "", + "description": "" + }, + { + "event_key": "929633", + "active": "Y", + "pinned": "N", + "name": "Keynote: Opening Remarks - Lee Byron, Co-Creator of GraphQL & Director, GraphQL Foundation", + "event_start": "2025-09-08 09:05", + "event_end": "2025-09-08 09:15", + "event_type": "Keynote Sessions", + "goers": "19", + "seats": "0", + "invite_only": "N", + "venue": "Grote Zaal - 2nd Floor", + "audience": "Any", + "id": "fe829e6aab214193a809c31e4b0c832a", + "venue_id": "2152800", + "speakers": [ + { + "username": "lee_byron.25jvpjmb", + "id": "18743534", + "name": "Lee Byron", + "company": "GraphQL Foundation", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "8", + "event_start_weekday": "Monday", + "event_start_weekday_short": "Mon", + "event_start_time": "09:05", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "8", + "event_end_weekday": "Monday", + "event_end_weekday_short": "Mon", + "event_end_time": "09:15", + "start_date": "2025-09-08", + "start_time": "09:05:00", + "start_time_ts": 1757315100, + "end_date": "2025-09-08", + "end_time": "09:15:00", + "event_subtype": "", + "description": "" + }, + { + "event_key": "927784", + "active": "Y", + "pinned": "N", + "name": "Keynote: Community Update 2025: Growing in the Open - Benjie Gillam, Director & Maintainer, Graphile; Jem Gillam, Community Operations, Graphile; Uri Goldshtein, CEO, The Guild", + "event_start": "2025-09-08 09:15", + "event_end": "2025-09-08 09:35", + "event_type": "Keynote Sessions", + "description": "Even ten years in, GraphQL continues to evolve—not just in code, but in connection. This year the Foundation has doubled down on transparency, support, and shared leadership: board minutes are now public, Subject Matter Experts have helped shape the conference agenda, and we'll be launching a new program live on stage! There are also updates on our existing initiatives including community grants and GraphQL Locals.\n\nThis talk is a thank you to the people behind the progress and a celebration of our growing constellation of contributors. It's also an invitation to step forward and get involved—one of the best ways to do that is by joining our new Community Working Group, giving passionate community members a voice in shaping the Foundation's directions and initiatives for the next ten years of GraphQL.", + "goers": "18", + "seats": "0", + "invite_only": "N", + "venue": "Grote Zaal - 2nd Floor", + "audience": "Any", + "id": "f31a60c9bffdbc04ea8fe446bd8d644b", + "venue_id": "2152800", + "speakers": [ + { + "username": "jem28", + "id": "23300543", + "name": "Jem Gillam", + "company": "Graphile", + "custom_order": 0 + }, + { + "username": "uri_goldshtein.23xujj9a", + "id": "14900013", + "name": "Uri Goldshtein", + "company": "The Guild", + "custom_order": 1 + }, + { + "username": "benjie3", + "id": "18743846", + "name": "Benjie Gillam", + "company": "Graphile", + "custom_order": 2 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "8", + "event_start_weekday": "Monday", + "event_start_weekday_short": "Mon", + "event_start_time": "09:15", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "8", + "event_end_weekday": "Monday", + "event_end_weekday_short": "Mon", + "event_end_time": "09:35", + "start_date": "2025-09-08", + "start_time": "09:15:00", + "start_time_ts": 1757315700, + "end_date": "2025-09-08", + "end_time": "09:35:00", + "event_subtype": "" + }, + { + "event_key": "929632", + "active": "Y", + "pinned": "N", + "name": "Keynote: Reimagining Developer Experience for AI-Native Development - Sarah Sanders, Technical Writer, Docker", + "event_start": "2025-09-08 09:35", + "event_end": "2025-09-08 09:45", + "event_type": "Keynote Sessions", + "description": "Meet the new developer journey: Ask AI → Generate code → Iterate → Ship. This fundamental shift in how developers work demands we rethink every touchpoint of our GraphQL APIs. This talk focuses on the developer experience layer—how to design schemas that are self-explanatory, structure documentation so AI gives accurate answers about your API, and build tools that feel like pair programming with a senior engineer.", + "goers": "17", + "seats": "0", + "invite_only": "N", + "venue": "Grote Zaal - 2nd Floor", + "audience": "Any", + "geo_area": "Yes", + "id": "609a4afce7ff09af02230777aa079b8f", + "venue_id": "2152800", + "speakers": [ + { + "username": "sasanders26", + "id": "21066861", + "name": "Sarah Sanders", + "company": "Docker", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "8", + "event_start_weekday": "Monday", + "event_start_weekday_short": "Mon", + "event_start_time": "09:35", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "8", + "event_end_weekday": "Monday", + "event_end_weekday_short": "Mon", + "event_end_time": "09:45", + "start_date": "2025-09-08", + "start_time": "09:35:00", + "start_time_ts": 1757316900, + "end_date": "2025-09-08", + "end_time": "09:45:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf2025/51/Sarah%20Sanders%20Keynote%20GraphQLConf%202025.pptx.pdf", + "name": "Sarah Sanders Keynote GraphQLConf 2025.pptx.pdf" + } + ], + "event_subtype": "" + }, + { + "event_key": "924510", + "active": "Y", + "pinned": "N", + "name": "Keynote: GraphQL at Meta - Jordan Eldredge, Software Engineer, Meta", + "event_start": "2025-09-08 09:50", + "event_end": "2025-09-08 10:00", + "event_type": "Keynote Sessions", + "description": "A peek behind the curtain revealing how GraphQL is used at Meta. We will explore how everything from culture, development process, client and server implementations, schema patterns and conventions, advanced tooling and more work together to allow GraphQL to enable great user and developer experiences at Meta.", + "goers": "18", + "seats": "0", + "invite_only": "N", + "venue": "Grote Zaal - 2nd Floor", + "audience": "Intermediate", + "geo_area": "Yes", + "id": "4eec1d8993f89f5599949ae4fbfa4581", + "venue_id": "2152800", + "speakers": [ + { + "username": "jordaneldredge1", + "id": "21508644", + "name": "Jordan Eldredge", + "company": "Meta", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "8", + "event_start_weekday": "Monday", + "event_start_weekday_short": "Mon", + "event_start_time": "09:50", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "8", + "event_end_weekday": "Monday", + "event_end_weekday_short": "Mon", + "event_end_time": "10:00", + "start_date": "2025-09-08", + "start_time": "09:50:00", + "start_time_ts": 1757317800, + "end_date": "2025-09-08", + "end_time": "10:00:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf2025/6c/GraphQL%20at%20Meta.pptx", + "name": "GraphQL at Meta.pptx" + } + ], + "event_subtype": "" + }, + { + "event_key": "929625", + "active": "Y", + "pinned": "N", + "name": "Keynote: How GraphQL is Redefining API Orchestration for the AI Era - Matt DeBergalis, CEO & Co-Founder, Apollo GraphQL", + "event_start": "2025-09-08 10:05", + "event_end": "2025-09-08 10:15", + "event_type": "Keynote Sessions", + "description": "As developers build with AI agents, we face a challenge: how do we provide these agents with reliable, flexible access to our distributed data? GraphQL's graph-based approach makes it the ideal language for AI. Join Matt DeBergalis, CEO and Co-founder of Apollo GraphQL, to explore how \"thinking in graphs\" fundamentally transforms API orchestration from procedural code to declarative queries – creating the composable data layer that AI-driven applications require.", + "goers": "18", + "seats": "0", + "invite_only": "N", + "venue": "Grote Zaal - 2nd Floor", + "audience": "Any", + "id": "3d0c8511f9632541f3f52a9ea020755d", + "venue_id": "2152800", + "speakers": [ + { + "username": "matt1575", + "id": "7503056", + "name": "Matt DeBergalis", + "company": "Apollo GraphQL", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "8", + "event_start_weekday": "Monday", + "event_start_weekday_short": "Mon", + "event_start_time": "10:05", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "8", + "event_end_weekday": "Monday", + "event_end_weekday_short": "Mon", + "event_end_time": "10:15", + "start_date": "2025-09-08", + "start_time": "10:05:00", + "start_time_ts": 1757318700, + "end_date": "2025-09-08", + "end_time": "10:15:00", + "event_subtype": "" + }, + { + "event_key": "15", + "active": "Y", + "pinned": "N", + "name": "Keynote: Closing Remarks - Sarah Sanders, Technical Writer, Docker", + "event_start": "2025-09-08 10:15", + "event_end": "2025-09-08 10:20", + "event_type": "Keynote Sessions", + "goers": "17", + "seats": "0", + "invite_only": "N", + "venue": "Grote Zaal - 2nd Floor", + "audience": "Any", + "id": "3276a4a0491cb8293b9f5cbe46c68866", + "venue_id": "2152800", + "speakers": [ + { + "username": "sasanders26", + "id": "21066861", + "name": "Sarah Sanders", + "company": "Docker", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "8", + "event_start_weekday": "Monday", + "event_start_weekday_short": "Mon", + "event_start_time": "10:15", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "8", + "event_end_weekday": "Monday", + "event_end_weekday_short": "Mon", + "event_end_time": "10:20", + "start_date": "2025-09-08", + "start_time": "10:15:00", + "start_time_ts": 1757319300, + "end_date": "2025-09-08", + "end_time": "10:20:00", + "event_subtype": "", + "description": "" + }, + { + "event_key": "4", + "active": "Y", + "pinned": "N", + "name": "Break", + "event_start": "2025-09-08 10:20", + "event_end": "2025-09-08 10:45", + "event_type": "Breaks / Networking / Special Events", + "goers": "8", + "seats": "0", + "invite_only": "N", + "venue": "Foyer Grote Zaal - 2nd Floor", + "id": "34f3bff88293c5b2c571cc440aa44141", + "venue_id": "2152803", + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "8", + "event_start_weekday": "Monday", + "event_start_weekday_short": "Mon", + "event_start_time": "10:20", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "8", + "event_end_weekday": "Monday", + "event_end_weekday_short": "Mon", + "event_end_time": "10:45", + "start_date": "2025-09-08", + "start_time": "10:20:00", + "start_time_ts": 1757319600, + "end_date": "2025-09-08", + "end_time": "10:45:00", + "event_subtype": "", + "description": "" + }, + { + "event_key": "929637", + "active": "Y", + "pinned": "N", + "name": "Solutions Showcase", + "event_start": "2025-09-08 10:20", + "event_end": "2025-09-08 18:45", + "event_type": "Solutions Showcase", + "goers": "6", + "seats": "0", + "invite_only": "N", + "venue": "Workspace - 2nd Floor", + "id": "c9b7bbf7fb076e74d2338d8f46da1e14", + "venue_id": "2178053", + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "8", + "event_start_weekday": "Monday", + "event_start_weekday_short": "Mon", + "event_start_time": "10:20", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "8", + "event_end_weekday": "Monday", + "event_end_weekday_short": "Mon", + "event_end_time": "18:45", + "start_date": "2025-09-08", + "start_time": "10:20:00", + "start_time_ts": 1757319600, + "end_date": "2025-09-08", + "end_time": "18:45:00", + "event_subtype": "", + "description": "" + }, + { + "event_key": "929631", + "active": "Y", + "pinned": "N", + "name": "Sponsored Session: Schema Design Patterns: Leveraging Existing REST APIs for Rapid GraphQL Adoption - Michael Watson, Apollo GraphQL", + "event_start": "2025-09-08 10:45", + "event_end": "2025-09-08 11:15", + "event_type": "Developer Experience", + "description": "Even dedicated GraphQL developers face the reality of enterprise environments: multiple REST endpoints requiring complex orchestration and endless fetch requests. In this developer-focused session, we'll explore practical schema design patterns for effectively mapping common REST API shapes into your GraphQL schema.\n\nWe'll dive into real-world examples showing how to transform pagination, filtering, nested resources, and other REST patterns into intuitive GraphQL abstractions. You'll learn proven strategies for maintaining excellent developer experience while rapidly onboarding existing services to your graph.\n\nWhether working with OpenAPI specs or internal API documentation, we'll demonstrate tooling and techniques to accelerate this process dramatically – bringing your REST services into your graph in days, not months. Stop writing endless API orchestration code and start delivering value through GraphQL.", + "goers": "6", + "seats": "0", + "invite_only": "N", + "venue": "Grote Zaal - 2nd Floor", + "audience": "Any", + "geo_area": "Yes", + "id": "9ef7eaa509478085ff75215c2b664f23", + "venue_id": "2152800", + "speakers": [ + { + "username": "watson17", + "id": "19024254", + "name": "Michael Watson", + "company": "Apollo GraphQL", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "8", + "event_start_weekday": "Monday", + "event_start_weekday_short": "Mon", + "event_start_time": "10:45", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "8", + "event_end_weekday": "Monday", + "event_end_weekday_short": "Mon", + "event_end_time": "11:15", + "start_date": "2025-09-08", + "start_time": "10:45:00", + "start_time_ts": 1757321100, + "end_date": "2025-09-08", + "end_time": "11:15:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf2025/87/Schema%20Design%20Patterns-%20Leveraging%20Existing%20REST%20APIs%20for%20Rapid%20GraphQL%20Adoption.pdf", + "name": "Schema Design Patterns- Leveraging Existing REST APIs for Rapid GraphQL Adoption.pdf" + } + ], + "event_subtype": "Backend" + }, + { + "event_key": "929641", + "active": "Y", + "pinned": "N", + "name": "What’s Missing in Your Graph? Using AI to Uncover and Close Gaps - Christian Ernst, Booking.com", + "event_start": "2025-09-08 10:45", + "event_end": "2025-09-08 11:15", + "event_type": "GraphQL in Production", + "description": "At Booking.com, we’re applying AI to uncover data blind spots in our GraphQL schema, specifically gaps between what’s exposed today and what still lives in our legacy Perl systems. As we continue modernizing our frontend architecture, one major challenge is identifying what data is already available, what’s duplicated, and what’s missing entirely from the graph. Using AI, we’ve begun introspecting legacy domains to map their data structures against the schema, surface PII fields for tagging and tracking, and inform where schema design can be improved. In this talk, we’ll share how we’re using AI to support schema modernization at scale, streamline developer experience, and bring more consistency to a graph that continues to grow and change across teams.", + "goers": "6", + "seats": "0", + "invite_only": "N", + "venue": "IJzaal - 5th Floor", + "audience": "Intermediate", + "id": "41cdd30e0b737298834f3a929e2fd241", + "venue_id": "2152806", + "speakers": [ + { + "username": "christian.ernst1", + "id": "21066804", + "name": "Christian Ernst", + "company": "Booking.com", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "8", + "event_start_weekday": "Monday", + "event_start_weekday_short": "Mon", + "event_start_time": "10:45", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "8", + "event_end_weekday": "Monday", + "event_end_weekday_short": "Mon", + "event_end_time": "11:15", + "start_date": "2025-09-08", + "start_time": "10:45:00", + "start_time_ts": 1757321100, + "end_date": "2025-09-08", + "end_time": "11:15:00", + "event_subtype": "Schema evolution" + }, + { + "event_key": "929623", + "active": "Y", + "pinned": "N", + "name": "Imagining GraphQL 2.0: Choices in a Hypothetical Reboot - Kewei Qu & Curtis Li, Meta; Benjie Gillam, Graphile; Martin Bonnin, Apollo", + "event_start": "2025-09-08 10:45", + "event_end": "2025-09-08 11:15", + "event_type": "GraphQL Working Group", + "description": "This discussion embarks on a thought experiment to redesign GraphQL from the ground up. We will explore the choices that might be made if we could start over, free from the constraints of existing implementations.\n\nThe session focuses on key areas where the current GraphQL specification has faced challenges and sparked debate within the community. Discussions will cover:
  • Union Types: Exploring alternative approaches to improve flexibility and usability.
  • Schema-Defined Nullability: Rethinking how nullability is handled to enhance clarity and consistency.
  • Error Handling: Proposing new strategies for more robust and intuitive error management.\n
\nThrough collaborative discussions and interactive exercises, participants will contribute insights and ideas, shaping a theoretical vision of what GraphQL 2.0 could look like. This thought exercise is designed to challenge assumptions and inspire innovative solutions.\n\nThe session will conclude with a focus on the practicalities of evolving GraphQL towards a 2.0 version in the real world, exploring how to address these design challenges while considering migration paths and maintaining backward compatibility.", + "goers": "7", + "seats": "0", + "invite_only": "N", + "venue": "Studio - 5th Floor", + "audience": "Any", + "id": "ad5afe76bbdfd270a14cbee25d11bd40", + "venue_id": "2152809", + "speakers": [ + { + "username": "qkw1221", + "id": "18743864", + "name": "Kewei Qu", + "company": "Meta", + "custom_order": 0 + }, + { + "username": "curtis99877", + "id": "23098729", + "name": "Curtis Li", + "company": "Meta Platforms", + "custom_order": 1 + }, + { + "username": "benjie3", + "id": "18743846", + "name": "Benjie Gillam", + "company": "Graphile", + "custom_order": 2 + }, + { + "username": "martinbonnin42", + "id": "23098783", + "name": "Martin Bonnin", + "company": "Apollo", + "custom_order": 3 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "8", + "event_start_weekday": "Monday", + "event_start_weekday_short": "Mon", + "event_start_time": "10:45", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "8", + "event_end_weekday": "Monday", + "event_end_weekday_short": "Mon", + "event_end_time": "11:15", + "start_date": "2025-09-08", + "start_time": "10:45:00", + "start_time_ts": 1757321100, + "end_date": "2025-09-08", + "end_time": "11:15:00", + "event_subtype": "" + }, + { + "event_key": "925253", + "active": "Y", + "pinned": "N", + "name": "Lightning Talk: Offset Pagination Is Dead! Meet Relative Cursors - Michael Staib, ChilliCream", + "event_start": "2025-09-08 11:25", + "event_end": "2025-09-08 11:35", + "event_type": "Developer Experience", + "description": "What if you could keep traditional UI pagination concepts, but with the performance and reliability of cursor-based pagination? In this lightning talk, you’ll learn how relative cursors enable fast, consistent pagination while preserving familiar UX patterns like “jump to page.” It’s a smarter, more robust approach to navigating data—ideal for modern APIs and real-world apps.", + "goers": "5", + "seats": "0", + "invite_only": "N", + "venue": "IJzaal - 5th Floor", + "audience": "Advanced", + "id": "73b37145c961856b3c857568d0739a9f", + "venue_id": "2152806", + "speakers": [ + { + "username": "michael_staib.23xujj9p", + "id": "14900031", + "name": "Michael Staib", + "company": "ChilliCream", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "8", + "event_start_weekday": "Monday", + "event_start_weekday_short": "Mon", + "event_start_time": "11:25", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "8", + "event_end_weekday": "Monday", + "event_end_weekday_short": "Mon", + "event_end_time": "11:35", + "start_date": "2025-09-08", + "start_time": "11:25:00", + "start_time_ts": 1757323500, + "end_date": "2025-09-08", + "end_time": "11:35:00", + "event_subtype": "Patterns and community trends" + }, + { + "event_key": "929626", + "active": "Y", + "pinned": "N", + "name": "Panel Discussion: APIs for AIs - Kewei Qu, Meta; Fredrik Björk, Grafbase; Boris Besemer, Vercel; Michael Watson, Apollo GraphQL; Moderated by Stephen Spalding, Netflix", + "event_start": "2025-09-08 11:25", + "event_end": "2025-09-08 11:55", + "event_type": "GraphQL in Production", + "description": "APIs give AI superpowers. The MCP protocol, introduced less than a year ago, has quickly become a popular method for connecting large language models (LLMs) with the outside world. But where does GraphQL fit in? It's structured, typed, and introspectable... so what's the catch?\n\nJoin our panel of experts as we delve into how to leverage GraphQL effectively and safely in AI applications. We'll discuss the trade-offs, potential pitfalls, and share insights into best practices and strategies. This interactive discussion will explore how combining GraphQL with MCP can unlock new superpowers for AI, offering attendees a chance to engage with thought leaders and gain valuable perspectives.", + "goers": "4", + "seats": "0", + "invite_only": "N", + "venue": "Grote Zaal - 2nd Floor", + "id": "4ca721bc6a824e49d499ee35b71e953e", + "venue_id": "2152800", + "speakers": [ + { + "username": "watson17", + "id": "19024254", + "name": "Michael Watson", + "company": "Apollo GraphQL", + "custom_order": 0 + }, + { + "username": "borisbesemer", + "id": "23301917", + "name": "Boris Besemer", + "company": "Vercel", + "custom_order": 1 + }, + { + "username": "qkw1221", + "id": "18743864", + "name": "Kewei Qu", + "company": "Meta", + "custom_order": 2 + }, + { + "username": "fbjork", + "id": "23184575", + "name": "Fredrik Björk", + "company": "Grafbase", + "custom_order": 3 + }, + { + "username": "sspalding2", + "id": "18743825", + "name": "Stephen Spalding", + "company": "Netflix", + "custom_order": 4 + } + ], + "moderators": [ + { + "username": "sspalding2", + "name": "Stephen Spalding", + "eventid": "4ca721bc6a824e49d499ee35b71e953e", + "role": "moderator", + "company": "Netflix" + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "8", + "event_start_weekday": "Monday", + "event_start_weekday_short": "Mon", + "event_start_time": "11:25", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "8", + "event_end_weekday": "Monday", + "event_end_weekday_short": "Mon", + "event_end_time": "11:55", + "start_date": "2025-09-08", + "start_time": "11:25:00", + "start_time_ts": 1757323500, + "end_date": "2025-09-08", + "end_time": "11:55:00", + "event_subtype": "AI / LLMs" + }, + { + "event_key": "924672", + "active": "Y", + "pinned": "N", + "name": "Performant GraphQL at Scale - Andreas Marek, Atlassian", + "event_start": "2025-09-08 11:25", + "event_end": "2025-09-08 11:55", + "event_type": "GraphQL in Production", + "description": "After maintaining GraphQL Java for 10 years we learned what aspects of GraphQL are critical for optimal performance. \n \nWe we look at what users of GraphQL should consider and which aspects of the spec are critical for optimal performance.\n \nWe will look also closer into the aspects of operating GraphQL at scale including and what it means when the schema and requests continue to grow.", + "goers": "11", + "seats": "0", + "invite_only": "N", + "venue": "Studio - 5th Floor", + "audience": "Intermediate", + "id": "80ed10821b62754e5321d4984181cbfa", + "venue_id": "2152809", + "speakers": [ + { + "username": "andreas.marek1", + "id": "21066795", + "name": "Andreas Marek", + "company": "Atlassian", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "8", + "event_start_weekday": "Monday", + "event_start_weekday_short": "Mon", + "event_start_time": "11:25", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "8", + "event_end_weekday": "Monday", + "event_end_weekday_short": "Mon", + "event_end_time": "11:55", + "start_date": "2025-09-08", + "start_time": "11:25:00", + "start_time_ts": 1757323500, + "end_date": "2025-09-08", + "end_time": "11:55:00", + "event_subtype": "Scaling" + }, + { + "event_key": "925279", + "active": "Y", + "pinned": "N", + "name": "Lightning Talk: See the Graph in GraphQL: Graph Visualization in Action - Ivan Goncharov, KeenEthics", + "event_start": "2025-09-08 11:45", + "event_end": "2025-09-08 11:55", + "event_type": "Developer Experience", + "description": "Despite having \"Graph\" in its name, GraphQL schemas are rarely visualized as actual graphs.\n\nThis lightning talk explores the untapped potential of graph visualization for GraphQL schemas based on lessons learned while working on graphql-voyager.\n\nWe'll explore the theory behind effective schema visualization, share key insights from my 9 years of experience in this field, and discuss current challenges in representing complex schemas.\n\nI'll also present experimental approaches that go beyond existing libraries, pushing the boundaries of how we understand and interact with GraphQL schemas.\n\nJoin me for a visual journey that reveals what makes the \"Graph\" in GraphQL truly powerful, potentially reshaping how we design and understand our APIs.", + "goers": "10", + "seats": "0", + "invite_only": "N", + "venue": "IJzaal - 5th Floor", + "audience": "Intermediate", + "geo_area": "Yes", + "id": "2a74602450df6a446ac2b18d6e6fa6b5", + "venue_id": "2152806", + "speakers": [ + { + "username": "ivan.goncharov.ua", + "id": "23096422", + "name": "Ivan Goncharov", + "company": "KeenEthics", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "8", + "event_start_weekday": "Monday", + "event_start_weekday_short": "Mon", + "event_start_time": "11:45", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "8", + "event_end_weekday": "Monday", + "event_end_weekday_short": "Mon", + "event_end_time": "11:55", + "start_date": "2025-09-08", + "start_time": "11:45:00", + "start_time_ts": 1757324700, + "end_date": "2025-09-08", + "end_time": "11:55:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf2025/cc/2_See%20the%20Graph%20in%20GraphQL_%20Graph%20Visualization%20in%20Action.pdf", + "name": "2_See the Graph in GraphQL_ Graph Visualization in Action.pdf" + } + ], + "event_subtype": "Documentation" + }, + { + "event_key": "929647", + "active": "Y", + "pinned": "N", + "name": "Sponsored Session: Building the Ideal GraphQL Server Workflow Featuring GraphQL Code Generator - Eddy Nguyen, SEEK & The Guild", + "event_start": "2025-09-08 12:05", + "event_end": "2025-09-08 12:35", + "event_type": "Developer Experience", + "description": "Building an enterprise-level GraphQL server often leads to inconsistent practices, excessive boilerplate, and runtime errors that appear too late - all of which slow down feature delivery.\n\nThis talk explores what an ideal GraphQL server workflow may look like, and how tooling such as GraphQL Code Generator helps make it real.\n\nWe’ll walk through how to plan, build and integrate an example workflow:\n\n- Achieve strong type-safety\n- Ensure runtime safety with clear, actionable errors\n- Streamline development through consistent conventions and simplified setup\n\nBy the end, you’ll see how the right tooling can give developers confidence in their workflow, freeing them to focus on building features that deliver value to users faster.", + "goers": "5", + "seats": "0", + "invite_only": "N", + "venue": "IJzaal - 5th Floor", + "audience": "Any", + "geo_area": "Yes", + "id": "0281a72e8e35f07c74a5815c42c64a02", + "venue_id": "2152806", + "speakers": [ + { + "username": "eddynguyen", + "id": "23565738", + "name": "Eddy Nguyen", + "company": "SEEK & The Guild", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "8", + "event_start_weekday": "Monday", + "event_start_weekday_short": "Mon", + "event_start_time": "12:05", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "8", + "event_end_weekday": "Monday", + "event_end_weekday_short": "Mon", + "event_end_time": "12:35", + "start_date": "2025-09-08", + "start_time": "12:05:00", + "start_time_ts": 1757325900, + "end_date": "2025-09-08", + "end_time": "12:35:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf2025/bc/Building%20The%20Ideal%20GraphQL%20Server%20Workflow%20featuring%20GraphQL%20Code%20Generator.pdf", + "name": "Building The Ideal GraphQL Server Workflow featuring GraphQL Code Generator.pdf" + } + ], + "event_subtype": "Backend" + }, + { + "event_key": "922057", + "active": "Y", + "pinned": "N", + "name": "@async: Defer Even More! - Matt Mahoney, Meta", + "event_start": "2025-09-08 12:05", + "event_end": "2025-09-08 12:35", + "event_type": "GraphQL in Production", + "description": "@defer allows you to specify which parts of your operation are urgent, and which can be delayed. However, there is still a contract with @defer: all your data will always be returned, at some later point.\n\nThis poses a problem for certain classes of product: if only 10% of your operation will ever be on consumed, but you don't know exactly which 10% that will be, defer can introduce substantial hidden costs. To improve performance and reduce compute costs, Meta created @async to ensure products only ask for data when it's needed.", + "goers": "6", + "seats": "0", + "invite_only": "N", + "venue": "Studio - 5th Floor", + "audience": "Advanced", + "geo_area": "Yes", + "id": "4614b0dbd6236e202a87270ceda0c3bf", + "venue_id": "2152809", + "speakers": [ + { + "username": "mahoney.mattj", + "id": "19314398", + "name": "Matthew Mahoney", + "company": "Meta", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "8", + "event_start_weekday": "Monday", + "event_start_weekday_short": "Mon", + "event_start_time": "12:05", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "8", + "event_end_weekday": "Monday", + "event_end_weekday_short": "Mon", + "event_end_time": "12:35", + "start_date": "2025-09-08", + "start_time": "12:05:00", + "start_time_ts": 1757325900, + "end_date": "2025-09-08", + "end_time": "12:35:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf2025/a2/@async_%20Defer%20even%20more%20-%20GraphQL%20Conf%202025.pdf", + "name": "@async_ Defer even more - GraphQL Conf 2025.pdf" + } + ], + "event_subtype": "Scaling" + }, + { + "event_key": "913063", + "active": "Y", + "pinned": "N", + "name": "How To Use Fragments (They're Not for Re-use!) - Janette Cheng, Meta", + "event_start": "2025-09-08 12:05", + "event_end": "2025-09-08 12:35", + "event_type": "GraphQL in Production", + "description": "The most natural way to understand fragments is as a reusable part of a query. We at Meta know that this isn't true and can lead to a world of pain when it comes to making sure the data you fetch matches the code that uses that data (no over-fetching).\n\nThe worst part is both the GraphQL spec and the educational materials mention re-use for fragments as part of their value:\n\"Fragments allow for the reuse of common repeated selections of fields, reducing duplicated text in the document.\"\n\nThis talk will explain what we've learned is the best way to use fragments (as subcomponents you convert to in order to pass to the logic that is tied to that fragment).\n\nWe will use Relay's per-file graphql co-location as a demonstration of this philosophy in action", + "goers": "16", + "seats": "0", + "invite_only": "N", + "venue": "Grote Zaal - 2nd Floor", + "audience": "Beginner", + "geo_area": "Yes", + "id": "95c83506420d9a9a3a971a8802ba96f8", + "venue_id": "2152800", + "speakers": [ + { + "username": "janettelc", + "id": "23098753", + "name": "Janette Cheng", + "company": "Meta", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "8", + "event_start_weekday": "Monday", + "event_start_weekday_short": "Mon", + "event_start_time": "12:05", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "8", + "event_end_weekday": "Monday", + "event_end_weekday_short": "Mon", + "event_end_time": "12:35", + "start_date": "2025-09-08", + "start_time": "12:05:00", + "start_time_ts": 1757325900, + "end_date": "2025-09-08", + "end_time": "12:35:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf2025/44/how-to-use-fragments.pdf", + "name": "how-to-use-fragments.pdf" + } + ], + "event_subtype": "Scaling" + }, + { + "event_key": "10", + "active": "Y", + "pinned": "N", + "name": "Lunch", + "event_start": "2025-09-08 12:35", + "event_end": "2025-09-08 13:45", + "event_type": "Breaks / Networking / Special Events", + "goers": "14", + "seats": "0", + "invite_only": "N", + "venue": "Foyer Grote Zaal - 2nd Floor", + "id": "457da0fb4bd44feb088e8f4388b0f9c1", + "venue_id": "2152803", + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "8", + "event_start_weekday": "Monday", + "event_start_weekday_short": "Mon", + "event_start_time": "12:35", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "8", + "event_end_weekday": "Monday", + "event_end_weekday_short": "Mon", + "event_end_time": "13:45", + "start_date": "2025-09-08", + "start_time": "12:35:00", + "start_time_ts": 1757327700, + "end_date": "2025-09-08", + "end_time": "13:45:00", + "event_subtype": "", + "description": "" + }, + { + "event_key": "894556", + "active": "Y", + "pinned": "N", + "name": "From Docs To Conversation & Action - Daniel Hai & Dipro Bhowmik, monday.com", + "event_start": "2025-09-08 13:45", + "event_end": "2025-09-08 14:15", + "event_type": "Developer Experience", + "description": "Great documentation has always been the gold standard of API developer experience, and always a real challenge for GraphQL APIs. With the rise of AI and interactive API playgrounds, developer expectations have evolved. Static docs can be slow, confusing, and outdated, while an AI-powered assistant and API playground offer a dynamic, conversational, and instantly actionable experience. In this session, we’ll explore how we at monday.com leveraged AI and interactive tools to replace traditional documentation for our public GraphQL API, reducing friction and accelerating adoption.", + "goers": "2", + "seats": "0", + "invite_only": "N", + "venue": "IJzaal - 5th Floor", + "audience": "Any", + "geo_area": "Yes", + "id": "ed1b84b384c39fd16cbba908aeeda283", + "venue_id": "2152806", + "speakers": [ + { + "username": "dipro", + "id": "23187254", + "name": "Dipro Bhowmik", + "company": "monday.com", + "custom_order": 0 + }, + { + "username": "danielha4", + "id": "23098732", + "name": "Daniel Hai", + "company": "monday.com", + "custom_order": 1 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "8", + "event_start_weekday": "Monday", + "event_start_weekday_short": "Mon", + "event_start_time": "13:45", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "8", + "event_end_weekday": "Monday", + "event_end_weekday_short": "Mon", + "event_end_time": "14:15", + "start_date": "2025-09-08", + "start_time": "13:45:00", + "start_time_ts": 1757331900, + "end_date": "2025-09-08", + "end_time": "14:15:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf2025/d5/From%20Docs%20to%20Conversation%20&%20Action%20-%20monday%20API%20GraphQL%20Talk.pdf", + "name": "From Docs to Conversation & Action - monday API GraphQL Talk.pdf" + } + ], + "event_subtype": "Documentation" + }, + { + "event_key": "929645", + "active": "Y", + "pinned": "N", + "name": "Streamlining Data Collection and Entity Management for Amazon's Buyer Abuse Prevention Team - Adam Cervantes, Amazon", + "event_start": "2025-09-08 13:45", + "event_end": "2025-09-08 14:15", + "event_type": "GraphQL in Production", + "description": "The Buyer Abuse Prevention team is responsible for preventing returns abuse on Amazon.com. We do this by leveraging multiple streams of data to help make accurate decisions that minimize friction to our good customers. Enrichment of entities, for example, orders, is often distributed across multiple APIs, which makes collecting and organizing large sets of data inefficient and inflexible.\n\nTo simplify development, we built a GraphQL API to consolidate the collection and storage of data that allowed us to break the dependency on API results and design our storage around entities in a way that was optimal for our business. Chaining API calls now only takes place within a single API without need for code replication. Swapping out the underlying API for specific fields no longer requires code refactoring as the shape of the entity remained the same. The schema is well-connected which allows for different entry points but ultimately arrives at the same data without needing to reinvent the wheel.\n\nWe can now focus on developing a schema and set of entities that match our business needs, without risk of major refactoring when a dependent API changes.", + "goers": "5", + "seats": "0", + "invite_only": "N", + "venue": "Studio - 5th Floor", + "audience": "Beginner", + "geo_area": "Yes", + "id": "2f80d25265c00f9c5133f80cdcc71618", + "venue_id": "2152809", + "speakers": [ + { + "username": "adam427", + "id": "3141026", + "name": "Adam Cervantes", + "company": "Amazon", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "8", + "event_start_weekday": "Monday", + "event_start_weekday_short": "Mon", + "event_start_time": "13:45", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "8", + "event_end_weekday": "Monday", + "event_end_weekday_short": "Mon", + "event_end_time": "14:15", + "start_date": "2025-09-08", + "start_time": "13:45:00", + "start_time_ts": 1757331900, + "end_date": "2025-09-08", + "end_time": "14:15:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf2025/64/Adam%20Cervantes%20GraphQLConf.pdf", + "name": "Adam Cervantes GraphQLConf.pdf" + } + ], + "event_subtype": "Case studies" + }, + { + "event_key": "882751", + "active": "Y", + "pinned": "N", + "name": "GraphQL Subscriptions Are Stateful; We Made Them Stateless - Matteo Collina, Platformatic", + "event_start": "2025-09-08 13:45", + "event_end": "2025-09-08 14:15", + "event_type": "GraphQL in Production", + "description": "GraphQL Subscriptions over WebSockets is an extremely popular way to notify the caller that something happened on the back end. While a high level of Quality of Service is possible in other protocols such as STOMP or MQTT, there is no actual guarantee of delivery with GraphQL Subscriptions: any acknowledgment mechanism should be built in userland.\n \nWebSockets can be interrupted at any time with both graceful and ungraceful disconnections, and the lack of acknowledgment in the subscription protocol affects reliability, making GraphQL Subscription over WebSocket connections susceptible to disconnections, as any protocol failures will result in messages being lost. In other words, Subscriptions are stateful. In this talk, we will investigate a mitigation technique to make them resumable so that the connection can be destroyed and recreated without any message loss.", + "goers": "7", + "seats": "0", + "invite_only": "N", + "venue": "Grote Zaal - 2nd Floor", + "audience": "Intermediate", + "id": "0c3828d450fca7c409a3dda68f066428", + "venue_id": "2152800", + "speakers": [ + { + "username": "matteo.collina1", + "id": "11925534", + "name": "Matteo Collina", + "company": "Platformatic", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "8", + "event_start_weekday": "Monday", + "event_start_weekday_short": "Mon", + "event_start_time": "13:45", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "8", + "event_end_weekday": "Monday", + "event_end_weekday_short": "Mon", + "event_end_time": "14:15", + "start_date": "2025-09-08", + "start_time": "13:45:00", + "start_time_ts": 1757331900, + "end_date": "2025-09-08", + "end_time": "14:15:00", + "event_subtype": "Federation and distributed systems" + }, + { + "event_key": "926734", + "active": "Y", + "pinned": "N", + "name": "Composing Your UI With GraphQL: Building Federated Component Systems That Scale - Gabriel Cura-Castro, StubHub Inc", + "event_start": "2025-09-08 14:25", + "event_end": "2025-09-08 14:55", + "event_type": "Developer Experience", + "description": "GraphQL federation has changed how we think about data and it's time to adopt that thinking to how we build UIs and component systems. In this talk, Gabe will share his deep experience from building design systems at Apple, Netflix and now StubHub to help you design yours.\n\nWhat are the advantages GraphQL brings to a traditional React component system? How can fragments optimize the composability of your components? How to reduce duplication while reducing the time you need to ship new features?\n\nWe will provide guidance on how to build and leverage a federated component system along-side your design system.\n\nFinally, we will cover how we've leveraged AI to speedup the creation of our design system and federated components at StuHub. Join to learn more!", + "goers": "11", + "seats": "0", + "invite_only": "N", + "venue": "IJzaal - 5th Floor", + "audience": "Intermediate", + "geo_area": "Yes", + "id": "4d43e71c77159a2cdfea61b076428a8f", + "venue_id": "2152806", + "speakers": [ + { + "username": "gabe210", + "id": "23098750", + "name": "Gabriel Cura-Castro", + "company": "StubHub Inc", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "8", + "event_start_weekday": "Monday", + "event_start_weekday_short": "Mon", + "event_start_time": "14:25", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "8", + "event_end_weekday": "Monday", + "event_end_weekday_short": "Mon", + "event_end_time": "14:55", + "start_date": "2025-09-08", + "start_time": "14:25:00", + "start_time_ts": 1757334300, + "end_date": "2025-09-08", + "end_time": "14:55:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf2025/76/GraphQL%20Conf%202025.pdf", + "name": "GraphQL Conf 2025.pdf" + } + ], + "event_subtype": "Frontend" + }, + { + "event_key": "923772", + "active": "Y", + "pinned": "N", + "name": "Rethinking GraphQL Execution - Raymie Stata, Airbnb", + "event_start": "2025-09-08 14:25", + "event_end": "2025-09-08 14:55", + "event_type": "GraphQL in Production", + "description": "To ease life for the roughly 1,000 developers who contribute regularly to our GraphQL interface, Airbnb has a highly opinionated developer API that we believe eases life for both developers and the operators who maintain the service. In the past, this API was implemented on top of a traditional, specification-based GraphQL engine, which supported agility as we evolved our opinionated approach to resolvers. As that approach matured, we saw opportunities to build a more efficient engine to support them.\n\nThis talk describes our new GraphQL engine. Key elements in our design include:\n\n- Refactoring query execution into distinct resolution and completion phases.\n\n- A query planner that optimizes and orchestrates the execution of those phases.\n\n- A new data structure that is the intermediary between the two phases, a data structure that allows for principled communication between the many resolvers involved in executing a query", + "goers": "6", + "seats": "0", + "invite_only": "N", + "venue": "Grote Zaal - 2nd Floor", + "audience": "Advanced", + "geo_area": "Yes", + "id": "9426f470312d5ebb39a99a3a822f2821", + "venue_id": "2152800", + "speakers": [ + { + "username": "raymie2", + "id": "23098792", + "name": "Raymie Stata", + "company": "Airbnb", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "8", + "event_start_weekday": "Monday", + "event_start_weekday_short": "Mon", + "event_start_time": "14:25", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "8", + "event_end_weekday": "Monday", + "event_end_weekday_short": "Mon", + "event_end_time": "14:55", + "start_date": "2025-09-08", + "start_time": "14:25:00", + "start_time_ts": 1757334300, + "end_date": "2025-09-08", + "end_time": "14:55:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf2025/1b/TB_411_v5%20GraphQL%20Engine%20Talk.pdf", + "name": "TB_411_v5 GraphQL Engine Talk.pdf" + } + ], + "event_subtype": "Federation and distributed systems" + }, + { + "event_key": "879918", + "active": "Y", + "pinned": "N", + "name": "Unlocking Federation Security at Scale in Booking.com - Sanver Tarmur & Minghe Huang, Booking.com", + "event_start": "2025-09-08 14:25", + "event_end": "2025-09-08 14:55", + "event_type": "GraphQL in Production", + "description": "In Booking.com we are heavily using Federated GraphQL approach, more than 150 backend sub-graph services are integrated from different domains of the company such as accommodations, partner, flights, cars, trips, and fintech.\n \n \nOur federated GraphQL layer hosts daily 11b+ incoming requests, Federation in the back distributes 14b+ requests to the sub-graphs per day. We have a diverse set of clients such as Booking traveller, partner native apps/web clients, 140+ SSR (Server Side Rendering) services for Web/Mobile rendering, and AI chatbots. This level of adoption brings unique challenges in terms of security and traffic management. In Booking.com we have a large attack surface since our GraphQL schema is huge, to be specific we have ~7k types with 27k+ fields. In this session, we will share our schema driven approaches to mitigate risks due to authN/Z leaks, DDoS attacks or exposure of sensitive PII/PCI data. These methodologies are designed with a high degree of generality, ensuring their applicability and scalability across every other Federated GraphQL system.", + "goers": "3", + "seats": "0", + "invite_only": "N", + "venue": "Studio - 5th Floor", + "audience": "Intermediate", + "id": "4fd6c149b3e2fec837a6abad57421002", + "venue_id": "2152809", + "speakers": [ + { + "username": "minghe.huang", + "id": "23098789", + "name": "Minghe Huang", + "company": "Booking.com", + "custom_order": 0 + }, + { + "username": "sanvertarmur", + "id": "23098798", + "name": "Sanver Tarmur", + "company": "Booking.com", + "custom_order": 1 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "8", + "event_start_weekday": "Monday", + "event_start_weekday_short": "Mon", + "event_start_time": "14:25", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "8", + "event_end_weekday": "Monday", + "event_end_weekday_short": "Mon", + "event_end_time": "14:55", + "start_date": "2025-09-08", + "start_time": "14:25:00", + "start_time_ts": 1757334300, + "end_date": "2025-09-08", + "end_time": "14:55:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf2025/8d/Unlocking%20Federation%20Security%20at%20Scale.pdf", + "name": "Unlocking Federation Security at Scale.pdf" + } + ], + "event_subtype": "Security" + }, + { + "event_key": "925128", + "active": "Y", + "pinned": "N", + "name": "Event Sourcing + GraphQL = ♥️ - Mike Astle, Xolvio", + "event_start": "2025-09-08 15:05", + "event_end": "2025-09-08 15:35", + "event_type": "Developer Experience", + "description": "Event Sourcing is emerging as a preferred approach to building complex software systems. It enables rapid development, smooth evolution over time, and opens the door to AI-based acceleration.\n \nWe will make a brief introduction to the core concepts of Event Sourcing and why the approach is loved by its adherents. We will review the foundational elements of an Event Sourced application including some common architectural choices.\n \nGraphQL is known for expressive queries, precise data fetching, real-time capabilities, and a strong ecosystem. All of these pair well with Event Sourced applications. GraphQL simplifies the complexity of querying event streams, enables precise control over client-server interactions, and supports flexible schema evolution that is crucial to long term success. We will discuss this in the context of established patterns (and anti-patterns!).\n \nBy the end of this talk, attendees will clearly understand how combining Event Sourcing and GraphQL accelerates development and prepares data-driven apps to take advantage of AI-driven acceleration in the near future.", + "goers": "5", + "seats": "0", + "invite_only": "N", + "venue": "IJzaal - 5th Floor", + "audience": "Intermediate", + "id": "22bac0a80d82ca49dcb156f96a307b8b", + "venue_id": "2152806", + "speakers": [ + { + "username": "michael.astle", + "id": "23098786", + "name": "Mike Astle", + "company": "Xolvio", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "8", + "event_start_weekday": "Monday", + "event_start_weekday_short": "Mon", + "event_start_time": "15:05", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "8", + "event_end_weekday": "Monday", + "event_end_weekday_short": "Mon", + "event_end_time": "15:35", + "start_date": "2025-09-08", + "start_time": "15:05:00", + "start_time_ts": 1757336700, + "end_date": "2025-09-08", + "end_time": "15:35:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf2025/bd/GraphQLConf%202025%20-%20ES%20+%20GraphQL%20=%20%E2%99%A5%EF%B8%8F%20-%20Sep%202025%20-%20v0001.pdf", + "name": "GraphQLConf 2025 - ES + GraphQL = ♥️ - Sep 2025 - v0001.pdf" + } + ], + "event_subtype": "Patterns and community trends" + }, + { + "event_key": "895837", + "active": "Y", + "pinned": "N", + "name": "GraphQL Performance Issues at Netflix Scale - Stephen Chambers, Netflix", + "event_start": "2025-09-08 15:05", + "event_end": "2025-09-08 15:35", + "event_type": "GraphQL in Production", + "description": "The Member Experience Core Systems team at Netflix is entrusted with orchestrating every facet of the member experience. From the intricacies of the profiles screen to the dynamic homepage and the seamless search for your favorite shows, our robust API layer is the backbone that supports it all.\n\nOperating at an astronomical scale, our two principal Subgraph Services collectively manage over a million GraphQL queries per second. This immense scale, coupled with the diverse queries our systems accommodate, ensures that even the most minute edge cases are brought to light.\n\nIn this presentation, we will delve into two significant production bugs that emerged at scale. The first involved a federation-based solution at the query planning layer, which culminated in a 20% reduction in requests per second and yielded substantial cost savings amounting to hundreds of thousands of dollars. The second, a subgraph service specific enhancement, remarkably doubled the efficiency of our entire fleet.\n\nBy sharing our journey of identifying and resolving these issues, we aspire to provide insights that will directly enhance your day-to-day endeavors using GraphQL.", + "goers": "12", + "seats": "0", + "invite_only": "N", + "venue": "Grote Zaal - 2nd Floor", + "audience": "Intermediate", + "id": "682168b9f5a3998f61c54d12094ead0e", + "venue_id": "2152800", + "speakers": [ + { + "username": "stephenchambers", + "id": "23098804", + "name": "Stephen Chambers", + "company": "Netflix", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "8", + "event_start_weekday": "Monday", + "event_start_weekday_short": "Mon", + "event_start_time": "15:05", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "8", + "event_end_weekday": "Monday", + "event_end_weekday_short": "Mon", + "event_end_time": "15:35", + "start_date": "2025-09-08", + "start_time": "15:05:00", + "start_time_ts": 1757336700, + "end_date": "2025-09-08", + "end_time": "15:35:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf2025/1e/gqlconf-2025-graphql-performance-issues-at-netflix-scale.pdf", + "name": "gqlconf-2025-graphql-performance-issues-at-netflix-scale.pdf" + } + ], + "event_subtype": "Federation and distributed systems" + }, + { + "event_key": "919948", + "active": "Y", + "pinned": "N", + "name": "Breaking and Building Boundaries: Securing Federated GraphQL - Yehuda Rosenberg, JFrog", + "event_start": "2025-09-08 15:05", + "event_end": "2025-09-08 15:35", + "event_type": "GraphQL in Production", + "description": "You added security measures to all your subgraphs and are sure you're safe? Think again. In a federated GraphQL system, the most significant risks often hide not within individual services, but within the logic and trust assumptions of the federation layer itself.\n \nThis talk explores how federated GraphQL architectures introduce a new class of security challenges that traditional testing and validation frequently overlook. We'll walk through practical examples based on real-world use cases and both offensive and defensive insights, showing why stitching secure services together doesn’t automatically result in a secure supergraph.\n \nAttendees will see federation-specific threats in action, learn important security concepts, and walk away with actionable strategies for hardening routers, auditing configurations, and building safer service interactions. We'll also share PoC code and conceptual outlines for detection tooling to help apply these learnings in real-world systems.\n \nAn engaging, practical, and scenario-driven session - especially relevant for developers and security engineers working with federated GraphQL systems.", + "goers": "2", + "seats": "0", + "invite_only": "N", + "venue": "Studio - 5th Floor", + "audience": "Intermediate", + "id": "95f18f64a644710d42f294df2a2883e1", + "venue_id": "2152809", + "speakers": [ + { + "username": "yehudar", + "id": "23098819", + "name": "Yehuda Rosenberg", + "company": "JFrog", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "8", + "event_start_weekday": "Monday", + "event_start_weekday_short": "Mon", + "event_start_time": "15:05", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "8", + "event_end_weekday": "Monday", + "event_end_weekday_short": "Mon", + "event_end_time": "15:35", + "start_date": "2025-09-08", + "start_time": "15:05:00", + "start_time_ts": 1757336700, + "end_date": "2025-09-08", + "end_time": "15:35:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf2025/19/Breaking%20and%20Building%20Boundaries_%20Securing%20Federated%20GraphQL%20-%20GraphQLConf%202025.pdf", + "name": "Breaking and Building Boundaries_ Securing Federated GraphQL - GraphQLConf 2025.pdf" + } + ], + "event_subtype": "Security" + }, + { + "event_key": "5", + "active": "Y", + "pinned": "N", + "name": "Break", + "event_start": "2025-09-08 15:35", + "event_end": "2025-09-08 15:55", + "event_type": "Breaks / Networking / Special Events", + "goers": "11", + "seats": "0", + "invite_only": "N", + "venue": "Foyer Grote Zaal - 2nd Floor", + "id": "307b54cb1c642d7bd8a6fb371b42bab6", + "venue_id": "2152803", + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "8", + "event_start_weekday": "Monday", + "event_start_weekday_short": "Mon", + "event_start_time": "15:35", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "8", + "event_end_weekday": "Monday", + "event_end_weekday_short": "Mon", + "event_end_time": "15:55", + "start_date": "2025-09-08", + "start_time": "15:35:00", + "start_time_ts": 1757338500, + "end_date": "2025-09-08", + "end_time": "15:55:00", + "event_subtype": "", + "description": "" + }, + { + "event_key": "911156", + "active": "Y", + "pinned": "N", + "name": "GraphQL Isn't Just for Enterprises: The New King of Fullstack Typescript Applications - Alec Aivazis, HoudiniLabs", + "event_start": "2025-09-08 15:55", + "event_end": "2025-09-08 16:25", + "event_type": "Developer Experience", + "description": "Over the past few years, GraphQL has fallen out of favor for developers looking to build full-stack typescript applications. With projects like TRPC and NextJS, many people have started to pigeonhole GraphQL into an enterprise-shaped box. But this doesn't have to be the case! In this talk, Alec will give a practical introduction with live coding to Houdini, a GraphQL-first application framework and demonstrate how to rapidly move from idea to creation with a state-of-the-art developer experience that brings GraphQL back as a contender for the best choice for smaller applications.", + "goers": "5", + "seats": "0", + "invite_only": "N", + "venue": "Studio - 5th Floor", + "audience": "Beginner", + "id": "dda1fbb70f8b5b73223a6e37a736e5bd", + "venue_id": "2152809", + "speakers": [ + { + "username": "alec102", + "id": "18743870", + "name": "Alec Aivazis", + "company": "HoudiniLabs", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "8", + "event_start_weekday": "Monday", + "event_start_weekday_short": "Mon", + "event_start_time": "15:55", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "8", + "event_end_weekday": "Monday", + "event_end_weekday_short": "Mon", + "event_end_time": "16:25", + "start_date": "2025-09-08", + "start_time": "15:55:00", + "start_time_ts": 1757339700, + "end_date": "2025-09-08", + "end_time": "16:25:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf2025/d7/GraphQL%20Isn't Just For Enterprises.pdf", + "name": "GraphQL Isn't Just For Enterprises.pdf" + } + ], + "event_subtype": "Frontend" + }, + { + "event_key": "924335", + "active": "Y", + "pinned": "N", + "name": "Lightning Talk: The Federated GraphQL Subscriptions Zoo - Tom Houlé, Grafbase", + "event_start": "2025-09-08 15:55", + "event_end": "2025-09-08 16:05", + "event_type": "GraphQL in Production", + "description": "Subscriptions are not like queries and mutations. They require specific thinking and care in any implementation strategy.\nFederation adds a layer of infrastructure that can complicate subscriptions in two ways:\n\n- scaling, because the federation gateway may have to resolve many subscription streams at the same time,\n- translation, because each subgraph has the protocols it supports, and they may not overlap with the protocol used by the clients.\n\nThis lightning talk dives into the challenges of translation we encountered in concrete scenarios:\n\n- How websocket init payloads map, or not, to http headers\n- How to translate SSE requests to websocket requests\n- Alternatives like multipart streams\n- Websocket subprotocols", + "goers": "3", + "seats": "0", + "invite_only": "N", + "venue": "IJzaal - 5th Floor", + "audience": "Intermediate", + "id": "f4c4515cba67a0ef57bb208e2c805c6c", + "venue_id": "2152806", + "speakers": [ + { + "username": "tom817", + "id": "23098807", + "name": "Tom Houlé", + "company": "Grafbase", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "8", + "event_start_weekday": "Monday", + "event_start_weekday_short": "Mon", + "event_start_time": "15:55", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "8", + "event_end_weekday": "Monday", + "event_end_weekday_short": "Mon", + "event_end_time": "16:05", + "start_date": "2025-09-08", + "start_time": "15:55:00", + "start_time_ts": 1757339700, + "end_date": "2025-09-08", + "end_time": "16:05:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf2025/0a/federated-graphql-subscriptions.pdf", + "name": "federated-graphql-subscriptions.pdf" + } + ], + "event_subtype": "Federation and distributed systems" + }, + { + "event_key": "924894", + "active": "Y", + "pinned": "N", + "name": "From Private To Public: Evolving a GraphQL API for the Outside World - Laurin Quast, The Guild", + "event_start": "2025-09-08 15:55", + "event_end": "2025-09-08 16:25", + "event_type": "GraphQL in Production", + "description": "Turning a private GraphQL API into a public one comes with unexpected challenges. We’ll share how we approached this transition—starting from an existing internal schema that wasn’t shaped for external consumers—and the steps we took to expose only what was ready. Using Apollo Federation Contracts, we filtered out unstable or sensitive parts of the graph. Along the way, we defined best practices for the public schema, like cursor-based pagination, using oneOf for inputs and results.\nWe’ll also touch on how we serve the schema through Hive Gateway with a supergraph setup, and the security measures we added, like depth limiting and complexity analysis. To keep things evolving safely, we rely on GraphQL Hive to track usage and guide deprecations.\n \nIf you’re thinking about exposing a GraphQL API—or just want ideas for keeping one clean and manageable—this talk will share what worked for us, what didn’t, and what we learned.", + "goers": "12", + "seats": "0", + "invite_only": "N", + "venue": "Grote Zaal - 2nd Floor", + "audience": "Beginner", + "id": "11ee2487ca4b81120d1d7218b13f2003", + "venue_id": "2152800", + "speakers": [ + { + "username": "laurinquast", + "id": "18743819", + "name": "Laurin Quast", + "company": "The Guild", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "8", + "event_start_weekday": "Monday", + "event_start_weekday_short": "Mon", + "event_start_time": "15:55", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "8", + "event_end_weekday": "Monday", + "event_end_weekday_short": "Mon", + "event_end_time": "16:25", + "start_date": "2025-09-08", + "start_time": "15:55:00", + "start_time_ts": 1757339700, + "end_date": "2025-09-08", + "end_time": "16:25:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf2025/34/2025-09-08-from-private-to-public-graphql-api.pdf", + "name": "2025-09-08-from-private-to-public-graphql-api.pdf" + } + ], + "event_subtype": "Schema evolution" + }, + { + "event_key": "924336", + "active": "Y", + "pinned": "N", + "name": "Lightning Talk: Authorization in Federated GraphQL - Tom Houlé, Grafbase", + "event_start": "2025-09-08 16:15", + "event_end": "2025-09-08 16:25", + "event_type": "GraphQL in Production", + "description": "Adopting GraphQL federation creates a convenient place in your infrastructure to make authorization decisions:\n\n- It comes early in the request lifecycle, before any subgraph.\n- It has access to the whole client request, as well as the entirety of the federated graph.\n- Authorization can still be the responsibility of the subgraph teams, or a cross cutting concern.\n\nThis talk is about leveraging the special position of the federation gateway for authorization.\n\nWe'll cover the directives federation offers for authorization out of the box: `@authenticated`, `@requiresScopes`, `@policy`. To cover a more advanced use case, we'll explore how to implement fine-grained authorization taking advantage of data from your federated graph by leveraging extensions in the open source Grafbase Gateway.", + "goers": "3", + "seats": "0", + "invite_only": "N", + "venue": "IJzaal - 5th Floor", + "audience": "Intermediate", + "id": "4c9e99eb72e65a8115cabc6df964e106", + "venue_id": "2152806", + "speakers": [ + { + "username": "tom817", + "id": "23098807", + "name": "Tom Houlé", + "company": "Grafbase", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "8", + "event_start_weekday": "Monday", + "event_start_weekday_short": "Mon", + "event_start_time": "16:15", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "8", + "event_end_weekday": "Monday", + "event_end_weekday_short": "Mon", + "event_end_time": "16:25", + "start_date": "2025-09-08", + "start_time": "16:15:00", + "start_time_ts": 1757340900, + "end_date": "2025-09-08", + "end_time": "16:25:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf2025/7f/authorization-in-federated-graphql.pdf", + "name": "authorization-in-federated-graphql.pdf" + } + ], + "event_subtype": "Federation and distributed systems" + }, + { + "event_key": "925267", + "active": "Y", + "pinned": "N", + "name": "Compose Your Mobile App With GraphQL - Martin Bonnin, Apollo", + "event_start": "2025-09-08 16:35", + "event_end": "2025-09-08 17:05", + "event_type": "Developer Experience", + "description": "Jetpack Compose is a declarative UI framework for Kotlin and Android. Jetpack Compose makes it easy to describe your UI graph and build composable UIs.\n\nOn the other hand, GraphQL is a declarative language for your Data. GraphQL makes it easy to describe and query your Data Graph.\n\nSounds like a perfect match!\n\nIn this presentation, we'll take a look at the current mobile architectures and how they differ from web architectures.\n\nWe will dive into cache, offline mode and error handling and investigate how GraphQL can help mobile developers build more reactive and robust UIs.\n\nUsing real life examples from the GraphQL conf 2025 app, we well discuss patterns such as colocated fragments, optimistic updates, subscriptions and see how they fit in the mobile app development cycle.\n\nWhile it will use some Kotlin, most of the examples can be applied to iOS and/or any other mobile platform.\n\nIf you're a web developer, I'm hoping to give you some talking point to start the discussion with your mobile teams. Let's unite frontend developers!", + "goers": "3", + "seats": "0", + "invite_only": "N", + "venue": "Studio - 5th Floor", + "audience": "Intermediate", + "geo_area": "Yes", + "id": "33ba3777057f6b5d6e17b0e6fe86e7d9", + "venue_id": "2152809", + "speakers": [ + { + "username": "martinbonnin42", + "id": "23098783", + "name": "Martin Bonnin", + "company": "Apollo", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "8", + "event_start_weekday": "Monday", + "event_start_weekday_short": "Mon", + "event_start_time": "16:35", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "8", + "event_end_weekday": "Monday", + "event_end_weekday_short": "Mon", + "event_end_time": "17:05", + "start_date": "2025-09-08", + "start_time": "16:35:00", + "start_time_ts": 1757342100, + "end_date": "2025-09-08", + "end_time": "17:05:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf2025/75/Compose%20your%20mobile%20apps.pdf", + "name": "Compose your mobile apps.pdf" + } + ], + "event_subtype": "Frontend" + }, + { + "event_key": "925144", + "active": "Y", + "pinned": "N", + "name": "Building an Open-Source Federation Query Planner & Router - Dotan Simha & Kamil Kisiela, The Guild", + "event_start": "2025-09-08 16:35", + "event_end": "2025-09-08 17:05", + "event_type": "GraphQL in Production", + "description": "A talk covering the journey of The Guild building our new Rust router and query planner.\n\nWe are going to share our years-long journey through learnings, insights and real-life examples on why and how we’ve built our open-source Federation Router and query planner.\n\nIn this talk, we’ll cover:
  • The background and journey of the ecosystem’s different gateways and routers
  • Benchmarks and Audit-based development
  • Why we build our query planner as a library
  • How we got it to be so performant
  • Next steps and the community can get involved
", + "goers": "7", + "seats": "0", + "invite_only": "N", + "venue": "IJzaal - 5th Floor", + "audience": "Advanced", + "id": "1a0475a575803503fce927f22dd1beae", + "venue_id": "2152806", + "speakers": [ + { + "username": "kamilkisiela", + "id": "19082388", + "name": "Kamil Kisiela", + "company": "The Guild", + "custom_order": 0 + }, + { + "username": "dotan1", + "id": "23098735", + "name": "Dotan Simha", + "company": "The Guild", + "custom_order": 1 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "8", + "event_start_weekday": "Monday", + "event_start_weekday_short": "Mon", + "event_start_time": "16:35", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "8", + "event_end_weekday": "Monday", + "event_end_weekday_short": "Mon", + "event_end_time": "17:05", + "start_date": "2025-09-08", + "start_time": "16:35:00", + "start_time_ts": 1757342100, + "end_date": "2025-09-08", + "end_time": "17:05:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf2025/42/Building%20an%20Open-Source%20Federation%20Query-Planner%20&%20Router%20(1).pdf", + "name": "Building an Open-Source Federation Query-Planner & Router (1).pdf" + } + ], + "event_subtype": "Federation and distributed systems" + }, + { + "event_key": "924929", + "active": "Y", + "pinned": "N", + "name": "Death, Taxes, and Deprecation - Stephen Spalding, Netflix", + "event_start": "2025-09-08 16:35", + "event_end": "2025-09-08 17:05", + "event_type": "GraphQL in Production", + "description": "alt title: Surviving Change Without Breaking Everything\n \nWhen we launched our new GraphQL API at Netflix, it felt perfect—destined to power hundreds of millions of devices. Yet, change is inevitable. Even if your schema seems flawless today (which it isn't), requirements will shift, new features will emerge, and regrets will follow.\n \nGraphQL promises evolvability, allowing us to move forward without multiple API versions. But how does this hold up in practice? We mark fields as @deprecated, but what happens next? How can we embrace experimentation without entombing technical debt in the API? Does federation complicate things? Evolving your schema without breaking clients is easy, right? Right??\n \nDrawing from experience with the Netflix API, this talk explores techniques for evolving your schema safely and painlessly. We'll cover the schema lifecycle—from experimentation to design, deprecation, and deletion.\n \nAttendees will leave with:\n- Schema design principles that facilitate change\n- Practical techniques for evolving GraphQL schemas\n- Strategies for managing a deprecation workflow\n \nJoin us as we learn to face the inevitability of change with confidence and serenity.", + "goers": "12", + "seats": "0", + "invite_only": "N", + "venue": "Grote Zaal - 2nd Floor", + "audience": "Intermediate", + "id": "8e63bb4173054c8a5b67cfdac6649049", + "venue_id": "2152800", + "speakers": [ + { + "username": "sspalding2", + "id": "18743825", + "name": "Stephen Spalding", + "company": "Netflix", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "8", + "event_start_weekday": "Monday", + "event_start_weekday_short": "Mon", + "event_start_time": "16:35", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "8", + "event_end_weekday": "Monday", + "event_end_weekday_short": "Mon", + "event_end_time": "17:05", + "start_date": "2025-09-08", + "start_time": "16:35:00", + "start_time_ts": 1757342100, + "end_date": "2025-09-08", + "end_time": "17:05:00", + "event_subtype": "Schema evolution" + }, + { + "event_key": "929638", + "active": "Y", + "pinned": "N", + "name": "Avoiding the Monolith Trap: Lessons from Airbnb’s Multi-Tenant GraphQL Platform - Adam Miskiewicz, Airbnb", + "event_start": "2025-09-08 17:15", + "event_end": "2025-09-08 17:45", + "event_type": "GraphQL in Production", + "description": "Over the past six years, Viaduct has grown from Airbnb’s unified data access layer into a central platform for hosting business logic — now supporting over 1 million lines of code, 500+ monthly contributors, and 100+ teams.\n\nThat scale has brought a familiar risk: the slow creep toward monolith. Viaduct was never meant to be a microservices system, but we’ve had to make deliberate choices to preserve team autonomy, performance, and codebase sanity.\n\nThis talk shares the strategies we’re using — and actively evolving — to make that possible, including:\n\n* Tenant modules that define slices of the GraphQL schema alongside their implementation logic;\n* Relying on GraphQL fragments instead of service calls for inter-module communication;\n* Building ownership and attribution into the platform so teams can trace metrics and errors back to themselves.\n\nWe haven’t fully solved these challenges — but we’ve learned a lot about what works, what breaks, and what to watch for.", + "goers": "11", + "seats": "0", + "invite_only": "N", + "venue": "Studio - 5th Floor", + "audience": "Intermediate", + "geo_area": "Yes", + "id": "eb8343e5935fbfccaaacf983ef84ab49", + "venue_id": "2152809", + "speakers": [ + { + "username": "adam.miskiewicz", + "id": "23352721", + "name": "Adam Miskiewicz", + "company": "Airbnb", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "8", + "event_start_weekday": "Monday", + "event_start_weekday_short": "Mon", + "event_start_time": "17:15", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "8", + "event_end_weekday": "Monday", + "event_end_weekday_short": "Mon", + "event_end_time": "17:45", + "start_date": "2025-09-08", + "start_time": "17:15:00", + "start_time_ts": 1757344500, + "end_date": "2025-09-08", + "end_time": "17:45:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf2025/40/Avoiding%20the%20Monolith%20Trap%20-%20GraphQLConf%202025.pdf", + "name": "Avoiding the Monolith Trap - GraphQLConf 2025.pdf" + } + ], + "event_subtype": "Federation and distributed systems" + }, + { + "event_key": "894809", + "active": "Y", + "pinned": "N", + "name": "Building a Kotlin Federated GraphQL Gateway and Executor - Samuel Bernardo Vázquez Andalón, Expedia Group", + "event_start": "2025-09-08 17:15", + "event_end": "2025-09-08 17:45", + "event_type": "GraphQL in Production", + "description": "In this talk, we'll explore the design and implementation of a distributed GraphQL router built with Kotlin, leveraging graphql-java and Spring Boot.\nBy using Kotlin’s powerful scripting and DSLs, we can create a highly configurable and scalable solution that simplifies the complexity of managing distributed GraphQL APIs.", + "goers": "4", + "seats": "0", + "invite_only": "N", + "venue": "IJzaal - 5th Floor", + "audience": "Intermediate", + "geo_area": "Yes", + "id": "cb0e7d61d4055d199e7b9040617c2f88", + "venue_id": "2152806", + "speakers": [ + { + "username": "sam_2f", + "id": "23098795", + "name": "Samuel Bernardo Vázquez Andalón", + "company": "Expedia Group", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "8", + "event_start_weekday": "Monday", + "event_start_weekday_short": "Mon", + "event_start_time": "17:15", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "8", + "event_end_weekday": "Monday", + "event_end_weekday_short": "Mon", + "event_end_time": "17:45", + "start_date": "2025-09-08", + "start_time": "17:15:00", + "start_time_ts": 1757344500, + "end_date": "2025-09-08", + "end_time": "17:45:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf2025/2c/GraphQLConf-KotlinRouter.pdf", + "name": "GraphQLConf-KotlinRouter.pdf" + } + ], + "event_subtype": "Federation and distributed systems" + }, + { + "event_key": "929621", + "active": "Y", + "pinned": "N", + "name": "The Big Ideas in Relay - Jordan Eldredge, Meta", + "event_start": "2025-09-08 17:15", + "event_end": "2025-09-08 17:45", + "event_type": "GraphQL in Production", + "description": "Relay, Meta’s advanced GraphQL client for React, has many innovative capabilities not available in other clients. We will explore these capabilities, what they are, how they work, and the fundamental problems they solve: \n \n- Ensure data consistency with a normalized cache \n- Bound memory usage with user-land garbage collection \n- Avoid append-only queries by statically detecting unused fields \n- Bound JavaScript bundle size with Data Driven Dependencies \n- Build snappy, robust, mutations with rebasing optimistic updates \n- Preload code and data for any surface in just one network roundtrip with Entrypoints \n- Enable optimal data fetching without sacrificing local reasoning with Relay’s compiler \n \nAnd more!", + "goers": "5", + "seats": "0", + "invite_only": "N", + "venue": "Grote Zaal - 2nd Floor", + "audience": "Intermediate", + "geo_area": "Yes", + "id": "5d34138a7177e8a59443455e36ac1f8c", + "venue_id": "2152800", + "speakers": [ + { + "username": "jordaneldredge1", + "id": "21508644", + "name": "Jordan Eldredge", + "company": "Meta", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "8", + "event_start_weekday": "Monday", + "event_start_weekday_short": "Mon", + "event_start_time": "17:15", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "8", + "event_end_weekday": "Monday", + "event_end_weekday_short": "Mon", + "event_end_time": "17:45", + "start_date": "2025-09-08", + "start_time": "17:15:00", + "start_time_ts": 1757344500, + "end_date": "2025-09-08", + "end_time": "17:45:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf2025/69/The%20Big%20Ideas%20in%20Relay.pdf", + "name": "The Big Ideas in Relay.pdf" + } + ], + "event_subtype": "Scaling" + }, + { + "event_key": "13", + "active": "Y", + "pinned": "N", + "name": "Attendee Reception", + "event_start": "2025-09-08 17:45", + "event_end": "2025-09-08 18:45", + "event_type": "Breaks / Networking / Special Events", + "goers": "12", + "seats": "0", + "invite_only": "N", + "venue": "Foyer Grote Zaal - 2nd Floor", + "id": "a7b3192f95abd8295c126d103c3a42e5", + "venue_id": "2152803", + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "8", + "event_start_weekday": "Monday", + "event_start_weekday_short": "Mon", + "event_start_time": "17:45", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "8", + "event_end_weekday": "Monday", + "event_end_weekday_short": "Mon", + "event_end_time": "18:45", + "start_date": "2025-09-08", + "start_time": "17:45:00", + "start_time_ts": 1757346300, + "end_date": "2025-09-08", + "end_time": "18:45:00", + "event_subtype": "", + "description": "" + }, + { + "event_key": "929643", + "active": "Y", + "pinned": "N", + "name": "Cloakroom", + "event_start": "2025-09-09 08:00", + "event_end": "2025-09-09 18:00", + "event_type": "Breaks / Networking / Special Events", + "description": "SECURITY NOTICE\nPlease keep all personal belongings in your possession during the conference. GraphQL, The Linux Foundation nor the Pakhuis de Zwijger are responsible for lost or stolen items. If something is misplaced, check in with an Event Staff member at the registration desk.", + "goers": "2", + "seats": "0", + "invite_only": "N", + "venue": "K Floor - Underground Floor", + "id": "c2fd359dcbd99712bc116a0139bb4d76", + "venue_id": "2191087", + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "9", + "event_start_weekday": "Tuesday", + "event_start_weekday_short": "Tue", + "event_start_time": "08:00", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "9", + "event_end_weekday": "Tuesday", + "event_end_weekday_short": "Tue", + "event_end_time": "18:00", + "start_date": "2025-09-09", + "start_time": "08:00:00", + "start_time_ts": 1757397600, + "end_date": "2025-09-09", + "end_time": "18:00:00", + "event_subtype": "" + }, + { + "event_key": "2", + "active": "Y", + "pinned": "N", + "name": "Registration + Badge Pick-up", + "event_start": "2025-09-09 08:00", + "event_end": "2025-09-09 17:30", + "event_type": "Registration + Badge Pick-up", + "goers": "4", + "seats": "0", + "invite_only": "N", + "venue": "Foyer Grote Zaal - 2nd Floor", + "id": "c0205884be221948a39bc4af9939c675", + "venue_id": "2152803", + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "9", + "event_start_weekday": "Tuesday", + "event_start_weekday_short": "Tue", + "event_start_time": "08:00", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "9", + "event_end_weekday": "Tuesday", + "event_end_weekday_short": "Tue", + "event_end_time": "17:30", + "start_date": "2025-09-09", + "start_time": "08:00:00", + "start_time_ts": 1757397600, + "end_date": "2025-09-09", + "end_time": "17:30:00", + "event_subtype": "", + "description": "" + }, + { + "event_key": "17", + "active": "Y", + "pinned": "N", + "name": "GraphQL All Hands Meeting", + "event_start": "2025-09-09 09:00", + "event_end": "2025-09-09 10:30", + "event_type": "Breaks / Networking / Special Events", + "description": "Help shape the future of GraphQL! Join GraphQL Foundation Board Members, TSC Members, and other community leaders for a public meeting about goals and priorities for 2026, and help us celebrate 2025's wins.", + "goers": "6", + "seats": "0", + "invite_only": "N", + "venue": "IJzaal - 5th Floor", + "id": "5e4653a4e04e5b927347c0d4bce36517", + "venue_id": "2152806", + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "9", + "event_start_weekday": "Tuesday", + "event_start_weekday_short": "Tue", + "event_start_time": "09:00", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "9", + "event_end_weekday": "Tuesday", + "event_end_weekday_short": "Tue", + "event_end_time": "10:30", + "start_date": "2025-09-09", + "start_time": "09:00:00", + "start_time_ts": 1757401200, + "end_date": "2025-09-09", + "end_time": "10:30:00", + "event_subtype": "" + }, + { + "event_key": "929636", + "active": "Y", + "pinned": "N", + "name": "Solutions Showcase", + "event_start": "2025-09-09 09:00", + "event_end": "2025-09-09 17:30", + "event_type": "Solutions Showcase", + "goers": "1", + "seats": "0", + "invite_only": "N", + "venue": "Workspace - 2nd Floor", + "id": "f343bf1d5dc3d9c540336c117e84fb25", + "venue_id": "2178053", + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "9", + "event_start_weekday": "Tuesday", + "event_start_weekday_short": "Tue", + "event_start_time": "09:00", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "9", + "event_end_weekday": "Tuesday", + "event_end_weekday_short": "Tue", + "event_end_time": "17:30", + "start_date": "2025-09-09", + "start_time": "09:00:00", + "start_time_ts": 1757401200, + "end_date": "2025-09-09", + "end_time": "17:30:00", + "event_subtype": "", + "description": "" + }, + { + "event_key": "19", + "active": "Y", + "pinned": "N", + "name": "Workshop: Apollo Router & MCP: A Modern Agentic Development Approach - Michael Watson, Apollo GraphQL", + "event_start": "2025-09-09 09:00", + "event_end": "2025-09-09 10:30", + "event_type": "Workshops", + "description": "Join us for an intensive hands-on workshop where you'll build a complete e-commerce application stack, from GraphQL API to AI integration. We'll start by creating a robust GraphQL API using Apollo Router, covering schema design and federation best practices.\n\nThen we'll extend your GraphQL API with a Model Context Protocol (MCP) server, enabling structured AI data access and tool-based interactions. This allows AI assistants to query your products, manage inventory, and process orders directly through your API.This workshop emphasizes exceptional developer experience with hot-reloading capabilities across your entire stack for rapid iteration. You'll learn real-world patterns for connecting GraphQL APIs with MCP servers, handling data flow between layers, and maintaining type safety from your database to your AI tools.\n\nPrerequisites: Familiarity with GraphQL basics. Bring a laptop with Node.js installed.\n\nBy the end of this workshop, you'll be able to:
  • Configure Apollo Router to orchestrate multiple GraphQL services into a unified graph
  • Integrate microservices that extend and complement each other's capabilities
  • Build and deploy a custom GraphQL API as part of your federated graph
  • Expose any GraphQL operation as MCP tools with zero additional code, making your entire API instantly AI-accessible
  • Understand practical use cases for AI-integrated applications in modern development workflows
", + "goers": "3", + "seats": "0", + "invite_only": "N", + "venue": "Grote Zaal - 2nd Floor", + "audience": "Intermediate", + "id": "8a6e23690797787ee42c86f5799d212c", + "venue_id": "2152800", + "speakers": [ + { + "username": "watson17", + "id": "19024254", + "name": "Michael Watson", + "company": "Apollo GraphQL", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "9", + "event_start_weekday": "Tuesday", + "event_start_weekday_short": "Tue", + "event_start_time": "09:00", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "9", + "event_end_weekday": "Tuesday", + "event_end_weekday_short": "Tue", + "event_end_time": "10:30", + "start_date": "2025-09-09", + "start_time": "09:00:00", + "start_time_ts": 1757401200, + "end_date": "2025-09-09", + "end_time": "10:30:00", + "event_subtype": "" + }, + { + "event_key": "929624", + "active": "Y", + "pinned": "N", + "name": "Workshop: Social Media App \"Y\" with GraphQL, Relay, and React Server Components - Saihajpreet Singh, The Guild", + "event_start": "2025-09-09 09:00", + "event_end": "2025-09-09 10:30", + "event_type": "Workshops", + "description": "This workshop proposes the development of a demo social media application, \"Y,\" using GraphQL, Relay, and React Server Components (RSC). The goal is to showcase the powerful synergy between Relay’s declarative data fetching and RSC’s server-side rendering, creating an ideal stack for scalable, performant web applications. \n \nThe demo will highlight: \n \n- Co-location of GraphQL fragments with React components for a modular, maintainable codebase. \n- Relay’s type-safe queries to efficiently fetch data for posts, comments, and user profiles. \n- React Server Components to optimize server-side rendering and enable React streaming for progressive UI rendering. \n- A fully functional social media app with interactive, real-time features. \n \nThrough this hands-on demo, we’ll illustrate how Relay’s fragment-based architecture and RSC’s streaming capabilities allow developers to build responsive, data-driven applications. This workshop will demonstrate the potential of these technologies for modern frontend development providing a compelling case for adopting this stack in production projects.", + "goers": "6", + "seats": "0", + "invite_only": "N", + "venue": "Studio - 5th Floor", + "audience": "Any", + "geo_area": "Yes", + "id": "1ef800d68c28db994bfec011a6817fc8", + "venue_id": "2152809", + "speakers": [ + { + "username": "saihaj", + "id": "22528045", + "name": "Saihajpreet Singh", + "company": "The Guild", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "9", + "event_start_weekday": "Tuesday", + "event_start_weekday_short": "Tue", + "event_start_time": "09:00", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "9", + "event_end_weekday": "Tuesday", + "event_end_weekday_short": "Tue", + "event_end_time": "10:30", + "start_date": "2025-09-09", + "start_time": "09:00:00", + "start_time_ts": 1757401200, + "end_date": "2025-09-09", + "end_time": "10:30:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf2025/5d/saihaj-conf-workshop-2025.pdf", + "name": "saihaj-conf-workshop-2025.pdf" + } + ], + "event_subtype": "" + }, + { + "event_key": "6", + "active": "Y", + "pinned": "N", + "name": "Break", + "event_start": "2025-09-09 10:30", + "event_end": "2025-09-09 10:45", + "event_type": "Breaks / Networking / Special Events", + "goers": "9", + "seats": "0", + "invite_only": "N", + "venue": "Foyer Grote Zaal - 2nd Floor", + "id": "5c604292949899cb7ef2c8f36a86d098", + "venue_id": "2152803", + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "9", + "event_start_weekday": "Tuesday", + "event_start_weekday_short": "Tue", + "event_start_time": "10:30", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "9", + "event_end_weekday": "Tuesday", + "event_end_weekday_short": "Tue", + "event_end_time": "10:45", + "start_date": "2025-09-09", + "start_time": "10:30:00", + "start_time_ts": 1757406600, + "end_date": "2025-09-09", + "end_time": "10:45:00", + "event_subtype": "", + "description": "" + }, + { + "event_key": "927779", + "active": "Y", + "pinned": "N", + "name": "Fixing GraphQL's Biggest Mistake in 512 Bytes - Benjie Gillam, Graphile", + "event_start": "2025-09-09 10:45", + "event_end": "2025-09-09 11:25", + "event_type": "Developer Experience", + "description": "GraphQL error handling sucks. There, I said it.\n\nEver hunted through the errors list to figure out if a null was legit or caused by an error? If you're like me, you gave up and now treat nulls as \"maybe errored, maybe absent, maybe both.\"\n\nAnd nullability. Schema designers make anything that might fail nullable, producing partial responses when errors occur. But since anything can fail, now everything is nullable—\nand we're drowning in null checks. We recklessly cast to non-null or fall back to the empty string out of desperation. And we still don't know what's truly nullable.\n\nNo more.\n\nThis talk introduces a new, pragmatic approach, born from years of work by the Nullability WG. We propose a future where schemas reflect the true nullability of business entities, and error handling is where it belongs: in your code, not your data. Use your language's built-in tools to handle errors ergonomically; and drop the unnecessary null checks. When you read a null, it should mean one thing: the absence of data.\n\nThis isn't some distant ideal on the horizon of GraphQL's future; with just 512 bytes added to your GraphQL client, you can start adopting this today. Come see how.", + "goers": "13", + "seats": "0", + "invite_only": "N", + "venue": "IJzaal - 5th Floor", + "audience": "Any", + "id": "4ed67778faddda05ce0a191e525d43ee", + "venue_id": "2152806", + "speakers": [ + { + "username": "benjie3", + "id": "18743846", + "name": "Benjie Gillam", + "company": "Graphile", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "9", + "event_start_weekday": "Tuesday", + "event_start_weekday_short": "Tue", + "event_start_time": "10:45", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "9", + "event_end_weekday": "Tuesday", + "event_end_weekday_short": "Tue", + "event_end_time": "11:25", + "start_date": "2025-09-09", + "start_time": "10:45:00", + "start_time_ts": 1757407500, + "end_date": "2025-09-09", + "end_time": "11:25:00", + "event_subtype": "Frontend" + }, + { + "event_key": "26", + "active": "Y", + "pinned": "N", + "name": "Unconference: Lightning Talks", + "event_start": "2025-09-09 10:45", + "event_end": "2025-09-09 12:15", + "event_type": "Unconference", + "description": "Lightning Talks:
  • Samuel Vazquez - MCP server demo
  • Andres Ortiz - GraphQL + Neo4j graph database demo
  • Giuseppe Abrignani - GraphQL / Enterprise data modell
  • Lars de Bruijn - Quantifying graphQL Schema Health
  • Lars de Bruijn - Trusted Documents
Lightning Talk submissions & discussion thread\n\n***\n\"Unconference\" starts with U! Do you have a demo to share, an itch to scratch, lightning talk to workshop, or proposal you want to brainstorm? There's ample opportunity to bring your thoughts to the unconference table and seek or share feedback.\n\nThe unconference agenda will be created onsite - stay tuned for more info about how you can add your topics.", + "goers": "0", + "seats": "0", + "invite_only": "N", + "venue": "Studio - 5th Floor", + "audience": "Any", + "id": "b258c762df3ef4565c012424ee06727e", + "venue_id": "2152809", + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "9", + "event_start_weekday": "Tuesday", + "event_start_weekday_short": "Tue", + "event_start_time": "10:45", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "9", + "event_end_weekday": "Tuesday", + "event_end_weekday_short": "Tue", + "event_end_time": "12:15", + "start_date": "2025-09-09", + "start_time": "10:45:00", + "start_time_ts": 1757407500, + "end_date": "2025-09-09", + "end_time": "12:15:00", + "event_subtype": "" + }, + { + "event_key": "21", + "active": "Y", + "pinned": "N", + "name": "Workshop: Beyond GraphQL Federation: How We Use Composite Schemas and WebAssembly to Federate Non-GraphQL Data Sources - Benjamin Rabier & Tom Houlé, Grafbase", + "event_start": "2025-09-09 10:45", + "event_end": "2025-09-09 12:15", + "event_type": "Workshops", + "description": "In this workshop, we will look at different patterns to integrate various data sources in a federated graph using the Apollo Federation V2 spec, the Composite Schemas spec, WebAssembly with the recently released Component Model, and the Grafbase Gateway.\n\nGraphQL Federation is a fantastic pattern to combine APIs — called subgraphs — into a single schema while sharing types and declaratively depending from data from other subgraphs. In fact, it is too good to keep it to GraphQL subgraphs only — what if you could bring other kinds of APIs and data sources into your federated graph without having to write a dedicated GraphQL server in front of them?\n\nIn the course of the hands-on workshop, we will:
  • Integrate a REST API, a Postgres database and a Kafka instance using open source extensions,
  • Use the gRPC extension and the MCP server to understand, integrate and query gRPC services over GraphQL,
  • Build a new custom extension together
\nThe result will be a functioning GraphQL federated graph without GraphQL subgraphs, demonstrating that federation as a mechanism is useful beyond just GraphQL subgraphs.", + "goers": "3", + "seats": "0", + "invite_only": "N", + "venue": "Grote Zaal - 2nd Floor", + "audience": "Intermediate", + "id": "3712b5f88962e155f080a7afa612e46e", + "venue_id": "2152800", + "speakers": [ + { + "username": "benjamin154", + "id": "23098720", + "name": "Benjamin Rabier", + "company": "Grafbase", + "custom_order": 0 + }, + { + "username": "tom817", + "id": "23098807", + "name": "Tom Houlé", + "company": "Grafbase", + "custom_order": 1 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "9", + "event_start_weekday": "Tuesday", + "event_start_weekday_short": "Tue", + "event_start_time": "10:45", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "9", + "event_end_weekday": "Tuesday", + "event_end_weekday_short": "Tue", + "event_end_time": "12:15", + "start_date": "2025-09-09", + "start_time": "10:45:00", + "start_time_ts": 1757407500, + "end_date": "2025-09-09", + "end_time": "12:15:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf2025/a9/workshop-extensions-composite-schemas.pdf", + "name": "workshop-extensions-composite-schemas.pdf" + } + ], + "event_subtype": "" + }, + { + "event_key": "927134", + "active": "Y", + "pinned": "N", + "name": "Namespacing Is the Next Frontier of GraphQL Federation - Martijn Walraven, Apollo", + "event_start": "2025-09-09 11:35", + "event_end": "2025-09-09 12:15", + "event_type": "GraphQL Working Group", + "description": "Although the topic of namespacing has been brought up repeatedly in the GraphQL community over the last decade, there is an understandable worry that it would lead to anti-patterns in schema design. If namespacing is used as an excuse to avoid coordination between teams, this can result in a fragmented GraphQL schema that reflects current team boundaries as opposed to domain or client concerns.\n\nGraphQL Federation offers an alternative architecture: when coordination is enforced and consistency guaranteed, a large number of teams can contribute to a single, coherent GraphQL schema without the danger of stepping on each other's toes.\n\nEven with that architecture in place however, I believe there are still legitimate use cases for namespacing. In this talk, I will go over some of those use cases, and formulate a set of design principles that could guide the introduction of namespacing in GraphQL.", + "goers": "14", + "seats": "0", + "invite_only": "N", + "venue": "IJzaal - 5th Floor", + "audience": "Intermediate", + "id": "2bd94376bccf70783dd302222f29ca82", + "venue_id": "2152806", + "speakers": [ + { + "username": "martijn.walraven", + "id": "21066825", + "name": "Martijn Walraven", + "company": "Apollo", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "9", + "event_start_weekday": "Tuesday", + "event_start_weekday_short": "Tue", + "event_start_time": "11:35", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "9", + "event_end_weekday": "Tuesday", + "event_end_weekday_short": "Tue", + "event_end_time": "12:15", + "start_date": "2025-09-09", + "start_time": "11:35:00", + "start_time_ts": 1757410500, + "end_date": "2025-09-09", + "end_time": "12:15:00", + "event_subtype": "" + }, + { + "event_key": "11", + "active": "Y", + "pinned": "N", + "name": "Lunch - Attendees on Own or Grab-n-Go", + "event_start": "2025-09-09 12:15", + "event_end": "2025-09-09 14:15", + "event_type": "Breaks / Networking / Special Events", + "description": "Use this lunch time to go outside, visit local restaurants, and hang with your new GraphQL friends.\n\nOption 1 - Lunch restaurant guide\nOption 2 - A limited number of bag lunches will be available at the venue for you to take and either eat in the building or take outside.", + "goers": "11", + "seats": "0", + "invite_only": "N", + "id": "c792d79fcbf90eafe5aeccec4e753e2a", + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "9", + "event_start_weekday": "Tuesday", + "event_start_weekday_short": "Tue", + "event_start_time": "12:15", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "9", + "event_end_weekday": "Tuesday", + "event_end_weekday_short": "Tue", + "event_end_time": "14:15", + "start_date": "2025-09-09", + "start_time": "12:15:00", + "start_time_ts": 1757412900, + "end_date": "2025-09-09", + "end_time": "14:15:00", + "event_subtype": "" + }, + { + "event_key": "925079", + "active": "Y", + "pinned": "N", + "name": "The State of GraphQL Federation - Michael Staib, ChilliCream & Martijn Walraven, Apollo", + "event_start": "2025-09-09 14:15", + "event_end": "2025-09-09 14:55", + "event_type": "GraphQL Working Group", + "description": "The GraphQL community has come together to standardize how people can build distributed systems with GraphQL as an orchestrator. In this talk I will explain the general idea that we have for GraphQL as an Orchestrator in this space and how the new specification is tackling this. We will look at the progress we have made since last GraphQL Conf in the GraphQL composite schema working group and also get some sneak peaks at our early RFCs and prototypes. I will outline how this new specification is taking the best ideas of existing solutions in the market to make the next big leap towards mainstream adoption. This will allow anyone to build tooling by implementing the spec or parts of the spec that seamlessly integrate with other vendors.", + "goers": "10", + "seats": "0", + "invite_only": "N", + "venue": "IJzaal - 5th Floor", + "audience": "Intermediate", + "id": "534377045b9341cbcbb1098699294f99", + "venue_id": "2152806", + "speakers": [ + { + "username": "michael_staib.23xujj9p", + "id": "14900031", + "name": "Michael Staib", + "company": "ChilliCream", + "custom_order": 0 + }, + { + "username": "martijn.walraven", + "id": "21066825", + "name": "Martijn Walraven", + "company": "Apollo", + "custom_order": 1 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "9", + "event_start_weekday": "Tuesday", + "event_start_weekday_short": "Tue", + "event_start_time": "14:15", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "9", + "event_end_weekday": "Tuesday", + "event_end_weekday_short": "Tue", + "event_end_time": "14:55", + "start_date": "2025-09-09", + "start_time": "14:15:00", + "start_time_ts": 1757420100, + "end_date": "2025-09-09", + "end_time": "14:55:00", + "event_subtype": "" + }, + { + "event_key": "929640", + "active": "Y", + "pinned": "N", + "name": "Unconference", + "event_start": "2025-09-09 14:15", + "event_end": "2025-09-09 15:45", + "event_type": "Unconference", + "description": "\"Unconference\" starts with U! Do you have a demo to share, an itch to scratch, lightning talk to workshop, or proposal you want to brainstorm? There's ample opportunity to bring your thoughts to the unconference table and seek or share feedback.\n\nThe unconference agenda will be created onsite - stay tuned for more info about how you can add your topics.", + "goers": "4", + "seats": "0", + "invite_only": "N", + "venue": "Studio - 5th Floor", + "audience": "Any", + "id": "c72212216fc978651151148101346f18", + "venue_id": "2152809", + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "9", + "event_start_weekday": "Tuesday", + "event_start_weekday_short": "Tue", + "event_start_time": "14:15", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "9", + "event_end_weekday": "Tuesday", + "event_end_weekday_short": "Tue", + "event_end_time": "15:45", + "start_date": "2025-09-09", + "start_time": "14:15:00", + "start_time_ts": 1757420100, + "end_date": "2025-09-09", + "end_time": "15:45:00", + "event_subtype": "" + }, + { + "event_key": "20", + "active": "Y", + "pinned": "N", + "name": "Workshop: Unleash the Power of Federation with Hive Gateway - Denis Badurina & Arda Tanrıkulu, The Guild", + "event_start": "2025-09-09 14:15", + "event_end": "2025-09-09 15:45", + "event_type": "Workshops", + "description": "Unleash the Power of Federation with Hive Gateway Discover the possibilities of your GraphQL APIs! Learn how to use GraphQL Federation to unite various services and get to know Hive Gateway, an open-source GraphQL router. During this practical exercise, you will configure a simple federated gateway and execute queries across merged schemas. Discover important features such as built-in monitoring with OpenTelemetry, automatic query batching for optimal efficiency, strong security choices like JWT authentication and rate limiting, and GraphQL Subscriptions for real-time data. Find out for yourself how Hive Gateway makes it easier to create scalable and maintainable GraphQL.", + "goers": "7", + "seats": "0", + "invite_only": "N", + "venue": "Grote Zaal - 2nd Floor", + "audience": "Intermediate", + "id": "6fbc71a3ad13189339d753cb078ec781", + "venue_id": "2152800", + "speakers": [ + { + "username": "badurinadenis", + "id": "18743810", + "name": "Denis Badurina", + "company": "The Guild", + "custom_order": 0 + }, + { + "username": "ardatanrikulu", + "id": "18982310", + "name": "Arda Tanrıkulu", + "company": "The Guild", + "custom_order": 1 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "9", + "event_start_weekday": "Tuesday", + "event_start_weekday_short": "Tue", + "event_start_time": "14:15", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "9", + "event_end_weekday": "Tuesday", + "event_end_weekday_short": "Tue", + "event_end_time": "15:45", + "start_date": "2025-09-09", + "start_time": "14:15:00", + "start_time_ts": 1757420100, + "end_date": "2025-09-09", + "end_time": "15:45:00", + "event_subtype": "" + }, + { + "event_key": "925101", + "active": "Y", + "pinned": "N", + "name": "The State of GraphQL Open Telemetry - Pascal Senn, ChilliCream", + "event_start": "2025-09-09 15:05", + "event_end": "2025-09-09 15:45", + "event_type": "GraphQL Working Group", + "description": "Curious about how observability is evolving in the GraphQL ecosystem? This session explores the current state of OpenTelemetry and its integration with GraphQL. We'll cover the fundamentals of OpenTelemetry, introduce the OpenTelemetry working group (https://github.com/graphql/otel-wg), and dive into tracing, logging, and metrics - all essential pillars of observability. You'll also learn how OpenTelemetry is being applied in distributed GraphQL architectures to improve performance monitoring and troubleshooting across services. Whether you're new to observability or looking to level up your GraphQL stack, this talk will bring you up to speed on where the community is heading.", + "goers": "13", + "seats": "0", + "invite_only": "N", + "venue": "IJzaal - 5th Floor", + "audience": "Intermediate", + "id": "01ac876254b68e3c824f6d7e077ef654", + "venue_id": "2152806", + "speakers": [ + { + "username": "pascal.senn", + "id": "21066839", + "name": "Pascal Senn", + "company": "ChilliCream", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "9", + "event_start_weekday": "Tuesday", + "event_start_weekday_short": "Tue", + "event_start_time": "15:05", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "9", + "event_end_weekday": "Tuesday", + "event_end_weekday_short": "Tue", + "event_end_time": "15:45", + "start_date": "2025-09-09", + "start_time": "15:05:00", + "start_time_ts": 1757423100, + "end_date": "2025-09-09", + "end_time": "15:45:00", + "event_subtype": "" + }, + { + "event_key": "7", + "active": "Y", + "pinned": "N", + "name": "Break", + "event_start": "2025-09-09 15:45", + "event_end": "2025-09-09 16:00", + "event_type": "Breaks / Networking / Special Events", + "goers": "10", + "seats": "0", + "invite_only": "N", + "venue": "Foyer Grote Zaal - 2nd Floor", + "id": "beef68627af8441ecda3c744db096f49", + "venue_id": "2152803", + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "9", + "event_start_weekday": "Tuesday", + "event_start_weekday_short": "Tue", + "event_start_time": "15:45", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "9", + "event_end_weekday": "Tuesday", + "event_end_weekday_short": "Tue", + "event_end_time": "16:00", + "start_date": "2025-09-09", + "start_time": "15:45:00", + "start_time_ts": 1757425500, + "end_date": "2025-09-09", + "end_time": "16:00:00", + "event_subtype": "", + "description": "" + }, + { + "event_key": "922927", + "active": "Y", + "pinned": "N", + "name": "Lower Latency With Streaming GraphQL - Rob Richard, 1stDibs", + "event_start": "2025-09-09 16:00", + "event_end": "2025-09-09 16:40", + "event_type": "GraphQL Working Group", + "description": "Learn how to lower latency in your applications by streaming your GraphQL responses using the @defer and @stream directives. Learn the trade-offs of when to use these new directives and how they differ from GraphQL Subscriptions.\n\n@defer and @stream have been in development for some time now and have gone through many iterations. Learn about the motivation behind these changes and how they will lead to scalable GraphQL servers and efficient clients.", + "goers": "9", + "seats": "0", + "invite_only": "N", + "venue": "IJzaal - 5th Floor", + "audience": "Intermediate", + "id": "7774f5b0afdc94f922694d15a5593dfc", + "venue_id": "2152806", + "speakers": [ + { + "username": "robrichard87", + "id": "21066852", + "name": "Rob Richard", + "company": "1stDibs", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "9", + "event_start_weekday": "Tuesday", + "event_start_weekday_short": "Tue", + "event_start_time": "16:00", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "9", + "event_end_weekday": "Tuesday", + "event_end_weekday_short": "Tue", + "event_end_time": "16:40", + "start_date": "2025-09-09", + "start_time": "16:00:00", + "start_time_ts": 1757426400, + "end_date": "2025-09-09", + "end_time": "16:40:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf2025/a8/Defer%20and%20Stream%20GraphQL%20Conf%202025.pdf", + "name": "Defer and Stream GraphQL Conf 2025.pdf" + } + ], + "event_subtype": "" + }, + { + "event_key": "27", + "active": "Y", + "pinned": "N", + "name": "Unconference", + "event_start": "2025-09-09 16:00", + "event_end": "2025-09-09 17:30", + "event_type": "Unconference", + "description": "\"Unconference\" starts with U! Do you have a demo to share, an itch to scratch, lightning talk to workshop, or proposal you want to brainstorm? There's ample opportunity to bring your thoughts to the unconference table and seek or share feedback.\n\nThe unconference agenda will be created onsite - stay tuned for more info about how you can add your topics.", + "goers": "2", + "seats": "0", + "invite_only": "N", + "venue": "Studio - 5th Floor", + "audience": "Any", + "id": "0518875a37f944a72fce2c0a20d1188b", + "venue_id": "2152809", + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "9", + "event_start_weekday": "Tuesday", + "event_start_weekday_short": "Tue", + "event_start_time": "16:00", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "9", + "event_end_weekday": "Tuesday", + "event_end_weekday_short": "Tue", + "event_end_time": "17:30", + "start_date": "2025-09-09", + "start_time": "16:00:00", + "start_time_ts": 1757426400, + "end_date": "2025-09-09", + "end_time": "17:30:00", + "event_subtype": "" + }, + { + "event_key": "24", + "active": "Y", + "pinned": "N", + "name": "Workshop: Composite Schemas in Action - Michael Staib, Chillicream", + "event_start": "2025-09-09 16:00", + "event_end": "2025-09-09 17:30", + "event_type": "Workshops", + "description": "GraphQL is evolving — and with the new Composite Schema Specification, building distributed GraphQL systems has never been more standardized, flexible, and interoperable.\n\nIn this workshop, we'll dive into the core principles behind the Composite Schema Specification and demonstrate how they enable modular, scalable GraphQL architectures across teams and services. Whether you're coming from Node.js, Java, .NET, or any other stack — this specification is designed to work with you, not against you.\n\nAt the heart of this new standard is a powerful idea: composing GraphQL APIs in a strongly typed way. No more hidden fields. No more untyped extensions or brittle conventions.\n\nYou'll learn how to:\n
  • Design and build a distributed GraphQL system using the Composite Schema Specification
  • Compose services with clear ownership and type-safe contracts
  • Evolve your composite schema over time without breaking a sweat
  • Solve real-world challenges like shared types, or auth propagation
  • Operate composed schemas with observability, continuous integration, and confidence
\nWhether you're building from scratch or evolving an existing monolith, this workshop will equip you with the tools and mental models to harness composition — the right way.", + "goers": "5", + "seats": "0", + "invite_only": "N", + "venue": "Grote Zaal - 2nd Floor", + "audience": "Intermediate", + "id": "3b8701f24da2cf5456ffd5b793836ace", + "venue_id": "2152800", + "speakers": [ + { + "username": "michael_staib.23xujj9p", + "id": "14900031", + "name": "Michael Staib", + "company": "ChilliCream", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "9", + "event_start_weekday": "Tuesday", + "event_start_weekday_short": "Tue", + "event_start_time": "16:00", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "9", + "event_end_weekday": "Tuesday", + "event_end_weekday_short": "Tue", + "event_end_time": "17:30", + "start_date": "2025-09-09", + "start_time": "16:00:00", + "start_time_ts": 1757426400, + "end_date": "2025-09-09", + "end_time": "17:30:00", + "event_subtype": "" + }, + { + "event_key": "929629", + "active": "Y", + "pinned": "N", + "name": "Working Group Discussion Tables", + "event_start": "2025-09-09 16:50", + "event_end": "2025-09-09 17:30", + "event_type": "GraphQL Working Group", + "description": "This session is an opportunity for working group members to discuss the topics raised in the working group talks earlier in the day, and brainstorm ideas for moving forward.", + "goers": "7", + "seats": "0", + "invite_only": "N", + "venue": "IJzaal - 5th Floor", + "audience": "Any", + "id": "b11d2fe5c7b8940023f98e6a7ddb372b", + "venue_id": "2152806", + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "9", + "event_start_weekday": "Tuesday", + "event_start_weekday_short": "Tue", + "event_start_time": "16:50", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "9", + "event_end_weekday": "Tuesday", + "event_end_weekday_short": "Tue", + "event_end_time": "17:30", + "start_date": "2025-09-09", + "start_time": "16:50:00", + "start_time_ts": 1757429400, + "end_date": "2025-09-09", + "end_time": "17:30:00", + "event_subtype": "" + }, + { + "event_key": "929644", + "active": "Y", + "pinned": "N", + "name": "Cloakroom", + "event_start": "2025-09-10 08:00", + "event_end": "2025-09-10 17:30", + "event_type": "Breaks / Networking / Special Events", + "description": "SECURITY NOTICE\nPlease keep all personal belongings in your possession during the conference. GraphQL, The Linux Foundation nor the Pakhuis de Zwijger are responsible for lost or stolen items. If something is misplaced, check in with an Event Staff member at the registration desk.", + "goers": "3", + "seats": "0", + "invite_only": "N", + "venue": "K Floor - Underground Floor", + "id": "ec905b832dfbb9b0dc7445305f188cbc", + "venue_id": "2191087", + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "08:00", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "17:30", + "start_date": "2025-09-10", + "start_time": "08:00:00", + "start_time_ts": 1757484000, + "end_date": "2025-09-10", + "end_time": "17:30:00", + "event_subtype": "" + }, + { + "event_key": "3", + "active": "Y", + "pinned": "N", + "name": "Registration + Badge Pick-up", + "event_start": "2025-09-10 08:00", + "event_end": "2025-09-10 17:00", + "event_type": "Registration + Badge Pick-up", + "goers": "4", + "seats": "0", + "invite_only": "N", + "venue": "Foyer Grote Zaal - 2nd Floor", + "id": "684f3f2c57d94cc9ad1e3bba980712ec", + "venue_id": "2152803", + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "08:00", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "17:00", + "start_date": "2025-09-10", + "start_time": "08:00:00", + "start_time_ts": 1757484000, + "end_date": "2025-09-10", + "end_time": "17:00:00", + "event_subtype": "", + "description": "" + }, + { + "event_key": "929630", + "active": "Y", + "pinned": "N", + "name": "Lightning Talk: Hello Graffle! A Modular Type Safe GraphQL Client - Jason Kuhrt, The Guild", + "event_start": "2025-09-10 09:00", + "event_end": "2025-09-10 09:10", + "event_type": "Developer Experience", + "description": "Over the past year I have been evolving graphql-request into Graffle, a modular type safe GraphQL Client. Most of its features are realized as plugins so much so that it actually has fewer capabilities than graphql-request at its core! Graffle initially grew out of my desire to have a JS GraphQL client with a fully featured and type safe document builder which I couldn’t get from tools like GenQL or Zeus at the time.\n\nGraffle is still a mostly unknown work in progress but I am ready to begin talking about it and already some early adopters have taken to giving regular feedback. I think GraphQL can benefit from strengthened integrations with TypeScript. My past work on Nexus underscores that belief and I've been happy to see more recent tools enter the space like Pothos.", + "goers": "6", + "seats": "0", + "invite_only": "N", + "venue": "IJzaal - 5th Floor", + "audience": "Any", + "id": "ce3c04db5c598ba5451fcd71df4849ee", + "venue_id": "2152806", + "speakers": [ + { + "username": "jasonkuhrt", + "id": "23098756", + "name": "Jason Kuhrt", + "company": "The Guild", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "09:00", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "09:10", + "start_date": "2025-09-10", + "start_time": "09:00:00", + "start_time_ts": 1757487600, + "end_date": "2025-09-10", + "end_time": "09:10:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf2025/ab/hello-graffle.pdf", + "name": "hello-graffle.pdf" + } + ], + "event_subtype": "Backend" + }, + { + "event_key": "914113", + "active": "Y", + "pinned": "N", + "name": "From Hobby Project To Industry Standard: Lessons From 10 Years of GraphQL Java - Donna Zhou & Andreas Marek, Atlassian", + "event_start": "2025-09-10 09:00", + "event_end": "2025-09-10 09:30", + "event_type": "GraphQL in Production", + "description": "What started as a single developer's passion project now powers mission-critical APIs for tech giants like Twitter/X, Netflix, Amazon, AirBnB, and Atlassian. As the engine behind Spring for GraphQL and with over 2.2 million monthly downloads, GraphQL Java has become the Java implementation of GraphQL.\n\nHow does a volunteer-driven open source project not just survive, but thrive for a decade? In this talk, we'll share the crucial technical decisions and community building strategies that transformed a hobby project into an industry standard. We'll share how we fostered contributions from over 250 volunteers while maintaining high code quality and project momentum. You'll walk away with actionable insights to help you lead any software project, whether it's open source or enterprise.\n\nAbout the speakers: we are the maintainers of GraphQL Java, who have guided the project from its first commit to becoming the industry standard.", + "goers": "9", + "seats": "0", + "invite_only": "N", + "venue": "Grote Zaal - 2nd Floor", + "audience": "Any", + "id": "3cfd3578b6acb121870ddcc96b69543e", + "venue_id": "2152800", + "speakers": [ + { + "username": "donnasiqizhou", + "id": "18743879", + "name": "Donna Zhou", + "company": "Atlassian", + "custom_order": 0 + }, + { + "username": "andreas.marek1", + "id": "21066795", + "name": "Andreas Marek", + "company": "Atlassian", + "custom_order": 1 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "09:00", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "09:30", + "start_date": "2025-09-10", + "start_time": "09:00:00", + "start_time_ts": 1757487600, + "end_date": "2025-09-10", + "end_time": "09:30:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf2025/ee/GraphQLConf_GraphQLJava.pdf", + "name": "GraphQLConf_GraphQLJava.pdf" + } + ], + "event_subtype": "Case studies" + }, + { + "event_key": "929639", + "active": "Y", + "pinned": "N", + "name": "Hacking the Federation Query Planner - Mark Larah, Yelp", + "event_start": "2025-09-10 09:00", + "event_end": "2025-09-10 09:30", + "event_type": "GraphQL in Production", + "description": "Hacking the Federation Query Planner Federation allows concurrent execution across services - but there’s an edge case! And when it occurs, it’s a big performance problem and potentially very hard to solve.\n\nThis talk showcases an edge case we ran into at Yelp, how we solved it in the short term, and the what the long term spec changes are (specifically within the Composite Schemas spec).", + "goers": "6", + "seats": "0", + "invite_only": "N", + "venue": "Studio - 5th Floor", + "audience": "Any", + "id": "806eaa5ecdc05b0c0f01165c7980b4a6", + "venue_id": "2152809", + "speakers": [ + { + "username": "mark1437", + "id": "23416744", + "name": "Mark Larah", + "company": "Yelp", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "09:00", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "09:30", + "start_date": "2025-09-10", + "start_time": "09:00:00", + "start_time_ts": 1757487600, + "end_date": "2025-09-10", + "end_time": "09:30:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf2025/ca/GraphQL%20Conf%202025_%20Hacking%20the%20Federation%20Query%20Planner.pdf", + "name": "GraphQL Conf 2025_ Hacking the Federation Query Planner.pdf" + } + ], + "event_subtype": "Federation and distributed systems" + }, + { + "event_key": "929635", + "active": "Y", + "pinned": "N", + "name": "Solutions Showcase", + "event_start": "2025-09-10 09:00", + "event_end": "2025-09-10 16:00", + "event_type": "Solutions Showcase", + "goers": "2", + "seats": "0", + "invite_only": "N", + "venue": "Workspace - 2nd Floor", + "id": "f2d3f4845e1a0d30aebf38a2b6595824", + "venue_id": "2178053", + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "09:00", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "16:00", + "start_date": "2025-09-10", + "start_time": "09:00:00", + "start_time_ts": 1757487600, + "end_date": "2025-09-10", + "end_time": "16:00:00", + "event_subtype": "", + "description": "" + }, + { + "event_key": "929204", + "active": "Y", + "pinned": "N", + "name": "Lightning Talk: What If GraphQL Knew Accessibility? - Vanessa Johnson, The New York Times", + "event_start": "2025-09-10 09:20", + "event_end": "2025-09-10 09:30", + "event_type": "Developer Experience", + "description": "What if your GraphQL schema could do more than provide data? What if it could help your app be more accessible from the start? In this lightning talk, we'll explore an innovative idea of embedding accessibility metadata directly into GraphQL schemas. Inspired by using Kotlin semantics in Jetpack Compose, imagine annotating fields with labels, roles, or screen reader hints that can be used to support screen readers, improve navigation, and even power automated accessibility testing. By adding custom accessibility annotations, tools could generate more accessible UI components, which enhances both the developer experience and the user experience. This is a call to rethink the developer experience and treat accessibility as a first-class concern. Let's reimagine GraphQL not just as a data layer, but as an inclusive design enabler.", + "goers": "9", + "seats": "0", + "invite_only": "N", + "venue": "IJzaal - 5th Floor", + "audience": "Intermediate", + "id": "87264d07e7aaafb1811ba5ad451285a2", + "venue_id": "2152806", + "speakers": [ + { + "username": "vmjohnson999", + "id": "23098810", + "name": "Vanessa Johnson", + "company": "The New York Times", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "09:20", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "09:30", + "start_date": "2025-09-10", + "start_time": "09:20:00", + "start_time_ts": 1757488800, + "end_date": "2025-09-10", + "end_time": "09:30:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf2025/35/What%20if%20GraphQL%20Knew%20Accessbility?.pdf", + "name": "What if GraphQL Knew Accessbility?.pdf" + } + ], + "event_subtype": "Patterns and community trends" + }, + { + "event_key": "929622", + "active": "Y", + "pinned": "N", + "name": "Grats: Bringing Implementation-First GraphQL to TypeScript - Jordan Eldredge, Meta", + "event_start": "2025-09-10 09:40", + "event_end": "2025-09-10 10:10", + "event_type": "Developer Experience", + "description": "We will explore the novel static analysis approach used by Grats to enable a true implementation-first developer experience for building GraphQL servers in TypeScript. \n \nIf you are interested in compilers, type systems, static analysis and developer experience, this talk is for you!", + "goers": "5", + "seats": "0", + "invite_only": "N", + "venue": "Grote Zaal - 2nd Floor", + "audience": "Advanced", + "id": "e9075771b5513faaf06cca527e7a837d", + "venue_id": "2152800", + "speakers": [ + { + "username": "jordaneldredge1", + "id": "21508644", + "name": "Jordan Eldredge", + "company": "Meta", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "09:40", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "10:10", + "start_date": "2025-09-10", + "start_time": "09:40:00", + "start_time_ts": 1757490000, + "end_date": "2025-09-10", + "end_time": "10:10:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf2025/64/Grats.pdf", + "name": "Grats.pdf" + } + ], + "event_subtype": "Backend" + }, + { + "event_key": "925025", + "active": "Y", + "pinned": "N", + "name": "One API Definition To Rule Them All: Generating GraphQL Schemas From TypeSpec - Fiona Huang, Pinterest", + "event_start": "2025-09-10 09:40", + "event_end": "2025-09-10 10:10", + "event_type": "Developer Experience", + "description": "Managing separate API definitions for REST and GraphQL APIs that serve the same underlying data can be inefficient and lead to duplicated efforts. At Pinterest, we are streamlining our API definitions and unifying our data models with TypeSpec. TypeSpec allows us to define our API shapes once and generate API schemas in multiple forms such as OpenAPI, Protobuf, and now GraphQL!\n \nWe’ve developed an open-source TypeSpec GraphQL Emitter which generates valid GraphQL schemas directly from TypeSpec definitions.\n \nJoin us for an overview of how TypeSpec and the GraphQL Emitter can streamline your API workflow. We'll explore:\n \n* How TypeSpec's unified definition approach accelerates development across multiple API specs\n* The inner workings of our open-source GraphQL Emitter\n* Our wins and lessons learned while building the GraphQL Emitter\n \nThis talk will be perfect for anyone interested in GraphQL schema generation, unified API definitions, and vague Lord of the Rings references! See you there!", + "goers": "8", + "seats": "0", + "invite_only": "N", + "venue": "IJzaal - 5th Floor", + "audience": "Any", + "id": "0843f99870a32c08d091379a43d0c224", + "venue_id": "2152806", + "speakers": [ + { + "username": "fionabronwen", + "id": "23098747", + "name": "Fiona Huang", + "company": "Pinterest", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "09:40", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "10:10", + "start_date": "2025-09-10", + "start_time": "09:40:00", + "start_time_ts": 1757490000, + "end_date": "2025-09-10", + "end_time": "10:10:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf2025/be/GraphQL%20Conf%202025%20-%20One%20API%20Definition%20To%20Rule%20Them%20All.pdf", + "name": "GraphQL Conf 2025 - One API Definition To Rule Them All.pdf" + } + ], + "event_subtype": "Patterns and community trends" + }, + { + "event_key": "913037", + "active": "Y", + "pinned": "N", + "name": "Local Data Consistency With GraphQL - Sabrina Wasserman, Meta", + "event_start": "2025-09-10 09:40", + "event_end": "2025-09-10 10:10", + "event_type": "GraphQL in Production", + "description": "Have you ever wondered how GraphQL clients like Relay keep local data consistent across surfaces, ensuring that changes made within a session are seamlessly reflected across an application? In this talk, I'll delve into the concept of Local Data Consistency and explore how GraphQL clients at Meta, such as Relay, efficiently track and update changing GraphQL data locally, without introducing additional networking dependencies, and the UX benefits and features this unlocks.\n\nSpecifically, I’ll cover:\n- What even is Local Data Consistency, and why is it valuable to product developers?\n- How do you implement a data consistency engine from scratch?\n- How are advanced client-side features like offline mutation updates, asynchronous GraphQL request fetching, and more all made possible using a Local Data Consistency?", + "goers": "10", + "seats": "0", + "invite_only": "N", + "venue": "Studio - 5th Floor", + "audience": "Advanced", + "id": "c14c567785a5bebf241630d57eaababd", + "venue_id": "2152809", + "speakers": [ + { + "username": "sabrina.wasserman", + "id": "21066857", + "name": "Sabrina Wasserman", + "company": "Meta", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "09:40", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "10:10", + "start_date": "2025-09-10", + "start_time": "09:40:00", + "start_time_ts": 1757490000, + "end_date": "2025-09-10", + "end_time": "10:10:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf2025/c5/Local%20Data%20Consistency%20With%20GraphQL%20SW.pdf", + "name": "Local Data Consistency With GraphQL SW.pdf" + } + ], + "event_subtype": "Case studies" + }, + { + "event_key": "925146", + "active": "Y", + "pinned": "N", + "name": "From Data Loaders To Batch Resolvers - Aileen Chen, Airbnb", + "event_start": "2025-09-10 10:20", + "event_end": "2025-09-10 10:50", + "event_type": "Developer Experience", + "description": "In theory, data loaders solve most \"N+1\" problems in GraphQL. In practice, they can be hard to implement, so they’re typically used only in performance-critical situations and often reactively, once inefficiencies surface. To achieve better performance, batching needs to be applied wherever possible.\n \nThis talk introduces batch resolvers, a more developer-friendly alternative to data loaders. While traditional GraphQL resolvers take a single input and produce a single output, batching resolvers take a list of inputs and return a list of outputs. A batch resolver can simply call a batch service API without worrying about data loaders.\n \nWhen a developer provides a batch resolver, our GraphQL server automatically aggregates individual data fetches into a single call to that resolver. It can also apply heuristics to improve aggregation, for example by consolidating different selection sets for the same entity into a single input. This design not only makes application developers’ lives easier, but also allows the server to better optimize query execution by coordinating batch dispatching as part of a broader execution strategy.", + "goers": "17", + "seats": "0", + "invite_only": "N", + "venue": "IJzaal - 5th Floor", + "audience": "Intermediate", + "id": "77fa615db3eebcfe0063c0535e2fe972", + "venue_id": "2152806", + "speakers": [ + { + "username": "aileen.chen", + "id": "23098708", + "name": "Aileen Chen", + "company": "Airbnb", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "10:20", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "10:50", + "start_date": "2025-09-10", + "start_time": "10:20:00", + "start_time_ts": 1757492400, + "end_date": "2025-09-10", + "end_time": "10:50:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf2025/8c/batchresolvers.pdf", + "name": "batchresolvers.pdf" + } + ], + "event_subtype": "Backend" + }, + { + "event_key": "924215", + "active": "Y", + "pinned": "N", + "name": "Lightning Talk: Next-Generation GraphQL Cache Management in Your Android and iOS Apps - Benoit Lubek, Apollo GraphQL", + "event_start": "2025-09-10 10:20", + "event_end": "2025-09-10 10:30", + "event_type": "Developer Experience", + "description": "Effective caching is essential for building fast, resilient mobile apps especially when aiming for offline-first experiences. Apollo Kotlin and Apollo iOS offer a powerful Normalized Cache component tailored to GraphQL. In this lightning talk, we’ll showcase the latest advancements in both libraries, including support for pagination, cache expiration, and other new features designed to simplify and supercharge cache management on mobile.", + "goers": "2", + "seats": "0", + "invite_only": "N", + "venue": "Grote Zaal - 2nd Floor", + "audience": "Intermediate", + "id": "a0e2a06e7fa0578e1b252beef517aef2", + "venue_id": "2152800", + "speakers": [ + { + "username": "BoD", + "id": "431358", + "name": "Benoit Lubek", + "company": "Apollo Graph", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "10:20", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "10:30", + "start_date": "2025-09-10", + "start_time": "10:20:00", + "start_time_ts": 1757492400, + "end_date": "2025-09-10", + "end_time": "10:30:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf2025/d2/GraphQL%20Conf%202025_%20Next-generation%20GraphQL%20cache%20for%20your%20mobile%20apps.pdf", + "name": "GraphQL Conf 2025_ Next-generation GraphQL cache for your mobile apps.pdf" + } + ], + "event_subtype": "Frontend" + }, + { + "event_key": "924155", + "active": "Y", + "pinned": "N", + "name": "Rebuilding Buffer's Public API - Amanda Marochko & Joe Birch, Buffer", + "event_start": "2025-09-10 10:20", + "event_end": "2025-09-10 10:50", + "event_type": "GraphQL in Production", + "description": "Buffer’s Public API has long enabled developers to build tools that amplify the power of social media management. However, as the landscape of social platforms and developer needs has evolved, so too have the requirements for a robust, secure, and developer-friendly API. In this talk, we'll share our journey as we rebuild Buffer’s public API from the ground up, embracing modern GraphQL principles and best practices.\n \nAttendees will get an inside look at our design decisions, from intuitive schema design to robust authentication, and how we’re ensuring a smooth migration path for existing users. We’ll explore how we’re balancing the needs of our developer community with evolving platform policies and technical constraints.", + "goers": "1", + "seats": "0", + "invite_only": "N", + "venue": "Studio - 5th Floor", + "audience": "Any", + "id": "e6262da79f7c90fd01a2a13570d6b6bc", + "venue_id": "2152809", + "speakers": [ + { + "username": "amanda1988", + "id": "23098711", + "name": "Amanda Marochko", + "company": "Buffer", + "custom_order": 0 + }, + { + "username": "joebirch", + "id": "23098765", + "name": "Joe Birch", + "company": "Buffer", + "custom_order": 1 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "10:20", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "10:50", + "start_date": "2025-09-10", + "start_time": "10:20:00", + "start_time_ts": 1757492400, + "end_date": "2025-09-10", + "end_time": "10:50:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf2025/1f/GraphQLConf%202025.pdf", + "name": "GraphQLConf 2025.pdf" + } + ], + "event_subtype": "Case studies" + }, + { + "event_key": "898726", + "active": "Y", + "pinned": "N", + "name": "Lightning Talk: GraphQL Caching Lightning Talk - Emily Goodwin, Independent", + "event_start": "2025-09-10 10:40", + "event_end": "2025-09-10 10:50", + "event_type": "GraphQL in Production", + "description": "GraphQL provides flexibility in fetching data but this can prove challenging for caching. In this talk I cover the basics of caching in GraphQL such as layers you can cache at a high level. Layers such as the CDN, client side, server side, and database are touched upon with solutions from the community. The talk will also cover when to use each layer and what statistics to look at for improvement. I talk about how caching at multiple layers provides the best experience for the end user. By the end of this talk beginners will have a path forward to how they can cache at different layers for better performance.", + "goers": "11", + "seats": "0", + "invite_only": "N", + "venue": "Grote Zaal - 2nd Floor", + "audience": "Beginner", + "id": "af87438a9b7238f69626d9e1ce57f088", + "venue_id": "2152800", + "speakers": [ + { + "username": "goodwin.y.emily", + "id": "23098741", + "name": "Emily Goodwin", + "company": "Independent", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "10:40", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "10:50", + "start_date": "2025-09-10", + "start_time": "10:40:00", + "start_time_ts": 1757493600, + "end_date": "2025-09-10", + "end_time": "10:50:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf2025/55/IntroToCaching_Graphql2025.pdf", + "name": "IntroToCaching_Graphql2025.pdf" + } + ], + "event_subtype": "Scaling" + }, + { + "event_key": "8", + "active": "Y", + "pinned": "N", + "name": "Break", + "event_start": "2025-09-10 10:50", + "event_end": "2025-09-10 11:15", + "event_type": "Breaks / Networking / Special Events", + "goers": "11", + "seats": "0", + "invite_only": "N", + "venue": "Foyer Grote Zaal - 2nd Floor", + "id": "7a2a2ad935e2f7ac1801b3b17e322d74", + "venue_id": "2152803", + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "10:50", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "11:15", + "start_date": "2025-09-10", + "start_time": "10:50:00", + "start_time_ts": 1757494200, + "end_date": "2025-09-10", + "end_time": "11:15:00", + "event_subtype": "", + "description": "" + }, + { + "event_key": "925047", + "active": "Y", + "pinned": "N", + "name": "Imagining the Future of GraphQL Documentation Tooling - Jason Kuhrt, The Guild", + "event_start": "2025-09-10 11:15", + "event_end": "2025-09-10 11:45", + "event_type": "Developer Experience", + "description": "There are many aspects to consider when building a GraphQL API: Authentication, authorization, performance, schema design, and team workflow to name a few. Each aspect encompasses considerations, practices, and tools (or lack thereof). One aspect, documentation, can be easily neglected. This year at The Guild I spent time exploring that domain and prototyping an open source tool we’re calling Polen.\n\nI will present our thoughts on what characteristics and features we’d like to have from GraphQL documentation tooling and finish with a demo of how Polen tackled some of those things. I hope this session stimulates your own thinking about what documentation tools should include and tangible technical steps we might take to get there.", + "goers": "5", + "seats": "0", + "invite_only": "N", + "venue": "Grote Zaal - 2nd Floor", + "audience": "Any", + "id": "6c9b846e538e001af3db938d771d1178", + "venue_id": "2152800", + "speakers": [ + { + "username": "jasonkuhrt", + "id": "23098756", + "name": "Jason Kuhrt", + "company": "The Guild", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "11:15", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "11:45", + "start_date": "2025-09-10", + "start_time": "11:15:00", + "start_time_ts": 1757495700, + "end_date": "2025-09-10", + "end_time": "11:45:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf2025/69/imagining%20futures%20of%20graphql%20tooling.pdf", + "name": "imagining futures of graphql tooling.pdf" + } + ], + "event_subtype": "Documentation" + }, + { + "event_key": "924207", + "active": "Y", + "pinned": "N", + "name": "Deep Dive Into a GraphQL Federation Gateway, From Query Planning To the Execution - Benjamin Rabier, Grafbase", + "event_start": "2025-09-10 11:15", + "event_end": "2025-09-10 11:45", + "event_type": "GraphQL in Production", + "description": "Traditional GraphQL servers execute queries field by field with a depth-first algorithm as defined in the GraphQL specification. In contrast, GraphQL federation gateways need to partition the query and retrieve chunks of data from external data sources, creating new challenges. We'll present how we solved those challenges with a focus on performance.\n \nThe first, query planning, is to find the best possible plan with the multiple possibilities federation offers to unify your data and the various data sources with their requirements. We express this problem as a graph of possibilities and solve it as a Steiner Tree problem. The second challenge is performant execution. As we need to read and write overlapping chunks of the response in parallel, it's hard to be as efficient as a traditional GraphQL server writing a response iteratively with independent fields. We build an execution DAG with field dependencies, parallelizing work as much as possible without any lock on the response. We also pre-compute the expected data shape to ingest and validate incoming data into the response without any intermediate memory allocation.", + "goers": "4", + "seats": "0", + "invite_only": "N", + "venue": "Studio - 5th Floor", + "audience": "Intermediate", + "id": "d017baa3d96bc8ee7e195dbdce137a96", + "venue_id": "2152809", + "speakers": [ + { + "username": "benjamin154", + "id": "23098720", + "name": "Benjamin Rabier", + "company": "Grafbase", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "11:15", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "11:45", + "start_date": "2025-09-10", + "start_time": "11:15:00", + "start_time_ts": 1757495700, + "end_date": "2025-09-10", + "end_time": "11:45:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf2025/66/Deep%20Dive%20into%20a%20GraphQL%20Federation%20gateway.pdf", + "name": "Deep Dive into a GraphQL Federation gateway.pdf" + } + ], + "event_subtype": "Federation and distributed systems" + }, + { + "event_key": "925151", + "active": "Y", + "pinned": "N", + "name": "Safely Roll Out Strict Error Handling in Your GraphQL Codebase - Itamar Kestenbaum, Meta", + "event_start": "2025-09-10 11:15", + "event_end": "2025-09-10 11:45", + "event_type": "GraphQL in Production", + "description": "Last year we introduced strict error handling - with @throwOnFieldError as an example of how this can be accomplished. This year, we’ll discuss how to safely roll it out.\n \nYou’ve had a GraphQL codebase that weakly handled server-side errors for years. Now, you have the tools (directives, hooks, handlers, and language features) that let you treat field errors properly. However, it’s a daunting task to suddenly explode queries en-masse by flipping a switch. This move is powerful, but requires a thoughtful and data-driven approach to do safely.\n \nIn this talk we’ll cover:\n* Preparing the groundwork for migration to stricter error handling\n* Using data to make informed decisions about fragment/query behavior\n* Gating your change at a singular point\n* Scaling the rollout to a large codebase\n* How we’re approaching this rollout at Meta", + "goers": "10", + "seats": "0", + "invite_only": "N", + "venue": "IJzaal - 5th Floor", + "audience": "Intermediate", + "id": "bca05d46cfc531aeb3cd84927f6483c1", + "venue_id": "2152806", + "speakers": [ + { + "username": "itamark", + "id": "80829", + "name": "Itamar Kestenbaum", + "company": "Meta", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "11:15", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "11:45", + "start_date": "2025-09-10", + "start_time": "11:15:00", + "start_time_ts": 1757495700, + "end_date": "2025-09-10", + "end_time": "11:45:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf2025/0c/GraphQLConf%202025%20-%20How%20to%20safely%20roll%20out%20Error%20Handling%20-%20Itamar%20Kestenbaum.pdf", + "name": "GraphQLConf 2025 - How to safely roll out Error Handling - Itamar Kestenbaum.pdf" + } + ], + "event_subtype": "Scaling" + }, + { + "event_key": "924776", + "active": "Y", + "pinned": "N", + "name": "GraphQL in a World of Full-stack, Rich Clients: The Next Evolution - Robert Balicki, Pinterest", + "event_start": "2025-09-10 11:55", + "event_end": "2025-09-10 12:25", + "event_type": "Developer Experience", + "description": "One of the great achievements of GraphQL is composable, full-stack type safety: a strongly-typed schema, against which one writes client components, and from which minimal yet sufficient queries are generated. This seamless flow from database to UI, with immediate feedback, compile-time guarantees and great performance, represents an unmatched DevEx breakthrough.\n \nBut what if we use a full-stack client (like Isograph aims to be)? Or use a rich client in combination with a Hasura, Prisma or PostGraphile, and effectively write components against an SQL schema? Have both the GraphQL schema and its operation language become mere implementation details?\n \nIn this talk, I'll explore how GraphQL's apparent disappearance into tooling actually represents its ultimate victory. Even as GraphQL-the-syntax fades from view, its architectural innovations—fragment composability, full-stack type safety, document merging, persisted operations—become the invisible foundation of modern development.\n \nThe best way to honor this legacy isn't to protect its syntax — it's to let its principles be reborn in new forms, evolving as our tools evolve, making app development better for years to come.", + "goers": "7", + "seats": "0", + "invite_only": "N", + "venue": "Grote Zaal - 2nd Floor", + "audience": "Any", + "id": "a2bb7f46355a46dcab47d654c9ccbe4e", + "venue_id": "2152800", + "speakers": [ + { + "username": "robert.balicki", + "id": "18743858", + "name": "Robert Balicki", + "company": "Pinterest", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "11:55", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "12:25", + "start_date": "2025-09-10", + "start_time": "11:55:00", + "start_time_ts": 1757498100, + "end_date": "2025-09-10", + "end_time": "12:25:00", + "event_subtype": "Frontend" + }, + { + "event_key": "929166", + "active": "Y", + "pinned": "N", + "name": "Breaking the Monolith: Our Journey From Proto To Federated GraphQL at Scale - Mansi Mittal, Booking.com", + "event_start": "2025-09-10 11:55", + "event_end": "2025-09-10 12:25", + "event_type": "GraphQL in Production", + "description": "HotelPage Service (HPS) is one of the busiest, most business-critical systems at Booking.com — originally built as a REST API with Protobufs for speed and structure. It was fast but rigid. As product demands grew and clients needed more flexibility, cracks began to show: over-fetching, unclear ownership, and slow iteration cycles.\n \nThis talk shares our real-world journey of modernizing that stack with GraphQL — not just adopting it as a new interface, but transforming how teams design schemas, collaborate across domains, and scale under load. We’ll walk through how we evolved from a proto-backed monolith to a federated GraphQL architecture — improving performance, enabling resolver ownership, and making the schema reflect real product needs.\n \nWhether you're planning a GraphQL migration or scaling one across teams, this talk delivers actionable insights and hard-won lessons from operating at billions of requests per day.\n \nAttendees will gain:\n- Align schema design with client and product needs\n- Handle organisational complexity in federation\n- Avoid pitfalls like over-fetching and the N+1 trap\n- Drive resolver ownership and collaboration\n- Optimise execution paths under high traffic", + "goers": "7", + "seats": "0", + "invite_only": "N", + "venue": "Studio - 5th Floor", + "audience": "Any", + "id": "0296c34928a818353f1568775e47b47a", + "venue_id": "2152809", + "speakers": [ + { + "username": "mansi.mittal", + "id": "23098777", + "name": "Mansi Mittal", + "company": "Booking.com", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "11:55", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "12:25", + "start_date": "2025-09-10", + "start_time": "11:55:00", + "start_time_ts": 1757498100, + "end_date": "2025-09-10", + "end_time": "12:25:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf2025/43/Breaking%20the%20Monolith_%20Our%20Journey%20from%20Proto%20to%20Federated%20GraphQL%20at%20Scale.pdf", + "name": "Breaking the Monolith_ Our Journey from Proto to Federated GraphQL at Scale.pdf" + } + ], + "event_subtype": "Federation and distributed systems" + }, + { + "event_key": "919528", + "active": "Y", + "pinned": "N", + "name": "Smarter Caching With Events: Targeted Invalidation in Federated Graphs - Juan Carlos Blanco Delgado, RS Group", + "event_start": "2025-09-10 11:55", + "event_end": "2025-09-10 12:25", + "event_type": "GraphQL in Production", + "description": "Caching is one of the most powerful tools for improving API performance—but in a federated GraphQL architecture, stale data can quickly become a serious challenge. In this session, we will dive into how event-driven patterns can enable precise cache invalidation at the subgraph level, keeping your data fresh without sacrificing speed.\n\nYou will learn key design principles, practical integration strategies for GraphQL subgraphs, and the business impact of a smarter caching approach. We will also explore real-world use cases and demonstrate how CloudEvents can standardize event-based workflows across your architecture. Whether you are optimizing an existing caching layer or just beginning your caching journey, this talk will equip you with practical strategies to reduce latency, lower infrastructure costs, and deliver more reliable experiences to your users.", + "goers": "4", + "seats": "0", + "invite_only": "N", + "venue": "IJzaal - 5th Floor", + "audience": "Any", + "geo_area": "Yes", + "id": "aa21698ac3efc45ee1e7a9cbbaf830fe", + "venue_id": "2152806", + "speakers": [ + { + "username": "juancarlosjr97", + "id": "23098768", + "name": "Juan Carlos Blanco Delgado", + "company": "RS Group", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "11:55", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "12:25", + "start_date": "2025-09-10", + "start_time": "11:55:00", + "start_time_ts": 1757498100, + "end_date": "2025-09-10", + "end_time": "12:25:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf2025/dc/GraphQLConf%202025%20-%20JCBD%20-%20Smarter%20Caching%20With%20Events_%20Targeted%20Invalidation%20in%20Federated%20Graphs%20.pdf", + "name": "GraphQLConf 2025 - JCBD - Smarter Caching With Events_ Targeted Invalidation in Federated Graphs .pdf" + } + ], + "event_subtype": "Scaling" + }, + { + "event_key": "12", + "active": "Y", + "pinned": "N", + "name": "Lunch", + "event_start": "2025-09-10 12:25", + "event_end": "2025-09-10 13:40", + "event_type": "Breaks / Networking / Special Events", + "goers": "12", + "seats": "0", + "invite_only": "N", + "venue": "Foyer Grote Zaal - 2nd Floor", + "id": "466063ea35a642dc69aa3f25ad47aa3e", + "venue_id": "2152803", + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "12:25", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "13:40", + "start_date": "2025-09-10", + "start_time": "12:25:00", + "start_time_ts": 1757499900, + "end_date": "2025-09-10", + "end_time": "13:40:00", + "event_subtype": "", + "description": "" + }, + { + "event_key": "923860", + "active": "Y", + "pinned": "N", + "name": "Reintroducing Apollo Client: V4 and Beyond - Lenz Weber-Tronic, Apollo GraphQL", + "event_start": "2025-09-10 13:40", + "event_end": "2025-09-10 14:10", + "event_type": "Developer Experience", + "description": "`useQuery` is a powerful and simple abstraction, but there is so much more to Apollo Client today. In this talk we’ll re-introduce Apollo Client for this new era. Query preloading, suspense, fragment APIs, and data masking have given GraphQL practitioners a toolset to build sophisticated, scalable, and highly performant applications like never before. Learn about these new APIs, upgraded tooling, and how version 4.0 (and beyond) gives users a leaner, cleaner, and more capable open source GraphQL client.", + "goers": "7", + "seats": "0", + "invite_only": "N", + "venue": "Grote Zaal - 2nd Floor", + "audience": "Any", + "geo_area": "Yes", + "id": "efe5aee612551209ba413d57d3ddbb4e", + "venue_id": "2152800", + "speakers": [ + { + "username": "mail1232", + "id": "23098771", + "name": "Lenz Weber-Tronic", + "company": "Apollo GraphQL", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "13:40", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "14:10", + "start_date": "2025-09-10", + "start_time": "13:40:00", + "start_time_ts": 1757504400, + "end_date": "2025-09-10", + "end_time": "14:10:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf2025/5c/reintroducing%20Apollo%20Client%204.pdf", + "name": "reintroducing Apollo Client 4.pdf" + } + ], + "event_subtype": "Frontend" + }, + { + "event_key": "924498", + "active": "Y", + "pinned": "N", + "name": "LinkedIn's Code-First Approach To Federated GraphQL With gRPC - Ethan Shen & Spencer Kwok, LinkedIn", + "event_start": "2025-09-10 13:40", + "event_end": "2025-09-10 14:10", + "event_type": "GraphQL in Production", + "description": "Imagine having a federated GraphQL query builder customized to meet unique software infrastructure requirements—have you ever dreamed of such a tool? If so, please join us for an exciting session where we uncover LinkedIn’s code first approach to querying entity-oriented data with federated GraphQL on top of backend gRPC services. Discover how our solution leverages the advanced capabilities of gRPC for enhanced performance, low latency, and multi-language support. We will dive into the motivations behind adopting this strategy, the intricate challenges encountered, and the significant improvements in developer experience and productivity it brings. With real-world examples and performance benchmarks, witness how this approach modernizes our service infrastructure, leading to more efficient and scalable solutions.", + "goers": "6", + "seats": "0", + "invite_only": "N", + "venue": "Studio - 5th Floor", + "audience": "Intermediate", + "id": "dbabde0d810676b2a3633fa3b35de544", + "venue_id": "2152809", + "speakers": [ + { + "username": "skwok5", + "id": "23138920", + "name": "Spencer Kwok", + "company": "LinkedIn", + "custom_order": 0 + }, + { + "username": "ethan_shen.28dgusli", + "id": "23098744", + "name": "Ethan Shen", + "company": "LinkedIn", + "custom_order": 1 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "13:40", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "14:10", + "start_date": "2025-09-10", + "start_time": "13:40:00", + "start_time_ts": 1757504400, + "end_date": "2025-09-10", + "end_time": "14:10:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf2025/43/LinkedIn's Code-First Approach To Federated GraphQL With gRPC.pdf", + "name": "LinkedIn's Code-First Approach To Federated GraphQL With gRPC.pdf" + } + ], + "event_subtype": "Federation and distributed systems" + }, + { + "event_key": "922855", + "active": "Y", + "pinned": "N", + "name": "The Two GraphQLs - Andrei Bocan & Andreas Marek, Atlassian", + "event_start": "2025-09-10 13:40", + "event_end": "2025-09-10 14:10", + "event_type": "GraphQL in Production", + "description": "When adopting GraphQL, teams diligently follow \"best practices\" without realizing they're actually choosing between two fundamentally different approaches: designing schemas to serve UI components (frontend-first) or to represent domain models (structure-first). This distinction is rarely framed as an explicit choice in GraphQL literature, with most examples showcasing the structure-first approach by default.\n\nYet this initial decision shapes everything from your team structure to how you handle breaking changes—and if you start with a structure-first approach, it's especially difficult to unwind that decision later. In this session, we'll explore the critical differences between these philosophies, examine how they manifest in real schemas, and analyze the trade-offs each approach presents. You'll see how changes that feel natural in one approach become deeply problematic in the other, and learn to identify which patterns your team has already begun to follow.", + "goers": "8", + "seats": "0", + "invite_only": "N", + "venue": "IJzaal - 5th Floor", + "audience": "Intermediate", + "id": "f0b80ea2f4d001d47e50ee68ee8ef27f", + "venue_id": "2152806", + "speakers": [ + { + "username": "andreas.marek1", + "id": "21066795", + "name": "Andreas Marek", + "company": "Atlassian", + "custom_order": 0 + }, + { + "username": "andrei.bocan", + "id": "21066797", + "name": "Andrei Bocan", + "company": "Atlassian", + "custom_order": 1 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "13:40", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "14:10", + "start_date": "2025-09-10", + "start_time": "13:40:00", + "start_time_ts": 1757504400, + "end_date": "2025-09-10", + "end_time": "14:10:00", + "event_subtype": "Schema evolution" + }, + { + "event_key": "924505", + "active": "Y", + "pinned": "N", + "name": "Instagram’s REST To GraphQL Migration - Xiao Han, Chi Chan, Anirudh Padmarao, Lisa Watkins & Curtis Li, Meta", + "event_start": "2025-09-10 14:20", + "event_end": "2025-09-10 14:50", + "event_type": "GraphQL in Production", + "description": "Imagine you have a decade old REST API codebase with thousands of daily commits by hundreds of engineers, how would you incrementally adopt GraphQL? How would the data models be compatible with both REST and GraphQL to avoid divergence? How…?\n\nWe will share Instagram’s journey from 100% REST API development to 95%+ new APIs developed in GraphQL over a two year period.", + "goers": "12", + "seats": "0", + "invite_only": "N", + "venue": "Grote Zaal - 2nd Floor", + "audience": "Any", + "geo_area": "Yes", + "id": "5488aa89d9612e06d58e66cc521bcc38", + "venue_id": "2152800", + "speakers": [ + { + "username": "apadmarao", + "id": "23098714", + "name": "Anirudh Padmarao", + "company": "Meta", + "custom_order": 0 + }, + { + "username": "chanc2", + "id": "23098726", + "name": "Chi Chan", + "company": "Meta", + "custom_order": 1 + }, + { + "username": "curtis99877", + "id": "23098729", + "name": "Curtis Li", + "company": "Meta Platforms", + "custom_order": 2 + }, + { + "username": "lisamwatkins", + "id": "23098774", + "name": "Lisa Watkins", + "company": "Meta", + "custom_order": 3 + }, + { + "username": "x65han", + "id": "23098816", + "name": "Xiao Han", + "company": "Meta Inc.", + "custom_order": 4 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "14:20", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "14:50", + "start_date": "2025-09-10", + "start_time": "14:20:00", + "start_time_ts": 1757506800, + "end_date": "2025-09-10", + "end_time": "14:50:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf2025/36/GraphQLConf%202025%20-%20%20Instagram%E2%80%99s%20REST%20to%20GraphQL%20Migration.pdf", + "name": "GraphQLConf 2025 - Instagram’s REST to GraphQL Migration.pdf" + } + ], + "event_subtype": "Case studies" + }, + { + "event_key": "924826", + "active": "Y", + "pinned": "N", + "name": "Lightning Talk: \"Please Migrate Away From Field X To Field Y Before Z\" - A Story on Automating Our Deprecation Lifecycle - Rick Bijkerk, Bol", + "event_start": "2025-09-10 14:20", + "event_end": "2025-09-10 14:30", + "event_type": "GraphQL in Production", + "description": "Any company that wants to innovate deals with change. Within GraphQL that often means introducing new fields but also deprecating old fields & types.\nThe faster you can get rid of these old fields & types the less complex your architecture is and less complexity means an easier time building new features!\n\nWe saw this problem and got tired of the endless “please migrate away from field X to field Y before Z” emails, which were often not even sent to the right group of consumers!\n\nWe automated this process by building a slack bot that uses production analytical data to figure out what clients are using deprecated fields and automated the communication!", + "goers": "7", + "seats": "0", + "invite_only": "N", + "venue": "IJzaal - 5th Floor", + "audience": "Any", + "id": "b22c4cbb4356649d15129696322b6777", + "venue_id": "2152806", + "speakers": [ + { + "username": "rickbijkerk54", + "id": "19320231", + "name": "Rick Bijkerk", + "company": "Bol", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "14:20", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "14:30", + "start_date": "2025-09-10", + "start_time": "14:20:00", + "start_time_ts": 1757506800, + "end_date": "2025-09-10", + "end_time": "14:30:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf2025/4b/GraphQLConf%20-%20Please%20Migrate%20Away%20From%20Field%20X%20To%20Field%20Y.pdf", + "name": "GraphQLConf - Please Migrate Away From Field X To Field Y.pdf" + } + ], + "event_subtype": "Schema evolution" + }, + { + "event_key": "929620", + "active": "Y", + "pinned": "N", + "name": "Lightning Talk: Efficient Semantic Comparison of GraphQL Queries - Derek Kuc, Apollo GraphQL", + "event_start": "2025-09-10 14:40", + "event_end": "2025-09-10 14:50", + "event_type": "Developer Experience", + "description": "Ever wondered if two seemingly different GraphQL queries actually return the same data? Or how to ensure that complex queries—packed with type conditions and directives like @skip/@include—still mean the same thing after a major refactor? In this talk, we’ll explore a novel static analysis technique that efficiently checks whether one query’s response is always a subset of another’s. By performing this subset test in both directions, we can reliably determine query equivalence—bringing new clarity to complex GraphQL operations.", + "goers": "6", + "seats": "0", + "invite_only": "N", + "venue": "IJzaal - 5th Floor", + "audience": "Intermediate", + "id": "deac4044512d6d0a59c76aa712a777a4", + "venue_id": "2152806", + "speakers": [ + { + "username": "dkuc", + "id": "23173220", + "name": "Derek Kuc", + "company": "Apollo GraphQL", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "14:40", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "14:50", + "start_date": "2025-09-10", + "start_time": "14:40:00", + "start_time_ts": 1757508000, + "end_date": "2025-09-10", + "end_time": "14:50:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf2025/1c/Efficient%20Semantic%20Comparison%20of%20GraphQL%20Queries.pdf", + "name": "Efficient Semantic Comparison of GraphQL Queries.pdf" + } + ], + "event_subtype": "Testing" + }, + { + "event_key": "929167", + "active": "Y", + "pinned": "N", + "name": "“One Schema To Rule Them All”: Simplifying 10+ Mediaset Apps With One Single GraphQL Service - Marco Reni, Mediaset", + "event_start": "2025-09-10 15:00", + "event_end": "2025-09-10 15:30", + "event_type": "GraphQL in Production", + "description": "Mediaset, one of Europe largest free broadcasters, owns and manages more than ten consumer-facing applications across web, mobile, and smart TV platforms, leading the Media and Entertainment ecosystem in Italy and Europe. Historically, each of these apps (managed by distinct development teams) interacted directly with several different backend APIs to serve content to customers, resulting in redundant development efforts, inconsistencies between platforms and enormous and useless network transfers.\n\nIn this session we will present how, by creating a carefully designed GraphQL schema, we managed to transition each of them to a more streamlined approach, where the backend complexity and variety is hidden from the frontend integrations. We will dive into the choices made, the GraphQL features that we leveraged (one among all, Trusted Documents to exploit CDNs and improve security), the issues that we've encountered while building the system, and the benefits that we gained from all perspectives: user experience, development perspective, feature delivery and time to market.", + "goers": "3", + "seats": "0", + "invite_only": "N", + "venue": "Grote Zaal - 2nd Floor", + "audience": "Intermediate", + "id": "c8078724c37fbcf7a899c4c653e473f9", + "venue_id": "2152800", + "speakers": [ + { + "username": "marco.reni", + "id": "23098780", + "name": "Marco Reni", + "company": "Mediaset - MFE", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "15:00", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "15:30", + "start_date": "2025-09-10", + "start_time": "15:00:00", + "start_time_ts": 1757509200, + "end_date": "2025-09-10", + "end_time": "15:30:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf2025/ae/GraphQLConf2025%20|%20Marco%20Reni%20-%20One%20Schema%20to%20rule%20them%20all.pdf", + "name": "GraphQLConf2025 | Marco Reni - One Schema to rule them all.pdf" + } + ], + "event_subtype": "Case studies" + }, + { + "event_key": "924552", + "active": "Y", + "pinned": "N", + "name": "Proven Schema Designs and Best-practices - Jeff Dolle, The Guild", + "event_start": "2025-09-10 15:00", + "event_end": "2025-09-10 15:30", + "event_type": "GraphQL in Production", + "description": "\"There are only two hard things in Computer Science: cache invalidation and naming things\".\n\nGraphQL provides many benefits over other query languages. Federation builds on top of this foundation to provide even more flexibility and power. But even with all that GraphQL has to offer, the problem of naming remains.\n\nIn this talk, Jeff Dolle, from The Guild, will share what he's learned about schema design: proven design philosophies, designing for forward compatibility, exposing errors through types, and tips for how to avoid ambiguous or misleading type names.\n\nTogether, we will then go through an example product design meeting: taking user stories and building a complete GraphQL schema.", + "goers": "17", + "seats": "0", + "invite_only": "N", + "venue": "IJzaal - 5th Floor", + "audience": "Any", + "id": "9e816cd378c96b466658842ef0900183", + "venue_id": "2152806", + "speakers": [ + { + "username": "jeff737", + "id": "23098759", + "name": "Jeff Dolle", + "company": "The Guild", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "15:00", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "15:30", + "start_date": "2025-09-10", + "start_time": "15:00:00", + "start_time_ts": 1757509200, + "end_date": "2025-09-10", + "end_time": "15:30:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf2025/02/slides-proven-schema-designs-best-practices.pdf", + "name": "slides-proven-schema-designs-best-practices.pdf" + } + ], + "event_subtype": "Schema evolution" + }, + { + "event_key": "9", + "active": "Y", + "pinned": "N", + "name": "Break", + "event_start": "2025-09-10 15:30", + "event_end": "2025-09-10 15:50", + "event_type": "Breaks / Networking / Special Events", + "goers": "11", + "seats": "0", + "invite_only": "N", + "venue": "Foyer Grote Zaal - 2nd Floor", + "id": "9ef4af16d7ad63877af95cb200d75848", + "venue_id": "2152803", + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "15:30", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "15:50", + "start_date": "2025-09-10", + "start_time": "15:30:00", + "start_time_ts": 1757511000, + "end_date": "2025-09-10", + "end_time": "15:50:00", + "event_subtype": "", + "description": "" + }, + { + "event_key": "929628", + "active": "Y", + "pinned": "N", + "name": "LLMs + GraphQL + MCP: A Blueprint for Scalable AI Tooling - Erik Wrede, Strawberry-GraphQL & Thore Koritzius, Independent", + "event_start": "2025-09-10 15:50", + "event_end": "2025-09-10 16:20", + "event_type": "GraphQL in Production", + "description": "Plugging an LLM into GraphQL sounds simple—until it drowns in thousands of fields, types, and connections. Most models today can’t reason effectively over large APIs without brittle prompt hacks or hardcoded shortcuts.\n\nModel Context Protocol (MCP) is the cutting-edge solution for enabling seamless, dynamic interactions between LLMs and external tooling. It standardizes the way models interact with various tools, breaking down barriers between APIs and AI systems.\n\nIn this talk, you’ll discover how to turn any GraphQL endpoint into an MCP-compatible server with minimal overhead. Reuse your existing GraphQL infrastructure to avoid reinventing authorization, schema management, and validation enabling scalable, robust LLM integrations. We’ll compare existing tools and automated schema discovery against hand-crafted mappers based on benchmarks of public GraphQL APIs. Join us to learn about our experiences and recommendations for your next GenAI project, powered by GraphQL.", + "goers": "10", + "seats": "0", + "invite_only": "N", + "venue": "IJzaal - 5th Floor", + "audience": "Intermediate", + "id": "0edcd2dd0e8d11fb19db1974a0114df0", + "venue_id": "2152806", + "speakers": [ + { + "username": "erikwrede2", + "id": "21102110", + "name": "Erik Wrede", + "company": "Strawberry-GraphQL", + "custom_order": 0 + }, + { + "username": "thorekoritzius", + "id": "23218043", + "name": "Thore Koritzius", + "company": "Independent", + "custom_order": 1 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "15:50", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "16:20", + "start_date": "2025-09-10", + "start_time": "15:50:00", + "start_time_ts": 1757512200, + "end_date": "2025-09-10", + "end_time": "16:20:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf2025/98/GraphQL%20+%20MCP%20-%20Blueprint%20For%20Scalable%20AI%20Tooling.pdf", + "name": "GraphQL + MCP - Blueprint For Scalable AI Tooling.pdf" + } + ], + "event_subtype": "AI / LLMs" + }, + { + "event_key": "929627", + "active": "Y", + "pinned": "N", + "name": "Relay Migration API at Pinterest - Mauricio Montalvo, Pinterest", + "event_start": "2025-09-10 15:50", + "event_end": "2025-09-10 16:20", + "event_type": "GraphQL in Production", + "description": "Pinterest is adopting GraphQL. Given our app's size, we can't simply rewrite everything in one fell swoop. So, we created the Relay Migration API (RMA) — a set of tools to incrementally migrate your React components to consume GraphQL-shaped data while making requests to REST endpoints.\n\nI'll share how we've significantly evolved the RMA after migrating four key surfaces, focusing on the advanced challenges we faced:\n\n
  • RMA recreates objects on every render by default, breaking components expecting stable references. We implemented a caching layer, similar to Relay's, to return consistent objects between renders.
  • RMA originally read from static source objects, creating stale data when Redux state changed. Our solution: a selective subscription system that re-computes GraphQL data only when source fields change, keeping data current while eliminating unnecessary renders.
  • And in cases where Redux and GraphQL schemas fundamentally differ, we built bidirectional mapping with schema validation to ensure data consistency.
\nJoin us to learn how the Relay migration API has evolved and how it helps you accelerate your GraphQL migrations without disrupting existing applications!", + "goers": "6", + "seats": "0", + "invite_only": "N", + "venue": "Studio - 5th Floor", + "audience": "Beginner", + "id": "e80e32b1285a7c9a8c591a34f5e3ce1d", + "venue_id": "2152809", + "speakers": [ + { + "username": "mauricio.montalvo.guzman", + "id": "21066831", + "name": "Mauricio Montalvo", + "company": "Pinterest", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "15:50", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "16:20", + "start_date": "2025-09-10", + "start_time": "15:50:00", + "start_time_ts": 1757512200, + "end_date": "2025-09-10", + "end_time": "16:20:00", + "files": [ + { + "path": "https://static.sched.com/hosted_files/graphqlconf2025/29/Mauricio%20Montalvo%20-%20GraphQL%20Conf%202025%20-%20v3.pdf", + "name": "Mauricio Montalvo - GraphQL Conf 2025 - v3.pdf" + } + ], + "event_subtype": "Case studies" + }, + { + "event_key": "922697", + "active": "Y", + "pinned": "N", + "name": "Keynote: What Is the GraphQL Foundation? - Jeff Auriemma, Senior Engineering Manager, Apollo GraphQL", + "event_start": "2025-09-10 16:30", + "event_end": "2025-09-10 16:45", + "event_type": "Keynote Sessions", + "description": "This talk will give attendees an overview of the structure of GraphQL's official organizations: The GraphQL Foundation and the GraphQL Specification Project. It will get specific about the governance and roadmaps of each organization and their specific priorities in 2025 and beyond.\n\nIn my time serving in these various institutions, I've noticed that even the most active GraphQL practitioners aren't fully aware of what they are and what they do. Attendees will learn about the GraphQL Working Group, the Technical Steering Committee, and the Foundation's Governing Board. We'll also touch upon the various technical working groups and the new Community Working Group. The talk culminates in a call to action for folks to get involved.", + "goers": "19", + "seats": "0", + "invite_only": "N", + "venue": "Grote Zaal - 2nd Floor", + "audience": "Any", + "id": "1874c6f0bece5c91a1b6ff621cd21e2d", + "venue_id": "2152800", + "speakers": [ + { + "username": "jeff.auriemma", + "id": "18743876", + "name": "Jeff Auriemma", + "company": "Apollo GraphQL", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "16:30", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "16:45", + "start_date": "2025-09-10", + "start_time": "16:30:00", + "start_time_ts": 1757514600, + "end_date": "2025-09-10", + "end_time": "16:45:00", + "event_subtype": "" + }, + { + "event_key": "14", + "active": "Y", + "pinned": "N", + "name": "Keynote: Closing Remarks - Lee Byron, Co-Creator of GraphQL & Director, GraphQL Foundation", + "event_start": "2025-09-10 16:45", + "event_end": "2025-09-10 17:00", + "event_type": "Keynote Sessions", + "goers": "17", + "seats": "0", + "invite_only": "N", + "venue": "Grote Zaal - 2nd Floor", + "audience": "Any", + "id": "cb86b2c03a77f0f4133f2d906911cd83", + "venue_id": "2152800", + "speakers": [ + { + "username": "lee_byron.25jvpjmb", + "id": "18743534", + "name": "Lee Byron", + "company": "GraphQL Foundation", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "16:45", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "17:00", + "start_date": "2025-09-10", + "start_time": "16:45:00", + "start_time_ts": 1757515500, + "end_date": "2025-09-10", + "end_time": "17:00:00", + "event_subtype": "", + "description": "" + } +] \ No newline at end of file diff --git a/scripts/sync-sched/speakers.json b/scripts/sync-sched/speakers.json new file mode 100644 index 0000000000..dfeebca857 --- /dev/null +++ b/scripts/sync-sched/speakers.json @@ -0,0 +1,3448 @@ +{ + "equal": [ + [ + "christian.ernst", + "christian.ernst1" + ], + [ + "dotan1", + "dotansimha" + ], + [ + "janette.cheng", + "janettelc" + ], + [ + "jordaneldredge", + "jordaneldredge1" + ], + [ + "lee_byron.25jvpjmb", + "lee_byron.25krdom6" + ], + [ + "pooja.mistry", + "pooja.mistry1" + ], + [ + "saihaj", + "saihajpreet.singh" + ] + ], + "speakers": [ + { + "username": "abbottry", + "company": "NASA EED-3 / Element 84", + "position": "Senior Software Engineer", + "name": "Ryan Abbott", + "about": "Ryan Abbott is a software engineer with over 15 years of experience building scalable and maintainable backend systems. He currently works as a contractor for NASA through Element 84, where he is responsible for developing and maintaining mission-critical applications. Ryan is passionate about leveraging the right tools and technologies to create reliable and efficient systems. When not working, Ryan can be found flying planes, playing soccer, and spending quality time with his wife and kids.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/9/c4/18680304/avatar.jpg.320x320px.jpg?949", + "socialurls": [], + "_years": [ + 2023 + ], + "~syncedDetailsAt": 1749568381879 + }, + { + "username": "adam_malone.2791s6x2", + "company": "Hasura", + "position": "Global Director, Sales Engineering", + "name": "Adam Malone", + "about": "", + "location": "", + "url": "", + "avatar": "", + "socialurls": [], + "_years": [ + 2024 + ], + "~syncedDetailsAt": 1749502251756 + }, + { + "username": "adam.miskiewicz", + "company": "Airbnb", + "position": "Viaduct Platform Lead", + "name": "Adam Miskiewicz", + "about": "Adam is a Principal Software Engineer at Airbnb, where he leads platform architecture with a focus on performance, developer experience, and large-scale GraphQL systems. He’s one of the core architects behind Viaduct, Airbnb’s multi-tenant GraphQL platform, and is known for turning complex ideas into scalable, developer-friendly infrastructure. When he's not deep in Kotlin or shaping deployment strategy, he's probably pushing teams to move faster — safely.", + "location": "Baltimore, MD", + "url": "", + "avatar": "//avatars.sched.co/8/82/23352721/avatar.jpg.320x320px.jpg?bfd", + "socialurls": [ + { + "service": "Twitter", + "url": "https://x.com/skevy" + }, + { + "service": "LinkedIn", + "url": "https://www.linkedin.com/in/adammiskiewicz/" + } + ], + "_years": [ + 2025 + ], + "~syncedDetailsAt": 1758114065028 + }, + { + "username": "adam.sayah", + "company": "Solo.io", + "position": "Product Manager", + "name": "Adam Sayah", + "about": "Adam Sayah is Field Engineer at Solo.io, a company specializing in open source and enterprise software for application networking from the edge to service mesh. At Solo.io, Adam helps organizations build and operate robust cloud-native architecture. Prior to Solo.io, Adam held software engineering roles at cloud-native technology companies, working on Managed File Transfers, Kubernetes, API gateways, and service mesh.", + "location": "", + "url": "https://solo.io/", + "avatar": "//avatars.sched.co/e/3c/12615405/avatar.jpg.320x320px.jpg?742", + "socialurls": [ + { + "service": "Twitter", + "url": "https://twitter.com/_asayah" + }, + { + "service": "LinkedIn", + "url": "https://www.linkedin.com/in/adamsayah/" + } + ], + "_years": [ + 2023 + ], + "~syncedDetailsAt": 1749497543087 + }, + { + "username": "adam427", + "company": "Amazon", + "position": "Software Development Engineer", + "name": "Adam Cervantes", + "about": "Adam is currently a software development engineer at Amazon's Buyer Abuse Prevention team. For the last 4 years, Adam has been helping prevent returns abuse on Amazon.com. One of his projects was to consolidate the data the team needs into a single, cohesive, GraphQL API.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/b/ad/3141026/avatar.jpg.320x320px.jpg?5d5", + "socialurls": [ + { + "service": "LinkedIn", + "url": "https://www.linkedin.com/in/adam-cervantes-236334201" + } + ], + "_years": [ + 2025 + ], + "~syncedDetailsAt": 1758137788992 + }, + { + "username": "aditi_rajawat", + "company": "Intuit", + "position": "Software Engineering Manager", + "name": "Aditi Rajawat", + "about": "Aditi is an Engineering manager at Intuit leading GraphQL API Platform team, who transitioned into this role the current year from Staff Software Engineer. She has experience of 9 years in the software industry and enjoys working on distributed software systems. She is driving GraphQL adoption at Intuit with focus on improving developer productivity and holding a high bar for operational excellence of GraphQL runtime. Recently, she is also building a new habit to read books in her free time.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/7/07/21066788/avatar.jpg.320x320px.jpg?825", + "socialurls": [], + "_years": [ + 2024 + ], + "~syncedDetailsAt": 1749503031962 + }, + { + "username": "aileen.chen", + "company": "Airbnb", + "position": "Staff Software Engineer", + "name": "Aileen Chen", + "about": "I work on Viaduct, Airbnb's GraphQL-based data-oriented service mesh.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/4/65/23098708/avatar.jpg.320x320px.jpg?37c", + "socialurls": [], + "_years": [ + 2025 + ], + "~syncedDetailsAt": 1758114077046 + }, + { + "username": "ajhingran", + "company": "IBM", + "position": "IBM Fellow & CTO, Software", + "name": "Anant Jhingran", + "about": "Anant Jhingran is the CTO for IBM Software. He came into this current role when StepZen was acquired by IBM in February 2023. He was the CEO of StepZen, which he co-founded in early 2020 along with a couple of his Apigee colleagues. StepZen delivers GraphQL APIs using declarative approaches that he learnt from his decades of experience building out IBM's databases. \n \nHe has shipped deeply technical products that have been deployed in 1000s of enterprises. Before founding StepZen, he helped take Apigee public, as well as its acquisition by Google. He has a PhD in database systems from UC Berkeley and is accomplished in his professional career (IBM Fellow; CTO of IBM's Information Management Division; Distinguished Alumnus, IIT Delhi). His products have delivered billions of dollars of revenue at IBM and Apigee, and he has led large teams of researchers, engineers and product managers during his career.\n \nHe has received several awards including IBM Fellow, IIT Delhi Distinguished Alumnus Award, IBM Corporate Award for contributions to DB2, President's Gold Medal for highest GPA at IIT Delhi, and IBM Academy of Technology. He is the author of over a dozen patents and over 20 technical papers and is frequently giving keynotes in industry and academic conferences.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/3/48/19225935/avatar.jpg.320x320px.jpg?a5a", + "socialurls": [], + "_years": [ + 2023, + 2024 + ], + "~syncedDetailsAt": 1749497429311 + }, + { + "username": "alan.quigley", + "company": "Toast Inc", + "position": "Principal Software Engineer", + "name": "Alan Quigley", + "about": "I live in Dublin with my wife and two kids, near the city centre. I’ve been a Frontend Engineer at Toast for five years, with over twenty years of experience. At Toast, I’ve helped lead our design system and micro frontend architecture, and I’m currently focusing on the GraphQL tool chain to enhance our development process. Before engineering, I worked in Animation, where I learned the value of process and consistency, which I apply to my work today.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/a/aa/21066789/avatar.jpg.320x320px.jpg?256", + "socialurls": [], + "_years": [ + 2024 + ], + "~syncedDetailsAt": 1749503993038 + }, + { + "username": "alec102", + "company": "HoudiniLabs", + "position": "CEO", + "name": "Alec Aivazis", + "about": "Alec is an open source enthusiast currently focused on Houdini, a GraphQL client. He spends his time away from the keyboard tending to a collection of carnivorous plants. And when he's in the mood for a sunburn, he also enjoys cycling and sailing with his family.", + "location": "", + "url": "https://alec.aivazis.com/", + "avatar": "//avatars.sched.co/d/b3/18743870/avatar.jpg.320x320px.jpg?03d", + "socialurls": [ + { + "service": "Twitter", + "url": "https://twitter.com/alecaivazis" + }, + { + "service": "LinkedIn", + "url": "https://linkedin.com/alecaivazis" + } + ], + "_years": [ + 2023, + 2025 + ], + "~syncedDetailsAt": 1758114065028 + }, + { + "username": "alex_reilly.7ldur4l", + "company": "Independent", + "position": "Software Engineer", + "name": "Alex Reilly", + "about": "", + "location": "San Francisco", + "url": "https://alex.dev/", + "avatar": "//avatars.sched.co/9/8e/14900019/avatar.jpg.320x320px.jpg?3f4", + "socialurls": [ + { + "service": "Twitter", + "url": "https://x.com/alex_reilly_pro" + }, + { + "service": "LinkedIn", + "url": "https://www.linkedin.com/in/alexander-reilly/" + } + ], + "_years": [ + 2024 + ], + "~syncedDetailsAt": 1749497429311 + }, + { + "username": "alexsandra.sikora", + "company": "The Guild", + "position": "Open-source developer", + "name": "Aleksandra Sikora", + "about": "Aleksandra is an open-source developer at The Guild, based in Wrocław, Poland. Previously a tech lead for the Hasura Console and a lead maintainer of Blitz.js. Deeply passionate about open-source, TypeScript and dedicated to staying up to date with the JavaScript ecosystem.", + "location": "", + "url": "https://the-guild.dev/", + "avatar": "//avatars.sched.co/5/98/18743798/avatar.jpg.320x320px.jpg?43c", + "socialurls": [ + { + "service": "Twitter", + "url": "https://twitter.com/aleksandrasays" + }, + { + "service": "LinkedIn", + "url": "https://www.linkedin.com/in/aleksandra-sikora-b54699132/" + } + ], + "_years": [ + 2023 + ], + "~syncedDetailsAt": 1749497543087 + }, + { + "username": "amanda1988", + "company": "Buffer", + "position": "Staff Product Manager", + "name": "Amanda Marochko", + "about": "Originally from Ottawa, Canada, and currently based in Amsterdam, The Netherlands. Amanda Marochko is a Staff Product Manager at Buffer, responsible for maintaining and expanding Buffer's core product offering through channels and integrations. Prior to Buffer, she was the International Growth Lead (EMEA) at Shopify. Outside of work, she runs a non-profit for women in tech.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/1/80/23098711/avatar.jpg.320x320px.jpg?fab", + "socialurls": [], + "_years": [ + 2025 + ], + "~syncedDetailsAt": 1758114079985 + }, + { + "username": "amy1908", + "company": "RedwoodJS", + "position": "Lead Maintainer on the RedwoodJS Core Team", + "name": "Amy Dutton", + "about": "Amy loves using her 22 years of internet experience to teach developers how to design, and designers how to develop. She lives in Nashville, TN USA with her husband, 3 adorable kids, and 2 dogs.", + "location": "", + "url": "https://redwoodjs.com/", + "avatar": "//avatars.sched.co/4/80/16832327/avatar.jpg.320x320px.jpg?42e", + "socialurls": [], + "_years": [ + 2023 + ], + "~syncedDetailsAt": 1749568381879 + }, + { + "username": "an.ngo", + "company": "bol", + "position": "Tech Lead", + "name": "An Ngo", + "about": "An Ngo is a Tech Lead at bol. A GraphQL enthusiast since 2019, and founder of the API BrainTrust and a contributor of the (REST/GraphQL) API guidelines within bol. Currently core member of the GraphQL stewardship for the adoption of GraphQL at bol.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/2/28/21066792/avatar.jpg.320x320px.jpg?375", + "socialurls": [ + { + "service": "LinkedIn", + "url": "https://www.linkedin.com/in/vliegveld5/" + } + ], + "_years": [ + 2024 + ], + "~syncedDetailsAt": 1749497429311 + }, + { + "username": "andreas.heiberg", + "company": "Stellate", + "position": "Engineering Manager", + "name": "Andreas Heiberg", + "about": "In 2016 Andreas built a novel closed-source GraphQL server & client implementation at DueDil to optimise their large GraphQL infrastructure beyond what the DataLoader pattern allowed. At Babylon Health Andreas was the Engineering Manager for the GraphQL team and used Apollo Federation to move the health care industry forward. Today Andreas is the Engineering Manager at Stellate - bringing superpowers to large-scale GraphQL APIs.", + "location": "London, United Kingdom", + "url": "https://stellate.co/", + "avatar": "//avatars.sched.co/9/16/18743801/avatar.jpg.320x320px.jpg?7e0", + "socialurls": [ + { + "service": "Twitter", + "url": "https://twitter.com/andheiberg" + }, + { + "service": "LinkedIn", + "url": "https://www.linkedin.com/in/andheiberg/" + } + ], + "_years": [ + 2023 + ], + "~syncedDetailsAt": 1749502266902 + }, + { + "username": "andreas.marek1", + "company": "Atlassian", + "position": "Developer", + "name": "Andreas Marek", + "about": "GraphQL TSC Member and GraphQL Java founder. Working on all things GraphQL at Atlassian.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/1/ac/21066795/avatar.jpg.320x320px.jpg?556", + "socialurls": [], + "_years": [ + 2024, + 2025 + ], + "~syncedDetailsAt": 1758114065028 + }, + { + "username": "andrei.bocan", + "company": "Atlassian", + "position": "Principal Engineer", + "name": "Andrei Bocan", + "about": "Andrei is a professional book hoarder who frequently complains about software.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/f/c3/21066797/avatar.jpg.320x320px.jpg?fc6", + "socialurls": [], + "_years": [ + 2024, + 2025 + ], + "~syncedDetailsAt": 1758114074590 + }, + { + "username": "andrew.doyle1", + "company": "U.S. House of Representatives", + "position": "Director of Legislative Applications", + "name": "Andrew Doyle", + "about": "Andy Doyle is a technologist with over 30 years experience building systems. He currently works for the House of Representatives modernizing applications that support the legislative process.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/e/7d/21066800/avatar.jpg.320x320px.jpg?55c", + "socialurls": [], + "_years": [ + 2024 + ], + "~syncedDetailsAt": 1749505494947 + }, + { + "username": "ankita25", + "company": "Akto.io", + "position": "Co-founder and CEO", + "name": "Ankita Gupta", + "about": "Ankita is the co-founder and CEO of Akto.io. Prior to Akto she has experience working in VMware, LinkedIn and JP Morgan. She holds MBA from Dartmouth College and Bachelors in Technology from IIT Roorkee.", + "location": "San Francisco", + "url": "https://akto.io/", + "avatar": "//avatars.sched.co/9/a0/21265832/avatar.jpg.320x320px.jpg?b49", + "socialurls": [ + { + "service": "Twitter", + "url": "https://twitter.com/ankitaiitr" + }, + { + "service": "LinkedIn", + "url": "https://www.linkedin.com/in/ankita-gupta-89214515/" + } + ], + "_years": [ + 2024 + ], + "~syncedDetailsAt": 1749501873330 + }, + { + "username": "annyce.davis", + "company": "Meetup", + "position": "Vice President of Engineering", + "name": "Annyce Davis", + "about": "Annyce is an Android and Kotlin Google Developer Expert. She has spent the past 10+ years developing applications for the Android ecosystem across multiple form factors. She is also an international conference speaker and author, sharing her knowledge of Android and Kotlin development with others!", + "location": "United States", + "url": "https://www.meetup.com/", + "avatar": "//avatars.sched.co/3/11/2147992/avatar.jpg.320x320px.jpg?b1a", + "socialurls": [ + { + "service": "Twitter", + "url": "https://twitter.com/brwngrldev" + }, + { + "service": "LinkedIn", + "url": "https://www.linkedin.com/in/annycedavis" + } + ], + "_years": [ + 2023 + ], + "~syncedDetailsAt": 1749502266902 + }, + { + "username": "anthony_miller1", + "company": "Apollo GraphQL", + "position": "Principal Engineer - iOS", + "name": "Anthony Miller", + "about": "Anthony Miller leads the development of Apollo GraphQL’s iOS client library. He has a passion for client-side infrastructure, quality API design, and writing far too many unit tests. Outside of Apollo, Anthony enjoys board gaming with friends, watching movies, and relaxing by the pool.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/5/01/21066803/avatar.jpg.320x320px.jpg?46c", + "socialurls": [], + "_years": [ + 2024 + ], + "~syncedDetailsAt": 1749505494947 + }, + { + "username": "antoine.carossio", + "company": "Escape.tech", + "position": "Cofounder & CTO", + "name": "Antoine Carossio", + "about": "Former pentester for the French Intelligence Services.\nFormer Machine Learning Research @ Apple.\n\nlinkedin.com/in/acarossio/\nescape.tech (company)\n@iCarossio\nescape.tech (blog)", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/c/49/18743834/avatar.jpg.320x320px.jpg?7f3", + "socialurls": [ + { + "service": "Twitter", + "url": "https://twitter.com/iCarossio" + }, + { + "service": "LinkedIn", + "url": "https://www.linkedin.com/in/acarossio/" + } + ], + "_years": [ + 2023 + ], + "~syncedDetailsAt": 1749502266902 + }, + { + "username": "anushrut.gupta", + "company": "Hasura", + "position": "Senior Product Manager, Generative AI", + "name": "Anushrut Gupta", + "about": "We are building Pacha, an incredible tool that helps you build powerful AI applications that connect to any kind of data source with authorization, give LLMs a programmatic runtime and structured memory to eliminate context loss.", + "location": "San Francisco, California", + "url": "askpacha.ai", + "avatar": "//avatars.sched.co/3/3e/21460012/avatar.jpg.320x320px.jpg?925", + "socialurls": [ + { + "service": "LinkedIn", + "url": "https://www.linkedin.com/in/anushrut-gupta/" + } + ], + "_years": [ + 2024 + ], + "~syncedDetailsAt": 1749501873331 + }, + { + "username": "apadmarao", + "company": "Meta", + "position": "Software Engineer", + "name": "Anirudh Padmarao", + "about": "Server Infrastructure at Instagram", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/7/7a/23098714/avatar.jpg.320x320px.jpg?a19", + "socialurls": [], + "_years": [ + 2025 + ], + "~syncedDetailsAt": 1758114083720 + }, + { + "username": "ardatanrikulu", + "company": "The Guild", + "position": "Open Source Developer", + "name": "Arda Tanrıkulu", + "about": "", + "location": "İstanbul, Türkiye", + "url": "", + "avatar": "//avatars.sched.co/1/10/18982310/avatar.jpg.320x320px.jpg?e18", + "socialurls": [ + { + "service": "Twitter", + "url": "https://twitter.com/ardatanrikulu" + }, + { + "service": "LinkedIn", + "url": "https://www.linkedin.com/in/ardatan/" + } + ], + "_years": [ + 2023, + 2025 + ], + "~syncedDetailsAt": 1758114074590 + }, + { + "username": "arkenflame", + "company": "-", + "position": "Software Engineer", + "name": "Mike Solomon", + "about": "Mike is a software engineer with a background in distributed systems at scale. Previously, he was a Sr. Staff Software Engineer leading the Strato team (and a Group Tech Lead in Core Services) at Twitter.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/1/be/18743867/avatar.jpg.320x320px.jpg?5f6", + "socialurls": [], + "_years": [ + 2023, + 2024 + ], + "~syncedDetailsAt": 1749497439360 + }, + { + "username": "ashpak_shaikh", + "company": "Intuit", + "position": "Sr Staff Software Engineer", + "name": "Ashpak Shaikh", + "about": "Ashpak Shaikh is a Sr Staff Software Engineer at Intuit with over a decade of experience. He is a passionate advocate for GraphQL API development and has been an API steward at Intuit for several years. Ashpak believes in simplifying complex service orchestration with the power of Domain Specific Languages(DSL) and has been instrumental in architecting a GraphQL Gateway platform that powers consumer-facing applications like Turbotax, Mint, and Virtual Expert Platform at scale. He has played a key role in open-sourcing all the components of the GraphQL platform via the graph-quilt java project.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/0/a8/19084619/avatar.jpg.320x320px.jpg?4ad", + "socialurls": [ + { + "service": "LinkedIn", + "url": "https://www.linkedin.com/in/ashpak--shaikh/" + } + ], + "_years": [ + 2023 + ], + "~syncedDetailsAt": 1749502266902 + }, + { + "username": "badurinadenis", + "company": "The Guild", + "position": "Software Architect", + "name": "Denis Badurina", + "about": "I am a self-taught senior software architect, with a distinguishing trait of resiliently finding simple solutions to complex problems using communication through words and code. Starting from my first Lego set, I've been in love with development throughout my whole life. As a creator, having the ability to turn thoughts into reality is a gift I find essential. Forever learning through practical applications, bad decisions and positive thoughts - I, ultimately, turned a hobby into an obsession.", + "location": "Sarajevo", + "url": "", + "avatar": "//avatars.sched.co/6/a9/18743810/avatar.jpg.320x320px.jpg?ec6", + "socialurls": [ + { + "service": "Twitter", + "url": "https://twitter.com/enisdenjo" + }, + { + "service": "LinkedIn", + "url": "https://www.linkedin.com/in/enisdenjo/" + } + ], + "_years": [ + 2023, + 2024, + 2025 + ], + "~syncedDetailsAt": 1758114074590 + }, + { + "username": "benjamin154", + "company": "Grafbase", + "position": "Software Engineer", + "name": "Benjamin Rabier", + "about": "Living close to Paris, I've been at Grafbase for over two years building the GraphQL federation gateway among other things.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/7/22/23098720/avatar.jpg.320x320px.jpg?a94", + "socialurls": [], + "_years": [ + 2025 + ], + "~syncedDetailsAt": 1758114083720 + }, + { + "username": "benjie3", + "company": "Graphile", + "position": "GraphQL TSC Member", + "name": "Benjie Gillam", + "about": "A self-described \"community-funded open source maintainer,\" Benjie dedicates much of his time to open source, made possible by the support of appreciative and forward-thinking individuals and organizations. He can often be found helping contributors advance their proposals, and has been instrumental in many key GraphQL advancements and initiatives. As a member of the GraphQL Technical Steering Committee (TSC), Benjie is proud to help guide GraphQL into the future.", + "location": "Chandler's Ford, UK", + "url": "https://graphile.org/", + "avatar": "//avatars.sched.co/b/99/18743846/avatar.jpg.320x320px.jpg?a19", + "socialurls": [ + { + "service": "Twitter", + "url": "https://twitter.com/benjie" + }, + { + "service": "LinkedIn", + "url": "https://www.linkedin.com/in/benjiegillam/" + } + ], + "_years": [ + 2023, + 2024, + 2025 + ], + "~syncedDetailsAt": 1758114074590 + }, + { + "username": "BoD", + "company": "Apollo Graph", + "position": "Android Developer", + "name": "Benoit Lubek", + "about": "Currently working on Apollo-Kotlin, the Kotlin SDK for GraphQL, Benoit has been writing software for 20 years, with a focus on Android since its v1. When he’s not coding, you can find him enjoying movies or geocaching.", + "location": "France", + "url": "JRAF.org", + "avatar": "//avatars.sched.co/0/d3/431358/avatar.jpg.320x320px.jpg?e99", + "socialurls": [], + "_years": [ + 2025 + ], + "~syncedDetailsAt": 1758114083720 + }, + { + "username": "borisbesemer", + "company": "Vercel", + "position": "Senior Technical Consultant", + "name": "Boris Besemer", + "about": "", + "location": "The Netherlands", + "url": "", + "avatar": "//avatars.sched.co/c/f5/23301917/avatar.jpg.320x320px.jpg?2f8", + "socialurls": [], + "_years": [ + 2025 + ], + "~syncedDetailsAt": 1758137781378 + }, + { + "username": "brandon.r.minnick", + "company": "AWS", + "position": ".NET Developer Advocate", + "name": "Brandon Minnick", + "about": "Brandon is a Developer Advocate at AWS where he gets to work closely with the developer community to help fellow mobile app and cloud developers make 5-star apps.\n\nBrandon previously worked at Xamarin + Microsoft where he focused on creating mobile apps in C# using Xamarin + .NET MAUI.\n\nAn avid mobile app developer, Brandon loves to code and has contributed to and published countless apps!", + "location": "", + "url": "https://codetraveler.io/", + "avatar": "//avatars.sched.co/2/a4/9493345/avatar.jpg.320x320px.jpg?3ce", + "socialurls": [ + { + "service": "Twitter", + "url": "https://twitter.com/thecodetraveler" + } + ], + "_years": [ + 2023 + ], + "~syncedDetailsAt": 1749502266902 + }, + { + "username": "bryan.robinson2", + "company": "Hygraph", + "position": "Head of Developer Relations", + "name": "Bryan Robinson", + "about": "Bryan is the Head of Developer Relations at Hygraph. He has a strong passion for developer education and experience as well as decoupled architectures, frontend development, and clean design.", + "location": "", + "url": "https://hygraph.com/", + "avatar": "//avatars.sched.co/5/8e/19076363/avatar.jpg.320x320px.jpg?ad8", + "socialurls": [ + { + "service": "Twitter", + "url": "https://twitter.com/brob" + }, + { + "service": "LinkedIn", + "url": "https://linkedin.com/in/bryanlrobinson" + } + ], + "_years": [ + 2023 + ], + "~syncedDetailsAt": 1749502266902 + }, + { + "username": "bsklar", + "company": "Salesforce", + "position": "Senior Product Manager", + "name": "Ben Sklar", + "about": "Ben Sklar is a Senior Product Manager at Salesforce. He is an avid skier, hiker, and ultimate frisbee player.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/d/92/18743813/avatar.jpg.320x320px.jpg?042", + "socialurls": [ + { + "service": "LinkedIn", + "url": "https://www.linkedin.com/in/benjamin-sklar/" + } + ], + "_years": [ + 2023 + ], + "~syncedDetailsAt": 1749502266902 + }, + { + "username": "bsy", + "company": "Meta Platforms, Inc.", + "position": "Software Engineer", + "name": "Bryan Yang", + "about": "Bryan Yang is currently a tech lead at Meta leading the adoption of GraphQL in Ads Manager of Meta. Bryan has been working for a few big tech companies including Amazon and Uber for the past decade as a software engineer and an engineering manager. Bryan is wrapping up his master's degree in System Design and Management at MIT and holds a BS degree from University of Illinois at Urbana Champaign.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/7/1c/18743852/avatar.jpg.320x320px.jpg?de3", + "socialurls": [], + "_years": [ + 2023 + ], + "~syncedDetailsAt": 1749502266902 + }, + { + "username": "budha1", + "company": "Tyk", + "position": "Director of Product Ecosystems", + "name": "Budhaditya Bhattacharya", + "about": "Budha is the director of product ecosystems at Tyk, where he leads product education, ecosystem expansion, and open standards adoption. \n \nAs the board chair of the OpenAPI Initiative, he is responsible for membership growth and driving the adoption of OAS, Arazzo, and Overlays. \n \nPart product strategist, part developer advocate, and part storyteller, he’s on a mission to remove friction from API ecosystems by breaking down tech complexities preferably with a great metaphor and a well-placed pun.", + "location": "Durham, NC", + "url": "https://www.linkedin.com/in/budha-b/", + "avatar": "//avatars.sched.co/1/fe/17694866/avatar.jpg.320x320px.jpg?7a7", + "socialurls": [ + { + "service": "LinkedIn", + "url": "https://www.linkedin.com/in/budha-b" + } + ], + "_years": [ + 2024 + ], + "~syncedDetailsAt": 1749501873331 + }, + { + "username": "chanc2", + "company": "Meta", + "position": "Software Engineer", + "name": "Chi Chan", + "about": "GraphQL server side framework at Meta.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/6/6c/23098726/avatar.jpg.320x320px.jpg?2c3", + "socialurls": [ + { + "service": "LinkedIn", + "url": "https://www.linkedin.com/in/chichan1/" + } + ], + "_years": [ + 2025 + ], + "~syncedDetailsAt": 1758114074590 + }, + { + "username": "christian.ernst", + "company": "Booking.com", + "position": "Senior Software Engineer", + "name": "Christian Ernst", + "about": "Christian is currently a Senior Software Egineer at Booking.com. For the last two years Christian has been working driving the GraphQL initiative across the company by helping teams adopt GraphQL for their use cases.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/c/5f/19084532/avatar.jpg.320x320px.jpg?8bd", + "socialurls": [ + { + "service": "Twitter", + "url": "https://twitter.com/cernst11" + }, + { + "service": "LinkedIn", + "url": "https://nl.linkedin.com/in/christian-ernst11" + } + ], + "_years": [ + 2023 + ], + "~syncedDetailsAt": 1749502266902 + }, + { + "username": "christian.ernst1", + "company": "Booking.com", + "position": "Senior Software Engineer", + "name": "Christian Ernst", + "about": "Christian is currently a Senior Software Engineer at Booking.com. For the last three years Christian has been working to drive the GraphQL initiative across the company by helping teams adopt build new features leveraging GraphQL.", + "location": "Amsterdam", + "url": "", + "avatar": "//avatars.sched.co/9/39/21066804/avatar.jpg.320x320px.jpg?fff", + "socialurls": [], + "_years": [ + 2024, + 2025 + ], + "~syncedDetailsAt": 1758114074590 + }, + { + "username": "christian.stangier", + "company": "MOIA GmbH", + "position": "Senior Software Engineer", + "name": "Christian Stangier", + "about": "Christian is a Software Engineer at MOIA GmbH, a company trying to improve urban transportation with ride-pooling. With over 12 years of experience as a full-stack developer, Christian is currently focused on building real-time tooling for fleet operators with GraphQL on serverless AWS.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/a/5f/21066807/avatar.jpg.320x320px.jpg?a7c", + "socialurls": [], + "_years": [ + 2024 + ], + "~syncedDetailsAt": 1749505494947 + }, + { + "username": "curtis99877", + "company": "Meta Platforms", + "position": "Software Engineer", + "name": "Curtis Li", + "about": "Supporting GraphQL for mobile at Meta", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/b/59/23098729/avatar.jpg.320x320px.jpg?30d", + "socialurls": [], + "_years": [ + 2025 + ], + "~syncedDetailsAt": 1758137781378 + }, + { + "username": "danadajian", + "company": "Expedia Group", + "position": "Senior Software Engineer", + "name": "Dan Adajian", + "about": "I am a Senior Software Engineer at Expedia Group who is passionate about GraphQL, open source software, and developer experience. I live in Chicago, IL and enjoying playing golf and tennis when the weather allows!", + "location": "Chicago, IL", + "url": "https://github.com/danadajian/", + "avatar": "//avatars.sched.co/a/cc/21487429/avatar.jpg.320x320px.jpg?ffa", + "socialurls": [ + { + "service": "LinkedIn", + "url": "https://www.linkedin.com/in/dan-adajian-aa8aaa72" + } + ], + "_years": [ + 2024 + ], + "~syncedDetailsAt": 1749501873331 + }, + { + "username": "danielha4", + "company": "monday.com", + "position": "API Product Lead", + "name": "Daniel Hai", + "about": "Daniel Hai is the API Product Manager at monday.com, leading the strategy behind one of the largest public GraphQL implementations in the industry. With a decade of experience spanning software engineering and product management, he specializes in building APIs that developers love.\n \nBeyond his role at monday, Daniel actively shares insights on API product management and consults companies and startups on creating world-class developer experiences for the APIs.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/4/9a/23098732/avatar.jpg.320x320px.jpg?0c3", + "socialurls": [], + "_years": [ + 2025 + ], + "~syncedDetailsAt": 1758137781378 + }, + { + "username": "danielle.man", + "company": "Apollo GraphQL", + "position": "Senior Director of Engineering", + "name": "Danielle Man", + "about": "For the last 7 years I've been helping make GraphQL easier to build with and use at Apollo. I love building products for the web, solving problems with craftsmanship and code. In my time at Apollo I've been a friend, a manager, a developer, a product manager, a recruiter, an advocate, and more. At the end of the day, I just want to make tools that help people and feel great to use. I care much more about the people I'm working with than the day-to-day specifics of my job.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/b/1a/21066810/avatar.jpg.320x320px.jpg?708", + "socialurls": [], + "_years": [ + 2024 + ], + "~syncedDetailsAt": 1749505494947 + }, + { + "username": "david3103", + "company": "inRecovery", + "position": "Founder / CEO", + "name": "David Emanuel Sarabia", + "about": "", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/7/71/13551525/avatar.jpg.320x320px.jpg?cc8", + "socialurls": [], + "_years": [ + 2023 + ], + "~syncedDetailsAt": 1749503546034 + }, + { + "username": "dipro", + "company": "monday.com", + "position": "Senior Developer Advocate", + "name": "Dipro Bhowmik", + "about": "", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/3/ee/23187254/avatar.jpg.320x320px.jpg?c12", + "socialurls": [], + "_years": [ + 2025 + ], + "~syncedDetailsAt": 1758137784031 + }, + { + "username": "dkuc", + "company": "Apollo GraphQL", + "position": "Principal Software Engineer", + "name": "Derek Kuc", + "about": "Derek is an open source enthusiast working at Apollo on all things Federation. Prior to joining Apollo, Derek was a principal engineer at Expedia where he helped adopt GraphQL and open source graphql-kotlin.\n\nDerek also doesn’t think that anyone reads those bios so if you want to prove me wrong - high five me at the conference!", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/3/24/23173220/avatar.jpg.320x320px.jpg?c0e", + "socialurls": [ + { + "service": "Twitter", + "url": "https://x.com/derek_kuc" + }, + { + "service": "LinkedIn", + "url": "https://www.linkedin.com/in/dkuc/" + } + ], + "_years": [ + 2025 + ], + "~syncedDetailsAt": 1758114074590 + }, + { + "username": "donnasiqizhou", + "company": "Atlassian", + "position": "Software Engineer", + "name": "Donna Zhou", + "about": "I'm a maintainer of GraphQL Java and software engineer at Atlassian. I've published a book, GraphQL with Java and Spring, all about the official Spring for GraphQL integration and the GraphQL Java library.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/0/1d/18743879/avatar.jpg.320x320px.jpg?e2e", + "socialurls": [ + { + "service": "LinkedIn", + "url": "https://www.linkedin.com/in/donnazhou/" + } + ], + "_years": [ + 2023, + 2025 + ], + "~syncedDetailsAt": 1758114074590 + }, + { + "username": "dotan1", + "company": "The Guild", + "position": "CTO", + "name": "Dotan Simha", + "about": "CTO @ The Guild, creator and maintainer of many open-source libraries in the GraphQL ecosystem, including GraphQL-Codegen.", + "location": "", + "url": "https://the-guild.dev/", + "avatar": "//avatars.sched.co/3/1e/23098735/avatar.jpg.320x320px.jpg?7a3", + "socialurls": [ + { + "service": "Twitter", + "url": "https://x.com/dotansimha" + }, + { + "service": "LinkedIn", + "url": "https://www.linkedin.com/in/dotan-simha-36767b29/" + } + ], + "_years": [ + 2025 + ], + "~syncedDetailsAt": 1758114074590 + }, + { + "username": "dotansimha", + "company": "The Guild", + "position": "CTO", + "name": "Dotan Simha", + "about": "The creator of GraphQL Code Generator, and many other GraphQL-related tools. Active developer and maintainer of GraphQL-Hive and the CTO of The Guild.", + "location": "", + "url": "https://the-guild.dev/", + "avatar": "//avatars.sched.co/1/4d/18743828/avatar.jpg.320x320px.jpg?795", + "socialurls": [ + { + "service": "Twitter", + "url": "https://twitter.com/dotansimha" + } + ], + "_years": [ + 2023 + ], + "~syncedDetailsAt": 1749503782817 + }, + { + "username": "eddynguyen", + "company": "SEEK & The Guild", + "position": "Lead Engineer", + "name": "Eddy Nguyen", + "about": "By day, Eddy builds products at SEEK. By night, he maintains GraphQL Code Generator at The Guild.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/c/de/23565738/avatar.jpg.320x320px.jpg?063", + "socialurls": [ + { + "service": "Twitter", + "url": "https://x.com/eddeee888" + }, + { + "service": "LinkedIn", + "url": "https://www.linkedin.com/in/eddeee888/" + } + ], + "_years": [ + 2025 + ], + "~syncedDetailsAt": 1758114077046 + }, + { + "username": "eitan15", + "company": "Inigo", + "position": "CTO and Co-founder", + "name": "Eitan Joffe", + "about": "Software engineer and GraphQL enthusiast. Before founding Inigo, Eitan was a core member at multiple startups (Arista, Apstra, Observe) building stuff in networking, cloud infrastructure, and the observability space. Eitan's passion in life is to design, build and create stuff. He gets extra pleasure from finding elegant, simple solutions to complicated problems.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/5/e5/17700131/avatar.jpg.320x320px.jpg?aaf", + "socialurls": [], + "_years": [ + 2023 + ], + "~syncedDetailsAt": 1749503782817 + }, + { + "username": "emily.li2", + "company": "Benchling", + "position": "Software Engineer", + "name": "Emily Li", + "about": "Emily is a Software Engineer at Benchling where she has spent the past two years building a dynamically generated GraphQL API.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/d/91/21066813/avatar.jpg.320x320px.jpg?591", + "socialurls": [ + { + "service": "LinkedIn", + "url": "https://www.linkedin.com/in/emily-li-el2857/" + } + ], + "_years": [ + 2024 + ], + "~syncedDetailsAt": 1749501888881 + }, + { + "username": "en3m", + "company": "Independent", + "position": "dimaMachina.com", + "name": "Dimitri Postolov", + "about": "Open Source developer from Paris\nGraphQL-ESLint, Nextra and GraphiQL maintener", + "location": "", + "url": "https://the-guild.dev/", + "avatar": "//avatars.sched.co/5/78/18743843/avatar.jpg.320x320px.jpg?bb3", + "socialurls": [ + { + "service": "Twitter", + "url": "https://twitter.com/B2o5T" + }, + { + "service": "LinkedIn", + "url": "https://www.linkedin.com/in/postolov" + }, + { + "service": "Instagram", + "url": "https://www.instagram.com/dimdawkins" + } + ], + "_years": [ + 2023, + 2025 + ], + "~syncedDetailsAt": 1756282478611 + }, + { + "username": "erikwrede2", + "company": "Strawberry-GraphQL", + "position": "Software Engineer", + "name": "Erik Wrede", + "about": "Erik is a Software Engineer and GraphQL enthusiast that enjoys building full-stack GraphQL solutions. As a member of the GraphQL-Python Maintainer Team and Core Dev at Strawberry-GraphQL, he’s passionate about improving the developer experience and creating exciting new GraphQL tooling. Erik is excited about building performant and scalable solutions and is always eager to chat about new features, developments and the latest advancements in tech.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/6/74/21102110/avatar.jpg.320x320px.jpg?a37", + "socialurls": [ + { + "service": "Twitter", + "url": "https://twitter.com/erik_wrede" + }, + { + "service": "LinkedIn", + "url": "https://www.linkedin.com/in/erikwrede/" + } + ], + "_years": [ + 2024, + 2025 + ], + "~syncedDetailsAt": 1758114077046 + }, + { + "username": "ernie.turner1", + "company": "Coinbase", + "position": "Staff Software Engineer", + "name": "Ernie Turner", + "about": "Ernie has over fifteen years of experience building Enterprise web applications and developer platforms going back to the dark, soul crushing days of IE6. Ernie now works at Coinbase helping build their GraphQL infrastructure.", + "location": "", + "url": "https://coinbase.com/", + "avatar": "//avatars.sched.co/b/bc/18743873/avatar.jpg.320x320px.jpg?222", + "socialurls": [ + { + "service": "Twitter", + "url": "https://twitter.com/erniewturner" + }, + { + "service": "LinkedIn", + "url": "https://www.linkedin.com/in/ernie-turner-87545395/" + } + ], + "_years": [ + 2023 + ], + "~syncedDetailsAt": 1749503981180 + }, + { + "username": "ethan_shen.28dgusli", + "company": "LinkedIn", + "position": "Staff Software Engineer", + "name": "Ethan Shen", + "about": "I have over five years of experience working with GraphQL, applying the technology across both backend and frontend systems. I currently serve as a Staff Engineer and Tech Lead of the GraphQL Infrastructure team at LinkedIn.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/a/2f/23098744/avatar.jpg.320x320px.jpg?2ab", + "socialurls": [], + "_years": [ + 2025 + ], + "~syncedDetailsAt": 1758137784031 + }, + { + "username": "fbjork", + "company": "Grafbase", + "position": "CEO", + "name": "Fredrik Björk", + "about": "", + "location": "", + "url": "https://grafbase.com/", + "avatar": "//avatars.sched.co/1/eb/23184575/avatar.jpg.320x320px.jpg?dc7", + "socialurls": [ + { + "service": "Twitter", + "url": "https://x.com/fbjork" + }, + { + "service": "LinkedIn", + "url": "https://www.linkedin.com/in/fbjork/" + } + ], + "_years": [ + 2025 + ], + "~syncedDetailsAt": 1758114077046 + }, + { + "username": "fionabronwen", + "company": "Pinterest", + "position": "Senior Software Engineer", + "name": "Fiona Huang", + "about": "Fiona Huang is a Senior Software Engineer at Pinterest 📌 working on GraphQL on the Core API Platform team. Previously, she worked on planet scale APIs at Google, GraphQL at Twitter, and APIs at Braintree. Fiona enjoys data modeling 👩🏻‍💻, coffee ☕, croissants 🥐, and superfluous emoji usage ✨.", + "location": "New York, NY", + "url": "", + "avatar": "//avatars.sched.co/1/64/23098747/avatar.jpg.320x320px.jpg?c82", + "socialurls": [ + { + "service": "LinkedIn", + "url": "https://www.linkedin.com/in/fionabthompson/" + } + ], + "_years": [ + 2025 + ], + "~syncedDetailsAt": 1758114077046 + }, + { + "username": "gabe210", + "company": "StubHub Inc", + "position": "Senior Software Engineer - Design System Lead", + "name": "Gabriel Cura-Castro", + "about": "Gabriel Cura-Castro is senior software engineer with a particular interest in UX and design systems. He has two decades of experience developing software in a diverse range of fields spanning from developer tools, internet infrastructure, and finance. He has spent the last decade building design systems and federated components for the likes of Apple, Netflix, and now StubHub. In his spare time you can find him hiking the mountains of California with his daughter and partner.", + "location": "Santa Monica, CA", + "url": "", + "avatar": "//avatars.sched.co/5/54/23098750/avatar.jpg.320x320px.jpg?1ee", + "socialurls": [], + "_years": [ + 2025 + ], + "~syncedDetailsAt": 1758137784031 + }, + { + "username": "gabrielschulhof", + "company": "Auction.com", + "position": "Lead Software Engineer", + "name": "Gabriel Schulhof", + "about": "Node.js Core Collaborator and TSC Member emeritus, member of the Node.js API working group. Former employers include Nokia, Intel, and SpaceX.", + "location": "Irvine, CA", + "url": "https://auction.com/", + "avatar": "//avatars.sched.co/0/e6/13020672/avatar.jpg.320x320px.jpg?d7c", + "socialurls": [], + "_years": [ + 2024 + ], + "~syncedDetailsAt": 1749505494947 + }, + { + "username": "gerard.klijs", + "company": "AxonIQ", + "position": "Software Engineer", + "name": "Gerard Klijs", + "about": "With over 10 years of experience as a backend engineer, Gerard Klijs is a contributor to several GraphQL libraries, and also the creator and maintainer of a Rust library to use Confluent Schema Registry. He has an interest in event sourcing and CQRS and likes sharing knowledge via blogs, talks, and demo projects.", + "location": "", + "url": "https://www.axoniq.io/", + "avatar": "//avatars.sched.co/2/4b/18743792/avatar.jpg.320x320px.jpg?b61", + "socialurls": [ + { + "service": "Twitter", + "url": "https://twitter.com/GKlijs" + }, + { + "service": "LinkedIn", + "url": "https://www.linkedin.com/mwlite/profile/in/%F0%9F%92%BBgerard-klijs%F0%9F%A6%80-416b3744" + } + ], + "_years": [ + 2023 + ], + "~syncedDetailsAt": 1749503986466 + }, + { + "username": "giacomo.simmi", + "company": "Paramount", + "position": "Software Architect", + "name": "Giacomo Simmi", + "about": "Born in the 90s, I grew up in southern Italy surrounded by martial arts, anime, video games, and computers.\nI fell in love with computer science when software was still distributed on floppy disks.\n\nI started my career as a Mobile Developer when Android was just emerging. Later, I took on roles such as Web Developer, Backend Developer, Tech Lead, and IT Manager.\n\nToday, I am an IT Architect with more than 10 years of experience in consulting companies and corporates.", + "location": "Milan, Italy", + "url": "https://keadex.dev/", + "avatar": "//avatars.sched.co/6/8c/21496501/avatar.jpg.320x320px.jpg?5c6", + "socialurls": [ + { + "service": "LinkedIn", + "url": "https://www.linkedin.com/in/giacomosimmi/" + } + ], + "_years": [ + 2024 + ], + "~syncedDetailsAt": 1749501888881 + }, + { + "username": "gilgardosh", + "company": "The Guild", + "position": "Open Source Developer", + "name": "Gil Gardosh", + "about": "", + "location": "", + "url": "https://the-guild.dev/", + "avatar": "//avatars.sched.co/0/33/19070448/avatar.jpg.320x320px.jpg?34a", + "socialurls": [ + { + "service": "Twitter", + "url": "https://twitter.com/gilgardosh" + }, + { + "service": "LinkedIn", + "url": "https://www.linkedin.com/in/gil-gardosh-9a5088a5/" + } + ], + "_years": [ + 2023 + ], + "~syncedDetailsAt": 1749503986466 + }, + { + "username": "gonenj", + "company": "Wix.com", + "position": "Head of API Infra", + "name": "Gonen Jerbi", + "about": "Gonen, a GraphQL enthusiast for 8 years, joined Wix 6 years ago, pioneering GraphQL adoption. A transformative hackathon 5 years ago showcased automatic schema generation for Wix APIs. Today, Wix extensively uses GraphQL and plans to expose all APIs via GraphQL. Join him to explore his insights on streamlining GraphQL adoption and unleashing its potential.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/3/c5/18743816/avatar.jpg.320x320px.jpg?0f8", + "socialurls": [ + { + "service": "Twitter", + "url": "https://twitter.com/gonengar" + }, + { + "service": "LinkedIn", + "url": "https://www.linkedin.com/in/gonen-jerbi-01a7296a/" + } + ], + "_years": [ + 2023 + ], + "~syncedDetailsAt": 1749505650884 + }, + { + "username": "goodwin.y.emily", + "company": "Independent", + "position": "Professional GraphQL Developer turned GraphQL Hobbiest", + "name": "Emily Goodwin", + "about": "Emily has professionally worked with GraphQL for a bit over two years and has shifted to working with GraphQL as a hobby. She has experience with production schema stitching federate environments and customized GraphQL tools. When not coding she enjoys Magic the Gathering and volunteering.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/8/45/23098741/avatar.jpg.320x320px.jpg?a4f", + "socialurls": [], + "_years": [ + 2025 + ], + "~syncedDetailsAt": 1758137784031 + }, + { + "username": "hello2358", + "company": "IBM", + "position": "Technical Product Manager", + "name": "Roy Derks", + "about": "Roy is an entrepreneur, speaker and author from The Netherlands and, in his own words, 'wants to make the world a better place through tech'. He has been giving talks and trainings to developers worldwide on technologies like GraphQL, React and TypeScript. Most recently he wrote the book Fullstack GraphQL.", + "location": "Santa Clara, CA", + "url": "https://x.com/gethackteam", + "avatar": "//avatars.sched.co/a/20/16832291/avatar.jpg.320x320px.jpg?60d", + "socialurls": [ + { + "service": "Twitter", + "url": "https://x.com/gethackteam" + }, + { + "service": "LinkedIn", + "url": "https://www.linkedin.com/in/gethackteam" + } + ], + "_years": [ + 2023, + 2024 + ], + "~syncedDetailsAt": 1749497439360 + }, + { + "username": "idit_levine.25krdj4u", + "company": "Solo.io", + "position": "Founder", + "name": "Idit Levine", + "about": "", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/e/82/18769950/avatar.jpg.320x320px.jpg?ca2", + "socialurls": [], + "_years": [ + 2023 + ], + "~syncedDetailsAt": 1749505650884 + }, + { + "username": "itamark", + "company": "Meta", + "position": "Software Engineer", + "name": "Itamar Kestenbaum", + "about": "Software Engineer working on Infrastructure experiences at Meta", + "location": "", + "url": "https://www.threads.net/@itamarok", + "avatar": "//avatars.sched.co/b/e5/80829/avatar.jpg.320x320px.jpg?5bf", + "socialurls": [ + { + "service": "Facebook", + "url": "https://www.facebook.com/profile.php?id=504330120" + }, + { + "service": "LinkedIn", + "url": "https://linkedin.com/in/itamarkestenbaum" + } + ], + "_years": [ + 2024, + 2025 + ], + "~syncedDetailsAt": 1758114077046 + }, + { + "username": "ivan.goncharov.ua", + "company": "KeenEthics", + "position": "Head of R&D", + "name": "Ivan Goncharov", + "about": "Ivan has been active in the GraphQL community since its early days and is currently a member of the GraphQL Technical Steering Committee.", + "location": "Lviv", + "url": "https://apis.guru/", + "avatar": "//avatars.sched.co/d/6f/23096422/avatar.jpg.320x320px.jpg?958", + "socialurls": [ + { + "service": "LinkedIn", + "url": "https://www.linkedin.com/in/igoncharov/" + } + ], + "_years": [ + 2025 + ], + "~syncedDetailsAt": 1758137788992 + }, + { + "username": "jamie855", + "company": "Grafbase", + "position": "Dev Rel Engineer", + "name": "Jamie Barton", + "about": "Around since the days of dial-up modems and flash websites. I'm a software engineer who can do slightly more than build landing pages today. Despite my age (in tech years, at least), I'm always working with the latest tools like GraphQL to build beautiful and functional web apps.", + "location": "North East, UK", + "url": "https://grafbase.com/", + "avatar": "//avatars.sched.co/c/f3/18743804/avatar.jpg.320x320px.jpg?2a2", + "socialurls": [ + { + "service": "Twitter", + "url": "https://twitter.com/notrab" + }, + { + "service": "LinkedIn", + "url": "https://www.linkedin.com/in/notrab/" + } + ], + "_years": [ + 2023 + ], + "~syncedDetailsAt": 1749505650884 + }, + { + "username": "janette.cheng", + "company": "Meta", + "position": "Software Engineer", + "name": "Janette Cheng", + "about": "Working on the GraphQL client and build infrastructure for mobile apps at Meta", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/c/c0/21066816/avatar.jpg.320x320px.jpg?aa7", + "socialurls": [], + "_years": [ + 2024 + ], + "~syncedDetailsAt": 1749505607370 + }, + { + "username": "janettelc", + "company": "Meta", + "position": "Software Engineer", + "name": "Janette Cheng", + "about": "Working on the GraphQL client and build infrastructure for mobile apps at Meta", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/5/f9/23098753/avatar.jpg.320x320px.jpg?9a8", + "socialurls": [], + "_years": [ + 2025 + ], + "~syncedDetailsAt": 1758137784031 + }, + { + "username": "jared_cheney.7rad60v", + "company": "Intuit", + "position": "Distinguished Engineer", + "name": "Jared Cheney", + "about": "Jared Cheney is a Distinguished Engineer at Intuit with over 24 years of industry experience with a focus in DevOps, consulting, and software development. He has led many initiatives involving API integrations with other products and helps lead the efforts around best practices for API guidelines and principles within Intuit.", + "location": "Boise, ID", + "url": "intuit.com", + "avatar": "//avatars.sched.co/4/e3/18775617/avatar.jpg.320x320px.jpg?01b", + "socialurls": [ + { + "service": "LinkedIn", + "url": "https://www.linkedin.com/in/jaredcheney/" + } + ], + "_years": [ + 2023 + ], + "~syncedDetailsAt": 1749505650884 + }, + { + "username": "jasonkuhrt", + "company": "The Guild", + "position": "", + "name": "Jason Kuhrt", + "about": "I am a builder passionate about system design, developer experience, static typing, and functional programming. Educated in design theory, practice, and social responsibility, I fell into code via open source gateways like Wordpress, jQuery, Node.js, and GitHub. My love for open source continues today in TypeScript and GraphQL. In my personal life, close to my heart are the backpacking trips I take my two boys on yearly across the beautiful rugged Canadian wilderness.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/f/0a/23098756/avatar.jpg.320x320px.jpg?3a2", + "socialurls": [ + { + "service": "LinkedIn", + "url": "https://www.linkedin.com/in/kuhrt" + } + ], + "_years": [ + 2025 + ], + "~syncedDetailsAt": 1758114077046 + }, + { + "username": "jeff.auriemma", + "company": "Apollo GraphQL", + "position": "Senior Engineering Manager", + "name": "Jeff Auriemma", + "about": "Hi, I'm Jeff! I support the Apollo Client, Apollo iOS, Apollo Kotlin, and Apollo Server engineers at Apollo as a manager. Before going into software I was a trombonist and public school music teacher. In my free time I like to bake Chicago-style deep dish pizzas and French macarons.", + "location": "Connecticut, USA", + "url": "https://apollographql.com/", + "avatar": "//avatars.sched.co/3/77/18743876/avatar.jpg.320x320px.jpg?d3d", + "socialurls": [ + { + "service": "Twitter", + "url": "https://twitter.com/JeffAuriemma" + }, + { + "service": "LinkedIn", + "url": "https://www.linkedin.com/in/jeffreyauriemma/" + } + ], + "_years": [ + 2023, + 2024, + 2025 + ], + "~syncedDetailsAt": 1758114077046 + }, + { + "username": "jeff737", + "company": "The Guild", + "position": "Software Engineer", + "name": "Jeff Dolle", + "about": "Jeff Dolle is a Software Engineer at The Guild who has been using GraphQL full-stack since 2016 and is currently working on the GraphQL Hive platform. He has extensive experience designing and implementing schemas in production software, serving over a billion requests a month.", + "location": "", + "url": "https://graphql-hive.com/", + "avatar": "//avatars.sched.co/3/b5/23098759/avatar.jpg.320x320px.jpg?613", + "socialurls": [ + { + "service": "LinkedIn", + "url": "https://linkedin.com/in/jeffdolle" + } + ], + "_years": [ + 2025 + ], + "~syncedDetailsAt": 1758114077046 + }, + { + "username": "jem28", + "company": "Graphile", + "position": "Community Operations", + "name": "Jem Gillam", + "about": "Jem wears many hats: admin, marketing, video editor, QA, customer relations, operations, and so much more; but chief among them is community - fostering, moderation, outreach and collaboration are all in a day's work for them. Often working behind the scenes on GraphQL-related projects, they were key to the GraphQL Stars initiative, organized the SMEs program, and are the lead on a new program launching this year. In their spare time, Jem is a keen volunteer and loves to crochet and bake.", + "location": "Chandlers Ford, UK", + "url": "https://github.com/jemgillam", + "avatar": "//avatars.sched.co/f/8a/23300543/avatar.jpg.320x320px.jpg?afe", + "socialurls": [ + { + "service": "LinkedIn", + "url": "https://www.linkedin.com/in/jem-gillam-92063b14/" + } + ], + "_years": [ + 2025 + ], + "~syncedDetailsAt": 1758114077046 + }, + { + "username": "jens63", + "company": "WunderGraph", + "position": "CEO & Founder", + "name": "Jens Neuse", + "about": "CEO and Founder of WunderGraph,\nbuilding an open-source alternative to Apollo Federation and GraphOS.\nCreator of Open Federation, an open specification for federated GraphQL.\nCreator of graphql-go-tools, an open-source implementation of GraphQL in Go.", + "location": "", + "url": "https://wundergraph.com/", + "avatar": "//avatars.sched.co/3/68/19226202/avatar.jpg.320x320px.jpg?aea", + "socialurls": [ + { + "service": "Twitter", + "url": "https://twitter.com/TheWorstFounder" + }, + { + "service": "LinkedIn", + "url": "https://www.linkedin.com/in/jens-neuse-706673195/" + } + ], + "_years": [ + 2023 + ], + "~syncedDetailsAt": 1749505650884 + }, + { + "username": "jim.barton", + "company": "Solo.io", + "position": "Field Engineer", + "name": "Jim Barton", + "about": "Jim Barton is a Field Engineer at Solo.io, a Cambridge-based company specializing in service mesh and Kubernetes-native API gateway technology. Jim’s career in enterprise software spans 30 years. He has enjoyed roles as a project engineer, sales and consulting engineer, product development manager, and executive leader of tech startups. Prior to Solo, he spent a decade architecting, building and operating systems based on enterprise open-source technologies, at the likes of Red Hat, Amazon, and Zappos. After two years of COVID-driven, Zoom-encrusted isolation, Jim especially enjoys sharing with and learning from three-dimensional people at technical conferences around the world.", + "location": "Myrtle Beach, SC, USA", + "url": "https://solo.io/", + "avatar": "//avatars.sched.co/f/74/12615290/avatar.jpg.320x320px.jpg?8cc", + "socialurls": [ + { + "service": "Twitter", + "url": "https://twitter.com/@jameshbarton" + }, + { + "service": "LinkedIn", + "url": "https://www.linkedin.com/in/jameshbarton/" + } + ], + "_years": [ + 2023 + ], + "~syncedDetailsAt": 1749505650884 + }, + { + "username": "joebirch", + "company": "Buffer", + "position": "Staff Engineer", + "name": "Joe Birch", + "about": "Hi, my names Joe. I’m an Android Engineer and Google Developer Expert for Android based in Brighton, UK working on GraphQL + Android at Buffer. I’m passionate about coding and love creating robust, polished and exciting projects for mobile, the web, TV, wearables and I’ll probably be toying with whatever the new thing is at the time you’re reading this.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/d/34/23098765/avatar.jpg.320x320px.jpg?897", + "socialurls": [], + "_years": [ + 2025 + ], + "~syncedDetailsAt": 1758137784031 + }, + { + "username": "jordaneldredge", + "company": "Meta", + "position": "Software Engineer", + "name": "Jordan Eldredge", + "about": "Jordan has spent the last seven years working at Meta. He currently works on Relay, a sophisticated GraphQL client for JavaScript that powers most of Meta's JavaScript applications.", + "location": "", + "url": "https://jordaneldredge.com/", + "avatar": "//avatars.sched.co/7/eb/21066819/avatar.jpg.320x320px.jpg?65e", + "socialurls": [ + { + "service": "Twitter", + "url": "https://twitter.com/captbaritone" + }, + { + "service": "LinkedIn", + "url": "https://www.linkedin.com/in/jordaneldredge/" + } + ], + "_years": [ + 2024 + ], + "~syncedDetailsAt": 1749501888881 + }, + { + "username": "jordaneldredge1", + "company": "Meta", + "position": "Software Engineer at Meta", + "name": "Jordan Eldredge", + "about": "Jordan has spent the last eight years working at Meta. He currently works on Relay, a sophisticated GraphQL client for JavaScript that powers most of Meta's JavaScript applications.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/5/f6/21508644/avatar.jpg.320x320px.jpg?ad2", + "socialurls": [], + "_years": [ + 2025 + ], + "~syncedDetailsAt": 1758137784031 + }, + { + "username": "juancarlosjr97", + "company": "RS Group", + "position": "Senior Software Engineer", + "name": "Juan Carlos Blanco Delgado", + "about": "Juan Carlos (JC) is a Senior Software Engineer at RS Group, where he leads the development of the federated graph and supports teams in integrating and evolving their services within it. He is passionate about the open source community. Outside of work, JC enjoys running, climbing, cycling and snowboarding, and building cool things (recently with Rust)!", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/8/00/23098768/avatar.jpg.320x320px.jpg?181", + "socialurls": [ + { + "service": "LinkedIn", + "url": "https://www.linkedin.com/in/juancarlosjr97" + }, + { + "service": "Instagram", + "url": "https://www.instagram.com/juancarlosjr97" + } + ], + "_years": [ + 2025 + ], + "~syncedDetailsAt": 1758114079985 + }, + { + "username": "kamilkisiela", + "company": "The Guild", + "position": "Developer", + "name": "Kamil Kisiela", + "about": "Working on GraphQL tooling since before I had a mustache. I'm proud of it (the tooling).", + "location": "Warsaw, Poland", + "url": "https://github.com/kamilkisiela", + "avatar": "//avatars.sched.co/2/7e/19082388/avatar.jpg.320x320px.jpg?42c", + "socialurls": [ + { + "service": "Twitter", + "url": "https://twitter.com/kamilkisiela" + }, + { + "service": "LinkedIn", + "url": "https://www.linkedin.com/in/kamilkisiela" + }, + { + "service": "Instagram", + "url": "https://www.instagram.com/kisiel_ogarnij" + } + ], + "_years": [ + 2023, + 2024, + 2025 + ], + "~syncedDetailsAt": 1758114079985 + }, + { + "username": "keerthan.ekbote", + "company": "solo.io", + "position": "Mr.", + "name": "Sai Ekbote", + "about": "Sai Ekbote is a Software Engineer currently working on the GraphQL initiative at Solo.io. He has contributed to multiple open source projects such as Istio, Envoy and Flagger. Prior to working on cloud-native tech at solo, Sai worked as a full stack engineer at HubSpot and a simulations engineer at Raytheon.", + "location": "", + "url": "https://solo.io/", + "avatar": "//avatars.sched.co/a/6d/14553875/avatar.jpg.320x320px.jpg?9aa", + "socialurls": [ + { + "service": "LinkedIn", + "url": "https://linkedin.com/in/keerthanekbote" + } + ], + "_years": [ + 2023 + ], + "~syncedDetailsAt": 1749505650884 + }, + { + "username": "keith.babo", + "company": "Solo.io", + "position": "Chief Product Officer", + "name": "Keith Babo", + "about": "Keith Babo leads the product team at Solo.io covering the full range of application networking technologies required to build modern, cloud-native application architectures. Prior to joining Solo.io, Keith held product management and engineering leadership positions at Red Hat, Sun Microsystems, and Intel Corporation.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/2/05/19071264/avatar.jpg.320x320px.jpg?0c9", + "socialurls": [ + { + "service": "Twitter", + "url": "https://twitter.com/keithbabo" + }, + { + "service": "LinkedIn", + "url": "https://www.linkedin.com/in/babo/" + } + ], + "_years": [ + 2023 + ], + "~syncedDetailsAt": 1749505650884 + }, + { + "username": "kenneth.wussmann", + "company": "MOIA GmbH", + "position": "Tech Lead, Senior Software Engineer", + "name": "Kenneth Wußmann", + "about": "I currently work at MOIA, building serverless applications to operate an autonomous fleet of vehicles. My journey began in the Java EE cosmos, but over time I shifted to TypeScript, Serverless Architecture and GraphQL. I am fascinated by chess and its parallels to software development.", + "location": "", + "url": "", + "avatar": "", + "socialurls": [], + "_years": [ + 2024 + ], + "~syncedDetailsAt": 1749502251756 + }, + { + "username": "kennethstott", + "company": "Hasura, Inc.", + "position": "Field CTO, Hasura, Inc.", + "name": "Kenneth Stott", + "about": "Ken’s experience spans risk management consulting at Deloitte, technology executive leadership in major finance and energy firms, and the CTO of a MedTech startup. Most recently, he was a senior data architect for key initiatives at Bank of America. Now, as Field CTO at Hasura, Inc., he drives cost-effective data solutions for large finance, energy, and healthcare enterprises, addressing complex regulatory challenges and competitive pressures.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/f/b3/21066821/avatar.jpg.320x320px.jpg?439", + "socialurls": [], + "_years": [ + 2024 + ], + "~syncedDetailsAt": 1749505607370 + }, + { + "username": "kevin.brown11", + "company": "Exogee", + "position": "Chief Technology Officer", + "name": "Kevin Brown", + "about": "Kevin founded Exogee, a company that builds GraphQL based products for companies that want to ship high quality code quickly on modern stacks. He has been building with GraphQL for more than 7 years, creating software for more than 20 years and likes solving hard problems. Kevin is originally from the US and lives in Sydney, Australia.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/f/4d/21490044/avatar.jpg.320x320px.jpg?2c5", + "socialurls": [], + "_years": [ + 2024 + ], + "~syncedDetailsAt": 1749505607370 + }, + { + "username": "kevin1700", + "company": "The Graph", + "position": "Developer Relations Engineer", + "name": "Kevin Jones", + "about": "Kevin is an experienced Developer Relations Engineer with a strong focus on the dynamic realm of blockchain technology. With a passion for fostering innovation and education in the blockchain space, specializing in dApp development and a champion of the adoption of public goods education. Leveraging over 15 years of hands-on experience in deploying production applications, Kevin brings a wealth of knowledge to drive impactful solutions.", + "location": "San Francisco, CA", + "url": "", + "avatar": "//avatars.sched.co/2/d0/19150962/avatar.jpg.320x320px.jpg?e4c", + "socialurls": [ + { + "service": "Twitter", + "url": "https://twitter.com/cryptomastery_" + }, + { + "service": "LinkedIn", + "url": "https://www.linkedin.com/in/kevinjones-crypto/" + } + ], + "_years": [ + 2023 + ], + "~syncedDetailsAt": 1749505650884 + }, + { + "username": "laurent57", + "company": "Postman", + "position": "Microcks co-founder, Director of Engineering at Postman Open Technologies", + "name": "Laurent Broudoux", + "about": "Laurent is a Cloud-Native Architecture expert and Enterprise Integration problem lover. He has helped organizations in adopting distributed and cloud paradigms while capitalizing on their critical existing assets. He is the founder and lead developer of the Microcks.io open source project: a Kubernetes-native tool for API mocking and testing. For this, he is using his 10+ years experience as an architect in Financial Services where he defined API transformation strategies, including governance and delivery process.", + "location": "Le Mans, France", + "url": "", + "avatar": "//avatars.sched.co/4/7d/18853523/avatar.jpg.320x320px.jpg?fdb", + "socialurls": [ + { + "service": "Twitter", + "url": "https://twitter.com/lbroudoux" + }, + { + "service": "LinkedIn", + "url": "https://www.linkedin.com/in/laurentbroudoux/" + } + ], + "_years": [ + 2023 + ], + "~syncedDetailsAt": 1749505650884 + }, + { + "username": "laurinquast", + "company": "The Guild", + "position": "Software Engineer", + "name": "Laurin Quast", + "about": "Laurin Quast is a developer that started exploring GraphQL, by leading API development at a start-up. Realizing that there are still many unsolved problems and challenges within the space, he started contributing to famous JavaScript libraries, such as GraphQL Code Generator and Tools. Diving deeper, the transition into becoming a full-time open-source developer at The Guild was inevitable. Currently, he is working on Hive helping teams scale GraphQL across teams and organizations.", + "location": "", + "url": "https://the-guild.dev/", + "avatar": "//avatars.sched.co/2/a6/18743819/avatar.jpg.320x320px.jpg?ebc", + "socialurls": [ + { + "service": "Twitter", + "url": "https://twitter.com/n1rual" + }, + { + "service": "LinkedIn", + "url": "https://www.linkedin.com/in/laurin-quast-a47b871b4/" + } + ], + "_years": [ + 2023, + 2024, + 2025 + ], + "~syncedDetailsAt": 1758114079985 + }, + { + "username": "ldebruijn", + "company": "bol", + "position": "Tech Lead", + "name": "Lars de Bruijn", + "about": "Lars de Bruijn is a Tech Lead at bol, a leading retail platform operating in The Netherlands and Belgium. Lars is passionate about aligning business strategy with efficient execution, while ensuring the rubber hits the road with his hands-on approach. In his role he is responsible for the customer facing stack of bol, which is where he introduced Federated GraphQL and spearheaded the adoption of GraphQL in the organization.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/4/57/5922948/avatar.jpg.320x320px.jpg?fa5", + "socialurls": [ + { + "service": "LinkedIn", + "url": "https://www.linkedin.com/in/lars-de-bruijn/" + } + ], + "_years": [ + 2024 + ], + "~syncedDetailsAt": 1749501892530 + }, + { + "username": "lee_byron.25jvpjmb", + "company": "GraphQL Foundation", + "position": "Co-creator of GraphQL and Director", + "name": "Lee Byron", + "about": "", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/5/24/18743534/avatar.jpg.320x320px.jpg?480", + "socialurls": [], + "_years": [ + 2024, + 2025 + ], + "~syncedDetailsAt": 1758114079985 + }, + { + "username": "lee_byron.25krdom6", + "company": "GraphQL Foundation", + "position": "Co-creator of GraphQL, Director of the GraphQL Foundation", + "name": "Lee Byron", + "about": "Lee is the co-creator of GraphQL and Executive Director of the GraphQL Foundation. He leads Product Engineering at Watershed building tools to address the climate crisis. Lee has had a hand in open source libraries used by millions of developers worldwide including GraphQL, React, Dataloader, Immutable.js, Relay, Flow and more.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/8/92/18769956/avatar.jpg.320x320px.jpg?547", + "socialurls": [], + "_years": [ + 2023 + ], + "~syncedDetailsAt": 1749505650884 + }, + { + "username": "lerenzo", + "company": "Miro", + "position": "Senior Software Engineer", + "name": "LeRenzo Malcom", + "about": "Software engineer at Miro!", + "location": "", + "url": "https://miro.com/", + "avatar": "//avatars.sched.co/f/19/5604312/avatar.jpg.320x320px.jpg?db4", + "socialurls": [ + { + "service": "Twitter", + "url": "https://twitter.com/lerenzom" + }, + { + "service": "LinkedIn", + "url": "https://www.linkedin.com/in/lmalcom" + } + ], + "_years": [ + 2023 + ], + "~syncedDetailsAt": 1749505650884 + }, + { + "username": "lisamwatkins", + "company": "Meta", + "position": "Software Engineer", + "name": "Lisa Watkins", + "about": "Lisa works on the Mobile Sustainability team at Instagram. Her team's charter is to ensure the longterm health of the mobile developer experience at Instagram. Her main focus is transition Instagram from REST to GraphQL.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/7/15/23098774/avatar.jpg.320x320px.jpg?49f", + "socialurls": [], + "_years": [ + 2025 + ], + "~syncedDetailsAt": 1758137784031 + }, + { + "username": "lyonwj1", + "company": "Neo4j", + "position": "Developer Advocate", + "name": "William Lyon", + "about": "William Lyon is a Staff Developer Advocate at Neo4j, the open source graph database. He previously worked as a software engineer on quantitative finance systems, mobile apps for the real estate industry, and predictive API services. He is the author of the Manning book Full Stack GraphQL Applications and has a masters degree in Computer Science from the University of Montana. You can find him online where he publishes a blog at lyonwj.com", + "location": "San Mateo, CA", + "url": "https://lyonwj.com/", + "avatar": "//avatars.sched.co/5/93/19084292/avatar.jpg.320x320px.jpg?348", + "socialurls": [ + { + "service": "Twitter", + "url": "https://twitter.com/lyonwj" + }, + { + "service": "LinkedIn", + "url": "https://www.linkedin.com/in/lyonwj/" + } + ], + "_years": [ + 2023 + ], + "~syncedDetailsAt": 1749505650884 + }, + { + "username": "mahoney.mattj", + "company": "Meta", + "position": "Software Engineer", + "name": "Matthew Mahoney", + "about": "I work on Meta's Mobile GraphQL team.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/c/1d/19314398/avatar.jpg.320x320px.jpg?b71", + "socialurls": [ + { + "service": "Facebook", + "url": "https://www.facebook.com/mattjmahoney?mibextid=LQQJ4d" + }, + { + "service": "Twitter", + "url": "https://twitter.com/mahoneymattj" + } + ], + "_years": [ + 2024, + 2025 + ], + "~syncedDetailsAt": 1758114079985 + }, + { + "username": "mail1232", + "company": "Apollo GraphQL", + "position": "Senior Staff Engineer", + "name": "Lenz Weber-Tronic", + "about": "Lenz Weber-Tronic works as a Senior Staff Software Engineer at Apollo GraphQL, where he is part of the team maintaining the Apollo TypeScript Client. He is a maintainer of Redux Toolkit and if he’s not currently trying to summon elder gods with weird TypeScript incantations he can usually be found answering questions on Apollo and Redux usage or opening random PRs all over GitHub.", + "location": "Germany", + "url": "https://phryneas.de/", + "avatar": "//avatars.sched.co/1/fa/23098771/avatar.jpg.320x320px.jpg?314", + "socialurls": [], + "_years": [ + 2025 + ], + "~syncedDetailsAt": 1758137784031 + }, + { + "username": "mansi.mittal", + "company": "Booking.com", + "position": "Senior Software Engineer", + "name": "Mansi Mittal", + "about": "Mansi Mittal is a Senior Software Engineer with 12 years of experience, including 6 years at Booking.com. She has designed and architected critical, high-scale systems and led the migration from REST + Protobuf to federated GraphQL for high-volume, business-critical services. Passionate about scalable architecture, she bridges product needs with elegant engineering solutions.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/1/45/23098777/avatar.jpg.320x320px.jpg?cb5", + "socialurls": [ + { + "service": "LinkedIn", + "url": "https://www.linkedin.com/in/mansi-mit03/" + } + ], + "_years": [ + 2025 + ], + "~syncedDetailsAt": 1758137788992 + }, + { + "username": "marco.reni", + "company": "Mediaset - MFE", + "position": "Architect", + "name": "Marco Reni", + "about": "Marco Reni is an Architect at Mediaset (MFE), the biggest broadcaster in Italy and one of the largest free broadcasters in Europe. He is in charge of all the frontend architectures and services. Over the years, he has taken responsibility of several high profile projects - including the new Voting Platform - leveraging his background as a Backend/DevOps Engineer. In his free time he likes to play the piano, play board games, eat ramen and take photos while traveling around the world.", + "location": "Milan, Italy", + "url": "https://www.marcoreni.it/", + "avatar": "//avatars.sched.co/7/39/23098780/avatar.jpg.320x320px.jpg?6ae", + "socialurls": [ + { + "service": "LinkedIn", + "url": "https://linkedin.com/in/marcoreni" + } + ], + "_years": [ + 2025 + ], + "~syncedDetailsAt": 1758137781378 + }, + { + "username": "marion84", + "company": "Hasura", + "position": "Head of Developer Education", + "name": "Marion Schleifer", + "about": "I am leading the Developer Education efforts at Hasura, working with the documentation team and the technical evangelists team. I love interacting with and learning from the community to help improve the Hasura product. In my free time, I ride dirt bikes and practice ballet.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/b/cf/19150944/avatar.jpg.320x320px.jpg?418", + "socialurls": [ + { + "service": "Twitter", + "url": "https://twitter.com/rubydwarf" + }, + { + "service": "LinkedIn", + "url": "https://www.linkedin.com/in/marion-schleifer/" + } + ], + "_years": [ + 2023 + ], + "~syncedDetailsAt": 1749505650884 + }, + { + "username": "mark1437", + "company": "Yelp", + "position": "Software Engineer", + "name": "Mark Larah", + "about": "Mark leads GraphQL infrastructure and tooling at Yelp.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/e/b9/23416744/avatar.jpg.320x320px.jpg?fb2", + "socialurls": [ + { + "service": "Twitter", + "url": "https://x.com/mark_larah" + } + ], + "_years": [ + 2025 + ], + "~syncedDetailsAt": 1758114079985 + }, + { + "username": "martijn.walraven", + "company": "Apollo", + "position": "Software Engineer", + "name": "Martijn Walraven", + "about": "Martijn Walraven lives in Amsterdam and has been with Apollo since the early days of our GraphQL journey. He is one of the co-creators of Apollo Federation. Outside of work, he enjoys volunteering at a primary school and is working towards a degree in education.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/6/33/21066825/avatar.jpg.320x320px.jpg?ac7", + "socialurls": [], + "_years": [ + 2024, + 2025 + ], + "~syncedDetailsAt": 1758114079985 + }, + { + "username": "martinbonnin42", + "company": "Apollo", + "position": "Mobile Engineer", + "name": "Martin Bonnin", + "about": "Martin is a maintainer of Apollo Kotlin. He has been writing Android applications since Cupcake and fell in love with Kotlin in 2017. Martin loves naming things and the sound of his laptop fan compiling all these type-safe programs. When not busy rewriting all his bash scripts in Kotlin, Martin loves to hike the Pyrénées or play a good game of Hearthstone.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/c/ef/23098783/avatar.jpg.320x320px.jpg?7ff", + "socialurls": [], + "_years": [ + 2025 + ], + "~syncedDetailsAt": 1758137788992 + }, + { + "username": "marybriskin", + "company": "Tutored by Teachers", + "position": "Lead Software Engineer", + "name": "Mary Briskin", + "about": "Attended the University of Waterloo. Worked at Shopify and now working at Tutored by Teachers as the Lead Software Engineer. Love using graphQL, love learning from and teaching others!", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/2/3f/21457039/avatar.jpg.320x320px.jpg?7cf", + "socialurls": [], + "_years": [ + 2024 + ], + "~syncedDetailsAt": 1749501892530 + }, + { + "username": "masanori.uehara", + "company": "Tailor Inc.", + "position": "Head of Platform", + "name": "Masanori Uehara", + "about": "Masanori is a Head of Platform at Tailor Inc, a Headless ERP Platform. He previously worked as a Backend engineer at Japan's largest C2C Marketplace, Mercari, and joined Tailor in 2023.", + "location": "Tokyo, Japan", + "url": "https://www.tailor.tech/", + "avatar": "//avatars.sched.co/4/fd/21066828/avatar.jpg.320x320px.jpg?b60", + "socialurls": [ + { + "service": "Twitter", + "url": "https://twitter.com/jackchuka" + }, + { + "service": "LinkedIn", + "url": "https://www.linkedin.com/in/jackchuka/" + } + ], + "_years": [ + 2024 + ], + "~syncedDetailsAt": 1749501892530 + }, + { + "username": "matt1575", + "company": "Apollo GraphQL", + "position": "CEO & Co-Founder", + "name": "Matt DeBergalis", + "about": "Matt DeBergalis is the Chief Executive Officer and Co-Founder of Apollo GraphQL, where he is responsible for pioneering the next frontier of the company’s cutting-edge technology. Prior to Apollo, Matt was the co-founder of Meteor Development Group and co-creator of Meteor.js, which grew to become one of the most popular open-source projects in the world for developing full-stack web apps with JavaScript. He attended MIT and resides in the San Francisco Bay Area with his family.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/c/59/7503056/avatar.jpg.320x320px.jpg?f15", + "socialurls": [], + "_years": [ + 2024, + 2025 + ], + "~syncedDetailsAt": 1758137781378 + }, + { + "username": "matteo.collina1", + "company": "Platformatic", + "position": "Co-Founder & CTO", + "name": "Matteo Collina", + "about": "Matteo co-founded Platformatic.dev and serves as its CTO, recognized as a leading Open Source author in JavaScript with 30B annual downloads. Previously, he was Chief Software Architect at NearForm and earned a Ph.D. in 2014. Matteo is on the Node.js Technical Steering Committee, focusing on streams and HTTP, and developed the fast logger Pino and the Fastify framework. He has spoken at over 60 conferences and co-authored \"Accelerating Server-Side Development with Fastify\" by Packt.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/2/56/11925534/avatar.jpg.320x320px.jpg?3fe", + "socialurls": [ + { + "service": "Twitter", + "url": "https://twitter.com/matteocollins" + } + ], + "_years": [ + 2025 + ], + "~syncedDetailsAt": 1758137781378 + }, + { + "username": "mauricio.montalvo.guzman", + "company": "Pinterest", + "position": "Senior Software Engineer", + "name": "Mauricio Montalvo", + "about": "I’m a software engineer with 11 years of professional experience, I consider myself full stack but my career has been focused in FE development in the last years, I love creating UIs using ReactJS and GraphQL.\nAt Pinterest, I’m part of the Web team that’s exploring the introduction of GraphQL in our systems, I’ve worked on this for 3years now, leading a GQL migration project since Q3 2023.\n\nI think helping others and sharing knowledge is one of the best ways to improve in your career as a dev.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/8/d4/21066831/avatar.jpg.320x320px.jpg?3d6", + "socialurls": [], + "_years": [ + 2024, + 2025 + ], + "~syncedDetailsAt": 1758114079985 + }, + { + "username": "meenakshi.dhanani1", + "company": "Postman", + "position": "Ms.", + "name": "Meenakshi Dhanani", + "about": "Meenakshi is a Technical Enablement Architect at Postman, helping internal teams and customers build better API practices and unlock the platform's full potential, which serves over 30 million users worldwide. With a background in full-stack development and Developer Relations, she led Postman’s GraphQL initiatives and is a voting member of the GraphQL Foundation Board. Outside of work, she’s a fitness enthusiast training to become a yoga instructor, striving for balance both on and off the mat.", + "location": "India", + "url": "", + "avatar": "//avatars.sched.co/4/8c/18777983/avatar.jpg.320x320px.jpg?e4c", + "socialurls": [ + { + "service": "Twitter", + "url": "https://twitter.com/mdhananii" + }, + { + "service": "LinkedIn", + "url": "https://linkedin.com/in/meenakshi-dhanani" + } + ], + "_years": [ + 2023, + 2025 + ], + "~syncedDetailsAt": 1751036945383 + }, + { + "username": "mgiroux7", + "company": "Netflix", + "position": "Senior Software Developer @ Netflix, Author of Production Ready GraphQL & GraphQL TSC Member", + "name": "Marc-Andre Giroux", + "about": "Marc-André is senior software developer at Netflix. He is the author of the book Production Ready GraphQL and a member of the GraphQL Technical Steering Committee.", + "location": "Montreal, Canada", + "url": "https://productionreadygraphql.com/", + "avatar": "//avatars.sched.co/0/61/9031414/avatar.jpg.320x320px.jpg?b12", + "socialurls": [ + { + "service": "Twitter", + "url": "https://twitter.com/__xuorig__" + }, + { + "service": "LinkedIn", + "url": "https://www.linkedin.com/in/magiroux/" + } + ], + "_years": [ + 2023 + ], + "~syncedDetailsAt": 1749505650884 + }, + { + "username": "michael_staib.23xujj9p", + "company": "ChilliCream", + "position": "Michael Staib", + "name": "Michael Staib", + "about": "Michael is a member of the GraphQL technical steering committee, a Microsoft MVP, and the author of the Hot Chocolate project (https://github.com/ChilliCream/hotchocolate), a platform for building GraphQL servers and clients in .NET. This open-source project has been his main focus for the last couple of years.", + "location": "Zurich", + "url": "http://chillicream.com/", + "avatar": "//avatars.sched.co/a/85/14900031/avatar.jpg.320x320px.jpg?0a9", + "socialurls": [ + { + "service": "Twitter", + "url": "https://twitter.com/michael_staib" + }, + { + "service": "LinkedIn", + "url": "https://www.linkedin.com/in/michael-staib-31519571/" + } + ], + "_years": [ + 2023, + 2024, + 2025 + ], + "~syncedDetailsAt": 1758114079985 + }, + { + "username": "michael.astle", + "company": "Xolvio", + "position": "CTO", + "name": "Mike Astle", + "about": "Mike is a practical software leader with an interest in theory, but a stronger interest in getting things done. He's been slinging ones and zeroes for 30 years now and has experience going from five person startups to thousand person enterprises. Mike is currently the CTO of Xolvio where he leads delivery of client projects using GraphQL and event sourcing every day. He has previously spoken at SXSW and GraphQL Summit and mixes a fair bit of humor into his informal public speaking style.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/2/eb/23098786/avatar.jpg.320x320px.jpg?eb8", + "socialurls": [], + "_years": [ + 2025 + ], + "~syncedDetailsAt": 1758137788992 + }, + { + "username": "michael.bleigh", + "company": "Google", + "position": "Firebase Engineering Lead", + "name": "Michael Bleigh", + "about": "Michael is an engineering lead on the Firebase team at Google and has been building open source tech for the web for more than 15 years. Michael's open source projects have more than 2B downloads and he has presented at conferences including Google I/O, OSCON, and RailsConf. Michael recently led the creation of Firebase Data Connect, a GraphQL-based backend-as-a-service product that helps developers build apps on a PostgreSQL database.", + "location": "Bay Area, CA", + "url": "https://mbleigh.dev/", + "avatar": "//avatars.sched.co/d/0b/21066834/avatar.jpg.320x320px.jpg?83f", + "socialurls": [ + { + "service": "Twitter", + "url": "https://twitter.com/mbleigh" + }, + { + "service": "LinkedIn", + "url": "https://linkedin.com/in/mbleigh" + } + ], + "_years": [ + 2024 + ], + "~syncedDetailsAt": 1749501892530 + }, + { + "username": "minghe.huang", + "company": "Booking.com", + "position": "Senior Software Engineer", + "name": "Minghe Huang", + "about": "Minghe is a passionate software engineer with over a decade of experience spanning various technologies. With a deep interest in coding and scalable architectures, Minghe is currently focused on GraphQL federation and maintains the GraphQL federation platform at Booking.com.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/e/f2/23098789/avatar.jpg.320x320px.jpg?ff6", + "socialurls": [], + "_years": [ + 2025 + ], + "~syncedDetailsAt": 1758137788992 + }, + { + "username": "omribruchim", + "company": "Stealth", + "position": "CTO & Co-Founder @ Stealth", + "name": "Omri Bruchim", + "about": "Ex GM @ Wix, Public Speaker, Mostly talk about react, react-native, performance, and scale.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/8/5c/21066837/avatar.jpg.320x320px.jpg?b62", + "socialurls": [], + "_years": [ + 2024 + ], + "~syncedDetailsAt": 1749502056388 + }, + { + "username": "pascal.senn", + "company": "ChilliCream", + "position": "COO", + "name": "Pascal Senn", + "about": "I'm co-founder of ChilliCream, where we're passionate about advancing the GraphQL ecosystem. We develop and maintain open-source software, actively help and participate in the community, and create tools that help developers to get the most out of their GraphQL APIs.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/f/4e/21066839/avatar.jpg.320x320px.jpg?efc", + "socialurls": [], + "_years": [ + 2024, + 2025 + ], + "~syncedDetailsAt": 1758114083720 + }, + { + "username": "patrick.arminio", + "company": "Apollo", + "position": "Developer Advocate", + "name": "Patrick Arminio", + "about": "Developer Advocate at Apollo GraphQL, Chair of Python Italia. Creator of Strawberry GraphQL, a python library that makes use of type hints to create GraphQL APIs.", + "location": "London", + "url": "https://patrick.wtf/", + "avatar": "//avatars.sched.co/1/ab/19178765/avatar.jpg.320x320px.jpg?bd3", + "socialurls": [ + { + "service": "Twitter", + "url": "https://twitter.com/patrick91" + }, + { + "service": "LinkedIn", + "url": "https://www.linkedin.com/in/patrickarminio/" + }, + { + "service": "Instagram", + "url": "https://www.instagram.com/patrick.py" + } + ], + "_years": [ + 2023 + ], + "~syncedDetailsAt": 1749505650884 + }, + { + "username": "plgah", + "company": "Postman", + "position": "AI/Data Lead", + "name": "Pascal Heus", + "about": "Pascal Heus is a seasoned information technologist with extensive expertise in data management and engineering, metadata standards, and related best practices. He has collaborated with numerous data agencies and communities worldwide. His primary focus has been on driving the modernization of data management infrastructure, tooling, and advancing machine actionability and APIs in the field. Pascal brings valuable insights to the forefront of data management, enabling organizations to leverage cutting-edge practices for improved data governance and accessibility.", + "location": "Calgary, Canada", + "url": "https://www.postman.com/", + "avatar": "//avatars.sched.co/f/0e/15289322/avatar.jpg.320x320px.jpg?4a4", + "socialurls": [ + { + "service": "Twitter", + "url": "https://twitter.com/PascalHeus" + }, + { + "service": "LinkedIn", + "url": "https://www.linkedin.com/in/pascal" + } + ], + "_years": [ + 2023 + ], + "~syncedDetailsAt": 1749505650884 + }, + { + "username": "pooja.mistry", + "company": "Postman", + "position": "Developer Advocate", + "name": "Pooja Mistry", + "about": "Pooja Mistry(@poojamakes) is a Developer Advocate at Postman. She is passionate about the intersection of technology and community, and she works to expand the reach of Postman’s API Platform to developers worldwide. Before working at Postman, Pooja led the Partnership Advocacy Program at IBM and worked to build communities around sharing technology insights in the API, APIOps, Integration, and Data and AI space. Pooja loves to learn, teach, and share her knowledge with developers. Along with being a proud plant mom, she strongly believes in helping new technologists get up and running with technology and feel confident in their abilities to make!", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/d/a3/18775745/avatar.jpg.320x320px.jpg?cfc", + "socialurls": [ + { + "service": "Twitter", + "url": "https://twitter.com/poojamakes" + }, + { + "service": "LinkedIn", + "url": "https://www.linkedin.com/in/pmmistry/" + } + ], + "_years": [ + 2023 + ], + "~syncedDetailsAt": 1749505650884 + }, + { + "username": "pooja.mistry1", + "company": "", + "position": "", + "name": "Pooja Mistry", + "about": "Pooja Mistry (@poojamakes) is a Developer Advocate at Postman, an API platform with over 30 million users. She is passionate about the intersection of technology and community, working to expand the reach of Postman’s API Platform to developers worldwide. Pooja currently runs the Postman Intergalactic program, a series of Postman educational trainings.Pooja loves to learn, teach, and share her knowledge with developers. Besides being a proud plant mom, she strongly believes in helping new technologists get up and running with technology and feel confident in their abilities.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/1/b4/21225462/avatar.jpg.320x320px.jpg?a43", + "socialurls": [], + "_years": [ + 2024 + ], + "~syncedDetailsAt": 1749502056389 + }, + { + "username": "qkw1221", + "company": "Meta", + "position": "Senior Staff Software Engineer at Meta", + "name": "Kewei Qu", + "about": "TBD", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/9/1a/18743864/avatar.jpg.320x320px.jpg?7fa", + "socialurls": [], + "_years": [ + 2023, + 2024, + 2025 + ], + "~syncedDetailsAt": 1758137781378 + }, + { + "username": "rachit_sengupta", + "company": "Intuit", + "position": "Staff Software Engineer", + "name": "Rachit Sengupta", + "about": "Rachit has spent over six years at Intuit, where his work has spanned from building platforms for monetization and AI powered conversation to enhancing user experiences in products like QuickBooks and TurboTax. Currently, he is part of an Applied AI team focusing on the innovative use of Generative AI to boost developer productivity through intelligent tools and methodologies, such as efficient GraphQL attribute discovery and dynamic query generation.\n\nRachit looks forward to connecting with fellow innovators at this conference to exchange insights and discuss the evolving landscape of AI technologies and their applications in improving developer experiences.", + "location": "San Diego", + "url": "", + "avatar": "//avatars.sched.co/7/bc/21066842/avatar.jpg.320x320px.jpg?426", + "socialurls": [ + { + "service": "LinkedIn", + "url": "https://www.linkedin.com/in/rachit-sengupta-57b45513b/" + } + ], + "_years": [ + 2024 + ], + "~syncedDetailsAt": 1749502056389 + }, + { + "username": "rama_palaniappan", + "company": "Intuit", + "position": "Principal Engineer, API Platform Team", + "name": "Rama Palaniappan", + "about": "Rama Palaniappan is a Principal Engineer at Intuit. Rama has extensive experience in building scalable and reliable systems, and has been instrumental in the design and development of Intuit's API pla", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/5/dc/21066845/avatar.jpg.320x320px.jpg?4c4", + "socialurls": [], + "_years": [ + 2024 + ], + "~syncedDetailsAt": 1749502056389 + }, + { + "username": "ramnivas.laddad", + "company": "Exograph", + "position": "Co-founder", + "name": "Ramnivas Laddad", + "about": "Ramnivas leads the development of Exograph, a declarative approach to GraphQL backend written in Rust. He has led innovation in Spring Framework and Cloud Foundry since their beginning. Ramnivas is the author of AspectJ in Action, the best-selling book on aspect-oriented programming lauded by industry experts for its practical and innovative approach to real-world problems. He has spoken at leading industry conferences, including JavaOne, ScalaDays, SpringOne, and O'Reilly OSCON.", + "location": "", + "url": "https://exograph.dev/", + "avatar": "//avatars.sched.co/6/89/21066848/avatar.jpg.320x320px.jpg?5de", + "socialurls": [ + { + "service": "Twitter", + "url": "https://twitter.com/ramnivas" + }, + { + "service": "LinkedIn", + "url": "https://www.linkedin.com/in/ramnivasladdad/" + } + ], + "_years": [ + 2024 + ], + "~syncedDetailsAt": 1749502056389 + }, + { + "username": "raymie2", + "company": "Airbnb", + "position": "Viaduct Tech Lead", + "name": "Raymie Stata", + "about": "Raymie Stata earned his PhD in Computer Science from MIT and has been building technology at the intersection of search, big data, and distributed systems ever since. He founded Stata Labs, an early pioneer in desktop search, which was acquired by Yahoo! where he rose to CTO and helped shape the Hadoop ecosystem. He later founded Altiscale, one of the first Big-Data-as-a-Service platforms, which was acquired by SAP. After serving as Airbnb’s first Technical Fellow and leading a broad re-engineering of their technology stack, Raymie is now focused on Viaduct — a project developed in close collaboration with Airbnb to bring GraphQL infrastructure to the next level.", + "location": "San Francisco, USA", + "url": "", + "avatar": "//avatars.sched.co/4/a1/23098792/avatar.jpg.320x320px.jpg?a85", + "socialurls": [ + { + "service": "LinkedIn", + "url": "https://www.linkedin.com/in/rstata/" + } + ], + "_years": [ + 2025 + ], + "~syncedDetailsAt": 1758114065028 + }, + { + "username": "rickbijkerk54", + "company": "Bol", + "position": "Software Engineer", + "name": "Rick Bijkerk", + "about": "Software Engineer living in the Netherlands, working for Bol sinds 2021", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/d/6a/19320231/avatar.jpg.320x320px.jpg?4cd", + "socialurls": [], + "_years": [ + 2025 + ], + "~syncedDetailsAt": 1758137788992 + }, + { + "username": "robert.balicki", + "company": "Pinterest", + "position": "Staff Engineer", + "name": "Robert Balicki", + "about": "Robert is an engineer at Pinterest, where he helps the company adopt Relay and GraphQL. He was previously on the Relay team at Meta. Check out Isograph! https://isograph.dev", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/5/8b/18743858/avatar.jpg.320x320px.jpg?b95", + "socialurls": [ + { + "service": "Twitter", + "url": "https://x.com/StatisticsFTW" + }, + { + "service": "LinkedIn", + "url": "https://www.linkedin.com/in/robertbalicki/" + } + ], + "_years": [ + 2023, + 2024, + 2025 + ], + "~syncedDetailsAt": 1758114083720 + }, + { + "username": "robrichard87", + "company": "1stDibs", + "position": "Senior Director, Front-End Engineering", + "name": "Rob Richard", + "about": "Rob is a front-end engineer at 1stDibs, an online marketplace for extraordinary design. He is also a member of the GraphQL Technical Steering committee, where he has been championing the @defer & @stream spec proposal.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/b/cb/21066852/avatar.jpg.320x320px.jpg?6f4", + "socialurls": [], + "_years": [ + 2024, + 2025 + ], + "~syncedDetailsAt": 1758114083720 + }, + { + "username": "ruben.cagnie", + "company": "Toast", + "position": "Senior Principal Engineer at Toast", + "name": "Ruben Cagnie", + "about": "I am based in Boston but originally from Belgium. I have over 20 years of experience in the industry across different roles at startups as established companies. Currently, I am the Technical Design Lead for the customer experience org at Toast. Mainly focused on mobile experiences as well as AI.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/1/37/21066855/avatar.jpg.320x320px.jpg?9fa", + "socialurls": [], + "_years": [ + 2024 + ], + "~syncedDetailsAt": 1749502056389 + }, + { + "username": "sabrina.wasserman", + "company": "Meta", + "position": "Software Engineer", + "name": "Sabrina Wasserman", + "about": "GraphQL client-side frameworks software engineer at Meta.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/d/94/21066857/avatar.jpg.320x320px.jpg?4fd", + "socialurls": [], + "_years": [ + 2024, + 2025 + ], + "~syncedDetailsAt": 1758114083720 + }, + { + "username": "saihaj", + "company": "The Guild", + "position": "Head of Growth & Product Engineering - Stellate", + "name": "Saihajpreet Singh", + "about": "I’ve been active in the GraphQL community for years, maintaining many projects. I also support the ecosystem through efforts like managing GraphQL Weekly, representing The Guild in the GraphQL Foundation, and driving broader community initiatives, balancing technical leadership with community engagement.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/2/e9/22528045/avatar.jpg.320x320px.jpg?00f", + "socialurls": [], + "_years": [ + 2025 + ], + "~syncedDetailsAt": 1758137788992 + }, + { + "username": "saihajpreet.singh", + "company": "The Guild", + "position": "Software Engineer", + "name": "Saihajpreet Singh", + "about": "I have been deeply involved in the GraphQL community for several years, contributing to key projects like GraphQL-js, GraphQL Code Generator, GraphQL Yoga, and Envelop. With extensive experience in the field, I am passionate about open-source development.", + "location": "", + "url": "https://saihaj.dev/", + "avatar": "//avatars.sched.co/d/77/21066858/avatar.jpg.320x320px.jpg?75f", + "socialurls": [ + { + "service": "Twitter", + "url": "https://twitter.com/singh_saihaj/" + }, + { + "service": "LinkedIn", + "url": "https://www.linkedin.com/in/saihaj/" + } + ], + "_years": [ + 2024 + ], + "~syncedDetailsAt": 1749502079623 + }, + { + "username": "sam_2f", + "company": "Expedia Group", + "position": "Principal Software Engineer", + "name": "Samuel Bernardo Vázquez Andalón", + "about": "Principal Engineer at Expedia, currently working on the API Platform, team responsible for the GraphQL platform.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/e/e5/23098795/avatar.jpg.320x320px.jpg?102", + "socialurls": [], + "_years": [ + 2025 + ], + "~syncedDetailsAt": 1758137788992 + }, + { + "username": "sanvertarmur", + "company": "Booking.com", + "position": "Senior Software Engineer 2", + "name": "Sanver Tarmur", + "about": "Sanver is a Senior Software Engineer II at Booking.com with 15 years of industry experience. In recent years, he has been leading the Federated GraphQL transformation at Booking.com, focusing on scaling, enhancing the security of the GraphQL platform, and improving the developer experience for internal Graph users.", + "location": "Amsterdam", + "url": "linkedin.com/in/sanvertarmur", + "avatar": "//avatars.sched.co/0/9e/23098798/avatar.jpg.320x320px.jpg?318", + "socialurls": [], + "_years": [ + 2025 + ], + "~syncedDetailsAt": 1758137788992 + }, + { + "username": "sasanders26", + "company": "Docker", + "position": "Technical Writer", + "name": "Sarah Sanders", + "about": "Sarah is a Technical Writer at Docker, located in Philadelphia, PA. She specializes in writing developer and API documentation, with a deep focus on GraphQL developer experience. As an active contributor to the GraphQL project, she's passionate about creating educational resources and developer tools that make GraphQL more approachable.", + "location": "Philadelphia, PA", + "url": "", + "avatar": "//avatars.sched.co/4/50/21066861/avatar.jpg.320x320px.jpg?67a", + "socialurls": [ + { + "service": "LinkedIn", + "url": "https://www.linkedin.com/in/sarah-sanders-42913121a?utm_source=share&utm_campaign=share_via&utm_content=profile&utm_medi" + } + ], + "_years": [ + 2024, + 2025 + ], + "~syncedDetailsAt": 1758137781378 + }, + { + "username": "sasha177", + "company": "", + "position": "Staff Software Engineer/Tech Lead", + "name": "Sasha Solomon", + "about": "Sasha is a software engineer and industry expert in schema and data modeling, with experience building APIs and operating them at scale. She was a Staff Software engineer and co-Tech Lead of the Core API Platform Team at Twitter helping build the next generation API with GraphQL and Scala.\n\nShe served on the GraphQL Governing Board as a representative of Twitter, as well as on the Technical Steering Committee (TSC) for GraphQL. She also worked at Medium as the Tech Lead of the Platform Team, jumpstarting Medium's move to GraphQL.", + "location": "Portland, OR", + "url": "sashatsolomon.com", + "avatar": "//avatars.sched.co/e/e5/21336701/avatar.jpg.320x320px.jpg?ae7", + "socialurls": [ + { + "service": "Twitter", + "url": "https://x.com/sachee" + }, + { + "service": "LinkedIn", + "url": "https://www.linkedin.com/in/sasha-s-3808365a/" + } + ], + "_years": [ + 2024 + ], + "~syncedDetailsAt": 1749502079623 + }, + { + "username": "satish.chitnis", + "company": "Paramount / Pluto TV", + "position": "Principal Architect- Infrastructure", + "name": "Satish Chitnis", + "about": "", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/1/c3/21496512/avatar.jpg.320x320px.jpg?0c2", + "socialurls": [], + "_years": [ + 2024 + ], + "~syncedDetailsAt": 1749502079623 + }, + { + "username": "sdk.bens", + "company": "Northeastern University", + "position": "Graduate Researcher", + "name": "Seddik Benaissa", + "about": "Seddik, a software engineer and a researcher in Computer Science & Artificial Intelligence at Northeastern University,  With a love for data and a passion for exploring the world, he has traveled to 58 countries. When he's not immersed in cutting-edge technologies, Seddik can often be found embracing the wonders of nature in national parks, cheering at thrilling sports events, or actively participating in enriching tech summits.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/2/52/18743831/avatar.jpg.320x320px.jpg?746", + "socialurls": [], + "_years": [ + 2023 + ], + "~syncedDetailsAt": 1749505650884 + }, + { + "username": "seiyaizumi", + "company": "Tailor Inc.", + "position": "Lead Architect", + "name": "Seiya Izumi", + "about": "Seiya is a Frontend Engineer specializing in developing frontend infrastructure using the Tailor Platform, including SDKs, authentication systems, and design systems. He also leads technical decisions and architecture design for the Japan region. Joined Tailor in November 2022.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/7/bc/21066863/avatar.jpg.320x320px.jpg?c03", + "socialurls": [], + "_years": [ + 2024 + ], + "~syncedDetailsAt": 1749502079623 + }, + { + "username": "serhii.korin", + "company": "Booking.com", + "position": "Staff Software Engineer", + "name": "Serhii Korin", + "about": "I’m passionate about technology and adventure. While the former keeps me engaged in the ever-evolving world of innovation, the latter brings me peace through exploring new horizons, hiking in nature, or unwinding by a campfire. I also enjoy intellectual challenges, and in my spare time I love solving puzzles, playing chess and strategic board games.", + "location": "Amsterdam", + "url": "", + "avatar": "//avatars.sched.co/4/6a/19235292/avatar.jpg.320x320px.jpg?3fe", + "socialurls": [ + { + "service": "LinkedIn", + "url": "https://www.linkedin.com/in/serhiikorin" + } + ], + "_years": [ + 2023 + ], + "~syncedDetailsAt": 1749568381878 + }, + { + "username": "shahar_binyamin.24vrzgo4", + "company": "Inigo", + "position": "co-founder and CEO", + "name": "Shahar Binyamin", + "about": "Shahar Binyamin is the CEO and co-founder of Inigo. A software engineer by trade, he has extensive experience working on high-profile enterprise application and security projects. Among his roles, Shahar spent several years within the InfoSec Unit of the Israeli Defense Forces. He has also led product development at Dropbox and Kiteworks, with a focus on ensuring data and API security. Shahar lives in Silicon Valley, where Inigo is headquartered.", + "location": "", + "url": "https://inigo.io/", + "avatar": "//avatars.sched.co/c/b0/17274089/avatar.jpg.320x320px.jpg?cec", + "socialurls": [ + { + "service": "Twitter", + "url": "https://twitter.com/ShacharBinyamin" + }, + { + "service": "LinkedIn", + "url": "https://www.linkedin.com/in/shacharbinyamin/" + } + ], + "_years": [ + 2023 + ], + "~syncedDetailsAt": 1749568381878 + }, + { + "username": "shashank.gugnani", + "company": "Oracle", + "position": "Software Development Manager", + "name": "Shashank Gugnani", + "about": "I am an engineering manager in the Database Transactions team at Oracle, working on the design and implementation of next-generation Oracle database products. I hold a PhD in Computer Science from The Ohio State University and an undergraduate degree in Computer Science from BITS-Pilani. My research interests are related to storage systems and problems of scale in distributed systems. I have published several papers in top conferences and journals including VLDB, HPDC, SC, IPDPS, and BigData.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/3/e1/21458022/avatar.jpg.320x320px.jpg?bde", + "socialurls": [], + "_years": [ + 2024 + ], + "~syncedDetailsAt": 1749502079623 + }, + { + "username": "siva27", + "company": "Intuit", + "position": "Staff Software Engineer", + "name": "Siva Thiru", + "about": "Siva is a staff software engineer on the API Management Platform team at Intuit based in MountainView, CA. He works on building features for API Platform where developers can author, mock, explore and share APIs with other developers. During his free time, he enjoys going on hikes and runs a couple of marathons every year", + "location": "Toronto", + "url": "", + "avatar": "//avatars.sched.co/f/23/9778144/avatar.jpg.320x320px.jpg?422", + "socialurls": [], + "_years": [ + 2024 + ], + "~syncedDetailsAt": 1749502079623 + }, + { + "username": "skwok5", + "company": "LinkedIn", + "position": "Senior Software Engineer", + "name": "Spencer Kwok", + "about": "I specialize in federated GraphQL for frontend and backend services across LinkedIn's application ecosystem.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/f/e4/23138920/avatar.jpg.320x320px.jpg?2f3", + "socialurls": [ + { + "service": "LinkedIn", + "url": "https://www.linkedin.com/in/spencerkwok/" + } + ], + "_years": [ + 2025 + ], + "~syncedDetailsAt": 1758137781378 + }, + { + "username": "spencer211", + "company": "Okta", + "position": "Software Architect", + "name": "Spencer MacKinnon", + "about": "Spencer has worked on GraphQL at both Microsoft and Salesforce, where he has pushed the boundary of schema construction to, quite frankly, silly levels. He spends his free time sailing and has a fuchsia hexagon tattooed on his ankle. Follow him @smackinnon.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/e/9c/18743795/avatar.jpg.320x320px.jpg?957", + "socialurls": [], + "_years": [ + 2023 + ], + "~syncedDetailsAt": 1749568381878 + }, + { + "username": "sspalding2", + "company": "Netflix", + "position": "Engineer", + "name": "Stephen Spalding", + "about": "Stephen is a member of the Edge API team at Netflix and a GraphQL TSC emeritus. His team develops and operates the Netflix API platform. This is the nexus point where hundreds of microservices are aggregated into a single API that delivers the Netflix experience for the hundreds of millions of Netflix devices worldwide.", + "location": "", + "url": "http://stephenspalding.com/", + "avatar": "//avatars.sched.co/8/08/18743825/avatar.jpg.320x320px.jpg?af4", + "socialurls": [ + { + "service": "Twitter", + "url": "https://twitter.com/stephenspalding" + } + ], + "_years": [ + 2023, + 2024, + 2025 + ], + "~syncedDetailsAt": 1758114083720 + }, + { + "username": "stefan239", + "company": "Wundergraph", + "position": "Co-Founder & CCO", + "name": "Stefan Avram", + "about": "Stefan co-founded WunderGraph with Jens Neuse in 2021 and now spearheads growth and success strategies as the Chief Customer Officer.\n\nBefore WunderGraph, Stefan was a software engineer at three late-stage startups all using GraphQL.\n\nStefan is passionate about APIs, GraphQL, helping customers succeed, and building a long term company.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/0/e6/21335795/avatar.jpg.320x320px.jpg?985", + "socialurls": [], + "_years": [ + 2024 + ], + "~syncedDetailsAt": 1749502079623 + }, + { + "username": "stephanie.saunders2", + "company": "Coinbase", + "position": "Engineering Manager", + "name": "Stephanie Saunders", + "about": "This year, Stephanie made the switch from Staff Software Engineer to Engineering Manager and hasn’t looked back. She enjoys creating awesome GraphQL DevX, sifting through chaos to find order and reason, (which is an absolute requirement when you have four kids) leading other engineers to be the best they can be, and initiating company-wide culture changes. In her free time, (limited, remember the four kids) you can find her on top of a 14K Colorado peak, or 80ft under the ocean.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/1/65/14992671/avatar.jpg.320x320px.jpg?588", + "socialurls": [], + "_years": [ + 2023 + ], + "~syncedDetailsAt": 1749568381878 + }, + { + "username": "stephenchambers", + "company": "Netflix", + "position": "N/A", + "name": "Stephen Chambers", + "about": "Stephen Chambers is a Senior Software Engineer on the API team at Netflix. With a background in distributed systems, he spent six years at Liberty Mutual Insurance and two years at Apple before joining Netflix. Brand new to GraphQL, Stephen is navigating this technology with fresh eyes. Outside of work, he enjoys lifting weights, playing live music, and traveling with his wife, Tiffany.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/f/ac/23098804/avatar.jpg.320x320px.jpg?4a8", + "socialurls": [], + "_years": [ + 2025 + ], + "~syncedDetailsAt": 1758114065028 + }, + { + "username": "suresh_muthu", + "company": "Intuit", + "position": "Principal Engineer", + "name": "Suresh Muthu", + "about": "Suresh is a Principal Engineer at Intuit, where he focuses on the Intuit Data Exchange platform. The Intuit Data Exchange is responsible for acquiring, transforming, enriching, and managing consumer’s financial data from financial institutions across a variety of channels and authorization schemes. He has a passion for FinTech and domain-driven design and modeling APIs while dealing with legacy.", + "location": "", + "url": "https://www.intuit.com/", + "avatar": "//avatars.sched.co/2/29/18743849/avatar.jpg.320x320px.jpg?d1d", + "socialurls": [ + { + "service": "Twitter", + "url": "https://twitter.com/sureshmuthu" + }, + { + "service": "LinkedIn", + "url": "https://www.linkedin.com/in/sureshmuthu/" + } + ], + "_years": [ + 2023 + ], + "~syncedDetailsAt": 1749568381878 + }, + { + "username": "tanmaig", + "company": "Hasura", + "position": "CEO & Co-Founder", + "name": "Tanmai Gopal", + "about": "Tanmai is the co-founder of Hasura. He is a GPT-4-powered, full-stack, polyglot developer whose areas of interest and work span React, GraphQL, Node.js, Python, Haskell, Docker, Postgres, and Kubernetes. He is passionate about making it easy to build things. Before Hasura, Tanmai ran a consulting firm helping tech-forward enterprises migrate to cloud-native architectures and was the instructor of what became India's largest MOOC imad.tech with over 250,000 students.", + "location": "San Francisco", + "url": "https://hasura.io/", + "avatar": "//avatars.sched.co/1/7c/4968006/avatar.jpg.320x320px.jpg?81a", + "socialurls": [ + { + "service": "Twitter", + "url": "https://twitter.com/tanmaigo" + }, + { + "service": "LinkedIn", + "url": "https://www.linkedin.com/in/tanmaig" + } + ], + "_years": [ + 2023 + ], + "~syncedDetailsAt": 1749568381878 + }, + { + "username": "theo93", + "company": "Ping Labs", + "position": "CEO, Founder", + "name": "Theo Browne", + "about": "Known primarily for sh*tposting, secondarily for shouting on Youtube, and I guess for code as well. Theo likes full stack web dev and TypeScript a lot. Many think he dislikes GraphQL despite his persistent defense of it. Ask him about RSCs or tRPC if you have a few hours to spare", + "location": "San Francisco", + "url": "t3.gg", + "avatar": "//avatars.sched.co/2/a1/19108367/avatar.jpg.320x320px.jpg?09c", + "socialurls": [ + { + "service": "Twitter", + "url": "https://twitter.com/t3dotgg" + } + ], + "_years": [ + 2023 + ], + "~syncedDetailsAt": 1749568381878 + }, + { + "username": "thomas.heyenbrock", + "company": "Stellate", + "position": "Software Engineer", + "name": "Thomas Heyenbrock", + "about": "", + "location": "Munich, Germany", + "url": "", + "avatar": "//avatars.sched.co/d/37/14989332/avatar.jpg.320x320px.jpg?9f4", + "socialurls": [ + { + "service": "Twitter", + "url": "https://twitter.com/heyenbrock" + }, + { + "service": "LinkedIn", + "url": "https://www.linkedin.com/in/thomas-heyenbrock-1a9651145/" + } + ], + "_years": [ + 2023 + ], + "~syncedDetailsAt": 1749568381878 + }, + { + "username": "thorekoritzius", + "company": "Independent", + "position": "Machine Learning Software Engineer", + "name": "Thore Koritzius", + "about": "Thore is an ML Engineer with a passion for building and deploying multimodal LLMs. He enjoys working on the full stack of AI systems—from training embedding models and optimizing RAG pipelines to deploying on-premises LLM infrastructure. Thore is also a GraphQL and Rust enthusiast who loves exploring modern developer tools and building high-performance systems. His journey into AI started with research on Physics-Informed Neural Networks during his Master’s thesis, and he's been excited about pushing the boundaries of applied machine learning ever since.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/c/bd/23218043/avatar.jpg.320x320px.jpg?02e", + "socialurls": [], + "_years": [ + 2025 + ], + "~syncedDetailsAt": 1758114065028 + }, + { + "username": "tim.hall.engr", + "company": "Postman", + "position": "Technical Lead", + "name": "Tim Hall", + "about": "Tim is a full-stack developer working on GraphQL at Postman, where he's applying what he's learned building backends and frontends with GraphQL to developing Postman's GraphQL client. He's based in Virginia and shares an office with four crazy kids and five wild pets.", + "location": "", + "url": "https://www.postman.com/", + "avatar": "//avatars.sched.co/a/76/18743807/avatar.jpg.320x320px.jpg?7e7", + "socialurls": [ + { + "service": "Twitter", + "url": "https://twitter.com/timhalldesign" + }, + { + "service": "LinkedIn", + "url": "https://www.linkedin.com/in/timhallengr/" + } + ], + "_years": [ + 2023 + ], + "~syncedDetailsAt": 1749568381879 + }, + { + "username": "tom817", + "company": "Grafbase", + "position": "Software Engineer", + "name": "Tom Houlé", + "about": "Tom's professional life has gravitated towards GraphQL and Rust, schemas and databases. After authoring the first Rust GraphQL client library, recent years have taken him from the database schema management space at Prisma to GraphQL federation at Grafbase. In his free time, he enjoys long walks, pistachios and trying to teach his dog the international phonetic alphabet.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/2/e2/23098807/avatar.jpg.320x320px.jpg?cff", + "socialurls": [ + { + "service": "LinkedIn", + "url": "https://www.linkedin.com/in/tom-houl%C3%A9/?locale=en_US" + } + ], + "_years": [ + 2025 + ], + "~syncedDetailsAt": 1758114074590 + }, + { + "username": "tristan119", + "company": "Escape", + "position": "Co-founder & CEO", + "name": "Tristan Kalos", + "about": "Co-founder and CEO of Escape - GraphQL Security, the first company that provides developers and security teams the right tooling for building safe, scalable and compliant GraphQL APIs", + "location": "San Francisco, USA", + "url": "https://escape.tech/", + "avatar": "//avatars.sched.co/7/08/19011005/avatar.jpg.320x320px.jpg?53c", + "socialurls": [ + { + "service": "LinkedIn", + "url": "https://linkedin.com/in/tkalos" + } + ], + "_years": [ + 2023 + ], + "~syncedDetailsAt": 1749568381879 + }, + { + "username": "tushar.mathur", + "company": "Tailcall", + "position": "CEO & Founder", + "name": "Tushar Mathur", + "about": "Tushar is the Founder and CEO of Tailcall Inc. Before Tailcall, he was leading engineering at Dream11. He is an avid open-source maintainer and contributor, with an ardent passion for doing functional programming.", + "location": "", + "url": "https://tailcall.run/", + "avatar": "//avatars.sched.co/6/97/21066872/avatar.jpg.320x320px.jpg?498", + "socialurls": [ + { + "service": "Twitter", + "url": "https://twitter.com/tusharmath/" + }, + { + "service": "LinkedIn", + "url": "https://www.linkedin.com/in/tusharmath/" + } + ], + "_years": [ + 2024 + ], + "~syncedDetailsAt": 1749502251756 + }, + { + "username": "twitter7", + "company": "Apollo", + "position": "Staff Software Engineer", + "name": "Alessia Bellisario", + "about": "Alessia is a Staff Open Source Engineer at Apollo GraphQL building Apollo Client. She loves ECMAScript, making generative art with pen plotters and lives in New York City with her wife and son.", + "location": "", + "url": "https://apollographql.com/", + "avatar": "//avatars.sched.co/a/c6/18743837/avatar.jpg.320x320px.jpg?847", + "socialurls": [ + { + "service": "Twitter", + "url": "https://twitter.com/alessbell" + }, + { + "service": "LinkedIn", + "url": "https://www.linkedin.com/in/alessiabellisario/" + } + ], + "_years": [ + 2023, + 2024 + ], + "~syncedDetailsAt": 1749502251756 + }, + { + "username": "uri_goldshtein.23xujj9a", + "company": "The Guild", + "position": "CEO", + "name": "Uri Goldshtein", + "about": "The Guild, the largest open source group in the GraphQL ecosystem", + "location": "", + "url": "http://the-guild.dev/", + "avatar": "//avatars.sched.co/8/2b/14900013/avatar.jpg.320x320px.jpg?06d", + "socialurls": [ + { + "service": "Twitter", + "url": "https://twitter.com/UriGoldshtein" + }, + { + "service": "LinkedIn", + "url": "https://www.linkedin.com/in/urigo" + } + ], + "_years": [ + 2023, + 2024, + 2025 + ], + "~syncedDetailsAt": 1758114083720 + }, + { + "username": "vincent.desmares", + "company": "Teamstarter", + "position": "Co-founder & CTO", + "name": "Vincent Desmares", + "about": "While I was Tech lead and Team lead in a startup studio I developed business analytics platforms for Winsight, Apple and Rakuten. I then co-funded Teamstarter, a platform to boost employee initiative taking.", + "location": "Paris, France", + "url": "https://www.teamstarter.com/en", + "avatar": "//avatars.sched.co/d/cc/21066875/avatar.jpg.320x320px.jpg?f80", + "socialurls": [], + "_years": [ + 2024 + ], + "~syncedDetailsAt": 1749502251756 + }, + { + "username": "vmjohnson999", + "company": "The New York Times", + "position": "Android Engineer", + "name": "Vanessa Johnson", + "about": "Vanessa Johnson is an Android Engineer at The New York Times working on the Games Android app. She loves building mobile apps and any technical topics she finds interesting. She is passionate about accessibility, is working on various side projects, and has a newsletter & an upcoming podcast. When she isn’t coding she is usually playing pickup basketball or watching a horror movie.", + "location": "New York City", + "url": "https://vanessamj99.github.io/", + "avatar": "//avatars.sched.co/c/54/23098810/avatar.jpg.320x320px.jpg?394", + "socialurls": [ + { + "service": "LinkedIn", + "url": "https://www.linkedin.com/in/vanessa-johnson999/" + } + ], + "_years": [ + 2025 + ], + "~syncedDetailsAt": 1758114083720 + }, + { + "username": "watson17", + "company": "Apollo GraphQL", + "position": "Developer Relations Manager", + "name": "Michael Watson", + "about": "A father first and builder with a passion for polish second. I strive to connect my work with the real world and share my learnings. Whether it's IoT, the cloud, woodworking or now AI, I want to better understand how these pieces can fit together to create new experiences.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/4/84/19024254/avatar.jpg.320x320px.jpg?838", + "socialurls": [], + "_years": [ + 2024, + 2025 + ], + "~syncedDetailsAt": 1758137781378 + }, + { + "username": "x65han", + "company": "Meta Inc.", + "position": "Software Engineer", + "name": "Xiao Han", + "about": "Software Engineer on Instagram Product Foundations", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/5/90/23098816/avatar.jpg.320x320px.jpg?d30", + "socialurls": [], + "_years": [ + 2025 + ], + "~syncedDetailsAt": 1758114065028 + }, + { + "username": "yaacovcr", + "company": "Open Source", + "position": "Contributor", + "name": "Yaacov Rydzinski", + "about": "Open source GraphQL contributor interested primarily in executor enhancements, incremental delivery, and schema stitching, not necessarily in that order. Contributor to `graphql-tools`, especially the stitch module, part-time reviewer for `graphql-js`, implementer and re-implementer of incremental, deduplicated, and semi-concurrent GraphQL execution. Author of `value-or-promise`.", + "location": "", + "url": "https://github.com/yaacovCR", + "avatar": "//avatars.sched.co/4/e4/18743840/avatar.jpg.320x320px.jpg?eb9", + "socialurls": [ + { + "service": "Twitter", + "url": "https://twitter.com/YRydzinski" + }, + { + "service": "LinkedIn", + "url": "https://www.linkedin.com/in/yaacov" + } + ], + "_years": [ + 2023 + ], + "~syncedDetailsAt": 1749568381879 + }, + { + "username": "yassineldeeb94", + "company": "The Guild", + "position": "Sr. DevTools Engineer", + "name": "Yassin Eldeeb", + "about": "Yassin Eldeeb is a high school dropout with a unique programming background. He got his first client at the age of 15, contributed to JavaScript and Rust open-source ecosystems, and is a volunteering member of https://invisible.institute/beneath-the-surface helping their cause in achieving justice in Chicago. He currently works as an Open Source Devtools Engineer at The Guild. He enjoys adrenaline-fueled activities like Sky Diving, Hiking, and Deep diving.", + "location": "Egypt", + "url": "https://the-guild.dev/", + "avatar": "//avatars.sched.co/4/33/18743822/avatar.jpg.320x320px.jpg?230", + "socialurls": [ + { + "service": "Twitter", + "url": "https://twitter.com/YassinEldeeb7" + }, + { + "service": "LinkedIn", + "url": "https://www.linkedin.com/in/yassin-eldeeb/" + } + ], + "_years": [ + 2023, + 2024 + ], + "~syncedDetailsAt": 1749502251756 + }, + { + "username": "yczhu", + "company": "Meta", + "position": "Software Engineer", + "name": "Yuanchao Zhu", + "about": "I am a software engineer at Meta. I work on adopting Relay and GraphQL in Ads Manager incrementally. I enjoy solving hard technical problems and building sustainable frameworks.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/4/46/18743882/avatar.jpg.320x320px.jpg?6ba", + "socialurls": [], + "_years": [ + 2023 + ], + "~syncedDetailsAt": 1749568381879 + }, + { + "username": "yehudar", + "company": "JFrog", + "position": "Application Security Researcher", + "name": "Yehuda Rosenberg", + "about": "I'm an Application Security Researcher passionate about breaking assumptions in modern web technologies. From protocol quirks to real-world vulnerabilities, I explore how small oversights lead to big security issues. My work often blends offensive research with practical defense, aiming to make the internet a little safer and a lot more interesting.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/f/a8/23098819/avatar.jpg.320x320px.jpg?d3f", + "socialurls": [ + { + "service": "LinkedIn", + "url": "https://www.linkedin.com/in/luli-rosenberg/" + } + ], + "_years": [ + 2025 + ], + "~syncedDetailsAt": 1758137784031 + } + ] +} \ No newline at end of file diff --git a/scripts/sync-sched/sync.ts b/scripts/sync-sched/sync.ts new file mode 100644 index 0000000000..6b92cf15c2 --- /dev/null +++ b/scripts/sync-sched/sync.ts @@ -0,0 +1,495 @@ +#!/usr/bin/env tsx + +import assert from "node:assert" +import { parseArgs } from "node:util" +import { join } from "node:path" +import { readFile, writeFile } from "node:fs/promises" +import pLimit from "p-limit" + +import { + getSchedule, + getSpeakerDetails, + getSpeakers, + mergeSpeaker, + RequestContext, +} from "@/app/conf/_api/sched-client" +import type { ConferenceYear, SchedSpeaker } from "@/app/conf/_api/sched-types" + +/** + * Sched API rate limit is 30 requests per minute per token. + * This scripts fires: + * - one request for the entire schedule which overwritten + * - one request for the list of speakers with partial details + * - and N requests for the full details of each speaker + */ +const DEFAULT_SPEAKER_DETAILS_REQUEST_QUOTA = 10 + +const PRINT_UNCHANGED = false + +const unsafeKeys = Object.keys as (obj: T) => Array + +;(async function main() { + try { + const { values } = parseArgs({ + options: { + year: { + type: "string", + short: "y", + }, + quota: { + type: "string", + short: "q", + }, + help: { + type: "boolean", + short: "h", + }, + }, + }) + + if (values.help) { + help() + process.exit(0) + } + + const year = parseInt( + values.year || new Date().getFullYear().toString(), + ) as ConferenceYear + const quota = parseInt( + values.quota || DEFAULT_SPEAKER_DETAILS_REQUEST_QUOTA.toString(), + ) + + console.log(`Syncing schedule for year: ${year}`) + + const token = process.env[`SCHED_ACCESS_TOKEN_${year}`] + assert(token, `SCHED_ACCESS_TOKEN_${year} is not set`) + + await sync(year, quota, token) + } catch (error) { + if (error instanceof Error && error.message.includes("Unknown option")) { + console.error(`Error: ${error.message}`) + help() + process.exit(1) + } + throw error + } +})() + +async function sync( + year: ConferenceYear, + detailsRequestsQuota: number, + token: string, +) { + const apiUrl = { + 2023: "https://graphqlconf23.sched.com/api", + 2024: "https://graphqlconf2024.sched.com/api", + 2025: "https://graphqlconf2025.sched.com/api", + }[year] + + assert(apiUrl, `API URL for year ${year} not found`) + + const ctx: RequestContext = { apiUrl, token } + + const speakersFilePath = join(import.meta.dirname, "speakers.json") + const scheduleFilePath = join(import.meta.dirname, `schedule-${year}.json`) + + console.log("Getting schedule and speakers list...") + + const schedule = getSchedule(ctx) + const thisYearSpeakers = getSpeakers(ctx) + const existingSchedule = readFile(scheduleFilePath, "utf-8").then(JSON.parse) + const existingSpeakers = readFile(speakersFilePath, "utf-8").then(JSON.parse) + + const scheduleComparison = compare( + await existingSchedule, + await schedule, + "id", + ) + printComparison(scheduleComparison, "sessions", "id") + + const writeSchedule = writeFile( + scheduleFilePath, + JSON.stringify(await schedule, null, 2), + ) + + const speakerComparison = compare( + await existingSpeakers.then(data => data.speakers), + await thisYearSpeakers.then(speakers => + speakers.map(s => ({ + ...s, + _years: [year as ConferenceYear], + })), + ), + "username", + { merge: mergeSpeaker }, + ) + + await updateSpeakerDetails(ctx, speakerComparison, detailsRequestsQuota, year) + + printComparison(speakerComparison, "speakers", "username", { + printRemoved: false, + }) + + const { keptRemovedSpeakers, actuallyRemovedSpeakers } = + partitionRemovedSpeakers(speakerComparison.removed, year) + + if (actuallyRemovedSpeakers.length > 0) { + console.log( + bold( + `${actuallyRemovedSpeakers.length} speakers removed (only appeared in ${year}):`, + ), + ) + for (const speaker of actuallyRemovedSpeakers) { + console.log(red(`- ${speaker.username}`)) + } + } + + const updatedSpeakers = [ + ...keptRemovedSpeakers, + ...speakerComparison.unchanged, + ...speakerComparison.changed.map(change => change.new), + ...speakerComparison.added, + ].sort((a, b) => a.username.localeCompare(b.username)) + + const equal: string[][] = (await existingSpeakers).equal + updateEqualitySets(equal, updatedSpeakers) + + const writeSpeakers = writeFile( + speakersFilePath, + JSON.stringify( + { + equal, + speakers: updatedSpeakers, + }, + null, + 2, + ), + ) + + await writeSchedule + await writeSpeakers +} + +async function updateSpeakerDetails( + ctx: RequestContext, + /** mutated in place */ + comparison: Comparison, + quota: number, + year: ConferenceYear, +) { + const locations = new Map< + string /* username */, + [key: keyof Comparison, index: number] + >() + + for (const key of unsafeKeys(comparison)) { + const items = comparison[key as keyof Comparison] + for (let i = 0; i < items.length; i++) { + let item = items[i] + if (!("username" in item)) item = item.new + locations.set(item.username, [key, i]) + } + } + + const allSpeakers = [ + ...comparison.unchanged, + ...comparison.changed.map(change => change.new), + ...comparison.added, + ] + const byUpdateTime = allSpeakers + .filter(x => x._years?.includes(year)) + .sort((a, b) => { + const aTime = a["~syncedDetailsAt"] ?? 0 + const bTime = b["~syncedDetailsAt"] ?? 0 + return aTime - bTime + }) + + const toUpdate = byUpdateTime.slice(0, quota) + console.log(`Fetching additional details for ${toUpdate.length} speakers...`) + console.log( + toUpdate + .map(s => + [ + `- ${s.username.padEnd(32, " ")}`, + s["~syncedDetailsAt"] + ? `last synced at ${new Date(s["~syncedDetailsAt"]).toLocaleString()}` + : "without details yet", + ].join("\t"), + ) + .join("\n"), + ) + + const limit = pLimit(5) + const updated = await Promise.all( + toUpdate.map(speaker => + limit(() => getSpeakerDetails(ctx, speaker.username)), + ), + ) + + for (const speaker of updated) { + const location = locations.get(speaker.username) + if (location) { + const [key, index] = location + const current = + key === "changed" ? comparison[key][index].new : comparison[key][index] + + const newValue = mergeSpeaker(current, speaker) + const diff = objectDiff({ old: current, new: newValue }) + if (diff.trim()) { + console.log(diff) + } + newValue["~syncedDetailsAt"] = Date.now() + + if (key === "changed") { + comparison[key][index].new = newValue + } else { + comparison[key][index] = newValue + } + } + } + + // Re-classify after speaker details update + const actuallyChanged = comparison.changed.filter( + change => !deepStrictEqualWithoutInternals(change.old, change.new), + ) + const nowUnchanged = comparison.changed + .filter(change => deepStrictEqualWithoutInternals(change.old, change.new)) + .map(change => change.new) + + comparison.changed = actuallyChanged + comparison.unchanged.push(...nowUnchanged) +} + +function help() { + return console.log("Usage: tsx sync.ts --year --quota ") +} + +function partitionRemovedSpeakers( + removedSpeakers: SchedSpeaker[], + currentYear: ConferenceYear, +) { + const keptRemovedSpeakers: SchedSpeaker[] = [] + const actuallyRemovedSpeakers: SchedSpeaker[] = [] + + for (const speaker of removedSpeakers) { + // We only remove the speakers removed from Sched if they didn't have talks in other years. + if (speaker._years?.length === 1 && speaker._years[0] === currentYear) { + actuallyRemovedSpeakers.push(speaker) + } else { + keptRemovedSpeakers.push(speaker) + } + } + + return { keptRemovedSpeakers, actuallyRemovedSpeakers } +} + +type EqualitySet = string[][] + +function updateEqualitySets(old: EqualitySet, speakers: SchedSpeaker[]) { + for (const a of speakers) { + for (const b of speakers) { + if (a.username === b.username) continue + + // if the name or one of the social URLs is the same we add the username to a set + if ( + a.name === b.name || + a.socialurls?.some(url => + b.socialurls?.some(bUrl => bUrl.url === url.url), + ) + ) { + const existing = old.find( + set => set.includes(a.username) || set.includes(b.username), + ) + if (existing) { + const length = existing.length + const newSet = [...new Set([...existing, a.username, b.username])] + if (newSet.length !== length) { + existing.length = 0 + existing.push(...newSet) + console.log("Found more duplicate speakers:", newSet) + } + } else { + old.push([a.username, b.username]) + console.log("Found duplicate speakers:", a.username, b.username) + } + } + } + } +} + +// #region utility + +type Change = { old: T; new: T } +type Comparison = { + added: T[] + removed: T[] + changed: Change[] + unchanged: T[] +} + +function compare( + olds: T[], + news: T[], + key: keyof T, + options: { merge?: (oldItem: T, newItem: T) => T } = {}, +) { + const oldMap = new Map(olds.map(o => [o[key], o])) + const newMap = new Map(news.map(n => [n[key], n])) + + const added: T[] = [] + const removed: T[] = [] + const changed: Change[] = [] + const unchanged: T[] = [] + + for (const newItem of news) { + const oldItem = oldMap.get(newItem[key]) + if (oldItem) { + if (deepStrictEqualWithoutInternals(oldItem, newItem)) { + unchanged.push(oldItem) + } else { + changed.push({ + old: oldItem, + new: options.merge ? options.merge(oldItem, newItem) : newItem, + }) + } + } else { + added.push(newItem) + } + } + + for (const oldItem of olds) { + if (!newMap.has(oldItem[key])) { + removed.push(oldItem) + } + } + + return { added, removed, changed, unchanged } +} + +function printComparison( + comparison: Comparison, + name: string, + key: keyof T, + options: { printRemoved?: boolean } = { printRemoved: true }, +) { + if (comparison.added.length > 0) { + console.log(bold(`${comparison.added.length} ${name} added.`)) + for (const item of comparison.added) { + console.log(green(`+ ${JSON.stringify(item)}`)) + } + } + + if (options.printRemoved) { + if (comparison.removed.length > 0) { + console.log(bold(`${comparison.removed.length} ${name} removed.`)) + for (const item of comparison.removed) { + console.log(red(`- ${JSON.stringify(item)}`)) + } + } + } + + if (comparison.unchanged.length > 0) { + console.log(bold(`${comparison.unchanged.length} ${name} not changed.`)) + if (PRINT_UNCHANGED) { + for (const item of comparison.unchanged) { + console.log(yellow(`{ ${String(key)}: ${item[key]}, ... }`)) + } + } + } + + if (comparison.changed.length > 0) { + console.log(bold(`${comparison.changed.length} ${name} changed.`)) + for (const change of comparison.changed) { + console.log(change.new[key] + "\n", objectDiff(change)) + } + } +} + +function objectDiff(change: Change): string { + const allKeys = [ + ...new Set([...unsafeKeys(change.old), ...unsafeKeys(change.new)]), + ] + .sort() + .filter(key => !String(key).startsWith("~")) + + const diff = allKeys + .map(key => { + const oldValue = change.old[key] + const newValue = change.new[key] + + if (JSON.stringify(oldValue) === JSON.stringify(newValue)) { + return null + } + + return { key, oldValue, newValue } + }) + .filter(x => !!x) + + return diff + .map(diff => { + return `${yellow(String(diff.key))}:\n ${red("-" + JSON.stringify(diff.oldValue))}\n ${green("+" + JSON.stringify(diff.newValue))}` + }) + .join("\n") +} + +function green(text: string) { + return `\x1b[32m${text}\x1b[0m` +} + +function red(text: string) { + return `\x1b[31m${text}\x1b[0m` +} + +function yellow(text: string) { + return `\x1b[33m${text}\x1b[0m` +} + +function bold(text: string) { + return `\x1b[1m${text}\x1b[0m` +} + +function deepStrictEqualWithoutInternals(a: unknown, b: unknown): boolean { + if (a === b) return true + + if (a === null || b === null || a === undefined || b === undefined) { + return a === b + } + + if (typeof a !== typeof b) return false + + if (typeof a !== "object") return false + + if (Array.isArray(a) !== Array.isArray(b)) return false + + if (Array.isArray(a) && Array.isArray(b)) { + if (a.length !== b.length) return false + + for (let i = 0; i < a.length; i++) { + if (!deepStrictEqualWithoutInternals(a[i], b[i])) { + return false + } + } + return true + } + + const aObj = a as Record + const bObj = b as Record + + const aKeys = Object.keys(aObj).filter(key => !key.startsWith("~")) + const bKeys = Object.keys(bObj).filter(key => !key.startsWith("~")) + + if (aKeys.length !== bKeys.length) return false + + aKeys.sort() + bKeys.sort() + + for (const key of aKeys) { + if (!deepStrictEqualWithoutInternals(aObj[key], bObj[key])) { + return false + } + } + + return true +} + +// #endregion utility diff --git a/scripts/update-code-data/organize-code-data.ts b/scripts/update-code-data/organize-code-data.ts new file mode 100644 index 0000000000..95444770dd --- /dev/null +++ b/scripts/update-code-data/organize-code-data.ts @@ -0,0 +1,57 @@ +import { Library, sortLibs } from "../sort-libraries/sort-libraries" +import { CodeData } from "./update-code-data" + +export type List = { + name: string + totalStars: number + categoryMap: { + [categoryName: string]: Library[] + } +} + +export async function organizeCodeData( + codeData: CodeData, +): Promise<{ languageList: List[]; toolList: List[]; serviceList: Library[] }> { + const languageList: List[] = [] + const toolList: List[] = [] + let serviceList: Library[] = [] + await Promise.all([ + ...Object.keys(codeData.Languages).map(async languageName => { + const libraryCategoryMap = codeData.Languages[languageName] + let languageTotalStars = 0 + await Promise.all( + Object.keys(libraryCategoryMap).map(async libraryCategoryName => { + const libraries = libraryCategoryMap[libraryCategoryName] + const { sortedLibs, totalStars } = await sortLibs(libraries) + + libraryCategoryMap[libraryCategoryName] = sortedLibs + languageTotalStars += totalStars || 0 + }), + ) + languageList.push({ + name: languageName, + totalStars: languageTotalStars, + categoryMap: libraryCategoryMap, + }) + }), + ...Object.keys(codeData.Tools).map(async toolName => { + const toolCategoryMap = codeData.Tools[toolName] + let toolTotalStars = 0 + await Promise.all( + Object.keys(toolCategoryMap).map(async toolCategoryName => { + const tools = toolCategoryMap[toolCategoryName] + const { sortedLibs, totalStars } = await sortLibs(tools) + toolCategoryMap[toolCategoryName] = sortedLibs + toolTotalStars += totalStars || 0 + }), + ) + toolList.push({ + name: toolName, + totalStars: toolTotalStars, + categoryMap: toolCategoryMap, + }) + }), + (serviceList = codeData.Services), + ]) + return { languageList, toolList, serviceList } +} diff --git a/scripts/update-code-data/sort-code-data.ts b/scripts/update-code-data/sort-code-data.ts new file mode 100644 index 0000000000..4ed5d2a21e --- /dev/null +++ b/scripts/update-code-data/sort-code-data.ts @@ -0,0 +1,35 @@ +import { Library } from "../sort-libraries/sort-libraries" +import { List } from "./organize-code-data" + +type organizeData = { + languageList: List[] + toolList: List[] + serviceList: Library[] +} + +export async function sortCodeData( + organizeData: organizeData, +): Promise { + await Promise.all([ + organizeData.languageList.sort((a, b) => { + if (a.totalStars > b.totalStars) { + return -1 + } + if (a.totalStars < b.totalStars) { + return 1 + } + return 0 + }), + organizeData.toolList.sort((a, b) => { + if (a.totalStars > b.totalStars) { + return -1 + } + if (a.totalStars < b.totalStars) { + return 1 + } + return 0 + }), + organizeData.serviceList, + ]) + return organizeData +} diff --git a/scripts/update-code-data/update-code-data.ts b/scripts/update-code-data/update-code-data.ts new file mode 100644 index 0000000000..af04f7a861 --- /dev/null +++ b/scripts/update-code-data/update-code-data.ts @@ -0,0 +1,117 @@ +import { readFile } from "fs/promises" +import { promisify } from "util" +// @ts-expect-error -- types are missing +import * as frontmatterParser from "parser-front-matter" +import { Library } from "../sort-libraries/sort-libraries" + +const parse$ = promisify(frontmatterParser.parse) + +export type CodeData = { + Languages: { + [languageName: string]: { + [categoryName: string]: Library[] + } + } + Tools: { + [toolName: string]: { + [categoryToolsName: string]: Library[] + } + } + Services: Library[] +} + +export async function updateCodeData( + markdownFilePaths: string[], + slugMap: string, +): Promise { + const codeData = {} as CodeData + await Promise.all( + markdownFilePaths.map(async markdownFilePath => { + const markdownFileContent = await readFile(markdownFilePath, "utf-8") + let { + data: { name, description, url, github, npm, gem }, + content: howto, + } = await parse$(markdownFileContent) + howto = howto.trim() + const pathArr = markdownFilePath.split("/") + const languageSupport = markdownFilePath.includes("language-support") + const toolsSupport = markdownFilePath.includes("tools") + + switch (true) { + case languageSupport: { + const languageSupportDirIndex = pathArr.indexOf("language-support") + const languageNameSlugIndex = languageSupportDirIndex + 1 + const languageNameSlug = pathArr[languageNameSlugIndex] + // @ts-expect-error fixme + const languageName = slugMap[languageNameSlug] + codeData.Languages ||= {} + codeData.Languages[languageName] ||= {} + + const categoryNameSlugIndex = languageSupportDirIndex + 2 + const categoryNameSlug = pathArr[categoryNameSlugIndex] + // @ts-expect-error fixme + const categoryName = slugMap[categoryNameSlug] + codeData.Languages[languageName][categoryName] ||= [] + codeData.Languages[languageName][categoryName].push({ + name, + description, + howto, + url, + github, + npm, + gem, + sourcePath: markdownFilePath, + }) + break + } + case toolsSupport: { + const toolSupportDirIndex = pathArr.indexOf("tools") + const toolNameSlugIndex = toolSupportDirIndex + 1 + const toolNameSlug = pathArr[toolNameSlugIndex] + // @ts-expect-error fixme + const toolName = slugMap[toolNameSlug] + codeData.Tools ||= {} + codeData.Tools[toolName] ||= {} + const categoryToolsNameSlugIndex = toolSupportDirIndex + 2 + const categoryToolsNameSlug = pathArr[categoryToolsNameSlugIndex] + // @ts-expect-error fixme + const categoryToolsName = slugMap[categoryToolsNameSlug] + codeData.Tools[toolName][categoryToolsName] ||= [] + + codeData.Tools[toolName][categoryToolsName].push({ + name, + description, + howto, + url, + github, + npm, + gem, + sourcePath: markdownFilePath, + }) + break + } + default: { + const codeDirIndex = pathArr.indexOf("code") + const categoryNameSlugIndex = codeDirIndex + 1 + const categoryNameSlug = pathArr[categoryNameSlugIndex] + // @ts-expect-error fixme + const categoryName = slugMap[categoryNameSlug] + // @ts-expect-error fixme + codeData[categoryName] ||= [] + // @ts-expect-error fixme + codeData[categoryName].push({ + name, + description, + howto, + url, + github, + npm, + gem, + sourcePath: markdownFilePath, + }) + } + } + }), + ) + return codeData +} diff --git a/scripts/validate-snippets.js b/scripts/validate-snippets.js new file mode 100644 index 0000000000..dfdfaee30a --- /dev/null +++ b/scripts/validate-snippets.js @@ -0,0 +1,165 @@ +#!/usr/bin/env node +// @ts-check + +import fs from "node:fs" +import path from "node:path" +import glob from "fast-glob" +import { parse } from "graphql" +import { fileURLToPath } from "node:url" + +const __filename = fileURLToPath(import.meta.url) +const __dirname = path.dirname(__filename) +const projectRoot = path.resolve(__dirname, "../") + +/** @type {string} Glob pattern for MDX files to validate */ +const MDX_GLOB = "./src/pages/learn/**/*.mdx" +/** @type {RegExp} Regex to match code blocks in markdown */ +const CODE_BLOCK_REGEX = /^(`{3,})(\w+)\s*\n([\s\S]*?)\r?\n\1$/gm +/** @type {string} Comment to ignore code snippets */ +const IGNORE_COMMENT = "snippet-ignore" + +/** @type {number} */ +let totalFiles = 0 +/** @type {number} */ +let totalSnippets = 0 +/** @type {number} */ +let totalErrors = 0 + +/** + * @typedef {{ message: string }} ParseError + */ + +/** + * @param {string} code + * @returns {ParseError[]} + */ +function validateGraphQL(code) { + try { + parse(code) + return [] + } catch (error) { + return [{ message: error instanceof Error ? error.message : String(error) }] + } +} + +/** + * @typedef {{ + * lang: string, + * code: string, + * lineNumber: number, + * filePath: string + * }} Snippet + +/** + * Extracts code snippets from MDX content + * @param {string} content - The MDX file content + * @param {string} filePath - The path to the file being processed + * @returns {Snippet[]} Array of extracted code snippets + */ +function extractSnippets(content, filePath) { + const snippets = [] + let match + + while ((match = CODE_BLOCK_REGEX.exec(content)) !== null) { + const [fullMatch, openingBackticks, lang, code] = match + const beforeBlock = content.slice(0, match.index) + const lineNumber = beforeBlock.split(/\r?\n/).length + + if (beforeBlock.includes(IGNORE_COMMENT)) { + continue + } + + snippets.push({ lang, code, lineNumber, filePath }) + } + + return snippets +} + +/** + * @typedef {{ + * type: string, + * file: string, + * line: number, + * message: string + * }} ValidationError + */ + +/** + * @param {Snippet} snippet - The code snippet to validate + * @returns {Promise} Array of validation errors + */ +async function validateSnippet(snippet) { + const { lang, code, lineNumber, filePath } = snippet + + if (!code.trim()) return [] + + if (lang === "graphql") { + const messages = validateGraphQL(code) + return messages.map(msg => ({ + type: "GraphQL", + file: filePath, + line: lineNumber, + message: msg.message, + })) + } + + return [] +} + +/** + * @returns {Promise} + */ +async function main() { + console.log(`Validating code snippets in: ${MDX_GLOB}`) + + const files = glob.sync(MDX_GLOB, { cwd: projectRoot }) + totalFiles = files.length + + if (totalFiles === 0) { + console.log("No MDX files found to validate.") + return + } + + const errors = [] + + for (const file of files) { + const content = fs.readFileSync(file, "utf8") + const snippets = extractSnippets(content, file) + totalSnippets += snippets.length + + for (const snippet of snippets) { + const snippetErrors = await validateSnippet(snippet) + errors.push(...snippetErrors) + } + } + + totalErrors = errors.length + + if (totalErrors > 0) { + errors.forEach(err => { + const errorMessage = `${err.type} Error in ${err.file} at line ${err.line}: ${err.message}` + console.error(errorMessage) + + if (process.env.GITHUB_ACTIONS) { + console.log(`::error file=${err.file},line=${err.line}::${err.message}`) + } + }) + + console.error("\nCode snippet validation failed. Check error logs.") + console.error(`Files checked: ${totalFiles}`) + console.error(`Snippets checked: ${totalSnippets}`) + console.error(`Errors found: ${totalErrors}`) + process.exit(1) + } else { + console.log( + "\n✅ Code snippet validation passed. All code snippets are valid.", + ) + console.log(`Files checked: ${totalFiles}`) + console.log(`Snippets checked: ${totalSnippets}`) + } +} + +main().catch(err => { + console.error(err) + process.exit(1) +}) diff --git a/site/.nojekyll b/site/.nojekyll deleted file mode 100644 index bc7f8f7417..0000000000 --- a/site/.nojekyll +++ /dev/null @@ -1 +0,0 @@ -TODO: get this out of the source diff --git a/site/_core/BlogLayout.js b/site/_core/BlogLayout.js deleted file mode 100644 index 3f8d639d55..0000000000 --- a/site/_core/BlogLayout.js +++ /dev/null @@ -1,22 +0,0 @@ -/** - * Copyright (c) 2015, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the license found in the - * LICENSE file in the root directory of this source tree. - */ - -var React = require('react'); -var Site = require('./Site'); -var BlogSidebar = require('./BlogSidebar'); -var BlogPost = require('./BlogPost'); - -module.exports = ({ page, site }) => - -
-
- - -
-
-
diff --git a/site/_core/BlogPost.js b/site/_core/BlogPost.js deleted file mode 100644 index 2b8bf65df4..0000000000 --- a/site/_core/BlogPost.js +++ /dev/null @@ -1,21 +0,0 @@ -/** - * Copyright (c) 2015, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the license found in the - * LICENSE file in the root directory of this source tree. - */ - -var React = require('react'); -var Marked = require('./Marked'); - -module.exports = ({ post, isPermalink }) => -
-

{isPermalink ? post.title : {post.title}}

-

{new Date(post.date).toLocaleDateString()} by {post.byline}

- {post.guestBio ? null :
} - {post.guestBio &&

{ - `This guest article contributed by ${post.byline}, ${post.guestBio}.` - }

} - {post.content} -
diff --git a/site/_core/BlogSidebar.js b/site/_core/BlogSidebar.js deleted file mode 100644 index 53f96d09f8..0000000000 --- a/site/_core/BlogSidebar.js +++ /dev/null @@ -1,31 +0,0 @@ -/** - * Copyright (c) 2015, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the license found in the - * LICENSE file in the root directory of this source tree. - */ - -var path = require('path'); -var React = require('react'); - -module.exports = ({ site, page }) => -
-
-

Subscribe

- RSS -
-
-

Recent Posts

-
    - {site.files.blog - .filter(file => !file.draft && path.extname(file.relPath) === '.md') - .sort((a, b) => a.date < b.date) - .map(post => -
  • - {post === page ? post.title : {post.title}} -
  • - )} -
-
-
diff --git a/site/_core/DocsLayout.js b/site/_core/DocsLayout.js deleted file mode 100644 index 5f48eeb30a..0000000000 --- a/site/_core/DocsLayout.js +++ /dev/null @@ -1,31 +0,0 @@ -/** - * Copyright (c) 2015, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the license found in the - * LICENSE file in the root directory of this source tree. - */ - -var path = require('path'); -var React = require('react'); -var Site = require('./Site'); -var Marked = require('./Marked'); -var DocsSidebar = require('./DocsSidebar'); - -export default ({ page, site }) => - -
-
-
-

{page.title}

- {page.content} - {page.next && - - Continue Reading → - {page.nextPage.title} - } -
- -
-
-
diff --git a/site/_core/DocsSidebar.js b/site/_core/DocsSidebar.js deleted file mode 100644 index 6acff72ce6..0000000000 --- a/site/_core/DocsSidebar.js +++ /dev/null @@ -1,126 +0,0 @@ -/** - * Copyright (c) 2015, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the license found in the - * LICENSE file in the root directory of this source tree. - */ - -var React = require('react'); -import { toSlug } from './Header'; - -export default ({ site, page, firstURL }) => -
- {getCategories(site, page.dir, firstURL).map(category => - - )} -
- -// pageID is the id of the rendering page -// category is the category object to render a sidebar for -function SidebarForCategory({ pageID, category }) { - const listItems = category.links.map(page => { - const shouldOpenInNewWindow = page.url.slice(0, 4) === 'http'; - const target = shouldOpenInNewWindow ? '_blank' : null; - const rel = shouldOpenInNewWindow ? 'noopener noreferrer' : null; - - // Link for the main page overall - return ( -
  • - - {page.sidebarTitle || page.title} - - {page.sublinks && // Sublinks to any page sub-parts - - } -
  • - ); - }); - - return ( -
    -

    {category.name}

    -
      {listItems}
    -
    - ); -} - -// If firstURL is provided, it's the URL (starting with /) of the -// first page to put on the sidebar. -function getCategories(site, dir, firstURL) { - if (!site.files[dir]) { - throw new Error('Cannot build sidebar for ' + dir); - } - var pages = site.files[dir].filter(file => file.content); - - // Build a hashmap of url -> page - var articles = {} - for (var i = 0; i < pages.length; ++i) { - var page = pages[i]; - articles[page.url] = page; - } - - // Build a hashmap of url -> previous_url - var previous = {}; - for (var i = 0; i < pages.length; ++i) { - var page = pages[i]; - if (page.next) { - if (!articles[page.next]) { - throw new Error( - '`next: ' + page.next + '` in ' + page.url + ' doesn\'t exist' - ); - } - previous[articles[page.next].url] = page.url; - } - } - - // Find the first element which doesn't have any previous - var first = null; - for (var i = 0; i < pages.length; ++i) { - var page = pages[i]; - if (firstURL === page.url || !previous[page.url]) { - first = page; - break; - } - } - if (!first) { - throw new Error('first not found'); - } - - var categories = []; - var currentCategory = null; - - var page = first; - var i = 0; - while (page && i++ < 1000) { - if (!currentCategory || page.category !== currentCategory.name) { - currentCategory && categories.push(currentCategory); - currentCategory = { - name: page.category, - links: [] - } - } - currentCategory.links.push(page); - page = articles[page.next]; - } - categories.push(currentCategory); - - return categories; -} diff --git a/site/_core/GraphQLJSLayout.js b/site/_core/GraphQLJSLayout.js deleted file mode 100644 index 59c787b681..0000000000 --- a/site/_core/GraphQLJSLayout.js +++ /dev/null @@ -1,31 +0,0 @@ -/** - * Copyright (c) 2016, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the license found in the - * LICENSE file in the root directory of this source tree. - */ - -var path = require('path'); -var React = require('react'); -var Site = require('./Site'); -var Marked = require('./Marked'); -var DocsSidebar = require('./DocsSidebar'); - -export default ({ page, site }) => - -
    -
    -
    -

    {page.title}

    - {page.content} - {page.next && - - Continue Reading → - {page.nextPage.title} - } -
    - -
    -
    -
    diff --git a/site/_core/Header.js b/site/_core/Header.js deleted file mode 100644 index 0d9a4a8535..0000000000 --- a/site/_core/Header.js +++ /dev/null @@ -1,59 +0,0 @@ -/** - * Copyright (c) 2015, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the license found in the - * LICENSE file in the root directory of this source tree. - */ - -var React = require('react'); - -export function toSlug(string) { - // var accents = "àáäâèéëêìíïîòóöôùúüûñç"; - var accents = "\u00e0\u00e1\u00e4\u00e2\u00e8" + - "\u00e9\u00eb\u00ea\u00ec\u00ed\u00ef" + - "\u00ee\u00f2\u00f3\u00f6\u00f4\u00f9" + - "\u00fa\u00fc\u00fb\u00f1\u00e7"; - - var without = "aaaaeeeeiiiioooouuuunc"; - - return String(string) - - // Handle uppercase characters - .toLowerCase() - - // Handle accentuated characters - .replace( - new RegExp('[' + accents + ']', 'g'), - function (c) { return without.charAt(accents.indexOf(c)); }) - - // Dash special characters - .replace(/[^a-z0-9]/g, '-') - - // Compress multiple dash - .replace(/-+/g, '-') - - // Trim dashes - .replace(/^-|-$/g, ''); -} - -export default (props) => { - var usedSlugs = props.usedSlugs || {}; - var append = ''; - var loopCount = 0; - do { - var slug = toSlug((props.toSlug || props.children) + append); - append = '-' + (++loopCount); - } while (usedSlugs[slug]); - usedSlugs[slug] = slug; - var Heading = 'h' + props.level; - var url = props.url || ''; - - return ( - - - {props.children} - {' '}# - - ); -} diff --git a/site/_core/HeaderLinks.js b/site/_core/HeaderLinks.js deleted file mode 100644 index a8eaff5939..0000000000 --- a/site/_core/HeaderLinks.js +++ /dev/null @@ -1,32 +0,0 @@ -/** - * Copyright (c) 2015, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the license found in the - * LICENSE file in the root directory of this source tree. - */ - -var React = require('react'); - -const links = [ - { section: 'learn', text: 'Learn', href: '/learn/' }, - { section: 'code', text: 'Code', href: '/code/' }, - { section: 'community', text: 'Community', href: '/community/' }, - { section: 'spec', text: 'Spec', href: 'https://facebook.github.io/graphql/' }, - { section: 'codeofconduct', text: 'Code of Conduct', href: '/codeofconduct/' }, - { section: 'foundation', text: 'Foundation', href: 'https://foundation.graphql.org/' }, -]; - -export default ({ section }) => - diff --git a/site/_core/Marked.js b/site/_core/Marked.js deleted file mode 100644 index b47ad11cbd..0000000000 --- a/site/_core/Marked.js +++ /dev/null @@ -1,1114 +0,0 @@ -/** - * marked - a markdown parser - * Copyright (c) 2011-2013, Christopher Jeffrey. (MIT Licensed) - * https://github.com/chjj/marked -*/ - -var React = require('react'); -var Prism = require('./Prism'); -import Header from './Header'; - -export default function Marked(props) { - return
    {marked(props.children, props)}
    ; -} - -/** - * Block-Level Grammar - */ - -var block = { - newline: /^\n+/, - code: /^( {4}[^\n]+\n*)+/, - fences: noop, - hr: /^( *[-*_]){3,} *(?:\n+|$)/, - heading: /^ *(#{1,6}) *([^\n]+?) *#* *(?:\n+|$)/, - nptable: noop, - lheading: /^([^\n]+)\n *(=|-){3,} *\n*/, - blockquote: /^( *>[^\n]+(\n[^\n]+)*\n*)+/, - list: /^( *)(bull) [\s\S]+?(?:hr|\n{2,}(?! )(?!\1bull )\n*|\s*$)/, - html: /^ *(?:comment|closed|closing) *(?:\n{2,}|\s*$)/, - def: /^ *\[([^\]]+)\]: *]+)>?(?: +["(]([^\n]+)[")])? *(?:\n+|$)/, - table: noop, - paragraph: /^((?:[^\n]+\n?(?!hr|heading|lheading|blockquote|tag|def))+)\n*/, - text: /^[^\n]+/ -}; - -block.bullet = /(?:[*+-]|\d+\.)/; -block.item = /^( *)(bull) [^\n]*(?:\n(?!\1bull )[^\n]*)*/; -block.item = replace(block.item, 'gm') - (/bull/g, block.bullet) - (); - -block.list = replace(block.list) - (/bull/g, block.bullet) - ('hr', /\n+(?=(?: *[-*_]){3,} *(?:\n+|$))/) - (); - -block._tag = '(?!(?:' - + 'a|em|strong|small|s|cite|q|dfn|abbr|data|time|code' - + '|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo' - + '|span|br|wbr|ins|del|img)\\b)\\w+(?!:/|@)\\b'; - -block.html = replace(block.html) - ('comment', //) - ('closed', /<(tag)[\s\S]+?<\/\1>/) - ('closing', /])*?>/) - (/tag/g, block._tag) - (); - -block.paragraph = replace(block.paragraph) - ('hr', block.hr) - ('heading', block.heading) - ('lheading', block.lheading) - ('blockquote', block.blockquote) - ('tag', '<' + block._tag) - ('def', block.def) - (); - -/** - * Normal Block Grammar - */ - -block.normal = merge({}, block); - -/** - * GFM Block Grammar - */ - -block.gfm = merge({}, block.normal, { -//fences: /^ *(`{3,}|~{3,}) *(\S+)? *\n([\s\S]+?)\s*\1 *(?:\n+|$)/, - fences: /^ *(`{3,}|~{3,}) *([^\s{]+)?(?: *\{ *((?:\d+(?: *- *\d+)?(?: *, *\d+(?: *- *\d+)?)*) *)?\})? *\n([\s\S]+?)\s*\1 *(?:\n+|$)/, - paragraph: /^/ -}); - -block.gfm.paragraph = replace(block.paragraph) - ('(?!', '(?!' + block.gfm.fences.source.replace('\\1', '\\2') + '|') - (); - -/** - * GFM + Tables Block Grammar - */ - -block.tables = merge({}, block.gfm, { - nptable: /^ *(\S.*\|.*)\n *([-:]+ *\|[-| :]*)\n((?:.*\|.*(?:\n|$))*)\n*/, - table: /^ *\|(.+)\n *\|( *[-:]+[-| :]*)\n((?: *\|.*(?:\n|$))*)\n*/ -}); - -/** - * Block Lexer - */ - -function Lexer(options) { - this.tokens = []; - this.tokens.links = {}; - this.options = options || marked.defaults; - this.rules = block.normal; - - if (this.options.gfm) { - if (this.options.tables) { - this.rules = block.tables; - } else { - this.rules = block.gfm; - } - } -} - -/** - * Expose Block Rules - */ - -Lexer.rules = block; - -/** - * Static Lex Method - */ - -Lexer.lex = function(src, options) { - var lexer = new Lexer(options); - return lexer.lex(src); -}; - -/** - * Preprocessing - */ - -Lexer.prototype.lex = function(src) { - src = src - .replace(/\r\n|\r/g, '\n') - .replace(/\t/g, ' ') - .replace(/\u00a0/g, ' ') - .replace(/\u2424/g, '\n'); - - return this.token(src, true); -}; - -/** - * Lexing - */ - -Lexer.prototype.token = function(src, top) { - var src = src.replace(/^ +$/gm, '') - , next - , loose - , cap - , bull - , b - , item - , space - , i - , l; - - while (src) { - // newline - if (cap = this.rules.newline.exec(src)) { - src = src.substring(cap[0].length); - if (cap[0].length > 1) { - this.tokens.push({ - type: 'space' - }); - } - } - - // code - if (cap = this.rules.code.exec(src)) { - src = src.substring(cap[0].length); - cap = cap[0].replace(/^ {4}/gm, ''); - this.tokens.push({ - type: 'code', - text: !this.options.pedantic - ? cap.replace(/\n+$/, '') - : cap - }); - continue; - } - - // fences (gfm) - if (cap = this.rules.fences.exec(src)) { - src = src.substring(cap[0].length); - this.tokens.push({ - type: 'code', - lang: cap[2], - line: cap[3], - text: cap[4] - }); - continue; - } - - // heading - if (cap = this.rules.heading.exec(src)) { - src = src.substring(cap[0].length); - this.tokens.push({ - type: 'heading', - depth: cap[1].length, - text: cap[2] - }); - continue; - } - - // table no leading pipe (gfm) - if (top && (cap = this.rules.nptable.exec(src))) { - src = src.substring(cap[0].length); - - item = { - type: 'table', - header: cap[1].replace(/^ *| *\| *$/g, '').split(/ *\| */), - align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */), - cells: cap[3].replace(/\n$/, '').split('\n') - }; - - for (i = 0; i < item.align.length; i++) { - if (/^ *-+: *$/.test(item.align[i])) { - item.align[i] = 'right'; - } else if (/^ *:-+: *$/.test(item.align[i])) { - item.align[i] = 'center'; - } else if (/^ *:-+ *$/.test(item.align[i])) { - item.align[i] = 'left'; - } else { - item.align[i] = null; - } - } - - for (i = 0; i < item.cells.length; i++) { - item.cells[i] = item.cells[i].split(/ *\| */); - } - - this.tokens.push(item); - - continue; - } - - // lheading - if (cap = this.rules.lheading.exec(src)) { - src = src.substring(cap[0].length); - this.tokens.push({ - type: 'heading', - depth: cap[2] === '=' ? 1 : 2, - text: cap[1] - }); - continue; - } - - // hr - if (cap = this.rules.hr.exec(src)) { - src = src.substring(cap[0].length); - this.tokens.push({ - type: 'hr' - }); - continue; - } - - // blockquote - if (cap = this.rules.blockquote.exec(src)) { - src = src.substring(cap[0].length); - - this.tokens.push({ - type: 'blockquote_start' - }); - - cap = cap[0].replace(/^ *> ?/gm, ''); - - // Pass `top` to keep the current - // "toplevel" state. This is exactly - // how markdown.pl works. - this.token(cap, top); - - this.tokens.push({ - type: 'blockquote_end' - }); - - continue; - } - - // list - if (cap = this.rules.list.exec(src)) { - src = src.substring(cap[0].length); - bull = cap[2]; - - this.tokens.push({ - type: 'list_start', - ordered: bull.length > 1 - }); - - // Get each top-level item. - cap = cap[0].match(this.rules.item); - - next = false; - l = cap.length; - i = 0; - - for (; i < l; i++) { - item = cap[i]; - - // Remove the list item's bullet - // so it is seen as the next token. - space = item.length; - item = item.replace(/^ *([*+-]|\d+\.) +/, ''); - - // Outdent whatever the - // list item contains. Hacky. - if (~item.indexOf('\n ')) { - space -= item.length; - item = !this.options.pedantic - ? item.replace(new RegExp('^ {1,' + space + '}', 'gm'), '') - : item.replace(/^ {1,4}/gm, ''); - } - - // Determine whether the next list item belongs here. - // Backpedal if it does not belong in this list. - if (this.options.smartLists && i !== l - 1) { - b = block.bullet.exec(cap[i+1])[0]; - if (bull !== b && !(bull.length > 1 && b.length > 1)) { - src = cap.slice(i + 1).join('\n') + src; - i = l - 1; - } - } - - // Determine whether item is loose or not. - // Use: /(^|\n)(?! )[^\n]+\n\n(?!\s*$)/ - // for discount behavior. - loose = next || /\n\n(?!\s*$)/.test(item); - if (i !== l - 1) { - next = item[item.length-1] === '\n'; - if (!loose) loose = next; - } - - this.tokens.push({ - type: loose - ? 'loose_item_start' - : 'list_item_start' - }); - - // Recurse. - this.token(item, false); - - this.tokens.push({ - type: 'list_item_end' - }); - } - - this.tokens.push({ - type: 'list_end' - }); - - continue; - } - - // html - if (cap = this.rules.html.exec(src)) { - src = src.substring(cap[0].length); - this.tokens.push({ - type: this.options.sanitize - ? 'paragraph' - : 'html', - pre: cap[1] === 'pre' || cap[1] === 'script', - text: cap[0] - }); - continue; - } - - // def - if (top && (cap = this.rules.def.exec(src))) { - src = src.substring(cap[0].length); - this.tokens.links[cap[1].toLowerCase()] = { - href: cap[2], - title: cap[3] - }; - continue; - } - - // table (gfm) - if (top && (cap = this.rules.table.exec(src))) { - src = src.substring(cap[0].length); - - item = { - type: 'table', - header: cap[1].replace(/^ *| *\| *$/g, '').split(/ *\| */), - align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */), - cells: cap[3].replace(/(?: *\| *)?\n$/, '').split('\n') - }; - - for (i = 0; i < item.align.length; i++) { - if (/^ *-+: *$/.test(item.align[i])) { - item.align[i] = 'right'; - } else if (/^ *:-+: *$/.test(item.align[i])) { - item.align[i] = 'center'; - } else if (/^ *:-+ *$/.test(item.align[i])) { - item.align[i] = 'left'; - } else { - item.align[i] = null; - } - } - - for (i = 0; i < item.cells.length; i++) { - item.cells[i] = item.cells[i] - .replace(/^ *\| *| *\| *$/g, '') - .split(/ *\| */); - } - - this.tokens.push(item); - - continue; - } - - // top-level paragraph - if (top && (cap = this.rules.paragraph.exec(src))) { - src = src.substring(cap[0].length); - this.tokens.push({ - type: 'paragraph', - text: cap[1][cap[1].length-1] === '\n' - ? cap[1].slice(0, -1) - : cap[1] - }); - continue; - } - - // text - if (cap = this.rules.text.exec(src)) { - // Top-level should never reach here. - src = src.substring(cap[0].length); - this.tokens.push({ - type: 'text', - text: cap[0] - }); - continue; - } - - if (src) { - throw new - Error('Infinite loop on byte: ' + src.charCodeAt(0)); - } - } - - return this.tokens; -}; - -/** - * Inline-Level Grammar - */ - -var inline = { - escape: /^\\([\\`*{}\[\]()#+\-.!_>])/, - autolink: /^<([^ >]+(@|:\/)[^ >]+)>/, - url: noop, - tag: /^|^<\/?\w+(?:"[^"]*"|'[^']*'|[^'">])*?>/, - link: /^!?\[(inside)\]\(href\)/, - reflink: /^!?\[(inside)\]\s*\[([^\]]*)\]/, - nolink: /^!?\[((?:\[[^\]]*\]|[^\[\]])*)\]/, - strong: /^__([\s\S]+?)__(?!_)|^\*\*([\s\S]+?)\*\*(?!\*)/, - em: /^\b_((?:__|[\s\S])+?)_\b|^\*((?:\*\*|[\s\S])+?)\*(?!\*)/, - code: /^(`+)\s*([\s\S]*?[^`])\s*\1(?!`)/, - br: /^ {2,}\n(?!\s*$)/, - del: noop, - text: /^[\s\S]+?(?=[\\?(?:\s+['"]([\s\S]*?)['"])?\s*/; - -inline.link = replace(inline.link) - ('inside', inline._inside) - ('href', inline._href) - (); - -inline.reflink = replace(inline.reflink) - ('inside', inline._inside) - (); - -/** - * Normal Inline Grammar - */ - -inline.normal = merge({}, inline); - -/** - * Pedantic Inline Grammar - */ - -inline.pedantic = merge({}, inline.normal, { - strong: /^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/, - em: /^_(?=\S)([\s\S]*?\S)_(?!_)|^\*(?=\S)([\s\S]*?\S)\*(?!\*)/ -}); - -/** - * GFM Inline Grammar - */ - -inline.gfm = merge({}, inline.normal, { - escape: replace(inline.escape)('])', '~|])')(), - url: /^(https?:\/\/[^\s<]+[^<.,:;"')\]\s])/, - del: /^~~(?=\S)([\s\S]*?\S)~~/, - text: replace(inline.text) - (']|', '~]|') - ('|', '|https?://|') - () -}); - -/** - * GFM + Line Breaks Inline Grammar - */ - -inline.breaks = merge({}, inline.gfm, { - br: replace(inline.br)('{2,}', '*')(), - text: replace(inline.gfm.text)('{2,}', '*')() -}); - -/** - * Inline Lexer & Compiler - */ - -function InlineLexer(links, options) { - this.options = options || marked.defaults; - this.links = links; - this.rules = inline.normal; - - if (!this.links) { - throw new - Error('Tokens array requires a `links` property.'); - } - - if (this.options.gfm) { - if (this.options.breaks) { - this.rules = inline.breaks; - } else { - this.rules = inline.gfm; - } - } else if (this.options.pedantic) { - this.rules = inline.pedantic; - } -} - -/** - * Expose Inline Rules - */ - -InlineLexer.rules = inline; - -/** - * Static Lexing/Compiling Method - */ - -InlineLexer.output = function(src, links, options) { - var inline = new InlineLexer(links, options); - return inline.output(src); -}; - -/** - * Lexing/Compiling - */ - -InlineLexer.prototype.output = function(src) { - var out = [] - , link - , text - , href - , cap; - - while (src) { - // escape - if (cap = this.rules.escape.exec(src)) { - src = src.substring(cap[0].length); - out.push(cap[1]); - continue; - } - - // autolink - if (cap = this.rules.autolink.exec(src)) { - src = src.substring(cap[0].length); - if (cap[2] === '@') { - text = cap[1][6] === ':' - ? cap[1].substring(7) - : cap[1]; - href = 'mailto:' + text; - } else { - text = cap[1]; - href = text; - } - out.push(React.DOM.a({href: this.sanitizeUrl(href)}, text)); - continue; - } - - // url (gfm) - if (cap = this.rules.url.exec(src)) { - src = src.substring(cap[0].length); - text = cap[1]; - href = text; - out.push(React.DOM.a({href: this.sanitizeUrl(href)}, text)); - continue; - } - - // tag - if (cap = this.rules.tag.exec(src)) { - src = src.substring(cap[0].length); - // TODO(alpert): Don't escape if sanitize is false - out.push(cap[0]); - continue; - } - - // link - if (cap = this.rules.link.exec(src)) { - src = src.substring(cap[0].length); - out.push(this.outputLink(cap, { - href: cap[2], - title: cap[3] - })); - continue; - } - - // reflink, nolink - if ((cap = this.rules.reflink.exec(src)) - || (cap = this.rules.nolink.exec(src))) { - src = src.substring(cap[0].length); - link = (cap[2] || cap[1]).replace(/\s+/g, ' '); - link = this.links[link.toLowerCase()]; - if (!link || !link.href) { - out.push.apply(out, this.output(cap[0][0])); - src = cap[0].substring(1) + src; - continue; - } - out.push(this.outputLink(cap, link)); - continue; - } - - // strong - if (cap = this.rules.strong.exec(src)) { - src = src.substring(cap[0].length); - out.push(React.DOM.strong(null, this.output(cap[2] || cap[1]))); - continue; - } - - // em - if (cap = this.rules.em.exec(src)) { - src = src.substring(cap[0].length); - out.push(React.DOM.em(null, this.output(cap[2] || cap[1]))); - continue; - } - - // code - if (cap = this.rules.code.exec(src)) { - src = src.substring(cap[0].length); - out.push(React.DOM.code(null, cap[2])); - continue; - } - - // br - if (cap = this.rules.br.exec(src)) { - src = src.substring(cap[0].length); - out.push(React.DOM.br(null, null)); - continue; - } - - // del (gfm) - if (cap = this.rules.del.exec(src)) { - src = src.substring(cap[0].length); - out.push(React.DOM.del(null, this.output(cap[1]))); - continue; - } - - // text - if (cap = this.rules.text.exec(src)) { - src = src.substring(cap[0].length); - out.push(this.smartypants(cap[0])); - continue; - } - - if (src) { - throw new - Error('Infinite loop on byte: ' + src.charCodeAt(0)); - } - } - - return out; -}; - -/** - * Sanitize a URL for a link or image - */ - -InlineLexer.prototype.sanitizeUrl = function(url) { - if (this.options.sanitize) { - try { - var prot = decodeURIComponent(url) - .replace(/[^A-Za-z0-9:]/g, '') - .toLowerCase(); - if (prot.indexOf('javascript:') === 0) { - return '#'; - } - } catch (e) { - return '#'; - } - } - return url; -}; - -/** - * Compile Link - */ - -InlineLexer.prototype.outputLink = function(cap, link) { - if (cap[0][0] !== '!') { - var shouldOpenInNewWindow = - link.href.charAt(0) !== '/' - && link.href.charAt(0) !== '#'; - - return React.DOM.a({ - href: this.sanitizeUrl(link.href), - title: link.title, - target: shouldOpenInNewWindow ? '_blank' : null, - rel: shouldOpenInNewWindow ? 'nofollow noopener noreferrer' : null - }, this.output(cap[1])); - } else { - return React.DOM.img({ - src: this.sanitizeUrl(link.href), - alt: cap[1], - title: link.title - }, null); - } -}; - -/** - * Smartypants Transformations - */ - -InlineLexer.prototype.smartypants = function(text) { - if (!this.options.smartypants) return text; - return text - .replace(/--/g, '\u2014') - .replace(/'([^']*)'/g, '\u2018$1\u2019') - .replace(/"([^"]*)"/g, '\u201C$1\u201D') - .replace(/\.{3}/g, '\u2026'); -}; - -/** - * Parsing & Compiling - */ - -function Parser(options) { - this.tokens = []; - this.token = null; - this.options = options || marked.defaults; - this.usedSlugs = {}; -} - -/** - * Static Parse Method - */ - -Parser.parse = function(src, options) { - var parser = new Parser(options); - return parser.parse(src); -}; - -/** - * Parse Loop - */ - -Parser.prototype.parse = function(src) { - this.inline = new InlineLexer(src.links, this.options); - this.tokens = src.reverse(); - - var out = []; - while (this.next()) { - out.push(this.tok()); - } - - return out; -}; - -/** - * Next Token - */ - -Parser.prototype.next = function() { - return this.token = this.tokens.pop(); -}; - -/** - * Preview Next Token - */ - -Parser.prototype.peek = function() { - return this.tokens[this.tokens.length-1] || 0; -}; - -/** - * Parse Text Tokens - */ - -Parser.prototype.parseText = function() { - var body = this.token.text; - - while (this.peek().type === 'text') { - body += '\n' + this.next().text; - } - - return this.inline.output(body); -}; - -/** - * Parse Current Token - */ - -Parser.prototype.tok = function() { - switch (this.token.type) { - case 'space': { - return []; - } - case 'hr': { - return React.DOM.hr(null, null); - } - case 'heading': { - return ( -
    - {this.inline.output(this.token.text)} -
    - ); - } - case 'code': { - if (this.token.lang === 'graphql') { - var lines = this.token.text.split('\n'); - var firstLine = lines.shift().match(/^\s*#\s*({.*})$/); - if (firstLine) { - var metaData; - try { - metaData = JSON.parse(firstLine[1]); - } catch (e) { - console.error('Invalid Metadata JSON:', firstLine[1]); - } - if (metaData) { - var query = lines.join('\n'); - var variables = metaData.variables ? JSON.stringify(metaData.variables, null, 2) : ''; - return - - -When we built Facebook's mobile applications, we needed a data-fetching API powerful enough to describe all of Facebook, yet simple and easy to learn so product developers can focus on building things quickly. We developed GraphQL three years ago to fill this need. Today it powers hundreds of billions of API calls a day. This year we've begun the process of open-sourcing GraphQL by drafting a specification, releasing a reference implementation, and forming a community around it here at [graphql.org](http://graphql.org/). - -## Why GraphQL? - -Back in 2012, we began an effort to rebuild Facebook's native mobile applications. - -At the time, our iOS and Android apps were thin wrappers around views of our mobile website. While this brought us close to a platonic ideal of the "write one, run anywhere" mobile application, in practice it pushed our mobile-webview apps beyond their limits. As Facebook's mobile apps became more complex, they suffered poor performance and frequently crashed. - -As we transitioned to natively implemented models and views, we found ourselves for the first time needing an API data version of News Feed — which up until that point had only been delivered as HTML. We evaluated our options for delivering News Feed data to our mobile apps, including RESTful server resources and FQL tables (Facebook's SQL-like API). We were frustrated with the differences between the data we wanted to use in our apps and the server queries they required. We don't think of data in terms of resource URLs, secondary keys, or join tables; we think about it in terms of a graph of objects and the models we ultimately use in our apps like NSObjects or JSON. - -There was also a considerable amount of code to write on both the server to prepare the data and on the client to parse it. This frustration inspired a few of us to start the project that ultimately became GraphQL. GraphQL was our opportunity to rethink mobile app data-fetching from the perspective of product designers and developers. It moved the focus of development to the client apps, where designers and developers spend their time and attention. - -## What is GraphQL? - -A GraphQL query is a string that is sent to a server to be interpreted and fulfilled, which then returns JSON back to the client. - - - -**Defines a data shape:** The first thing you'll notice is that GraphQL queries mirror their response. This makes it easy to predict the shape of the data returned from a query, as well as to write a query if you know the data your app needs. More important, this makes GraphQL really easy to learn and use. GraphQL is unapologetically driven by the data requirements of products and of the designers and developers who build them. - -**Hierarchical:** Another important aspect of GraphQL is its hierarchical nature. GraphQL naturally follows relationships between objects, where a RESTful service may require multiple round-trips (resource-intensive on mobile networks) or a complex join statement in SQL. This data hierarchy pairs well with graph-structured data stores and ultimately with the hierarchical user interfaces it's used within. - -**Strongly typed:** Each level of a GraphQL query corresponds to a particular type, and each type describes a set of available fields. Similar to SQL, this allows GraphQL to provide descriptive error messages before executing a query. It also plays well with the strongly typed native environments of Obj-C and Java. - -**Protocol, not storage:** Each GraphQL field on the server is backed by a function - code linking to your application layer. While we were building GraphQL to support News Feed, we already had a sophisticated feed ranking and storage model, along with existing databases and business logic. GraphQL had to leverage all this existing work to be useful, and so does not dictate or provide any backing storage. Instead, GraphQL takes advantage of your existing code by exposing your application layer, not your storage layer. - -**Introspective:** A GraphQL server can be queried for the types it supports. This creates a powerful platform for tools and client software to build atop this information like code generation in statically typed languages, our application framework, Relay, or IDEs like GraphiQL (pictured below). GraphiQL helps developers learn and explore an API quickly without grepping the codebase or wrangling with cURL. - - - -**Version free:** The shape of the returned data is determined entirely by the client's query, so servers become simpler and easy to generalize. When you're adding new product features, additional fields can be added to the server, leaving existing clients unaffected. When you're sunsetting older features, the corresponding server fields can be deprecated but continue to function. This gradual, backward-compatible process removes the need for an incrementing version number. We still support three years of released Facebook applications on a single version of our GraphQL API. - -With GraphQL, we were able to build full-featured native News Feed on iOS in 2012, and on Android shortly after. Since then, GraphQL has become the primary way we build our mobile apps and the servers that power them. More than three years later, GraphQL powers almost all data-fetching in our mobile applications, serving millions of requests per second from nearly 1,000 shipped application versions. - -When we built GraphQL in 2012 we had no idea how important it would become to how we build things at Facebook and didn't anticipate its value beyond Facebook. However earlier this year we announced Relay, our application framework for the web and React Native built atop GraphQL. The community excitement for Relay inspired us to revisit GraphQL to evaluate every detail, make improvements, fix inconsistencies, and write a specification describing GraphQL and how it works. - -Two months ago, we [made our progress public](https://www.youtube.com/watch?v=WQLzZf34FJ8) and released a working draft of the [GraphQL spec](http://facebook.github.io/graphql/) and a reference implementation: [GraphQL.js](https://github.com/graphql/graphql-js). Since then, a community has started to form around GraphQL, and versions of the GraphQL runtime are being [built in many languages](https://github.com/chentsulin/awesome-graphql), including Go, Ruby, Scala, Java, .Net, and Python. We've also begun to share some of the tools we use internally, like [GraphiQL](https://github.com/graphql/graphiql), an in-browser IDE, documentation browser, and query runner. GraphQL has also seen production usage outside Facebook, in a project for the [*Financial Times*](https://www.youtube.com/watch?v=S0s935RKKB4) by consultancy [Red Badger](http://red-badger.com/). - -“GraphQL makes orchestrating data fetching so much simpler and it pretty much functions as a perfect isolation point between the front end and the back end” -— Viktor Charypar, software engineer at Red Badger - -While GraphQL is an established part of building products at Facebook, its use beyond Facebook is just beginning. Try out [GraphiQL](http://graphql-swapi.parseapp.com/graphiql/) and help provide feedback on our [specification](https://github.com/facebook/graphql/). We think GraphQL can greatly simplify data needs for both client product developers and server-side engineers, regardless of what languages you're using in either environment, and we're excited to continue to improve GraphQL, help a community grow around it, and see what we can build together. diff --git a/site/blog/20151016-subscriptions.md b/site/blog/20151016-subscriptions.md deleted file mode 100644 index 919a85fc89..0000000000 --- a/site/blog/20151016-subscriptions.md +++ /dev/null @@ -1,90 +0,0 @@ ---- -title: "Subscriptions in GraphQL and Relay" -layout: ../_core/BlogLayout -permalink: /blog/subscriptions-in-graphql-and-relay/ -date: 16 Oct 2015 -byline: Dan Schafer and Laney Kuenzel ---- - -When we announced and open-sourced GraphQL and Relay this year, we described how they can be used to perform reads with queries, and to perform writes with mutations. However, oftentimes clients want to get pushed updates from the server when data they care about changes. To support that, we’ve introduced a third operation into the GraphQL specification: subscription. - -## Event-based subscriptions - -The approach that we’ve taken to subscriptions parallels that of mutations; just as the list of mutations that the server supports describes all of the actions that a client can take, the list of subscriptions that the server supports describes all of the events that it can subscribe to. Just as a client can tell the server what data to refetch after it performs a mutation with a GraphQL selection, the client can tell the server what data it wants to be pushed with the subscription with a GraphQL selection. - -For example, in the Facebook schema, we have a mutation field named `storyLike`, that clients can use to like a post. The client might want to refetch the like count, as well as the like sentence (“Dan and 3 others like this”. We do this translation on the server because of the complexity of that translation in various languages). To do so, they would issue the following mutation: - -``` -mutation StoryLikeMutation($input: StoryLikeInput) { - storyLike(input: $input) { - story { - likers { count } - likeSentence { text } - } - } -} -``` - -But when you’re looking at a post, you also want to get pushed an update whenever someone else likes the post! That’s where subscriptions come in; the Facebook schema has a subscription field named `storyLikeSubscribe` that allows the client to get pushed data anytime someone likes or unlikes that story! The client would create a subscription like this: - -``` -subscription StoryLikeSubscription($input: StoryLikeSubscribeInput) { - storyLikeSubscribe(input: $input) { - story { - likers { count } - likeSentence { text } - } - } -} -``` - - -The client would then send this subscription to the server, along with the value for the `$input` variable, which would contain information like the story ID to which we are subscribing: - -```graphql -input StoryLikeSubscribeInput { - storyId: string - clientSubscriptionId: string -} -``` - -At Facebook, we send this query to the server at build time to generate a unique ID for it, then subscribe to a special MQTT topic with the subscription ID in it, but many different subscription mechanisms could be used here. - -On the server, we then trigger this subscription every time someone likes a post. If all of our clients were using GraphQL, we could put this hook in the GraphQL mutation; since we have non-GraphQL clients as well, we put the hook in a layer below the GraphQL mutation to ensure it always fires. - -## Why not Live Queries? - -Notably, this approach requires the client to subscribe to events that it cares about. Another approach is to have the client subscribe to a query, and ask for updates every time the result of that query changes. Why didn’t we take that approach? - -Let’s look back at the data we wanted to refetch for the story: - -``` -fragment StoryLikeData on Story { - story { - likers { count } - likeSentence { text } - } -} -``` - -What events could trigger that a change to the data fetched in that fragment? - -* Someone likes the post. -* Someone unlikes the post. -* Someone who had liked the post deactivates their account (changes the like count down one, changes the like sentence to decrement the translated count). -* Someone who had liked the post reactivates their account (changes the like count up one, changes the like sentence to increment the translated count). -* Someone who had liked the post blocks you (cannot show them in the like sentence). -* Someone who had liked the post changes their name (need to update the text of the like sentence). -* Our internal ranking model for the ordering of names in the like sentence updates, and we should be listing a different person first (want to update the text of the like sentence). - -And that’s just the tip of the iceberg in terms of events; each of those events also becomes tricky when there are thousands of people subscribed, and millions of people who liked the post. Implementing live queries for this set of data proved to be immensely complicated. - -When building event-based subscriptions, the problem of determining what should trigger an event is easy, since the event defines that explicitly. It also proved fairly straight-forward to implement atop existing message queue systems. For live queries, though, this appeared much harder. The value of our fields is determined by the result of their resolve function, and figuring out all of the things that could alter the result of that function was difficult. We could in theory have polled on the server to implement this, but that had efficiency and timeliness issues. Based on this, we decided to invest in the event-based subscription approach. - -## What’s next? - -We’re actively building out the event-based subscription approach described above. We’ve built out live liking and commenting features on our iOS and Android apps using that approach, and are continuing to flesh out its functionality and API. While its current implementation at Facebook is coupled to Facebook’s infrastructure, we’re certainly looking forward to open sourcing our progress here as soon as we can. - -Because our backend and schema don’t offer easy support for live queries, we don’t have any plans to develop them at Facebook. At the same time, it’s clear that there are backends and schemas for which live queries are feasible, and that they offer a lot of value in those situations. The discussion in the community on this topic has been fantastic, and we’re excited to see what kind of live query proposals emerge from it! - -Subscriptions create a ton of possibilities for creating truly dynamic applications. We’re excited to continue developing GraphQL and Relay with the help of the community to enable these possibilities. diff --git a/site/blog/20160419-mocking.md b/site/blog/20160419-mocking.md deleted file mode 100644 index 69866266b5..0000000000 --- a/site/blog/20160419-mocking.md +++ /dev/null @@ -1,82 +0,0 @@ ---- -title: "Mocking your server is easy with GraphQL" -layout: ../_core/BlogLayout -permalink: /blog/mocking-with-graphql/ -date: 19 Apr 2016 -byline: "Jonas Helfer" -guestBio: engineer at Meteor working on Apollo ---- - -Do you think mocking your backend is always a tedious task? If you do, reading this post might change your mind… - -Mocking is the practice of creating a fake version of a component, so that you can develop and test other parts of your application independently. Mocking your backend is a great way to quickly build a prototype of your frontend, and it lets you test your frontend without starting up any servers. API mocking is so useful that a [quick Google search](https://www.google.com/?ion=1&espv=2#q=mock+rest+api) will turn up dozens of expensive products and services that promise to help you. - -Sadly, I think none of the solutions out there make it as easy as it should be. As it turns out, that’s because they’ve been trying to do it with the wrong technology! - -> Editor’s note : The concepts in this post are accurate, but some the code samples don’t demonstrate new usage patterns. After reading, consult the [graphql-tools docs](http://dev.apollodata.com/tools/graphql-tools/mocking.html) to see how to use mocking today. - -## Why mock? - -Mocking the data a backend would return is very useful for two main reasons: - -1. It lets you start developing a frontend feature when you don’t have a working backend for it yet. This is critical for projects where the frontend and backend components are often developed in parallel. -2. It lets you run tests locally without connecting to a real backend, which is much faster and safer. As your codebase grows and your app becomes more complex, starting up all of the server infrastructure just to run some tests isn’t feasible. - -If mocking your backend API has such clear benefits, why doesn’t everyone do it? I think it's because mocking often seems like too much trouble to be worth it. - -## Why is mocking backends hard? - -Let’s say your backend is some REST API that is called over HTTP from the browser. You have someone working on the backend, and someone else working on the frontend. The backend code actually determines the shape of the data returned for each REST endpoint, but mocking has to be done in the frontend code. That means the mocking code will break every time the backend changes, unless both are changed at the same time. What’s worse, if you’re doing your frontend testing against a mock backend that is not up to date with your backend, your tests may pass, but your actual frontend won’t work. - -Rather than having to keep more dependencies up to date, the easy option is to just not mock the REST API, or have the backend be in charge of mocking itself, just so it’s all in one place. That may be easier, but it will also slow you down. - -The other reason I often hear for why people don’t mock the backend in their project is because it takes time to set up: first you have to include extra logic in your data fetching layer that lets you turn mocking on and off, and second you have to actually describe what that mock data should look like. For any non-trivial API that requires a lot of tedious work. - -Both of these reasons for why mocking backends is hard are actually due to the same underlying reason: there is no standard REST API description in machine-consumable format and contains all the information necessary for mocking and can be used by both the backend and the frontend. There are some API description standards, like Swagger, but they don’t contain all of the information you need, and can be cumbersome to write and maintain. Unless you want to pay for a service or a product — and maybe even then — mocking is a lot of work. - -Actually, I should say mocking used to be a lot of work, because a new technology is changing the way we think of APIs: GraphQL. - -## Mocking is easy with a type system! - -GraphQL makes mocking easy, because every GraphQL backend comes with a static type system. The types can be shared between your backend and your frontend, and they contain all of the information necessary to make mocking incredibly fast and convenient. With GraphQL, there is no excuse to not mock your backend for development or testing. - -Here’s how easy it is to create a mocked backend that will accept any valid GraphQL query with the GraphQL mocking tool we are building as part of our new [GraphQL server toolkit](https://github.com/apollostack/graphql-tools): - - - -Every GraphQL server needs a schema, so it’s not extra code you need to write just for mocking. And the query is the one your component already uses for fetching data, so that’s also not code you write just for mocking. Not counting the import statement, it only took us one line of code to mock the entire backend! - -Put that in contrast to most REST APIs out there, where mocking means parsing a URL and returning data in a custom shape for each endpoint. It takes dozens of lines to mock a single endpoint that returns some realistic-looking data. With GraphQL, the shape is encoded in the query, and together with the schema we have enough information to mock the server with a single line of code. - -Did I mention that this one line is all you need to return mock data for any valid GraphQL query you could send? Not just some valid query, any valid query! Pretty cool, right? - -## Customizing mock data - -In the example above, the mock server will return completely random IDs and strings every time you query it. When you’ve just started building your app and only want to see what your UI code looks like in different states, that’s probably good enough, but as you start to fine-tune your layout, or want to use the mock server to test your component’s logic, you’ll probably need more realistic data. - -Luckily, this takes only a little more effort: customization of mock data is really where the Apollo mocking tool shines, because it lets you customize virtually everything about the mock data that it returns. - -It lets you do all of the following and more: - - - -For each type and each field you can provide a function that will be called on to generate mock data. Mock functions on fields have precedence over mock functions on types, but they work together really nicely: The field mock functions only need to describe the properties of the objects that matter to them, type mock functions will fill in the rest. - -The mock functions are actually just GraphQL resolve functions in disguise. What that means is that your mocking can do anything that you could do inside a GraphQL resolve function. If you wanted, you could write your entire backend with it. I’m not saying you should, but you could. - -I think the real power of this tool is that while it allows almost arbitrarily complex customization, you can get started really quickly and increase the sophistication of your mocks in tiny steps whenever you need it. Each step is so simple that it will feel like a breeze. - -But enough talking, here’s a complete example: - - - -## Live demo + try it yourself -To see the example in action and see what output it generates, head over to the [live demo](https://launchpad.graphql.com/98lq7vz8r) try running some queries! - -If you want to fiddle around with the example, just click the "Download" button in the Launchpad UI. If you’re curious about how it works or want to see what other tools we’re building for GraphQL, then head over to [apollostack/graphql-tools](https://github.com/apollostack/graphql-tools). - -Pretty cool, right? All of that becomes possible by using a type system. And that’s only just the beginning — we‘re working on bridging the gap between mocking and the real thing so that your mock server can gradually turn into your real server as you add more functionality to it. - -- - - - -*This post was originally published on [the Apollo Blog](https://medium.com/apollo-stack). We publish one or two posts every week, about the stuff we’re working on and thinking about.* diff --git a/site/blog/20160502-rest-api-graphql-wrapper.md b/site/blog/20160502-rest-api-graphql-wrapper.md deleted file mode 100644 index 8501c8d4c1..0000000000 --- a/site/blog/20160502-rest-api-graphql-wrapper.md +++ /dev/null @@ -1,517 +0,0 @@ ---- -title: "Wrapping a REST API in GraphQL" -layout: ../_core/BlogLayout -permalink: /blog/rest-api-graphql-wrapper/ -date: 5 May 2016 -byline: "Steven Luscher" ---- - -Time and time again I hear the same aspiration from front-end web and mobile developers: they're eager to reap the developer efficiency gains offered by new technologies like Relay and GraphQL, but they have years of momentum behind their existing REST API. Without data that clearly demonstrates the benefits of switching, they find it hard to justify an additional investment in GraphQL infrastructure. - -In this post I will outline a rapid, low-investment method that you can use to stand up a GraphQL endpoint atop an existing REST API, using JavaScript alone. No backend developers will be harmed during the making of this blog post. - -## A client-side REST wrapper - -We're going to create a _GraphQL schema_ – a type system that describes your universe of data – that wraps calls to your existing REST API. This schema will receive and resolve GraphQL queries all on the client side. This architecture features some inherent performance flaws, but is fast to implement and requires no server changes. - -Imagine a REST API that exposes a `/people/` endpoint through which you can browse `Person` models and their associated friends. - -![A REST API that exposes an index of people][rest-api-people] - -We will build a GraphQL schema that models people and their attributes (like `first_name` and `email`) as well as their association to other people through friendships. - -### Installation - -First we'll need a set of schema building tools. - -``` -npm install --save graphql -``` - -### Building the GraphQL Schema - -Ultimately we will want to export a `GraphQLSchema` that we can use to resolve queries. - -```js -import { GraphQLSchema } from 'graphql'; - -export default new GraphQLSchema({ - query: QueryType, -}); -``` - -At the root of all GraphQL schemas is a type called `query` whose definition we provide, and have specified here as `QueryType`. Let's build `QueryType` now – a type on which we will define all the possible things one might want to fetch. - -To replicate all of the functionality of our REST API, let's expose two fields on `QueryType`: - -* an `allPeople` field – analogous to `/people/` -* a `person(id: String)` field – analogous to `/people/{ID}/` - -Each field will consist of a return type, optional argument definitions, and a JavaScript method that resolves the data being queried for. - -```js -import { - GraphQLList, - GraphQLObjectType, - GraphQLString, -} from 'graphql'; - -const QueryType = new GraphQLObjectType({ - name: 'Query', - description: 'The root of all... queries', - fields: () => ({ - allPeople: { - type: new GraphQLList(PersonType), - resolve: root => // Fetch the index of people from the REST API, - }, - person: { - type: PersonType, - args: { - id: { type: GraphQLString }, - }, - resolve: (root, args) => // Fetch the person with ID `args.id`, - }, - }), -}); -``` - -Let's leave the resolvers as a sketch for now, and move on to defining `PersonType`. - -```js -import { - GraphQLList, - GraphQLObjectType, - GraphQLString, -} from 'graphql'; - -const PersonType = new GraphQLObjectType({ - name: 'Person', - description: 'Somebody that you used to know', - fields: () => ({ - firstName: { - type: GraphQLString, - resolve: person => person.first_name, - }, - lastName: { - type: GraphQLString, - resolve: person => person.last_name, - }, - email: {type: GraphQLString}, - id: {type: GraphQLString}, - username: {type: GraphQLString}, - friends: { - type: new GraphQLList(PersonType), - resolve: person => // Fetch the friends with the URLs `person.friends`, - }, - }), -}); -``` - -Note two things about the definition of `PersonType`. Firstly, we have not supplied a resolver for `email`, `id`, or `username`. The default resolver simply accesses the property of the `person` object that has the same name as the field. This works everywhere except where the property names do not match the field name (eg. the field `firstName` does not match the `first_name` property of the response object from the REST API) or where accessing the property would not yield the object that we want (eg. we want a list of person objects for the `friends` field, not a list of URLs). - -Now, let's write resolvers that fetch people from the REST API. Because we need to load from the network, we won't be able to return a value right away. Luckily for us, `resolve()` can return either a value or a `Promise` for a value. We're going to take advantage of this to fire off an HTTP request to the REST API that eventually resolves to a JavaScript object that conforms to `PersonType`. - -And here we have it – a complete first-pass at the schema: - -```js{28,38,45} -import { - GraphQLList, - GraphQLObjectType, - GraphQLSchema, - GraphQLString, -} from 'graphql'; - -const BASE_URL = 'https://myapp.com/'; - -function fetchResponseByURL(relativeURL) { - return fetch(`${BASE_URL}${relativeURL}`).then(res => res.json()); -} - -function fetchPeople() { - return fetchResponseByURL('/people/').then(json => json.people); -} - -function fetchPersonByURL(relativeURL) { - return fetchResponseByURL(relativeURL).then(json => json.person); -} - -const PersonType = new GraphQLObjectType({ - /* ... */ - fields: () => ({ - /* ... */ - friends: { - type: new GraphQLList(PersonType), - resolve: person => person.friends.map(fetchPersonByURL), - }, - }), -}); - -const QueryType = new GraphQLObjectType({ - /* ... */ - fields: () => ({ - allPeople: { - type: new GraphQLList(PersonType), - resolve: fetchPeople, - }, - person: { - type: PersonType, - args: { - id: { type: GraphQLString }, - }, - resolve: (root, args) => fetchPersonByURL(`/people/${args.id}/`), - }, - }), -}); - -export default new GraphQLSchema({ - query: QueryType, -}); -``` - - -### Using a client-side schema with Relay - -Normally, Relay will send its GraphQL queries to a server over HTTP. We can inject [@taion](https://github.com/taion/)'s custom `relay-local-schema` network layer to resolve queries using the schema we just built. Put this code wherever it's guaranteed to be executed before you mount your Relay app. - -``` -npm install --save relay-local-schema -``` - -``` -import RelayLocalSchema from 'relay-local-schema'; - -import schema from './schema'; - -Relay.injectNetworkLayer( - new RelayLocalSchema.NetworkLayer({ schema }) -); -``` - -And that's that. Relay will send all of its queries to your custom client-resident schema, which will in turn resolve them by making calls to your existing REST API. - -## A server-side REST wrapper - -The client-side REST API wrapper demonstrated above should help you get up and running quickly so that you can try out a Relay version of your app (or part of your app). - -However, as we mentioned before, this architecture features some inherent performance flaws because of how GraphQL is still calling your underlying REST API which can be very network intensive. A good next step is to move the schema from the client side to the server side to minimize latency on the network and to give you more power to cache responses. - -Take the next 10 minutes to watch me build a server side version of the GraphQL wrapper above using Node and Express. - - - -## Bonus round: A truly Relay compliant schema - -The schema we developed above will work for Relay up until a certain point – the point at which you ask Relay to refetch data for records you've already downloaded. Relay's refetching subsystem relies on your GraphQL schema exposing a special field that can fetch any entity in your data universe by GUID. We call this the _node interface_. - -To expose a node interface requires that you do two things: offer a `node(id: String!)` field at the root of the query, and switch all of your ids over to GUIDs (globally-unique ids). - -The `graphql-relay` package contains some helper functions to make this easy to do. - -``` -npm install --save graphql-relay -``` - -#### Global ids - -First, let's change the `id` field of `PersonType` into a GUID. To do this, we'll use the `globalIdField` helper from `graphql-relay`. - -```js -import { - globalIdField, -} from 'graphql-relay'; - -const PersonType = new GraphQLObjectType({ - name: 'Person', - description: 'Somebody that you used to know', - fields: () => ({ - id: globalIdField('Person'), - /* ... */ - }), -}); -``` - -Behind the scenes `globalIdField` returns a field definition that resolves `id` to a `GraphQLString` by hashing together the typename `'Person'` and the id returned by the REST API. We can later use `fromGlobalId` to convert the result of this field back into `'Person'` and the REST API's id. - -#### The node field - -Another set of helpers from `graphql-relay` will give us a hand developing the node field. Your job is to supply the helper two functions: - -* One function that can resolve an object given a GUID. -* One function that can resolve a typename given an object. - -```js -import { - fromGlobalId, - nodeDefinitions, -} from 'graphql-relay'; - -const { nodeInterface, nodeField } = nodeDefinitions( - globalId => { - const { type, id } = fromGlobalId(globalId); - if (type === 'Person') { - return fetchPersonByURL(`/people/${id}/`); - } - }, - object => { - if (object.hasOwnProperty('username')) { - return 'Person'; - } - }, -); -``` - -The object-to-typename resolver above is no marvel of engineering, but you get the idea. - -Next, we simply need to add the `nodeInterface` and the `nodeField` to our schema. A complete example follows: - -```js{27-39,54,61,72} -import { - GraphQLList, - GraphQLObjectType, - GraphQLSchema, - GraphQLString, -} from 'graphql'; -import { - fromGlobalId, - globalIdField, - nodeDefinitions, -} from 'graphql-relay'; - -const BASE_URL = 'https://myapp.com/'; - -function fetchResponseByURL(relativeURL) { - return fetch(`${BASE_URL}${relativeURL}`).then(res => res.json()); -} - -function fetchPeople() { - return fetchResponseByURL('/people/').then(json => json.people); -} - -function fetchPersonByURL(relativeURL) { - return fetchResponseByURL(relativeURL).then(json => json.person); -} - -const { nodeInterface, nodeField } = nodeDefinitions( - globalId => { - const { type, id } = fromGlobalId(globalId); - if (type === 'Person') { - return fetchPersonByURL(`/people/${id}/`); - } - }, - object => { - if (object.hasOwnProperty('username')) { - return 'Person'; - } - }, -); - -const PersonType = new GraphQLObjectType({ - name: 'Person', - description: 'Somebody that you used to know', - fields: () => ({ - firstName: { - type: GraphQLString, - resolve: person => person.first_name, - }, - lastName: { - type: GraphQLString, - resolve: person => person.last_name, - }, - email: {type: GraphQLString}, - id: globalIdField('Person'), - username: {type: GraphQLString}, - friends: { - type: new GraphQLList(PersonType), - resolve: person => person.friends.map(fetchPersonByURL), - }, - }), - interfaces: [ nodeInterface ], -}); - -const QueryType = new GraphQLObjectType({ - name: 'Query', - description: 'The root of all... queries', - fields: () => ({ - allPeople: { - type: new GraphQLList(PersonType), - resolve: fetchPeople, - }, - node: nodeField, - person: { - type: PersonType, - args: { - id: { type: GraphQLString }, - }, - resolve: (root, args) => fetchPersonByURL(`/people/${args.id}/`), - }, - }), -}); - -export default new GraphQLSchema({ - query: QueryType, -}); -``` - -## Taming pathological queries - -Consider the following friends-of-friends-of-friends query: - -```graphql -query { - person(id: "1") { - firstName - friends { - firstName - friends { - firstName - friends { - firstName - } - } - } - } -} -``` - -The schema we created above will generate multiple round trips to the REST API for the same data. - -![Duplicate queries to the REST API][pathological-query] - -This is obviously something we would like to avoid! At the very least, we need a way to cache the result of these requests. - -We created a library called DataLoader to help tame these sorts of queries. - -``` -npm install --save dataloader -``` - -As a special note, make sure that your runtime offers native or polyfilled versions of `Promise` and `Map`. Read more [at the DataLoader site](https://github.com/facebook/dataloader#getting-started). - -#### Creating a data loader - -To create a `DataLoader` you supply a method that can resolve a list of objects given a list of keys. In our example, the keys are URLs at which we access our REST API. - -```js -const personLoader = new DataLoader( - urls => Promise.all(urls.map(fetchPersonByURL)) -); -``` - -If this data loader sees a key more than once in its lifetime, it will return a memoized (cached) version of the response. - -#### Loading data - -We can make use of the `load()` and `loadMany()` methods on `personLoader` to load URLs without fear of hitting the REST API more than once per URL. A complete example follows: - -```js{36,63,83} -import DataLoader from 'dataloader'; -import { - GraphQLList, - GraphQLObjectType, - GraphQLSchema, - GraphQLString, -} from 'graphql'; -import { - fromGlobalId, - globalIdField, - nodeDefinitions, -} from 'graphql-relay'; - -const BASE_URL = 'https://myapp.com/'; - -function fetchResponseByURL(relativeURL) { - return fetch(`${BASE_URL}${relativeURL}`).then(res => res.json()); -} - -function fetchPeople() { - return fetchResponseByURL('/people/').then(json => json.people); -} - -function fetchPersonByURL(relativeURL) { - return fetchResponseByURL(relativeURL).then(json => json.person); -} - -const personLoader = new DataLoader( - urls => Promise.all(urls.map(fetchPersonByURL)) -); - -const { nodeInterface, nodeField } = nodeDefinitions( - globalId => { - const {type, id} = fromGlobalId(globalId); - if (type === 'Person') { - return personLoader.load(`/people/${id}/`); - } - }, - object => { - if (object.hasOwnProperty('username')) { - return 'Person'; - } - }, -); - -const PersonType = new GraphQLObjectType({ - name: 'Person', - description: 'Somebody that you used to know', - fields: () => ({ - firstName: { - type: GraphQLString, - resolve: person => person.first_name, - }, - lastName: { - type: GraphQLString, - resolve: person => person.last_name, - }, - email: {type: GraphQLString}, - id: globalIdField('Person'), - username: {type: GraphQLString}, - friends: { - type: new GraphQLList(PersonType), - resolve: person => personLoader.loadMany(person.friends), - }, - }), - interfaces: [nodeInterface], -}); - -const QueryType = new GraphQLObjectType({ - name: 'Query', - description: 'The root of all... queries', - fields: () => ({ - allPeople: { - type: new GraphQLList(PersonType), - resolve: fetchPeople, - }, - node: nodeField, - person: { - type: PersonType, - args: { - id: { type: GraphQLString }, - }, - resolve: (root, args) => personLoader.load(`/people/${args.id}/`), - }, - }), -}); - -export default new GraphQLSchema({ - query: QueryType, -}); -``` - -Now, our pathological query produces the following nicely de-duped set of requests to the REST API: - -![De-duped queries to the REST API][dataloader-query] - -### Query planning and beyond - -Consider that your REST API might already offer configuration offers that let you eagerly load associations. Maybe to load a person and all of their direct friends you might hit the URL `/people/1/?include_friends`. To take advantage of this in your GraphQL schema you will need the ability to develop a resolution plan based on the structure of the query itself (eg. whether the `friends` field is part of the query or not). - -For those interested in the current thinking around advanced resolution strategies, keep an eye on [pull request #304](https://github.com/graphql/graphql-js/pull/304). - -## Thanks for reading - -I hope that this demonstration has torn down some of the barriers between you and a functional GraphQL endpoint, and has inspired you to experiment with GraphQL and Relay on an existing project. - -[rest-api-people]: /img/blog/20160502-rest-api-graphql-wrapper/rest-api-people.png "A REST API that exposes an index of people" -[pathological-query]: /img/blog/20160502-rest-api-graphql-wrapper/pathological-query.png "Duplicate queries to the REST API" -[dataloader-query]: /img/blog/20160502-rest-api-graphql-wrapper/dataloader-query.png "De-duped queries to the REST API" diff --git a/site/blog/20160914-production-ready.md b/site/blog/20160914-production-ready.md deleted file mode 100644 index 6b1e076613..0000000000 --- a/site/blog/20160914-production-ready.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -title: "Leaving technical preview" -layout: ../_core/BlogLayout -permalink: /blog/production-ready/ -date: 14 Sep 2016 -byline: "Lee Byron" ---- - -After over a year of being open sourced we're bringing GraphQL out of "technical preview" and relaunching [graphql.org](http://graphql.org/). - -For us at Facebook, GraphQL isn't a new technology. GraphQL has been delivering data to mobile News Feed since 2012. Since then it's expanded to support the majority of the Facebook mobile product and evolved in the process. - -Early last year when we first [spoke publicly about GraphQL](https://www.youtube.com/watch?v=9sc8Pyc51uU) we received overwhelming demand to share more about this technology. That sparked an internal project to revisit GraphQL, make improvements, draft a specification, produce a reference implementation you could use to try it out, and build new versions of some of our favorite tools, like [GraphiQL](https://github.com/graphql/graphiql). We moved quickly, and released parts that were ready along the way. - -Part of Facebook's open source philosophy is that we want to only open source what is ready for production. While it's true that we had been using GraphQL in production at Facebook for years, we knew that these newly released pieces had yet to be proven. We expected feedback. So we carefully released GraphQL as a "technical preview." - -Exactly one year ago, we published graphql.org, with a [formal announcement](/blog/graphql-a-query-language/) that GraphQL was open source and ready to be "technically previewed". Since then we've seen GraphQL implemented [in many languages](/code/), and successfully adopted by other companies. That includes today's exciting announcement of the [GitHub GraphQL API](http://githubengineering.com/the-github-graphql-api/), the first major public API to use GraphQL. - -In recognition of the fact that GraphQL is now being used in production by many companies, we're excited to remove the "technical preview" moniker. GraphQL is production ready. - -We've also revamped this website, [graphql.org](http://graphql.org/), with clearer and more relevant content in response to some the most common questions we've received over the last year. - -We think GraphQL can greatly simplify data needs for both client product developers and server-side engineers, regardless of what languages you're using in either environment, and we're excited to continue to improve GraphQL, support the already growing community, and see what we can build together. diff --git a/site/blog/index.html.js b/site/blog/index.html.js deleted file mode 100644 index acf10e587e..0000000000 --- a/site/blog/index.html.js +++ /dev/null @@ -1,31 +0,0 @@ -/** - * Copyright (c) 2015, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the license found in the - * LICENSE file in the root directory of this source tree. - */ - -var path = require('path'); -var React = require('react'); -var Site = require('../_core/Site'); -var Marked = require('../_core/Marked'); -var BlogSidebar = require('../_core/BlogSidebar'); -var BlogPost = require('../_core/BlogPost'); - -export default ({ page, site }) => - -
    -
    -
    - {site.files.blog - .filter(file => !file.draft && path.extname(file.relPath) === '.md') - .sort((a, b) => a.date < b.date) - .map(post => - - )} -
    - -
    -
    -
    diff --git a/site/blog/rss.xml.js b/site/blog/rss.xml.js deleted file mode 100644 index 1740b75a0f..0000000000 --- a/site/blog/rss.xml.js +++ /dev/null @@ -1,38 +0,0 @@ -/** - * Copyright (c) 2015, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the license found in the - * LICENSE file in the root directory of this source tree. - */ - -var path = require('path'); -var React = require('react'); - -export default function BlogRSS({ site }) { - const posts = site.files.blog - .filter(file => !file.draft && path.extname(file.relPath) === '.md') - .sort((a, b) => a.date < b.date); - return ( - - Blog | GraphQL - - http://graphql.org/blog/ - {new Date(posts[0].date).toISOString()} - - {posts.map(post => - - {post.title} - - http://graphql.org{post.url} - {new Date(post.date).toISOString()} - {post.title} - {post.title} - - {post.byline} - - - )} - - ); -} diff --git a/site/code/index.html.js b/site/code/index.html.js deleted file mode 100644 index 69b2f31fb5..0000000000 --- a/site/code/index.html.js +++ /dev/null @@ -1,519 +0,0 @@ -/** - * Copyright (c) 2015, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the license found in the - * LICENSE file in the root directory of this source tree. - */ - -var React = require('react'); -var Site = require('../_core/Site'); -var Marked = require('../_core/Marked'); - -export default ({ page, site }) => - - -
    -
    -
    -

    Code

    - {` - -Many different programming languages support GraphQL. This list contains some of the more popular server-side frameworks, client libraries, services, and other useful stuff. - -## Server Libraries - -In addition to the GraphQL [reference implementations in JavaScript](#javascript), server libraries include: - -- [C# / .NET](#c-net) -- [Clojure](#clojure) -- [Elixir](#elixir) -- [Erlang](#erlang) -- [Go](#go) -- [Groovy](#groovy) -- [Java](#java) -- [JavaScript](#javascript) -- [PHP](#php) -- [Python](#python) -- [Scala](#scala) -- [Ruby](#ruby) - -### C# / .NET - - - [graphql-dotnet](https://github.com/graphql-dotnet/graphql-dotnet): GraphQL for .NET - - [graphql-net](https://github.com/ckimes89/graphql-net): Convert GraphQL to IQueryable - - [Hot Chocolate](https://github.com/ChilliCream/hotchocolate): GraphQL Server for .net core and .net classic - -### Clojure - -#### [alumbra](https://github.com/alumbra/alumbra) - -A set of reusable GraphQL components for Clojure conforming to the data structures given in [alumbra.spec](https://github.com/alumbra/alumbra.spec). - -\`\`\`clojure -(require '[alumbra.core :as alumbra] - '[claro.data :as data]) - -(def schema - "type Person { name: String!, friends: [Person!]! } - type QueryRoot { person(id: ID!): Person, me: Person! } - schema { query: QueryRoot }") - -(defrecord Person [id] - data/Resolvable - (resolve! [_ _] - {:name (str "Person #" id) - :friends (map ->Person (range (inc id) (+ id 3)))})) - -(def QueryRoot - {:person (map->Person {}) - :me (map->Person {:id 0})}) - -(def app - (alumbra/handler - {:schema schema - :query QueryRoot})) - -(defonce my-graphql-server - (aleph.http/start-server #'app {:port 3000})) -\`\`\` - -\`\`\`bash -$ curl -XPOST "http://0.0.0.0:3000/" -H'Content-Type: application/json' -d'{ - "query": "{ me { name, friends { name } } }" -}' -{"data":{"me":{"name":"Person #0","friends":[{"name":"Person #1"},{"name":"Person #2"}]}}} -\`\`\` - -#### [graphql-clj](https://github.com/tendant/graphql-clj) - -A Clojure library that provides a GraphQL implementation. - -Code that executes a hello world GraphQL query with \`graphql-clj\`: - -\`\`\`clojure - -(def schema "type QueryRoot { - hello: String - }") - -(defn resolver-fn [type-name field-name] - (get-in {"QueryRoot" {"hello" (fn [context parent & rest] - "Hello world!")}} - [type-name field-name])) - -(require '[graphql-clj.executor :as executor]) - -(executor/execute nil schema resolver-fn "{ hello }") -\`\`\` - -#### [lacinia](https://github.com/walmartlabs/lacinia) - -A full implementation of the GraphQL specification that aims to maintain external compliance with the specification. - -### Elixir - - - [absinthe](https://github.com/absinthe-graphql/absinthe): GraphQL implementation for Elixir. - - [graphql-elixir](https://github.com/graphql-elixir/graphql): An Elixir implementation of Facebook's GraphQL. - -### Erlang - - - [graphql-erlang](https://github.com/shopgun/graphql-erlang): GraphQL implementation in Erlang. - -### Go - - - [graphql-go](https://github.com/graphql-go/graphql): An implementation of GraphQL for Go / Golang. - - [graph-gophers/graphql-go](https://github.com/graph-gophers/graphql-go): An active implementation of GraphQL in Golang (was https://github.com/neelance/graphql-go). - - [GQLGen](https://github.com/99designs/gqlgen) - Go generate based graphql server library. - - [graphql-relay-go](https://github.com/graphql-go/relay): A Go/Golang library to help construct a graphql-go server supporting react-relay. - - [machinebox/graphql](https://github.com/machinebox/graphql): An elegant low-level HTTP client for GraphQL. - - [samsarahq/thunder](https://github.com/samsarahq/thunder): A GraphQL implementation with easy schema building, live queries, and batching. - -### Groovy - -#### [gorm-graphql](https://github.com/grails/gorm-graphql/) - -**Core Library** - The GORM GraphQL library provides functionality to generate a GraphQL schema based on your GORM entities. In addition to mapping domain classes to a GraphQL schema, the core library also provides default implementations of "data fetchers" to query, update, and delete data through executions of the schema. - -**Grails Plugin** - In a addition to the Core Library, the GORM GraphQL Grails Plugin: - -- Provides a controller to receive and respond to GraphQL requests through HTTP, based on their guidelines. -- Generates the schema at startup with spring bean configuration to make it easy to extend. -- Includes a [GraphiQL](https://github.com/graphql/graphiql) browser enabled by default in development. The browser is accessible at /graphql/browser. -- Overrides the default data binder to use the data binding provided by Grails -- Provides a [trait](https://grails.github.io/gorm-graphql/latest/api/org/grails/gorm/graphql/plugin/testing/GraphQLSpec.html) to make integration testing of your GraphQL endpoints easier - -See [the documentation](https://grails.github.io/gorm-graphql/latest/guide/index.html) for more information. - -#### [GQL](https://grooviter.github.io/gql/) - -GQL is a Groovy library for GraphQL - -### Java - -#### [graphql-java](https://github.com/graphql-java/graphql-java) - -A Java library for building GraphQL APIs. - -Code that executes a hello world GraphQL query with \`graphql-java\`: - -\`\`\`java -import graphql.ExecutionResult; -import graphql.GraphQL; -import graphql.schema.GraphQLSchema; -import graphql.schema.StaticDataFetcher; -import graphql.schema.idl.RuntimeWiring; -import graphql.schema.idl.SchemaGenerator; -import graphql.schema.idl.SchemaParser; -import graphql.schema.idl.TypeDefinitionRegistry; - -import static graphql.schema.idl.RuntimeWiring.newRuntimeWiring; - -public class HelloWorld { - - public static void main(String[] args) { - String schema = "type Query{hello: String} schema{query: Query}"; - - SchemaParser schemaParser = new SchemaParser(); - TypeDefinitionRegistry typeDefinitionRegistry = schemaParser.parse(schema); - - RuntimeWiring runtimeWiring = newRuntimeWiring() - .type("Query", builder -> builder.dataFetcher("hello", new StaticDataFetcher("world"))) - .build(); - - SchemaGenerator schemaGenerator = new SchemaGenerator(); - GraphQLSchema graphQLSchema = schemaGenerator.makeExecutableSchema(typeDefinitionRegistry, runtimeWiring); - - GraphQL build = GraphQL.newGraphQL(graphQLSchema).build(); - ExecutionResult executionResult = build.execute("{hello}"); - - System.out.println(executionResult.getData().toString()); - // Prints: {hello=world} - } -} -\`\`\` - -See [the graphql-java docs](https://github.com/graphql-java/graphql-java) for more information on setup. - -### JavaScript - -#### [GraphQL.js](/graphql-js/) ([github](https://github.com/graphql/graphql-js/)) ([npm](https://www.npmjs.com/package/graphql)) - -The reference implementation of the GraphQL specification, designed for running GraphQL in a Node.js environment. - -To run a \`GraphQL.js\` hello world script from the command line: - -\`\`\`bash -npm install graphql -\`\`\` - -Then run \`node hello.js\` with this code in \`hello.js\`: - -\`\`\`js -var { graphql, buildSchema } = require('graphql'); - -var schema = buildSchema(\` - type Query { - hello: String - } -\`); - -var root = { hello: () => 'Hello world!' }; - -graphql(schema, '{ hello }', root).then((response) => { - console.log(response); -}); -\`\`\` - -#### [express-graphql](/graphql-js/running-an-express-graphql-server/) ([github](https://github.com/graphql/express-graphql)) ([npm](https://www.npmjs.com/package/express-graphql)) - -The reference implementation of a GraphQL API server over an Express webserver. You can use this to run GraphQL in conjunction with a regular Express webserver, or as a standalone GraphQL server. - -To run an \`express-graphql\` hello world server: - -\`\`\`bash -npm install express express-graphql graphql -\`\`\` - -Then run \`node server.js\` with this code in \`server.js\`: - -\`\`\`js -var express = require('express'); -var graphqlHTTP = require('express-graphql'); -var { buildSchema } = require('graphql'); - -var schema = buildSchema(\` - type Query { - hello: String - } -\`); - -var root = { hello: () => 'Hello world!' }; - -var app = express(); -app.use('/graphql', graphqlHTTP({ - schema: schema, - rootValue: root, - graphiql: true, -})); -app.listen(4000, () => console.log('Now browse to localhost:4000/graphql')); -\`\`\` - -#### [apollo-server](https://www.apollographql.com/docs/apollo-server/) ([github](https://github.com/apollographql/apollo-server)) ([npm](https://www.npmjs.com/package/apollo-server-express)) - -A set of GraphQL server packages from Apollo that work with various Node.js HTTP frameworks (Express, Connect, Hapi, Koa etc). - -To run a hello world server with apollo-server-express: - -\`\`\`bash -npm install apollo-server-express body-parser express graphql graphql-tools -\`\`\` - -Then run \`node server.js\` with this code in \`server.js\`: - -\`\`\`js -var express = require('express'); -var bodyParser = require('body-parser'); -var { graphqlExpress, graphiqlExpress } = require('apollo-server-express'); -var { makeExecutableSchema } = require('graphql-tools'); - -var typeDefs = [\` -type Query { - hello: String -} - -schema { - query: Query -}\`]; - -var resolvers = { - Query: { - hello(root) { - return 'world'; - } - } -}; - -var schema = makeExecutableSchema({typeDefs, resolvers}); -var app = express(); -app.use('/graphql', bodyParser.json(), graphqlExpress({schema})); -app.use('/graphiql', graphiqlExpress({endpointURL: '/graphql'})); -app.listen(4000, () => console.log('Now browse to localhost:4000/graphiql')); -\`\`\` - -Apollo Server also supports all Node.js HTTP server frameworks: Express, Connect, HAPI and Koa. - -### PHP - - - [graphql-php](https://github.com/webonyx/graphql-php): A PHP port of GraphQL reference implementation - - [graphql-relay-php](https://github.com/ivome/graphql-relay-php): A library to help construct a graphql-php server supporting react-relay. - -#### [Siler](https://siler.leocavalcante.com/graphql/) ([github](https://github.com/leocavalcante/siler)) - -Siler is a PHP library powered with high-level abstractions to work with GraphQL. - -To run a Siler hello world script: - -\`\`\`graphql -type Query { - hello: String -} -\`\`\` - -\`\`\`php - [ - 'hello' => 'world', - ], -]; -$schema = Graphql\schema($typeDefs, $resolvers); - -echo "Server running at http://127.0.0.1:8080"; - -Http\server(Graphql\psr7($schema), function (\Throwable $err) { - var_dump($err); - return Diactoros\json([ - 'error' => true, - 'message' => $err->getMessage(), - ]); -})()->run(); -\`\`\` - -It also provides functionality for the construction of a WebSocket Subscriptions Server based on how Apollo works. - -### Python - -#### [Graphene](http://graphene-python.org/) ([github](https://github.com/graphql-python/graphene)) - -A Python library for building GraphQL APIs. - -To run a Graphene hello world script: - -\`\`\`bash -pip install graphene -\`\`\` - -Then run \`python hello.py\` with this code in \`hello.py\`: - -\`\`\`python -import graphene - -class Query(graphene.ObjectType): - hello = graphene.String(name=graphene.String(default_value="World")) - - def resolve_hello(self, info, name): - return 'Hello ' + name - -schema = graphene.Schema(query=Query) -result = schema.execute('{ hello }') -print(result.data['hello']) # "Hello World" -\`\`\` - -There are also nice bindings for [Relay](https://facebook.github.io/relay/), Django, SQLAlchemy, and Google App Engine. - -### Ruby - -#### [graphql-ruby](https://github.com/rmosolgo/graphql-ruby) - -A Ruby library for building GraphQL APIs. - -To run a hello world script with \`graphql-ruby\`: - -\`\`\`bash -gem install graphql -\`\`\` - -Then run \`ruby hello.rb\` with this code in \`hello.rb\`: - -\`\`\`ruby -require 'graphql' - -QueryType = GraphQL::ObjectType.define do - name 'Query' - field :hello do - type types.String - resolve -> (obj, args, ctx) { 'Hello world!' } - end -end - -Schema = GraphQL::Schema.define do - query QueryType -end - -puts Schema.execute('{ hello }').to_json -\`\`\` - -There are also nice bindings for Relay and Rails. - -### Scala - -#### [Sangria](http://sangria-graphql.org/) ([github](https://github.com/sangria-graphql/sangria)): A Scala GraphQL library that supports [Relay](https://facebook.github.io/relay/). - -An example of a hello world GraphQL schema and query with \`sangria\`: - -\`\`\`scala -import sangria.schema._ -import sangria.execution._ -import sangria.macros._ - -val QueryType = ObjectType("Query", fields[Unit, Unit]( - Field("hello", StringType, resolve = _ ⇒ "Hello world!") -)) - -val schema = Schema(QueryType) - -val query = graphql"{ hello }" - -Executor.execute(schema, query) map println -\`\`\` - -## GraphQL Clients - -- [C# / .NET](#c-net-1) -- [Clojurescript](#clojurescript-1) -- [Go](#go-1) -- [Java / Android](#java-android) -- [JavaScript](#javascript-1) -- [Swift / Objective-C iOS](#swift-objective-c-ios) -- [Python](#python-1) - -### C# / .NET - - - [GraphQL.Client](https://github.com/graphql-dotnet/graphql-client): A GraphQL Client for .NET. - - [graphql-net-client](https://github.com/bkniffler/graphql-net-client): Basic example GraphQL client for .NET. - - [SAHB.GraphQLClient](https://github.com/sahb1239/SAHB.GraphQLClient): GraphQL client which supports generating queries from C# classes - -### Clojurescript - - - [re-graph](https://github.com/oliyh/re-graph/): A GraphQL client implemented in Clojurescript with support for websockets. - -### Go - - - [graphql](https://github.com/shurcooL/graphql#readme): A GraphQL client implementation in Go. - -### Java / Android - - - [Apollo Android](https://github.com/apollographql/apollo-android): A strongly-typed, caching GraphQL client for Android, written in Java. - - - [Nodes](https://github.com/americanexpress/nodes): A GraphQL JVM Client designed for constructing queries from standard model definitions. By American Express. - -### JavaScript - - - [Relay](https://facebook.github.io/relay/) ([github](https://github.com/facebook/relay)) ([npm](https://www.npmjs.com/package/react-relay)): Facebook's framework for building React applications that talk to a GraphQL backend. - - [Apollo Client](http://apollographql.com/client/) ([github](https://github.com/apollographql/apollo-client)): A powerful JavaScript GraphQL client, designed to work well with React, React Native, Angular 2, or just plain JavaScript. - - [graphql-request](https://github.com/graphcool/graphql-request): A simple and flexible JavaScript GraphQL client that works in all JavaScript environments (the browser, Node.js, and React Native) - basically a lightweight wrapper around \`fetch\`. - - [Lokka](https://github.com/kadirahq/lokka): A simple JavaScript GraphQL client that works in all JavaScript environments (the browser, Node.js, and React Native). - - [nanogql](https://github.com/yoshuawuyts/nanogql): Tiny GraphQL client library using template strings. - - [gq-loader](https://github.com/Houfeng/gq-loader): A simple JavaScript GraphQL client,Let the *.gql file be used as a module through webpack loader. - - [AWS Amplify](https://aws.github.io/aws-amplify): A JavaScript library for application development using cloud services, which supports GraphQL backend and React components for working with GraphQL data. - - [Grafoo](https://github.com/grafoojs/grafoo): An all purpose GraphQL client with view layer integrations for multiple frameworks in just 1.6kb. - -### Swift / Objective-C iOS - - - [Apollo iOS](https://www.apollographql.com/docs/ios/) ([github](https://github.com/apollographql/apollo-ios)): A GraphQL client for iOS that returns results as query-specific Swift types, and integrates with Xcode to show your Swift source and GraphQL side by side, with inline validation errors. - - [GraphQL iOS](https://github.com/funcompany/graphql-ios): An Objective-C GraphQL client for iOS. - -### Python - - - [GQL](https://github.com/graphql-python/gql): A GraphQL client in Python. - - [python-graphql-client](https://github.com/graphcool/python-graphql-client): Simple GraphQL client for Python 2.7+. - - [sgqlc](https://github.com/profusion/sgqlc): A simple Python GraphQL client. Supports generating code generation for types defined in a GraphQL schema. - -## Tools - - - [graphiql](https://github.com/graphql/graphiql) ([npm](https://www.npmjs.com/package/graphiql)): An interactive in-browser GraphQL IDE. - - [libgraphqlparser](https://github.com/graphql/libgraphqlparser): A GraphQL query language parser in C++ with C and C++ APIs. - - [Graphql Language Service](https://github.com/graphql/graphql-language-service): An interface for building GraphQL language services for IDEs (diagnostics, autocomplete etc). - - [quicktype](https://quicktype.io) ([github](https://github.com/quicktype/quicktype)): Generate types for GraphQL queries in TypeScript, Swift, golang, C#, C++, and more. - -## Services - - - [Apollo Engine](http://www.apollographql.com/engine/): A service for monitoring the performance and usage of your GraphQL backend. - - [GraphCMS](https://graphcms.com/): A BaaS (Backend as a Service) that sets you up with a GraphQL backend as well as tools for content editors to work with the stored data. - - [Graphcool](https://www.graph.cool) ([github](https://github.com/graphcool)): A BaaS (Backend as a Service) providing a GraphQL backend for your applications with a powerful web ui for managing your database and stored data. - - [Reindex](https://www.reindex.io/baas/) ([github](https://github.com/reindexio/reindex-js)): A BaaS (Backend as a Service) that sets you up with a GraphQL backend targeted at applications using React and Relay. - - [Scaphold](https://scaphold.io) ([github](https://github.com/scaphold-io)): A BaaS (Backend as a Service) that sets you up with a GraphQL backend for your applications with many different integrations. - - [Tipe](https://tipe.io) ([github](https://github.com/tipeio)): A SaaS (Software as a Service) content management system that allows you to create your content with powerful editing tools and access it from anywhere with a GraphQL or REST API. - - [AWS AppSync](https://aws.amazon.com/appsync/): Fully managed GraphQL service with realtime subscriptions, offline programming & synchronization, and enterprise security features as well as fine grained authorization controls. - - [Hasura](https://hasura.io): A BaaS (Backend as a Service) that lets you create tables, define permissions on Postgres and query and manipulate using a GraphQL interface. - -## More Stuff - - - [awesome-graphql](https://github.com/chentsulin/awesome-graphql): A fantastic community maintained collection of libraries, resources, and more. - - `} - -
    -
    -
    - -
    diff --git a/site/codeofconduct/CodeOfConduct.md b/site/codeofconduct/CodeOfConduct.md deleted file mode 100644 index 7054cdbe10..0000000000 --- a/site/codeofconduct/CodeOfConduct.md +++ /dev/null @@ -1,50 +0,0 @@ ---- -title: Code of Conduct -layout: ../_core/DocsLayout -category: Code Of Conduct -permalink: /codeofconduct/ ---- - -# GraphQL Code of Conduct v1.0 - -## Our Pledge - -In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation. - -## Our Standards - -Examples of behavior that contributes to creating a positive environment include: - -* Using welcoming and inclusive language -* Being respectful of differing viewpoints and experiences -* Gracefully accepting constructive criticism -* Focusing on what is best for the community -* Showing empathy towards other community members - -Examples of unacceptable behavior by participants include: - -* The use of sexualized language or imagery and unwelcome sexual attention or advances -* Trolling, insulting/derogatory comments, and personal or political attacks -* Public or private harassment -* Publishing others’ private information, such as a physical or electronic address, without explicit permission -* Other conduct which could reasonably be considered inappropriate in a professional setting - -## Our Responsibilities - -GraphQL Specification members, project participants and contributors (collectively, "participants") are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. - -The steering committee of the GraphQL Specification has the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any participant for other behaviors that they deem inappropriate, threatening, offensive, or harmful. - -All participants have determined that The Linux Foundation is the most optimal organization to shepherd the development of this project. Participants acknowledge and agree to The Linux Foundation's exclusive right to use "GraphQL" and any other names and trademarks associated with the GraphQL open source project and GraphQL Specification and to authorize others’ use of the marks, establish guidelines for such use, and to delegate these responsibilities. Participants agree not to take any action inconsistent with such rights and to cooperate in any action which The Linux Foundation deems necessary or desirable to prevent confusion or establish or preserve these rights. Participants will not independently adopt, use, or attempt to register any trademarks or trade names that are confusingly similar to these names. - -## Scope - -This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. - -## Enforcement - -Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the Executive Director, or, if the complaint involves the Executive Director, a member of the steering committee. All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. Participants who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by the steering committee. - -## Attribution - -This Code of Conduct is adapted from the Contributor Covenant, version 1.4, available at [https://www.contributor-covenant.org/version/1/4/code-of-conduct.html](https://www.contributor-covenant.org/version/1/4/code-of-conduct.html). For answers to common questions about this code of conduct, see [https://www.contributor-covenant.org/faq](https://www.contributor-covenant.org/faq) diff --git a/site/community/Community-Events.md b/site/community/Community-Events.md deleted file mode 100644 index f9311f3881..0000000000 --- a/site/community/Community-Events.md +++ /dev/null @@ -1,75 +0,0 @@ ---- -title: Upcoming Events -layout: ../_core/DocsLayout -category: Community -permalink: /community/upcoming-events/ -sublinks: Upcoming Events,Meetups ---- - -## Upcoming Events - -### GraphQL Conf Berlin - -- **Date:** June 20-21, 2019 -- **Location:** Berlin, Germany -- **Link:** https://www.graphqlconf.org/ - -GraphQL Conf Berlin is the world's biggest GraphQL community conference. It's a non-profit conference with speakers from all around the world. Learn about GraphQL best practices from industry experts and become part of the thriving GraphQL community. - -### GraphQL Summit - -- **Date:** October 29-31, 2019 -- **Location:** San Francisco, USA -- **Link:** https://www.graphqlconf.org/ - -GraphQL conference organized by Apollo. - -## Meetups - -### North America - -- [GraphQL San Francisco](http://www.meetup.com/GraphQL-SF/) -- [GraphQL & Relay (San Francisco)](http://www.meetup.com/graphql/) -- [GraphQL Seattle](https://www.meetup.com/Seattle-GraphQL-Meetup/) -- [GraphQL Toronto](https://www.meetup.com/GraphQL-Toronto/) -- [GraphQL NYC](https://www.meetup.com/GraphQL-NYC/) -- [GraphQL Atlanta](https://www.meetup.com/GraphQL-Atlanta/) -- [GraphQL Austin](https://www.meetup.com/ATX-GraphQL/) -- [GraphQL Los Angeles](https://www.meetup.com/Los-Angeles-GraphQL-Meetup/) -- [GraphQL Dallas-Fort Worth](https://www.meetup.com/DFW-GraphQL-Meetup/) -- [GraphQL Ottawa](https://www.meetup.com/GraphQL-Ottawa/) -- [GraphQL Columbus](https://www.meetup.com/GraphQL-Columbus/) -- [GraphQL Vancouver](https://www.meetup.com/GraphQL-Vancouver/) -- [GraphQL Minneapolis](https://www.meetup.com/GraphQL-MN/) -- [GraphQL Denver](https://www.meetup.com/graphql-denver) -- [GraphQL By the Bay (San Francisco)](https://www.meetup.com/graphql-by-the-bay/) - -### South America - -- [GraphQL São Paulo](https://www.meetup.com/Apollo-GraphQL/) -- [GraphQL Buenos Aires](https://www.meetup.com/GraphQL-BA/) - -### Europe - -- [GraphQL Amsterdam](https://www.meetup.com/Amsterdam-GraphQL-Meetup/) -- [GraphQL Berlin](https://www.meetup.com/graphql-berlin/) -- [GraphQL London](https://www.meetup.com/GraphQL-London) -- [GraphQL Paris](https://www.meetup.com/GraphQL-Paris/) -- [GraphQL Munich](https://www.meetup.com/GraphQL-Munich/) -- [GraphQL Barcelona](https://www.meetup.com/GraphQL-Barcelona/) -- [GraphQL Stockholm](https://www.meetup.com/GraphQL-Stockholm/) -- [GraphQL Budapest](https://www.meetup.com/Budapest-GraphQL/) -- [GraphQL Lisbon](https://www.meetup.com/GraphQL-Lisbon/) -- [GraphQL Vienna](https://www.meetup.com/GraphQL-Vienna/) - -### Australia - -- [GraphQL Melbourne](http://graphql.melbourne/) -- [GraphQL Sydney](https://graphql.sydney/) - -### Asia - -- [GraphQL Tel Aviv](https://www.meetup.com/GraphQL-TLV/) -- [GraphQL Tokyo](https://www.meetup.com/GraphQL-Tokyo/) -- [GraphQL Meetup (Bangalore)](https://www.meetup.com/GraphQL-Meetup/) -- [GraphQL Meetup (Bangkok)](https://www.meetup.com/GraphQL-Bangkok/) diff --git a/site/community/Community-Resources.md b/site/community/Community-Resources.md deleted file mode 100644 index c3803e945d..0000000000 --- a/site/community/Community-Resources.md +++ /dev/null @@ -1,126 +0,0 @@ ---- -title: Community Resources -layout: ../_core/DocsLayout -category: Community -permalink: /community/ -next: /community/upcoming-events/ -sublinks: Blogs,Videos ---- - -## Stack Overflow - -Many members of the community use Stack Overflow to ask and answer questions. [Read through the existing questions tagged with **graphql** or ask your own!](http://stackoverflow.com/questions/tagged/graphql) - -## Facebook Group - -Join the [GraphQL Facebook Group](https://www.facebook.com/groups/graphql.community/) sharing and discovering new content. The GraphQL Facebook group is the preferred venue for announcements and broader discussion. - -## Twitter - -Use the [**#graphql** hashtag](https://twitter.com/search?q=%23GraphQL&src=tyah) on Twitter to join the conversation. - -Here are some helpful accounts to follow: -- [@GraphQL](https://twitter.com/GraphQL) -- [@graphqlweekly](https://twitter.com/graphqlweekly) -- [@GraphQLStackOverflow](https://twitter.com/GraphQLatSO) -- [@apollographql](https://twitter.com/apollographql) -- [@graphcool](https://twitter.com/graphcool) -- [@ScapholdDotIO](https://twitter.com/ScapholdDotIO) - -## IRC - -Chat with GraphQL developers on IRC at the [freenode](https://freenode.net/) server on the #graphql channel. - -## Slack & Discord - -Many GraphQL developers idle in Discord and Slack chatrooms for live -communication and quick questions. - -Join #graphql on the [ReactiFlux Discord](http://join.reactiflux.com/). - -### Slack Communities: - -- [**#general** on GraphQL](https://graphql.slack.com/messages/general/). [Get your invite here!](https://graphql-slack.herokuapp.com/) -- [Apollo Slack](http://apollostack.com/#slack) -- [Reindex Slack](http://slack.reindex.io/) -- [Graphcool Slack](https://slack.graph.cool/) -- [Scaphold.io Slack](http://slack.scaphold.io/) - -## Blogs - -Here are a list of notable blog posts to help you better understand GraphQL: - -- [GraphQL: A data query language](/blog/graphql-a-query-language/) - Lee Byron -- [Subscriptions in GraphQL and Relay](/blog/subscriptions-in-graphql-and-relay/) - Dan Schafer and Laney Kuenzel -- [Mocking your server is easy with GraphQL](/blog/mocking-with-graphql/) - Jonas Helfer -- [Wrapping a REST API in GraphQL](/blog/rest-api-graphql-wrapper/) - Steven Luscher -- [Leaving technical preview](/blog/production-ready/) - Lee Byron -- [Relicensing the GraphQL specification](https://medium.com/@leeb/relicensing-the-graphql-specification-e7d07a52301b) - Lee Byron -- [GraphQL Introduction](https://facebook.github.io/react/blog/2015/05/01/graphql-introduction.html) - Nick Schrock -- [From REST to GraphQL](https://0x2a.sh/from-rest-to-graphql-b4e95e94c26b#.tag7nzkrb) - Jacob Gillespie -- [GraphQL Explained](https://medium.com/apollo-stack/graphql-explained-5844742f195e#.zdykxos6i) - Jonas Helfer -- [GraphQL Concepts Visualized](https://medium.com/apollo-stack/the-concepts-of-graphql-bc68bd819be3#.hfczgtdsj) - Dhaivat Pandya -- [Building the f8 App: Using GraphQL & Relay](http://makeitopen.com/docs/en/1-A2-relay.html) -- [Your First GraphQL Server](https://medium.com/the-graphqlhub/your-first-graphql-server-3c766ab4f0a2#.ovn0y19k4) - Clay Allsopp -- [Tutorial: Kick start a JS API with Apollo-server, Dataloader and Knex](https://bamtech.gitbook.io/dev-standards/backend/graphql-js/getting-started-with-apollo-server-dataloader-knex.mo) - Thomas Pucci -- [Tutorial: How to Build a GraphQL Server](https://medium.com/apollo-stack/tutorial-building-a-graphql-server-cddaa023c035#.bu6sdnst4) - Jonas Helfer -- [Designing Powerful APIs with GraphQL Query Parameters](https://www.graph.cool/docs/tutorials/designing-powerful-apis-with-graphql-query-parameters-aing7uech3/) - Johannes Schickling -- [GraphQL and the amazing Apollo Client](https://medium.com/google-developer-experts/graphql-and-the-amazing-apollo-client-fe57e162a70c) - Gerard Sans -- [GraphQL Server Basics (Part I): The Schema](https://blog.graph.cool/graphql-server-basics-the-schema-ac5e2950214e) - Nikolas Burk -- [GraphQL Server Basics (Part II): The Network Layer](https://blog.graph.cool/graphql-server-basics-the-network-layer-51d97d21861) - Nikolas Burk -- [GraphQL Server Basics (Part III): Demystifying the `info` argument in GraphQL resolvers](https://blog.graph.cool/graphql-server-basics-demystifying-the-info-argument-in-graphql-resolvers-6f26249f613a) - Nikolas Burk - -## Videos - -Developers inside and outside of Facebook have given talks about GraphQL at conferences and meetups around the world. Here are some of our favorites: - -- [Exploring GraphQL](https://www.youtube.com/watch?v=WQLzZf34FJ8) - Lee Byron, React Europe 2015 -- [From Zero to GraphQL in 30 Minutes](https://www.youtube.com/watch?v=UBGzsb2UkeY) - Steve Luscher -- [Exploring GraphQL](https://www.youtube.com/watch?v=_9RgHXqH8J0) - Nick Schrock, @Scale 2015 -- [GraphQL Servers](https://www.youtube.com/watch?v=KOudxKJXsjc) - Nick Schrock, React Rally 2015 -- [GraphQL at Facebook](https://www.youtube.com/watch?v=etax3aEe2dA) - Dan Schafer, React Europe 2016 -- [GraphQL Source Code Overview](https://www.youtube.com/watch?v=IqtYr6RX32Q) - Lee Byron -- [GraphQL Future](https://www.youtube.com/watch?v=ViXL0YQnioU) - Lee Byron & Laney Kuenzel -- [Apollo Client: Put GraphQL Data in Your UI](https://www.youtube.com/watch?v=u1E0CbGeICo) - Sashko Stubailo -- [Relay 2 - simpler, faster, and more predictable](https://www.youtube.com/watch?v=OEfUBN9dAI8) - Greg Hurrell -- [Build a GraphQL server for Node.js, using PostgreSQL/MySQL](https://www.youtube.com/watch?v=DNPVqK_woRQ) - Lee Benson -- [A GraphQL Framework for Non-JS Servers](https://www.youtube.com/watch?v=RNoyPSrQyPs) - Syrus Akbary -- [Modernize Your Angular App with GraphQL](https://www.youtube.com/watch?v=E8feZBidZcs) - Uri Goldshtein, AngularCamp 2016 -- [GraphQL server tutorial for Node.js with SQL, MongoDB and REST ](https://www.youtube.com/watch?v=PHabPhgRUuU) - Jonas Helfer -- [Building Native Mobile Apps with GraphQL](https://www.youtube.com/watch?v=z5rz3saDPJ8) - Martjin Walraven, React Europe 2016 -- [GraphQL in native applications](https://atscaleconference.com/videos/graphql-in-native-applications-at-scale/) - Igor Canadi & Alex Langenfeld, @Scale 2016 -- [Build a GraphQL Backend with the Serverless Framework](https://acloud.guru/learn/serverless-with-graphql) - Ryan Brown -- [Build a Full GraphQL Backend in Under 5 Minutes](https://www.youtube.com/watch?v=bJ8pnYd6jPQ) - Michael Paris -- [GraphQL: From Zero to Scala](https://www.youtube.com/watch?v=6ttypoLyRaU) - Jérémie Astori, Northeast Scala Symposium 2017 -- [GraphQL in Production: Backend as a Service](https://www.youtube.com/watch?v=U2NKoStGBvE) - Michael Paris & Vince Ning, GraphQL in Production Meetup SF August 2016 -- [Development of real-time apps with GraphQL Node.js](https://youtu.be/yh_A6CEqsSM) - Vince Ning & Michael Paris, SF Node Meetup February 2017 -- [Unleashing the power of GraphQL using Angular 2](https://www.youtube.com/watch?v=VYpJ9pfugM8) - Gerard Sans, NG-BE 2016 -- [Webinar Series: GraphQL Around The World](https://graphql-world.com/webinar) - Vince Ning & Michael Paris -- [All Talks from GraphQL Europe](https://www.youtube.com/playlist?list=PLn2e1F9Rfr6n_WFm9fPE-_wYPrYvSTySt) - Lee Byron, Sashko Stubailo, Dan Schafer, Johannes Schickling and many more -- [Learning GraphQL with React and Relay](https://www.packtpub.com/application-development/learning-graphql-react-and-relay-video) by Divyendu Singh -- [Hands-on GraphQL for Better RESTful Web Services (Video)](https://www.packtpub.com/application-development/hands-graphql-better-restful-web-services-video) by Ashwin Hegde - -## Books - -- [The GraphQL Guide](https://graphql.guide) by John Resig and Loren Sands-Ramshaw -- [Learning GraphQL](https://www.amazon.com/Learning-GraphQL-Declarative-Fetching-Modern/dp/1492030716/) by Eve Porcello and Alex Banks -- [Fullstack GraphQL](https://www.graphql.college/fullstack-graphql) by Julian Mayorga -- [Craft GraphQL APIs in Elixir with Absinthe](https://pragprog.com/book/wwgraphql/craft-graphql-apis-in-elixir-with-absinthe) by Bruce Williams and Ben Wilson -- [Learning GraphQL and Relay](https://www.packtpub.com/web-development/learning-graphql-and-relay) by Samer Buna - -## More Resources - -To explore other community-developed resources and content about GraphQL, take a look at these sites: - -- [How to GraphQL](https://www.howtographql.com): The Fullstack Tutorial for GraphQL -- [Building Apollo](https://dev-blog.apollodata.com/) -- [Learn GraphQL](https://learngraphql.com/basics/introduction) -- [awesome-graphql](https://github.com/chentsulin/awesome-graphql): A fantastic community maintained collection of libraries, resources, and more. -- [graphql-apis](https://github.com/APIs-guru/graphql-apis): A collective list of public GraphQL APIs. -- [Graphcool Blog](https://www.graph.cool/blog/) -- [Learn Apollo](https://www.learnapollo.com/): A hands-on tutorial for Apollo GraphQL Client (for React, ReactNative, Exponent, Angular, Vue & iOS) -- [Learn Relay](https://www.learnrelay.org): A comprehensive introduction to Relay (includes video tutorials) -- [Scaphold Community](https://scaphold.io/community/): Resources to help you launch a production app with GraphQL -- [GraphQL World](https://graphql-world.com): Global community of GraphQL developers and events -- [GraphQL Talks](https://www.graph.cool/talks/): Find & Watch the best GraphQL Talks -- [Basically, Full-stack GraphQL](https://github.com/TejasQ/basically-fullstack-graphql): A code-based introduction to working with GraphQL on the client _and_ server in plain English diff --git a/site/docs/api-reference-errors/index.html.js b/site/docs/api-reference-errors/index.html.js deleted file mode 100644 index c988dde342..0000000000 --- a/site/docs/api-reference-errors/index.html.js +++ /dev/null @@ -1,3 +0,0 @@ -var React = require('react') -var Redirect = require('../../_core/Redirect') -export default () => diff --git a/site/docs/api-reference-execution/index.html.js b/site/docs/api-reference-execution/index.html.js deleted file mode 100644 index abb7be8ace..0000000000 --- a/site/docs/api-reference-execution/index.html.js +++ /dev/null @@ -1,3 +0,0 @@ -var React = require('react') -var Redirect = require('../../_core/Redirect') -export default () => diff --git a/site/docs/api-reference-express-graphql/index.html.js b/site/docs/api-reference-express-graphql/index.html.js deleted file mode 100644 index bd10b1b77d..0000000000 --- a/site/docs/api-reference-express-graphql/index.html.js +++ /dev/null @@ -1,3 +0,0 @@ -var React = require('react') -var Redirect = require('../../_core/Redirect') -export default () => diff --git a/site/docs/api-reference-graphql/index.html.js b/site/docs/api-reference-graphql/index.html.js deleted file mode 100644 index 64b26f362d..0000000000 --- a/site/docs/api-reference-graphql/index.html.js +++ /dev/null @@ -1,3 +0,0 @@ -var React = require('react') -var Redirect = require('../../_core/Redirect') -export default () => diff --git a/site/docs/api-reference-language/index.html.js b/site/docs/api-reference-language/index.html.js deleted file mode 100644 index cce334627a..0000000000 --- a/site/docs/api-reference-language/index.html.js +++ /dev/null @@ -1,3 +0,0 @@ -var React = require('react') -var Redirect = require('../../_core/Redirect') -export default () => diff --git a/site/docs/api-reference-type-system/index.html.js b/site/docs/api-reference-type-system/index.html.js deleted file mode 100644 index 446ce7e7b7..0000000000 --- a/site/docs/api-reference-type-system/index.html.js +++ /dev/null @@ -1,3 +0,0 @@ -var React = require('react') -var Redirect = require('../../_core/Redirect') -export default () => diff --git a/site/docs/api-reference-type-utilities/index.html.js b/site/docs/api-reference-type-utilities/index.html.js deleted file mode 100644 index e03905bb53..0000000000 --- a/site/docs/api-reference-type-utilities/index.html.js +++ /dev/null @@ -1,3 +0,0 @@ -var React = require('react') -var Redirect = require('../../_core/Redirect') -export default () => diff --git a/site/docs/api-reference-type-validation/index.html.js b/site/docs/api-reference-type-validation/index.html.js deleted file mode 100644 index f73c0aeac4..0000000000 --- a/site/docs/api-reference-type-validation/index.html.js +++ /dev/null @@ -1,3 +0,0 @@ -var React = require('react') -var Redirect = require('../../_core/Redirect') -export default () => diff --git a/site/docs/getting-started/index.html.js b/site/docs/getting-started/index.html.js deleted file mode 100644 index d0259867c0..0000000000 --- a/site/docs/getting-started/index.html.js +++ /dev/null @@ -1,3 +0,0 @@ -var React = require('react') -var Redirect = require('../../_core/Redirect') -export default () => diff --git a/site/docs/intro/index.html.js b/site/docs/intro/index.html.js deleted file mode 100644 index d0259867c0..0000000000 --- a/site/docs/intro/index.html.js +++ /dev/null @@ -1,3 +0,0 @@ -var React = require('react') -var Redirect = require('../../_core/Redirect') -export default () => diff --git a/site/docs/introspection/index.html.js b/site/docs/introspection/index.html.js deleted file mode 100644 index b623a521c3..0000000000 --- a/site/docs/introspection/index.html.js +++ /dev/null @@ -1,3 +0,0 @@ -var React = require('react') -var Redirect = require('../../_core/Redirect') -export default () => diff --git a/site/docs/queries/index.html.js b/site/docs/queries/index.html.js deleted file mode 100644 index 660a925f15..0000000000 --- a/site/docs/queries/index.html.js +++ /dev/null @@ -1,3 +0,0 @@ -var React = require('react') -var Redirect = require('../../_core/Redirect') -export default () => diff --git a/site/docs/typesystem/index.html.js b/site/docs/typesystem/index.html.js deleted file mode 100644 index f03661c87d..0000000000 --- a/site/docs/typesystem/index.html.js +++ /dev/null @@ -1,3 +0,0 @@ -var React = require('react') -var Redirect = require('../../_core/Redirect') -export default () => diff --git a/site/docs/validation/index.html.js b/site/docs/validation/index.html.js deleted file mode 100644 index b4099c46d0..0000000000 --- a/site/docs/validation/index.html.js +++ /dev/null @@ -1,3 +0,0 @@ -var React = require('react') -var Redirect = require('../../_core/Redirect') -export default () => diff --git a/site/docs/videos/index.html.js b/site/docs/videos/index.html.js deleted file mode 100644 index 08473f1aef..0000000000 --- a/site/docs/videos/index.html.js +++ /dev/null @@ -1,3 +0,0 @@ -var React = require('react') -var Redirect = require('../../_core/Redirect') -export default () => diff --git a/site/favicon.ico b/site/favicon.ico deleted file mode 100644 index 89bd152f32..0000000000 Binary files a/site/favicon.ico and /dev/null differ diff --git a/site/google437284cc1356bc93.html.txt b/site/google437284cc1356bc93.html.txt deleted file mode 100644 index 7dd820dfc4..0000000000 --- a/site/google437284cc1356bc93.html.txt +++ /dev/null @@ -1 +0,0 @@ -google-site-verification: google437284cc1356bc93.html \ No newline at end of file diff --git a/site/graphql-js/APIReference-Errors.md b/site/graphql-js/APIReference-Errors.md deleted file mode 100644 index eccd0934ce..0000000000 --- a/site/graphql-js/APIReference-Errors.md +++ /dev/null @@ -1,109 +0,0 @@ ---- -title: graphql/error -layout: ../_core/GraphQLJSLayout -category: API Reference -permalink: /graphql-js/error/ -sublinks: formatError,GraphQLError,locatedError,syntaxError -next: /graphql-js/execution/ ---- - -The `graphql/error` module is responsible for creating and formatting -GraphQL errors. You can import either from the `graphql/error` module, or from the root `graphql` module. For example: - -```js -import { GraphQLError } from 'graphql'; // ES6 -var { GraphQLError } = require('graphql'); // CommonJS -``` - -## Overview - - - -## Errors - -### GraphQLError - -```js -class GraphQLError extends Error { - constructor( - message: string, - nodes?: Array, - stack?: ?string, - source?: Source, - positions?: Array, - originalError?: ?Error, - extensions?: ?{ [key: string]: mixed } - ) -} -``` - -A representation of an error that occurred within GraphQL. Contains -information about where in the query the error occurred for debugging. Most -commonly constructed with `locatedError` below. - -### syntaxError - -```js -function syntaxError( - source: Source, - position: number, - description: string -): GraphQLError; -``` - -Produces a GraphQLError representing a syntax error, containing useful -descriptive information about the syntax error's position in the source. - -### locatedError - -```js -function locatedError(error: ?Error, nodes: Array): GraphQLError { -``` - -Given an arbitrary Error, presumably thrown while attempting to execute a -GraphQL operation, produce a new GraphQLError aware of the location in the -document responsible for the original Error. - -### formatError - -```js -function formatError(error: GraphQLError): GraphQLFormattedError - -type GraphQLFormattedError = { - message: string, - locations: ?Array -}; - -type GraphQLErrorLocation = { - line: number, - column: number -}; -``` - -Given a GraphQLError, format it according to the rules described by the -Response Format, Errors section of the GraphQL Specification. diff --git a/site/graphql-js/APIReference-Execution.md b/site/graphql-js/APIReference-Execution.md deleted file mode 100644 index 750c2889f8..0000000000 --- a/site/graphql-js/APIReference-Execution.md +++ /dev/null @@ -1,60 +0,0 @@ ---- -title: graphql/execution -layout: ../_core/GraphQLJSLayout -category: API Reference -permalink: /graphql-js/execution/ -sublinks: execute -next: /graphql-js/language/ ---- - -The `graphql/execution` module is responsible for the execution phase of -fulfilling a GraphQL request. You can import either from the `graphql/execution` module, or from the root `graphql` module. For example: - -```js -import { execute } from 'graphql'; // ES6 -var { execute } = require('graphql'); // CommonJS -``` - -## Overview - - - -## Execution - -### execute - -```js -export function execute( - schema: GraphQLSchema, - documentAST: Document, - rootValue?: mixed, - contextValue?: mixed, - variableValues?: ?{[key: string]: mixed}, - operationName?: ?string -): MaybePromise - -type MaybePromise = Promise | T; - -type ExecutionResult = { - data: ?Object; - errors?: Array; -} -``` - -Implements the "Evaluating requests" section of the GraphQL specification. - -Returns a Promise that will eventually be resolved and never rejected. - -If the arguments to this function do not result in a legal execution context, -a GraphQLError will be thrown immediately explaining the invalid input. - -`ExecutionResult` represents the result of execution. `data` is the result of -executing the query, `errors` is null if no errors occurred, and is a -non-empty array if an error occurred. diff --git a/site/graphql-js/APIReference-ExpressGraphQL.md b/site/graphql-js/APIReference-ExpressGraphQL.md deleted file mode 100644 index 65703b1b08..0000000000 --- a/site/graphql-js/APIReference-ExpressGraphQL.md +++ /dev/null @@ -1,35 +0,0 @@ ---- -title: express-graphql -layout: ../_core/GraphQLJSLayout -category: API Reference -permalink: /graphql-js/express-graphql/ -sublinks: graphqlHTTP -next: /graphql-js/graphql/ ---- - -The `express-graphql` module provides a simple way to create an [Express](https://expressjs.com/) server that runs a GraphQL API. - -```js -import graphqlHTTP from 'express-graphql'; // ES6 -var graphqlHTTP = require('express-graphql'); // CommonJS -``` - -### graphqlHTTP - -```js -graphqlHTTP({ - schema: GraphQLSchema, - graphiql?: ?boolean, - rootValue?: ?any, - context?: ?any, - pretty?: ?boolean, - formatError?: ?Function, - validationRules?: ?Array, -}): Middleware -``` - -Constructs an Express application based on a GraphQL schema. - -See the [express-graphql tutorial](/graphql-js/running-an-express-graphql-server/) for sample usage. - -See the [GitHub README](https://github.com/graphql/express-graphql) for more extensive documentation of the details of this method. diff --git a/site/graphql-js/APIReference-GraphQL.md b/site/graphql-js/APIReference-GraphQL.md deleted file mode 100644 index 3db7cdf841..0000000000 --- a/site/graphql-js/APIReference-GraphQL.md +++ /dev/null @@ -1,179 +0,0 @@ ---- -title: graphql -layout: ../_core/GraphQLJSLayout -category: API Reference -permalink: /graphql-js/graphql/ -sublinks: graphql -next: /graphql-js/error/ ---- - -The `graphql` module exports a core subset of GraphQL functionality for creation -of GraphQL type systems and servers. - -```js -import { graphql } from 'graphql'; // ES6 -var { graphql } = require('graphql'); // CommonJS -``` - -## Overview - -*Entry Point* - - - -*Schema* - - - -*Type Definitions* - - - -*Scalars* - - - -*Errors* - - - -## Entry Point - -### graphql - -```js -graphql( - schema: GraphQLSchema, - requestString: string, - rootValue?: ?any, - contextValue?: ?any, - variableValues?: ?{[key: string]: any}, - operationName?: ?string -): Promise -``` - -The `graphql` function lexes, parses, validates and executes a GraphQL request. -It requires a `schema` and a `requestString`. Optional arguments include a -`rootValue`, which will get passed as the root value to the executor, a `contextValue`, -which will get passed to all resolve functions, -`variableValues`, which will get passed to the executor to provide values for -any variables in `requestString`, and `operationName`, which allows the caller -to specify which operation in `requestString` will be run, in cases where -`requestString` contains multiple top-level operations. - -## Schema - -See the [Type System API Reference](../type#schema). - -## Type Definitions - -See the [Type System API Reference](../type#definitions). - -## Scalars - -See the [Type System API Reference](../type#scalars). - -## Errors - -See the [Errors API Reference](../error) diff --git a/site/graphql-js/APIReference-Language.md b/site/graphql-js/APIReference-Language.md deleted file mode 100644 index 340a1eab08..0000000000 --- a/site/graphql-js/APIReference-Language.md +++ /dev/null @@ -1,305 +0,0 @@ ---- -title: graphql/language -layout: ../_core/GraphQLJSLayout -category: API Reference -permalink: /graphql-js/language/ -sublinks: BREAK,getLocation,Kind,lex,parse,parseValue,printSource,visit -next: /graphql-js/type/ ---- - -The `graphql/language` module is responsible for parsing and operating on the GraphQL language. You can import either from the `graphql/language` module, or from the root `graphql` module. For example: - -```js -import { Source } from 'graphql'; // ES6 -var { Source } = require('graphql'); // CommonJS -``` - -## Overview - -*Source* - - - -*Lexer* - - - -*Parser* - - - -*Visitor* - - - -*Printer* - - - -## Source - -### Source - -```js -export class Source { - constructor(body: string, name?: string) -} -``` - -A representation of source input to GraphQL. The name is optional, -but is mostly useful for clients who store GraphQL documents in -source files; for example, if the GraphQL input is in a file Foo.graphql, -it might be useful for name to be "Foo.graphql". - -### getLocation - -```js -function getLocation(source: Source, position: number): SourceLocation - -type SourceLocation = { - line: number; - column: number; -} -``` - -Takes a Source and a UTF-8 character offset, and returns the corresponding -line and column as a SourceLocation. - -## Lexer - -### lex - -```js -function lex(source: Source): Lexer; - -type Lexer = (resetPosition?: number) => Token; - -export type Token = { - kind: number; - start: number; - end: number; - value: ?string; -}; -``` - -Given a Source object, this returns a Lexer for that source. -A Lexer is a function that acts like a generator in that every time -it is called, it returns the next token in the Source. Assuming the -source lexes, the final Token emitted by the lexer will be of kind -EOF, after which the lexer will repeatedly return EOF tokens whenever -called. - -The argument to the lexer function is optional, and can be used to -rewind or fast forward the lexer to a new position in the source. - -## Parser - -### parse - -```js -export function parse( - source: Source | string, - options?: ParseOptions -): Document -``` - -Given a GraphQL source, parses it into a Document. - -Throws GraphQLError if a syntax error is encountered. - -### parseValue - -```js -export function parseValue( - source: Source | string, - options?: ParseOptions -): Value -``` - -Given a string containing a GraphQL value, parse the AST for that value. - -Throws GraphQLError if a syntax error is encountered. - -This is useful within tools that operate upon GraphQL Values directly and -in isolation of complete GraphQL documents. - -### Kind - -An enum that describes the different kinds of AST nodes. - -## Visitor - -### visit - -```js -function visit(root, visitor, keyMap) -``` - -visit() will walk through an AST using a depth first traversal, calling -the visitor's enter function at each node in the traversal, and calling the -leave function after visiting that node and all of its child nodes. - -By returning different values from the enter and leave functions, the -behavior of the visitor can be altered, including skipping over a sub-tree of -the AST (by returning false), editing the AST by returning a value or null -to remove the value, or to stop the whole traversal by returning BREAK. - -When using visit() to edit an AST, the original AST will not be modified, and -a new version of the AST with the changes applied will be returned from the -visit function. - -```js -var editedAST = visit(ast, { - enter(node, key, parent, path, ancestors) { - // @return - // undefined: no action - // false: skip visiting this node - // visitor.BREAK: stop visiting altogether - // null: delete this node - // any value: replace this node with the returned value - }, - leave(node, key, parent, path, ancestors) { - // @return - // undefined: no action - // false: no action - // visitor.BREAK: stop visiting altogether - // null: delete this node - // any value: replace this node with the returned value - } -}); -``` - -Alternatively to providing enter() and leave() functions, a visitor can -instead provide functions named the same as the kinds of AST nodes, or -enter/leave visitors at a named key, leading to four permutations of -visitor API: - -1) Named visitors triggered when entering a node a specific kind. - -```js -visit(ast, { - Kind(node) { - // enter the "Kind" node - } -}) -``` - -2) Named visitors that trigger upon entering and leaving a node of - a specific kind. - -```js -visit(ast, { - Kind: { - enter(node) { - // enter the "Kind" node - } - leave(node) { - // leave the "Kind" node - } - } -}) -``` - -3) Generic visitors that trigger upon entering and leaving any node. - -```js -visit(ast, { - enter(node) { - // enter any node - }, - leave(node) { - // leave any node - } -}) -``` - -4) Parallel visitors for entering and leaving nodes of a specific kind. - -```js -visit(ast, { - enter: { - Kind(node) { - // enter the "Kind" node - } - }, - leave: { - Kind(node) { - // leave the "Kind" node - } - } -}) -``` - -### BREAK - -The sentinel `BREAK` value described in the documentation of `visitor`. - -## Printer - -### print - -```js -function print(ast): string -``` - -Converts an AST into a string, using one set of reasonable -formatting rules. diff --git a/site/graphql-js/APIReference-TypeSystem.md b/site/graphql-js/APIReference-TypeSystem.md deleted file mode 100644 index 0a7ff72520..0000000000 --- a/site/graphql-js/APIReference-TypeSystem.md +++ /dev/null @@ -1,666 +0,0 @@ ---- -title: graphql/type -layout: ../_core/GraphQLJSLayout -category: API Reference -permalink: /graphql-js/type/ -sublinks: getNamedType,getNullableType,GraphQLBoolean,GraphQLEnumType,GraphQLFloat,GraphQLID,GraphQLInputObjectType,GraphQLInt,GraphQLInterfaceType,GraphQLList,GraphQLNonNull,GraphQLObjectType,GraphQLScalarType,GraphQLSchema,GraphQLString,GraphQLUnionType,isAbstractType,isCompositeType,isInputType,isLeafType,isOutputType -next: /graphql-js/utilities/ ---- - -The `graphql/type` module is responsible for defining GraphQL types and schema. You can import either from the `graphql/type` module, or from the root `graphql` module. For example: - -```js -import { GraphQLSchema } from 'graphql'; // ES6 -var { GraphQLSchema } = require('graphql'); // CommonJS -``` - -## Overview - -*Schema* - - - -*Definitions* - - - -*Predicates* - - - -*Un-modifiers* - - - -*Scalars* - - - -## Schema - -### GraphQLSchema - -```js -class GraphQLSchema { - constructor(config: GraphQLSchemaConfig) -} - -type GraphQLSchemaConfig = { - query: GraphQLObjectType; - mutation?: ?GraphQLObjectType; -} -``` - -A Schema is created by supplying the root types of each type of operation, -query and mutation (optional). A schema definition is then supplied to the -validator and executor. - -#### Example - -```js -var MyAppSchema = new GraphQLSchema({ - query: MyAppQueryRootType - mutation: MyAppMutationRootType -}); -``` - -## Definitions - -### GraphQLScalarType - -```js -class GraphQLScalarType { - constructor(config: GraphQLScalarTypeConfig) -} - -type GraphQLScalarTypeConfig = { - name: string; - description?: ?string; - serialize: (value: mixed) => ?InternalType; - parseValue?: (value: mixed) => ?InternalType; - parseLiteral?: (valueAST: Value) => ?InternalType; -} -``` - -The leaf values of any request and input values to arguments are -Scalars (or Enums) and are defined with a name and a series of serialization -functions used to ensure validity. - -#### Example - -```js -var OddType = new GraphQLScalarType({ - name: 'Odd', - serialize: oddValue, - parseValue: oddValue, - parseLiteral(ast) { - if (ast.kind === Kind.INT) { - return oddValue(parseInt(ast.value, 10)); - } - return null; - } -}); - -function oddValue(value) { - return value % 2 === 1 ? value : null; -} -``` - -### GraphQLObjectType - -```js -class GraphQLObjectType { - constructor(config: GraphQLObjectTypeConfig) -} - -type GraphQLObjectTypeConfig = { - name: string; - interfaces?: GraphQLInterfacesThunk | Array; - fields: GraphQLFieldConfigMapThunk | GraphQLFieldConfigMap; - isTypeOf?: (value: any, info?: GraphQLResolveInfo) => boolean; - description?: ?string -} - -type GraphQLInterfacesThunk = () => Array; - -type GraphQLFieldConfigMapThunk = () => GraphQLFieldConfigMap; - -// See below about resolver functions. -type GraphQLFieldResolveFn = ( - source?: any, - args?: {[argName: string]: any}, - context?: any, - info?: GraphQLResolveInfo -) => any - -type GraphQLResolveInfo = { - fieldName: string, - fieldNodes: Array, - returnType: GraphQLOutputType, - parentType: GraphQLCompositeType, - schema: GraphQLSchema, - fragments: { [fragmentName: string]: FragmentDefinition }, - rootValue: any, - operation: OperationDefinition, - variableValues: { [variableName: string]: any }, -} - -type GraphQLFieldConfig = { - type: GraphQLOutputType; - args?: GraphQLFieldConfigArgumentMap; - resolve?: GraphQLFieldResolveFn; - deprecationReason?: string; - description?: ?string; -} - -type GraphQLFieldConfigArgumentMap = { - [argName: string]: GraphQLArgumentConfig; -}; - -type GraphQLArgumentConfig = { - type: GraphQLInputType; - defaultValue?: any; - description?: ?string; -} - -type GraphQLFieldConfigMap = { - [fieldName: string]: GraphQLFieldConfig; -}; -``` - -Almost all of the GraphQL types you define will be object types. Object types -have a name, but most importantly describe their fields. - -When two types need to refer to each other, or a type needs to refer to -itself in a field, you can use a function expression (aka a closure or a -thunk) to supply the fields lazily. - -Note that resolver functions are provided the `source` object as the first parameter. -However, if a resolver function is not provided, then the default resolver is -used, which looks for a method on `source` of the same name as the field. If found, -the method is called with `(args, context, info)`. Since it is a method on `source`, -that value can always be referenced with `this`. - -#### Examples - -```js -var AddressType = new GraphQLObjectType({ - name: 'Address', - fields: { - street: { type: GraphQLString }, - number: { type: GraphQLInt }, - formatted: { - type: GraphQLString, - resolve(obj) { - return obj.number + ' ' + obj.street - } - } - } -}); - -var PersonType = new GraphQLObjectType({ - name: 'Person', - fields: () => ({ - name: { type: GraphQLString }, - bestFriend: { type: PersonType }, - }) -}); -``` - -### GraphQLInterfaceType - -```js -class GraphQLInterfaceType { - constructor(config: GraphQLInterfaceTypeConfig) -} - -type GraphQLInterfaceTypeConfig = { - name: string, - fields: GraphQLFieldConfigMapThunk | GraphQLFieldConfigMap, - resolveType?: (value: any, info?: GraphQLResolveInfo) => ?GraphQLObjectType, - description?: ?string -}; -``` - -When a field can return one of a heterogeneous set of types, a Interface type -is used to describe what types are possible, what fields are in common across -all types, as well as a function to determine which type is actually used -when the field is resolved. - -#### Example - -```js -var EntityType = new GraphQLInterfaceType({ - name: 'Entity', - fields: { - name: { type: GraphQLString } - } -}); -``` - -### GraphQLUnionType - -```js -class GraphQLUnionType { - constructor(config: GraphQLUnionTypeConfig) -} - -type GraphQLUnionTypeConfig = { - name: string, - types: GraphQLObjectsThunk | Array, - resolveType?: (value: any, info?: GraphQLResolveInfo) => ?GraphQLObjectType; - description?: ?string; -}; - -type GraphQLObjectsThunk = () => Array; -``` - -When a field can return one of a heterogeneous set of types, a Union type -is used to describe what types are possible as well as providing a function -to determine which type is actually used when the field is resolved. - -### Example - -```js -var PetType = new GraphQLUnionType({ - name: 'Pet', - types: [ DogType, CatType ], - resolveType(value) { - if (value instanceof Dog) { - return DogType; - } - if (value instanceof Cat) { - return CatType; - } - } -}); -``` - -### GraphQLEnumType - -```js -class GraphQLEnumType { - constructor(config: GraphQLEnumTypeConfig) -} - -type GraphQLEnumTypeConfig = { - name: string; - values: GraphQLEnumValueConfigMap; - description?: ?string; -} - -type GraphQLEnumValueConfigMap = { - [valueName: string]: GraphQLEnumValueConfig; -}; - -type GraphQLEnumValueConfig = { - value?: any; - deprecationReason?: string; - description?: ?string; -} - -type GraphQLEnumValueDefinition = { - name: string; - value?: any; - deprecationReason?: string; - description?: ?string; -} -``` - -Some leaf values of requests and input values are Enums. GraphQL serializes -Enum values as strings, however internally Enums can be represented by any -kind of type, often integers. - -Note: If a value is not provided in a definition, the name of the enum value -will be used as its internal value. - -#### Example - -```js -var RGBType = new GraphQLEnumType({ - name: 'RGB', - values: { - RED: { value: 0 }, - GREEN: { value: 1 }, - BLUE: { value: 2 } - } -}); -``` - -### GraphQLInputObjectType - -```js -class GraphQLInputObjectType { - constructor(config: GraphQLInputObjectConfig) -} - -type GraphQLInputObjectConfig = { - name: string; - fields: GraphQLInputObjectConfigFieldMapThunk | GraphQLInputObjectConfigFieldMap; - description?: ?string; -} - -type GraphQLInputObjectConfigFieldMapThunk = () => GraphQLInputObjectConfigFieldMap; - -type GraphQLInputObjectFieldConfig = { - type: GraphQLInputType; - defaultValue?: any; - description?: ?string; -} - -type GraphQLInputObjectConfigFieldMap = { - [fieldName: string]: GraphQLInputObjectFieldConfig; -}; - -type GraphQLInputObjectField = { - name: string; - type: GraphQLInputType; - defaultValue?: any; - description?: ?string; -} - -type GraphQLInputObjectFieldMap = { - [fieldName: string]: GraphQLInputObjectField; -}; -``` - -An input object defines a structured collection of fields which may be -supplied to a field argument. - -Using `NonNull` will ensure that a value must be provided by the query - -#### Example - -```js -var GeoPoint = new GraphQLInputObjectType({ - name: 'GeoPoint', - fields: { - lat: { type: new GraphQLNonNull(GraphQLFloat) }, - lon: { type: new GraphQLNonNull(GraphQLFloat) }, - alt: { type: GraphQLFloat, defaultValue: 0 }, - } -}); -``` - -### GraphQLList - -```js -class GraphQLList { - constructor(type: GraphQLType) -} -``` - -A list is a kind of type marker, a wrapping type which points to another -type. Lists are often created within the context of defining the fields of -an object type. - -#### Example - -```js -var PersonType = new GraphQLObjectType({ - name: 'Person', - fields: () => ({ - parents: { type: new GraphQLList(Person) }, - children: { type: new GraphQLList(Person) }, - }) -}); -``` - -### GraphQLNonNull - -```js -class GraphQLNonNull { - constructor(type: GraphQLType) -} -``` - -A non-null is a kind of type marker, a wrapping type which points to another -type. Non-null types enforce that their values are never null and can ensure -an error is raised if this ever occurs during a request. It is useful for -fields which you can make a strong guarantee on non-nullability, for example -usually the id field of a database row will never be null. - -#### Example - -```js -var RowType = new GraphQLObjectType({ - name: 'Row', - fields: () => ({ - id: { type: new GraphQLNonNull(String) }, - }) -}); -``` - -## Predicates - -### isInputType - -```js -function isInputType(type: ?GraphQLType): boolean -``` - -These types may be used as input types for arguments and directives. - -### isOutputType - -```js -function isOutputType(type: ?GraphQLType): boolean -``` - -These types may be used as output types as the result of fields - -### isLeafType - -```js -function isLeafType(type: ?GraphQLType): boolean -``` - -These types may describe types which may be leaf values - -### isCompositeType - -```js -function isCompositeType(type: ?GraphQLType): boolean -``` - -These types may describe the parent context of a selection set - -### isAbstractType - -```js -function isAbstractType(type: ?GraphQLType): boolean -``` - -These types may describe a combination of object types - -## Un-modifiers - -### getNullableType - -```js -function getNullableType(type: ?GraphQLType): ?GraphQLNullableType -``` - -If a given type is non-nullable, this strips the non-nullability and -returns the underlying type. - -### getNamedType - -```js -function getNamedType(type: ?GraphQLType): ?GraphQLNamedType -``` - -If a given type is non-nullable or a list, this repeated strips the -non-nullability and list wrappers and returns the underlying type. - -## Scalars - -### GraphQLInt - -```js -var GraphQLInt: GraphQLScalarType; -``` - -A `GraphQLScalarType` that represents an int. - -### GraphQLFloat - -```js -var GraphQLFloat: GraphQLScalarType; -``` - -A `GraphQLScalarType` that represents a float. - -### GraphQLString - -```js -var GraphQLString: GraphQLScalarType; -``` - -A `GraphQLScalarType` that represents a string. - -### GraphQLBoolean - -```js -var GraphQLBoolean: GraphQLScalarType; -``` - -A `GraphQLScalarType` that represents a boolean. - -### GraphQLID - -```js -var GraphQLID: GraphQLScalarType; -``` - -A `GraphQLScalarType` that represents an ID. diff --git a/site/graphql-js/APIReference-Utilities.md b/site/graphql-js/APIReference-Utilities.md deleted file mode 100644 index 2b0b0625ae..0000000000 --- a/site/graphql-js/APIReference-Utilities.md +++ /dev/null @@ -1,245 +0,0 @@ ---- -title: graphql/utilities -layout: ../_core/GraphQLJSLayout -category: API Reference -permalink: /graphql-js/utilities/ -sublinks: astFromValue,buildASTSchema,buildClientSchema,buildSchema,introspectionQuery,isValidJSValue,isValidLiteralValue,printIntrospectionSchema,printSchema,typeFromAST,TypeInfo -next: /graphql-js/validation/ ---- - -The `graphql/utilities` module contains common useful computations to use with -the GraphQL language and type objects. You can import either from the `graphql/utilities` module, or from the root `graphql` module. For example: - -```js -import { introspectionQuery } from 'graphql'; // ES6 -var { introspectionQuery } = require('graphql'); // CommonJS -``` - -## Overview - -*Introspection* - - - -*Schema Language* - - - -*Visitors* - - - -*Value Validation* - - - -## Introspection - -### introspectionQuery - -```js -var introspectionQuery: string -``` - -A GraphQL query that queries a server's introspection system for enough -information to reproduce that server's type system. - -### buildClientSchema - -```js -function buildClientSchema( - introspection: IntrospectionQuery -): GraphQLSchema -``` - -Build a GraphQLSchema for use by client tools. - -Given the result of a client running the introspection query, creates and -returns a GraphQLSchema instance which can be then used with all GraphQL.js -tools, but cannot be used to execute a query, as introspection does not -represent the "resolver", "parse" or "serialize" functions or any other -server-internal mechanisms. - -## Schema Representation - -### buildSchema - -```js -function buildSchema(source: string | Source): GraphQLSchema { -``` - -Creates a GraphQLSchema object from GraphQL schema language. The schema will use default resolvers. For more detail on the GraphQL schema language, see the [schema language docs](/learn/schema/) or this [schema language cheat sheet](https://wehavefaces.net/graphql-shorthand-notation-cheatsheet-17cd715861b6#.9oztv0a7n). - -### printSchema - -```js -function printSchema(schema: GraphQLSchema): string { -``` - -Prints the provided schema in the Schema Language format. - -### printIntrospectionSchema - -```js -function printIntrospectionSchema(schema: GraphQLSchema): string { -``` - -Prints the built-in introspection schema in the Schema Language format. - -### buildASTSchema - -```js -function buildASTSchema( - ast: SchemaDocument, - queryTypeName: string, - mutationTypeName: ?string -): GraphQLSchema -``` - -This takes the ast of a schema document produced by `parseSchemaIntoAST` in -`graphql/language/schema` and constructs a GraphQLSchema instance which can be -then used with all GraphQL.js tools, but cannot be used to execute a query, as -introspection does not represent the "resolver", "parse" or "serialize" -functions or any other server-internal mechanisms. - -### typeFromAST - -```js -function typeFromAST( - schema: GraphQLSchema, - inputTypeAST: Type -): ?GraphQLType -``` - -Given the name of a Type as it appears in a GraphQL AST and a Schema, return the -corresponding GraphQLType from that schema. - -### astFromValue - -```js -function astFromValue( - value: any, - type?: ?GraphQLType -): ?Value -``` -Produces a GraphQL Input Value AST given a JavaScript value. - -Optionally, a GraphQL type may be provided, which will be used to -disambiguate between value primitives. - -## Visitors - -### TypeInfo - -```js -class TypeInfo { - constructor(schema: GraphQLSchema) - getType(): ?GraphQLOutputType { - getParentType(): ?GraphQLCompositeType { - getInputType(): ?GraphQLInputType { - getFieldDef(): ?GraphQLFieldDefinition { - getDirective(): ?GraphQLDirective { - getArgument(): ?GraphQLArgument { -} -``` - -TypeInfo is a utility class which, given a GraphQL schema, can keep track -of the current field and type definitions at any point in a GraphQL document -AST during a recursive descent by calling `enter(node)` and `leave(node)`. - -## Value Validation - -### isValidJSValue - -```js -function isValidJSValue(value: any, type: GraphQLInputType): string[] -``` - -Given a JavaScript value and a GraphQL type, determine if the value will be -accepted for that type. This is primarily useful for validating the -runtime values of query variables. - -### isValidLiteralValue - -```js -function isValidLiteralValue( - type: GraphQLInputType, - valueAST: Value -): string[] -``` - -Utility for validators which determines if a value literal AST is valid given -an input type. - -Note that this only validates literal values, variables are assumed to -provide values of the correct type. diff --git a/site/graphql-js/APIReference-Validation.md b/site/graphql-js/APIReference-Validation.md deleted file mode 100644 index e9c28ebbe0..0000000000 --- a/site/graphql-js/APIReference-Validation.md +++ /dev/null @@ -1,68 +0,0 @@ ---- -title: graphql/validation -layout: ../_core/GraphQLJSLayout -category: API Reference -permalink: /graphql-js/validation/ -sublinks: specifiedRules,validate ---- - -The `graphql/validation` module fulfills the Validation phase of fulfilling a -GraphQL result. You can import either from the `graphql/validation` module, or from the root `graphql` module. For example: - -```js -import { validate } from 'graphql/validation'; // ES6 -var { validate } = require('graphql/validation'); // CommonJS -``` - -## Overview - - - -## Validation - -### validate - -```js -function validate( - schema: GraphQLSchema, - ast: Document, - rules?: Array -): Array -``` - -Implements the "Validation" section of the spec. - -Validation runs synchronously, returning an array of encountered errors, or -an empty array if no errors were encountered and the document is valid. - -A list of specific validation rules may be provided. If not provided, the -default list of rules defined by the GraphQL specification will be used. - -Each validation rules is a function which returns a visitor -(see the language/visitor API). Visitor methods are expected to return -GraphQLErrors, or Arrays of GraphQLErrors when invalid. - -Visitors can also supply `visitSpreadFragments: true` which will alter the -behavior of the visitor to skip over top level defined fragments, and instead -visit those fragments at every point a spread is encountered. - -### specifiedRules - -```js -var specifiedRules: Array<(context: ValidationContext): any> -``` - -This set includes all validation rules defined by the GraphQL spec diff --git a/site/graphql-js/Guides-ConstructingTypes.md b/site/graphql-js/Guides-ConstructingTypes.md deleted file mode 100644 index 9abd6e100d..0000000000 --- a/site/graphql-js/Guides-ConstructingTypes.md +++ /dev/null @@ -1,117 +0,0 @@ ---- -title: Constructing Types -layout: ../_core/GraphQLJSLayout -category: Advanced Guides -permalink: /graphql-js/constructing-types/ -next: /graphql-js/express-graphql/ ---- - -For many apps, you can define a fixed schema when the application starts, and define it using GraphQL schema language. In some cases, it's useful to construct a schema programmatically. You can do this using the `GraphQLSchema` constructor. - -When you are using the `GraphQLSchema` constructor to create a schema, instead of defining `Query` and `Mutation` types solely using schema language, you create them as separate object types. - -For example, let's say we are building a simple API that lets you fetch user data for a few hardcoded users based on an id. Using `buildSchema` we could write a server with: - -```javascript -var express = require('express'); -var graphqlHTTP = require('express-graphql'); -var { buildSchema } = require('graphql'); - -var schema = buildSchema(` - type User { - id: String - name: String - } - - type Query { - user(id: String): User - } -`); - -// Maps id to User object -var fakeDatabase = { - 'a': { - id: 'a', - name: 'alice', - }, - 'b': { - id: 'b', - name: 'bob', - }, -}; - -var root = { - user: function ({id}) { - return fakeDatabase[id]; - } -}; - -var app = express(); -app.use('/graphql', graphqlHTTP({ - schema: schema, - rootValue: root, - graphiql: true, -})); -app.listen(4000); -console.log('Running a GraphQL API server at localhost:4000/graphql'); -``` - -We can implement this same API without using GraphQL schema language: - -```javascript -var express = require('express'); -var graphqlHTTP = require('express-graphql'); -var graphql = require('graphql'); - -// Maps id to User object -var fakeDatabase = { - 'a': { - id: 'a', - name: 'alice', - }, - 'b': { - id: 'b', - name: 'bob', - }, -}; - -// Define the User type -var userType = new graphql.GraphQLObjectType({ - name: 'User', - fields: { - id: { type: graphql.GraphQLString }, - name: { type: graphql.GraphQLString }, - } -}); - -// Define the Query type -var queryType = new graphql.GraphQLObjectType({ - name: 'Query', - fields: { - user: { - type: userType, - // `args` describes the arguments that the `user` query accepts - args: { - id: { type: graphql.GraphQLString } - }, - resolve: function (_, {id}) { - return fakeDatabase[id]; - } - } - } -}); - -var schema = new graphql.GraphQLSchema({query: queryType}); - -var app = express(); -app.use('/graphql', graphqlHTTP({ - schema: schema, - graphiql: true, -})); -app.listen(4000); -console.log('Running a GraphQL API server at localhost:4000/graphql'); -``` - -When we use this method of creating the API, the root level resolvers are implemented on the `Query` and `Mutation` types rather than on a `root` object. - -This is particularly useful if you want to create a GraphQL schema automatically from something else, like a database schema. You might have a common format for something like creating and updating database records. This is also useful for implementing features like union types which don't map cleanly to ES6 classes and schema language. diff --git a/site/graphql-js/Tutorial-Authentication.md b/site/graphql-js/Tutorial-Authentication.md deleted file mode 100644 index 2ad93de475..0000000000 --- a/site/graphql-js/Tutorial-Authentication.md +++ /dev/null @@ -1,53 +0,0 @@ ---- -title: Authentication and Express Middleware -sidebarTitle: Authentication & Middleware -layout: ../_core/GraphQLJSLayout -category: GraphQL.js Tutorial -permalink: /graphql-js/authentication-and-express-middleware/ -next: /graphql-js/constructing-types/ ---- - -It's simple to use any Express middleware in conjunction with `express-graphql`. In particular, this is a great pattern for handling authentication. - -To use middleware with a GraphQL resolver, just use the middleware like you would with a normal Express app. The `request` object is then available as the second argument in any resolver. - -For example, let's say we wanted our server to log the IP address of every request, and we also want to write an API that returns the IP address of the caller. We can do the former with middleware, and the latter by accessing the `request` object in a resolver. Here's server code that implements this: - -```javascript -var express = require('express'); -var graphqlHTTP = require('express-graphql'); -var { buildSchema } = require('graphql'); - -var schema = buildSchema(` - type Query { - ip: String - } -`); - -function loggingMiddleware(req, res, next) { - console.log('ip:', req.ip); - next(); -} - -var root = { - ip: function (args, request) { - return request.ip; - } -}; - -var app = express(); -app.use(loggingMiddleware); -app.use('/graphql', graphqlHTTP({ - schema: schema, - rootValue: root, - graphiql: true, -})); -app.listen(4000); -console.log('Running a GraphQL API server at localhost:4000/graphql'); -``` - -In a REST API, authentication is often handled with a header, that contains an auth token which proves what user is making this request. Express middleware processes these headers and puts authentication data on the Express `request` object. Some middleware modules that handle authentication like this are [Passport](http://passportjs.org/), [express-jwt](https://github.com/auth0/express-jwt), and [express-session](https://github.com/expressjs/session). Each of these modules works with `express-graphql`. - -If you aren't familiar with any of these authentication mechanisms, we recommend using `express-jwt` because it's simple without sacrificing any future flexibility. - -If you've read through the docs linearly to get to this point, congratulations! You now know everything you need to build a practical GraphQL API server. diff --git a/site/graphql-js/Tutorial-BasicTypes.md b/site/graphql-js/Tutorial-BasicTypes.md deleted file mode 100644 index 4532f03f01..0000000000 --- a/site/graphql-js/Tutorial-BasicTypes.md +++ /dev/null @@ -1,58 +0,0 @@ ---- -title: Basic Types -layout: ../_core/GraphQLJSLayout -category: GraphQL.js Tutorial -permalink: /graphql-js/basic-types/ -next: /graphql-js/passing-arguments/ ---- - -In most situations, all you need to do is to specify the types for your API using the GraphQL schema language, taken as an argument to the `buildSchema` function. - -The GraphQL schema language supports the scalar types of `String`, `Int`, `Float`, `Boolean`, and `ID`, so you can use these directly in the schema you pass to `buildSchema`. - -By default, every type is nullable - it's legitimate to return `null` as any of the scalar types. Use an exclamation point to indicate a type cannot be nullable, so `String!` is a non-nullable string. - -To use a list type, surround the type in square brackets, so `[Int]` is a list of integers. - -Each of these types maps straightforwardly to JavaScript, so you can just return plain old JavaScript objects in APIs that return these types. Here's an example that shows how to use some of these basic types: - -```javascript -var express = require('express'); -var graphqlHTTP = require('express-graphql'); -var { buildSchema } = require('graphql'); - -// Construct a schema, using GraphQL schema language -var schema = buildSchema(` - type Query { - quoteOfTheDay: String - random: Float! - rollThreeDice: [Int] - } -`); - -// The root provides a resolver function for each API endpoint -var root = { - quoteOfTheDay: () => { - return Math.random() < 0.5 ? 'Take it easy' : 'Salvation lies within'; - }, - random: () => { - return Math.random(); - }, - rollThreeDice: () => { - return [1, 2, 3].map(_ => 1 + Math.floor(Math.random() * 6)); - }, -}; - -var app = express(); -app.use('/graphql', graphqlHTTP({ - schema: schema, - rootValue: root, - graphiql: true, -})); -app.listen(4000); -console.log('Running a GraphQL API server at localhost:4000/graphql'); -``` - -If you run this code with `node server.js` and browse to http://localhost:4000/graphql you can try out these APIs. - -These examples show you how to call APIs that return different types. To send different types of data into an API, you will also need to learn about [passing arguments to a GraphQL API](/graphql-js/passing-arguments/). diff --git a/site/graphql-js/Tutorial-ExpressGraphQL.md b/site/graphql-js/Tutorial-ExpressGraphQL.md deleted file mode 100644 index 6fbfd57c67..0000000000 --- a/site/graphql-js/Tutorial-ExpressGraphQL.md +++ /dev/null @@ -1,59 +0,0 @@ ---- -title: Running an Express GraphQL Server -sidebarTitle: Running Express + GraphQL -layout: ../_core/GraphQLJSLayout -category: GraphQL.js Tutorial -permalink: /graphql-js/running-an-express-graphql-server/ -next: /graphql-js/graphql-clients/ ---- - -The simplest way to run an GraphQL API server is to use [Express](https://expressjs.com), a popular web application framework for Node.js. You will need to install two additional dependencies: - -```bash -npm install express express-graphql graphql --save -``` - -Let's modify our “hello world” example so that it's an API server rather than a script that runs a single query. We can use the 'express' module to run a webserver, and instead of executing a query directly with the `graphql` function, we can use the `express-graphql` library to mount a GraphQL API server on the “/graphql” HTTP endpoint: - -```javascript -var express = require('express'); -var graphqlHTTP = require('express-graphql'); -var { buildSchema } = require('graphql'); - -// Construct a schema, using GraphQL schema language -var schema = buildSchema(` - type Query { - hello: String - } -`); - -// The root provides a resolver function for each API endpoint -var root = { - hello: () => { - return 'Hello world!'; - }, -}; - -var app = express(); -app.use('/graphql', graphqlHTTP({ - schema: schema, - rootValue: root, - graphiql: true, -})); -app.listen(4000); -console.log('Running a GraphQL API server at localhost:4000/graphql'); -``` - -You can run this GraphQL server with: - -```bash -node server.js -``` - -Since we configured `graphqlHTTP` with `graphiql: true`, you can use the GraphiQL tool to manually issue GraphQL queries. If you navigate in a web browser to `http://localhost:4000/graphql`, you should see an interface that lets you enter queries. It should look like: - -![hello world graphql example](/img/hello.png) - -This screen shot shows the GraphQL query `{ hello }` being issued and giving a result of `{ data: { hello: 'Hello world!' } }`. GraphiQL is a great tool for debugging and inspecting a server, so we recommend running it whenever your application is in development mode. - -At this point you have learned how to run a GraphQL server and how to use GraphiQL interface to issue queries. The next step is to learn how to [issue GraphQL queries from client code](/graphql-js/graphql-clients/). diff --git a/site/graphql-js/Tutorial-GettingStarted.md b/site/graphql-js/Tutorial-GettingStarted.md deleted file mode 100644 index 0e492ae00d..0000000000 --- a/site/graphql-js/Tutorial-GettingStarted.md +++ /dev/null @@ -1,62 +0,0 @@ ---- -title: Getting Started With GraphQL.js -sidebarTitle: Getting Started -layout: ../_core/GraphQLJSLayout -category: GraphQL.js Tutorial -permalink: /graphql-js/ -next: /graphql-js/running-an-express-graphql-server/ ---- - -## Prerequisites - -Before getting started, you should have Node v6 installed, although the examples should mostly work in previous versions of Node as well. For this guide, we won't use any language features that require transpilation, but we will use some ES6 features like [Promises](http://www.html5rocks.com/en/tutorials/es6/promises/), [classes](http://javascriptplayground.com/blog/2014/07/introduction-to-es6-classes-tutorial/), and [fat arrow functions](https://strongloop.com/strongblog/an-introduction-to-javascript-es6-arrow-functions/), so if you aren't familiar with them you might want to read up on them first. - -To create a new project and install GraphQL.js in your current directory: - -```bash -npm init -npm install graphql --save -``` - -## Writing Code - -To handle GraphQL queries, we need a schema that defines the `Query` type, and we need an API root with a function called a “resolver” for each API endpoint. For an API that just returns “Hello world!”, we can put this code in a file named `server.js`: - -```javascript -var { graphql, buildSchema } = require('graphql'); - -// Construct a schema, using GraphQL schema language -var schema = buildSchema(` - type Query { - hello: String - } -`); - -// The root provides a resolver function for each API endpoint -var root = { - hello: () => { - return 'Hello world!'; - }, -}; - -// Run the GraphQL query '{ hello }' and print out the response -graphql(schema, '{ hello }', root).then((response) => { - console.log(response); -}); -``` - -If you run this with: - -```bash -node server.js -``` - -You should see the GraphQL response printed out: - -```javascript -{ data: { hello: 'Hello world!' } } -``` - -Congratulations - you just executed a GraphQL query! - -For practical applications, you'll probably want to run GraphQL queries from an API server, rather than executing GraphQL with a command line tool. To use GraphQL for an API server over HTTP, check out [Running an Express GraphQL Server](/graphql-js/running-an-express-graphql-server/). diff --git a/site/graphql-js/Tutorial-GraphQLClients.md b/site/graphql-js/Tutorial-GraphQLClients.md deleted file mode 100644 index 68485e4367..0000000000 --- a/site/graphql-js/Tutorial-GraphQLClients.md +++ /dev/null @@ -1,87 +0,0 @@ ---- -title: GraphQL Clients -layout: ../_core/GraphQLJSLayout -category: GraphQL.js Tutorial -permalink: /graphql-js/graphql-clients/ -next: /graphql-js/basic-types/ ---- - -Since a GraphQL API has more underlying structure than a REST API, there are more powerful clients like [Relay](https://facebook.github.io/relay/) which can automatically handle batching, caching, and other features. But you don't need a complex client to call a GraphQL server. With `express-graphql`, you can just send an HTTP POST request to the endpoint you mounted your GraphQL server on, passing the GraphQL query as the `query` field in a JSON payload. - -For example, let's say we mounted a GraphQL server on http://localhost:4000/graphql as in the example code for [running an Express GraphQL server](/graphql-js/running-an-express-graphql-server/), and we want to send the GraphQL query `{ hello }`. We can do this from the command line with `curl`. If you paste this into a terminal: - -```bash -curl -X POST \ --H "Content-Type: application/json" \ --d '{"query": "{ hello }"}' \ -http://localhost:4000/graphql -``` - -You should see the output returned as JSON: - -```bash -{"data":{"hello":"Hello world!"}} -``` - -If you prefer to use a graphical user interface to send a test query, you can use clients such as [GraphiQL](https://github.com/graphql/graphiql) and [Insomnia](https://github.com/getinsomnia/insomnia). - -It's also simple to send GraphQL from the browser. Open up http://localhost:4000, open a developer console, and paste in: - -```javascript -fetch('https://github.com/graphql', { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'Accept': 'application/json', - }, - body: JSON.stringify({query: "{ hello }"}) -}) - .then(r => r.json()) - .then(data => console.log('data returned:', data)); -``` - -You should see the data returned, logged in the console: - -``` -data returned: Object { hello: "Hello world!" } -``` - -In this example, the query was just a hardcoded string. As your application becomes more complex, and you add GraphQL endpoints that take arguments as described in [Passing Arguments](/graphql-js/passing-arguments/), you will want to construct GraphQL queries using variables in client code. You can do this by including a keyword prefixed with a dollar sign in the query, and passing an extra `variables` field on the payload. - -For example, let's say you're running the example server from [Passing Arguments](/graphql-js/passing-arguments/) that has a schema of - -```javascript -type Query { - rollDice(numDice: Int!, numSides: Int): [Int] -} -``` - -You could access this from JavaScript with the code: - -```javascript -var dice = 3; -var sides = 6; -var query = `query RollDice($dice: Int!, $sides: Int) { - rollDice(numDice: $dice, numSides: $sides) -}`; - -fetch('https://github.com/graphql', { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'Accept': 'application/json', - }, - body: JSON.stringify({ - query, - variables: { dice, sides }, - }) -}) - .then(r => r.json()) - .then(data => console.log('data returned:', data)); -``` - -Using this syntax for variables is a good idea because it automatically prevents bugs due to escaping, and it makes it easier to monitor your server. - -In general, it will take a bit more time to set up a GraphQL client like Relay, but it's worth it to get more features as your application grows. You might want to start out just using HTTP requests as the underlying transport layer, and switching to a more complex client as your application gets more complex. - -At this point you can write a client and server in GraphQL for an API that receives a single string. To do more, you will want to [learn how to use the other basic data types](/graphql-js/basic-types/). diff --git a/site/graphql-js/Tutorial-Mutations.md b/site/graphql-js/Tutorial-Mutations.md deleted file mode 100644 index 2ccde6ae68..0000000000 --- a/site/graphql-js/Tutorial-Mutations.md +++ /dev/null @@ -1,194 +0,0 @@ ---- -title: Mutations and Input Types -layout: ../_core/GraphQLJSLayout -category: GraphQL.js Tutorial -permalink: /graphql-js/mutations-and-input-types/ -next: /graphql-js/authentication-and-express-middleware/ ---- - -If you have an API endpoint that alters data, like inserting data into a database or altering data already in a database, you should make this endpoint a `Mutation` rather than a `Query`. This is as simple as making the API endpoint part of the top-level `Mutation` type instead of the top-level `Query` type. - -Let's say we have a “message of the day” server, where anyone can update the message of the day, and anyone can read the current one. The GraphQL schema for this is simply: - -```javascript -type Mutation { - setMessage(message: String): String -} - -type Query { - getMessage: String -} -``` - -It's often convenient to have a mutation that maps to a database create or update operation, like `setMessage`, return the same thing that the server stored. That way, if you modify the data on the server, the client can learn about those modifications. - -Both mutations and queries can be handled by root resolvers, so the root that implements this schema can simply be: - -```javascript -var fakeDatabase = {}; -var root = { - setMessage: function ({message}) { - fakeDatabase.message = message; - return message; - }, - getMessage: function () { - return fakeDatabase.message; - } -}; -``` - -You don't need anything more than this to implement mutations. But in many cases, you will find a number of different mutations that all accept the same input parameters. A common example is that creating an object in a database and updating an object in a database often take the same parameters. To make your schema simpler, you can use “input types” for this, by using the `input` keyword instead of the `type` keyword. - -For example, instead of a single message of the day, let's say we have many messages, indexed in a database by the `id` field, and each message has both a `content` string and an `author` string. We want a mutation API both for creating a new message and for updating an old message. We could use the schema: - -```javascript -input MessageInput { - content: String - author: String -} - -type Message { - id: ID! - content: String - author: String -} - -type Query { - getMessage(id: ID!): Message -} - -type Mutation { - createMessage(input: MessageInput): Message - updateMessage(id: ID!, input: MessageInput): Message -} -``` - -Here, the mutations return a `Message` type, so that the client can get more information about the newly-modified `Message` in the same request as the request that mutates it. - -Input types can't have fields that are other objects, only basic scalar types, list types, and other input types. - -Naming input types with `Input` on the end is a useful convention, because you will often want both an input type and an output type that are slightly different for a single conceptual object. - -Here's some runnable code that implements this schema, keeping the data in memory: - -```javascript -var express = require('express'); -var graphqlHTTP = require('express-graphql'); -var { buildSchema } = require('graphql'); - -// Construct a schema, using GraphQL schema language -var schema = buildSchema(` - input MessageInput { - content: String - author: String - } - - type Message { - id: ID! - content: String - author: String - } - - type Query { - getMessage(id: ID!): Message - } - - type Mutation { - createMessage(input: MessageInput): Message - updateMessage(id: ID!, input: MessageInput): Message - } -`); - -// If Message had any complex fields, we'd put them on this object. -class Message { - constructor(id, {content, author}) { - this.id = id; - this.content = content; - this.author = author; - } -} - -// Maps username to content -var fakeDatabase = {}; - -var root = { - getMessage: function ({id}) { - if (!fakeDatabase[id]) { - throw new Error('no message exists with id ' + id); - } - return new Message(id, fakeDatabase[id]); - }, - createMessage: function ({input}) { - // Create a random id for our "database". - var id = require('crypto').randomBytes(10).toString('hex'); - - fakeDatabase[id] = input; - return new Message(id, input); - }, - updateMessage: function ({id, input}) { - if (!fakeDatabase[id]) { - throw new Error('no message exists with id ' + id); - } - // This replaces all old data, but some apps might want partial update. - fakeDatabase[id] = input; - return new Message(id, input); - }, -}; - -var app = express(); -app.use('/graphql', graphqlHTTP({ - schema: schema, - rootValue: root, - graphiql: true, -})); -app.listen(4000, () => { - console.log('Running a GraphQL API server at localhost:4000/graphql'); -}); - -``` - -To call a mutation, you must use the keyword `mutation` before your GraphQL query. To pass an input type, provide the data written as if it's a JSON object. For example, with the server defined above, you can create a new message and return the `id` of the new message with this operation: - -```javascript -mutation { - createMessage(input: { - author: "andy", - content: "hope is a good thing", - }) { - id - } -} -``` - -You can use variables to simplify mutation client logic just like you can with queries. For example, some JavaScript code that calls the server to execute this mutation is: - -```javascript -var author = 'andy'; -var content = 'hope is a good thing'; -var query = `mutation CreateMessage($input: MessageInput) { - createMessage(input: $input) { - id - } -}`; - -fetch('https://github.com/graphql', { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'Accept': 'application/json', - }, - body: JSON.stringify({ - query, - variables: { - input: { - author, - content, - } - } - }) -}) - .then(r => r.json()) - .then(data => console.log('data returned:', data)); -``` - -One particular type of mutation is operations that change users, like signing up a new user. While you can implement this using GraphQL mutations, you can reuse many existing libraries if you learn about [GraphQL with authentication and Express middleware](/graphql-js/authentication-and-express-middleware/). diff --git a/site/graphql-js/Tutorial-ObjectTypes.md b/site/graphql-js/Tutorial-ObjectTypes.md deleted file mode 100644 index 60a151f3ac..0000000000 --- a/site/graphql-js/Tutorial-ObjectTypes.md +++ /dev/null @@ -1,144 +0,0 @@ ---- -title: Object Types -layout: ../_core/GraphQLJSLayout -category: GraphQL.js Tutorial -permalink: /graphql-js/object-types/ -next: /graphql-js/mutations-and-input-types/ ---- - -In many cases, you don't want to return a number or a string from an API. You want to return an object that has its own complex behavior. GraphQL is a perfect fit for this. - -In GraphQL schema language, the way you define a new object type is the same way we have been defining the `Query` type in our examples. Each object can have fields that return a particular type, and methods that take arguments. For example, in the [Passing Arguments](/graphql-js/passing-arguments/) documentation, we had a method to roll some random dice: - -```javascript -type Query { - rollDice(numDice: Int!, numSides: Int): [Int] -} -``` - -If we wanted to have more and more methods based on a random die over time, we could implement this with a `RandomDie` object type instead. - -```javascript -type RandomDie { - roll(numRolls: Int!): [Int] -} - -type Query { - getDie(numSides: Int): RandomDie -} -``` - -Instead of a root-level resolver for the `RandomDie` type, we can instead use an ES6 class, where the resolvers are instance methods. This code shows how the `RandomDie` schema above can be implemented: - -```javascript -class RandomDie { - constructor(numSides) { - this.numSides = numSides; - } - - rollOnce() { - return 1 + Math.floor(Math.random() * this.numSides); - } - - roll({numRolls}) { - var output = []; - for (var i = 0; i < numRolls; i++) { - output.push(this.rollOnce()); - } - return output; - } -} - -var root = { - getDie: function ({numSides}) { - return new RandomDie(numSides || 6); - } -} -``` - -For fields that don't use any arguments, you can use either properties on the object or instance methods. So for the example code above, both `numSides` and `rollOnce` can actually be used to implement GraphQL fields, so that code also implements the schema of: - -```javascript -type RandomDie { - numSides: Int! - rollOnce: Int! - roll(numRolls: Int!): [Int] -} - -type Query { - getDie(numSides: Int): RandomDie -} -``` - -Putting this all together, here is some sample code that runs a server with this GraphQL API: - -```javascript -var express = require('express'); -var graphqlHTTP = require('express-graphql'); -var { buildSchema } = require('graphql'); - -// Construct a schema, using GraphQL schema language -var schema = buildSchema(` - type RandomDie { - numSides: Int! - rollOnce: Int! - roll(numRolls: Int!): [Int] - } - - type Query { - getDie(numSides: Int): RandomDie - } -`); - -// This class implements the RandomDie GraphQL type -class RandomDie { - constructor(numSides) { - this.numSides = numSides; - } - - rollOnce() { - return 1 + Math.floor(Math.random() * this.numSides); - } - - roll({numRolls}) { - var output = []; - for (var i = 0; i < numRolls; i++) { - output.push(this.rollOnce()); - } - return output; - } -} - -// The root provides the top-level API endpoints -var root = { - getDie: function ({numSides}) { - return new RandomDie(numSides || 6); - } -} - -var app = express(); -app.use('/graphql', graphqlHTTP({ - schema: schema, - rootValue: root, - graphiql: true, -})); -app.listen(4000); -console.log('Running a GraphQL API server at localhost:4000/graphql'); -``` - -When you issue a GraphQL query against an API that returns object types, you can call multiple methods on the object at once by nesting the GraphQL field names. For example, if you wanted to call both `rollOnce` to roll a die once, and `roll` to roll a die three times, you could do it with this query: - -```javascript -{ - getDie(numSides: 6) { - rollOnce - roll(numRolls: 3) - } -} -``` - -If you run this code with `node server.js` and browse to http://localhost:4000/graphql you can try out these APIs with GraphiQL. - -This way of defining object types often provides advantages over a traditional REST API. Instead of doing one API request to get basic information about an object, and then multiple subsequent API requests to find out more information about that object, you can get all of that information in one API request. That saves bandwidth, makes your app run faster, and simplifies your client-side logic. - -So far, every API we've looked at is designed for returning data. In order to modify stored data or handle complex input, it helps to [learn about mutations and input types](/graphql-js/mutations-and-input-types/). diff --git a/site/graphql-js/Tutorial-PassingArguments.md b/site/graphql-js/Tutorial-PassingArguments.md deleted file mode 100644 index 47154b488b..0000000000 --- a/site/graphql-js/Tutorial-PassingArguments.md +++ /dev/null @@ -1,130 +0,0 @@ ---- -title: Passing Arguments -layout: ../_core/GraphQLJSLayout -category: GraphQL.js Tutorial -permalink: /graphql-js/passing-arguments/ -next: /graphql-js/object-types/ ---- - -Just like a REST API, it's common to pass arguments to an endpoint in a GraphQL API. By defining the arguments in the schema language, typechecking happens automatically. Each argument must be named and have a type. For example, in the [Basic Types documentation](/graphql-js/basic-types/) we had an endpoint called `rollThreeDice`: - -```javascript -type Query { - rollThreeDice: [Int] -} -``` - -Instead of hardcoding “three”, we might want a more general function that rolls `numDice` dice, each of which have `numSides` sides. We can add arguments to the GraphQL schema language like this: - -```javascript -type Query { - rollDice(numDice: Int!, numSides: Int): [Int] -} -``` - -The exclamation point in `Int!` indicates that `numDice` can't be null, which means we can skip a bit of validation logic to make our server code simpler. We can let `numSides` be null and assume that by default a die has 6 sides. - -So far, our resolver functions took no arguments. When a resolver takes arguments, they are passed as one “args” object, as the first argument to the function. So rollDice could be implemented as: - -```javascript -var root = { - rollDice: function (args) { - var output = []; - for (var i = 0; i < args.numDice; i++) { - output.push(1 + Math.floor(Math.random() * (args.numSides || 6))); - } - return output; - } -}; -``` - -It's convenient to use [ES6 destructuring assignment](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment) for these parameters, since you know what format they will be. So we can also write `rollDice` as - -```javascript -var root = { - rollDice: function ({numDice, numSides}) { - var output = []; - for (var i = 0; i < numDice; i++) { - output.push(1 + Math.floor(Math.random() * (numSides || 6))); - } - return output; - } -}; -``` - -If you're familiar with destructuring, this is a bit nicer because the line of code where `rollDice` is defined tells you about what the arguments are. - -The entire code for a server that hosts this `rollDice` API is: - -```javascript -var express = require('express'); -var graphqlHTTP = require('express-graphql'); -var { buildSchema } = require('graphql'); - -// Construct a schema, using GraphQL schema language -var schema = buildSchema(` - type Query { - rollDice(numDice: Int!, numSides: Int): [Int] - } -`); - -// The root provides a resolver function for each API endpoint -var root = { - rollDice: function ({numDice, numSides}) { - var output = []; - for (var i = 0; i < numDice; i++) { - output.push(1 + Math.floor(Math.random() * (numSides || 6))); - } - return output; - } -}; - -var app = express(); -app.use('/graphql', graphqlHTTP({ - schema: schema, - rootValue: root, - graphiql: true, -})); -app.listen(4000); -console.log('Running a GraphQL API server at localhost:4000/graphql'); -``` - -When you call this API, you have to pass each argument by name. So for the server above, you could issue this GraphQL query to roll three six-sided dice: - -```javascript -{ - rollDice(numDice: 3, numSides: 6) -} -``` - -If you run this code with `node server.js` and browse to http://localhost:4000/graphql you can try out this API. - -When you're passing arguments in code, it's generally better to avoid constructing the whole query string yourself. Instead, you can use `$` syntax to define variables in your query, and pass the variables as a separate map. - -For example, some JavaScript code that calls our server above is: - -```javascript -var dice = 3; -var sides = 6; -var query = `query RollDice($dice: Int!, $sides: Int) { - rollDice(numDice: $dice, numSides: $sides) -}`; - -fetch('https://github.com/graphql', { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'Accept': 'application/json', - }, - body: JSON.stringify({ - query, - variables: { dice, sides }, - }) -}) - .then(r => r.json()) - .then(data => console.log('data returned:', data)); -``` - -Using `$dice` and `$sides` as variables in GraphQL means we don't have to worry about escaping on the client side. - -With basic types and argument passing, you can implement anything you can implement in a REST API. But GraphQL supports even more powerful queries. You can replace multiple API calls with a single API call if you learn how to [define your own object types](/graphql-js/object-types/). diff --git a/site/help/index.html.js b/site/help/index.html.js deleted file mode 100644 index b6d4f02771..0000000000 --- a/site/help/index.html.js +++ /dev/null @@ -1,3 +0,0 @@ -var React = require('react') -var Redirect = require('../_core/Redirect') -export default () => diff --git a/site/img/blog/20160502-rest-api-graphql-wrapper/dataloader-query.png b/site/img/blog/20160502-rest-api-graphql-wrapper/dataloader-query.png deleted file mode 100644 index a061a48469..0000000000 Binary files a/site/img/blog/20160502-rest-api-graphql-wrapper/dataloader-query.png and /dev/null differ diff --git a/site/img/blog/20160502-rest-api-graphql-wrapper/pathological-query.png b/site/img/blog/20160502-rest-api-graphql-wrapper/pathological-query.png deleted file mode 100644 index c8c11358a3..0000000000 Binary files a/site/img/blog/20160502-rest-api-graphql-wrapper/pathological-query.png and /dev/null differ diff --git a/site/img/blog/20160502-rest-api-graphql-wrapper/rest-api-people.png b/site/img/blog/20160502-rest-api-graphql-wrapper/rest-api-people.png deleted file mode 100644 index 1b2ada93eb..0000000000 Binary files a/site/img/blog/20160502-rest-api-graphql-wrapper/rest-api-people.png and /dev/null differ diff --git a/site/img/diagrams/business_layer.png b/site/img/diagrams/business_layer.png deleted file mode 100644 index b85d358e02..0000000000 Binary files a/site/img/diagrams/business_layer.png and /dev/null differ diff --git a/site/img/favicon.png b/site/img/favicon.png deleted file mode 100644 index 89bd152f32..0000000000 Binary files a/site/img/favicon.png and /dev/null differ diff --git a/site/img/graph-wash.png b/site/img/graph-wash.png deleted file mode 100644 index b4a190fe34..0000000000 Binary files a/site/img/graph-wash.png and /dev/null differ diff --git a/site/img/hello.png b/site/img/hello.png deleted file mode 100644 index 92ab663d6a..0000000000 Binary files a/site/img/hello.png and /dev/null differ diff --git a/site/img/logo-gray.svg b/site/img/logo-gray.svg deleted file mode 100644 index 30ab4526ee..0000000000 --- a/site/img/logo-gray.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/site/img/logo.svg b/site/img/logo.svg deleted file mode 100644 index 6a8a83abeb..0000000000 --- a/site/img/logo.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/site/img/og_image.png b/site/img/og_image.png deleted file mode 100644 index ca058a18c5..0000000000 Binary files a/site/img/og_image.png and /dev/null differ diff --git a/site/img/oss_logo.png b/site/img/oss_logo.png deleted file mode 100644 index 8183e289b1..0000000000 Binary files a/site/img/oss_logo.png and /dev/null differ diff --git a/site/img/phone.svg b/site/img/phone.svg deleted file mode 100644 index 3213f39b50..0000000000 --- a/site/img/phone.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/site/img/search.png b/site/img/search.png deleted file mode 100644 index 222fb660da..0000000000 Binary files a/site/img/search.png and /dev/null differ diff --git a/site/img/search.svg b/site/img/search.svg deleted file mode 100644 index 146d336e73..0000000000 --- a/site/img/search.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/site/img/server.svg b/site/img/server.svg deleted file mode 100644 index ad5d729639..0000000000 --- a/site/img/server.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/site/img/twitter_image.png b/site/img/twitter_image.png deleted file mode 100644 index 5d1f07fe16..0000000000 Binary files a/site/img/twitter_image.png and /dev/null differ diff --git a/site/index.html.js b/site/index.html.js deleted file mode 100644 index 5b08ed5a3e..0000000000 --- a/site/index.html.js +++ /dev/null @@ -1,570 +0,0 @@ -var React = require('react'); -var Site = require('./_core/Site'); -var HeaderLinks = require('./_core/HeaderLinks'); -var Prism = require('./_core/Prism'); -var Search = require('./_core/Search'); - -module.exports = ({ page, section }) => - -
    - -
    - -
    -
    -
    -
    - -
    -
    - -
    -
    - -

    GraphQL

    -
    - -
    -

    Describe your data

    - - {`type Project { - name: String - tagline: String - contributors: [User] -}`} - -
    - -
    -

    Ask for what you want

    - - {`{ - project(name: "GraphQL") { - tagline - } -}`} - -
    - -
    -

    Get predictable results

    - - {`{ - "project": { - "tagline": "A query language for APIs" - } -}`} - -
    -
    - - - -
    -
    - -
    -

    A query language for your API

    -

    - GraphQL is a query language for APIs and a runtime for fulfilling - those queries with your existing data. GraphQL provides a complete - and understandable description of the data in your API, gives - clients the power to ask for exactly what they need and nothing - more, makes it easier to evolve APIs over time, and enables powerful - developer tools.

    -
    - -
    -
    -

    Ask for what you need,
    get exactly that

    - {/*[Illustration: just a simple query and response?]*/} -

    - Send a GraphQL query to your API and get exactly what you need, - nothing more and nothing less. GraphQL queries always return - predictable results. Apps using GraphQL are fast and stable because - they control the data they get, not the server.

    -
    -
    -
    -
    -            {'{'}
    -            {'\n  hero {'}
    -            {'\n    name'}
    -            {'\n    height\n    mass'.split('').map((c, i) =>
    -              {c === '\n' ? 
    : c}
    )} - - {'\n }'} - {'\n}'} -
    -
    -
    -
    - - {`{ - "hero": { - "name": "Luke Skywalker" - } -}`} - -
    -
    - - {`{ - "hero": { - "name": "Luke Skywalker", - "height": 1.72 - } -}`} - -
    -
    - - {`{ - "hero": { - "name": "Luke Skywalker", - "height": 1.72, - "mass": 77 - } -}`} - -
    -
    -