aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2026-02-14 11:52:56 +0900
committernsfisis <nsfisis@gmail.com>2026-02-14 11:53:08 +0900
commit2889b562e64993482bd13fd806af8ed0865bab8b (patch)
tree39400ac4d994fb33d2c544e7d4b9d98f8ecbd86a
parente216c3bc97994b4172d15d52b46d5f6b75f35ea4 (diff)
downloadfeedaka-2889b562e64993482bd13fd806af8ed0865bab8b.tar.gz
feedaka-2889b562e64993482bd13fd806af8ed0865bab8b.tar.zst
feedaka-2889b562e64993482bd13fd806af8ed0865bab8b.zip
refactor: migrate API from GraphQL to REST (TypeSpec/OpenAPI)
Replace the entire GraphQL stack (gqlgen, urql, graphql-codegen) with a TypeSpec → OpenAPI 3.x pipeline using oapi-codegen for Go server stubs and openapi-fetch + openapi-typescript for the frontend client. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
-rw-r--r--CLAUDE.md36
-rw-r--r--backend/api/converters.go79
-rw-r--r--backend/api/echo_context.go21
-rw-r--r--backend/api/generated.go1162
-rw-r--r--backend/api/handler.go16
-rw-r--r--backend/api/handler_articles.go245
-rw-r--r--backend/api/handler_auth.go73
-rw-r--r--backend/api/handler_feeds.go185
-rw-r--r--backend/api/oapi-codegen.yaml6
-rw-r--r--backend/cmd/serve.go56
-rw-r--r--backend/go.mod31
-rw-r--r--backend/go.sum166
-rw-r--r--backend/gqlgen.yml31
-rw-r--r--backend/graphql/generated.go7011
-rw-r--r--backend/graphql/model/generated.go77
-rw-r--r--backend/graphql/resolver/auth_helpers.go29
-rw-r--r--backend/graphql/resolver/pagination.go177
-rw-r--r--backend/graphql/resolver/resolver.go18
-rw-r--r--backend/graphql/resolver/schema.resolvers.go461
-rw-r--r--backend/main.go2
-rw-r--r--frontend/biome.json2
-rw-r--r--frontend/graphql-codegen.ts23
-rw-r--r--frontend/package-lock.json3581
-rw-r--r--frontend/package.json9
-rw-r--r--frontend/src/api/generated.d.ts666
-rw-r--r--frontend/src/components/AddFeedForm.tsx20
-rw-r--r--frontend/src/components/ArticleItem.tsx33
-rw-r--r--frontend/src/components/ArticleList.tsx13
-rw-r--r--frontend/src/components/FeedItem.tsx34
-rw-r--r--frontend/src/components/FeedList.tsx50
-rw-r--r--frontend/src/components/FeedSidebar.tsx30
-rw-r--r--frontend/src/contexts/AuthContext.tsx75
-rw-r--r--frontend/src/graphql/generated/fragment-masking.ts87
-rw-r--r--frontend/src/graphql/generated/gql.ts52
-rw-r--r--frontend/src/graphql/generated/graphql.ts304
-rw-r--r--frontend/src/graphql/generated/index.ts2
-rw-r--r--frontend/src/graphql/mutations.graphql65
-rw-r--r--frontend/src/graphql/queries.graphql94
l---------frontend/src/graphql/schema.graphql1
-rw-r--r--frontend/src/hooks/usePaginatedArticles.ts68
-rw-r--r--frontend/src/main.tsx10
-rw-r--r--frontend/src/pages/Settings.tsx21
-rw-r--r--frontend/src/services/api-client.ts6
-rw-r--r--frontend/src/services/graphql-client.ts10
-rw-r--r--graphql/schema.graphql216
-rw-r--r--justfile1
-rw-r--r--openapi/openapi.yaml435
-rw-r--r--typespec/.gitignore1
-rw-r--r--typespec/main.tsp185
-rw-r--r--typespec/package-lock.json1421
-rw-r--r--typespec/package.json13
-rw-r--r--typespec/tspconfig.yaml4
52 files changed, 5031 insertions, 12383 deletions
diff --git a/CLAUDE.md b/CLAUDE.md
index 4c14a58..13faf40 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -2,15 +2,16 @@
## Project Overview
-Feedaka is a personal RSS/Atom feed reader. Monorepo with a Go backend and React/TypeScript frontend, communicating via GraphQL.
+Feedaka is a personal RSS/Atom feed reader. Monorepo with a Go backend and React/TypeScript frontend, communicating via REST API.
## Tech Stack
-- **Backend:** Go 1.24+, Echo v4, gqlgen (GraphQL), SQLite with sqlc
-- **Frontend:** React 19, TypeScript, Vite, Tailwind CSS, urql (GraphQL client), wouter (routing)
+- **Backend:** Go 1.24+, Echo v4, oapi-codegen (OpenAPI server stubs), SQLite with sqlc
+- **Frontend:** React 19, TypeScript, Vite, Tailwind CSS, openapi-fetch (REST client), wouter (routing)
+- **API Schema:** TypeSpec → OpenAPI 3.x → oapi-codegen (Go) + openapi-typescript (TS)
- **Task Runner:** [just](https://github.com/casey/just) (justfiles at root and `backend/`)
- **Linting/Formatting:** Biome (frontend), go fmt (backend)
-- **Code Generation:** gqlgen + sqlc (backend), graphql-codegen (frontend)
+- **Code Generation:** TypeSpec + oapi-codegen + openapi-typescript + sqlc
## Common Commands
@@ -21,7 +22,7 @@ just build # Build both frontend and backend
just dev # Start dev servers (frontend + backend)
just fmt # Format all code
just check # Type-check all code
-just generate # Regenerate GraphQL and DB code
+just generate # Regenerate API and DB code (TypeSpec → OpenAPI → Go/TS)
```
### Frontend (run from `frontend/`)
@@ -31,7 +32,7 @@ npm run build # Build with TypeScript + Vite
npm run dev # Start Vite dev server
npm run check # Run Biome checks
npm run fix # Auto-fix with Biome
-npm run generate # Generate GraphQL types
+npm run generate # Generate TypeScript types from OpenAPI
```
### Backend (run from `backend/`)
@@ -40,40 +41,45 @@ npm run generate # Generate GraphQL types
just build # Compile Go binary
just fmt # go fmt
just check # Verify build compiles
-just generate # Run go generate (gqlgen + sqlc)
+just generate # Run go generate (oapi-codegen + sqlc)
```
## Code Generation
Generated files — do not edit by hand:
-- `backend/graphql/generated.go` — gqlgen output
-- `backend/graphql/model/generated.go` — gqlgen models
+- `openapi/openapi.yaml` — TypeSpec output (OpenAPI 3.x)
+- `backend/api/generated.go` — oapi-codegen output (Echo server stubs + models)
- `backend/db/users.sql.go`, `backend/db/articles.sql.go`, `backend/db/feeds.sql.go` — sqlc output
-- `frontend/src/graphql/generated/` — graphql-codegen output
+- `frontend/src/api/generated.d.ts` — openapi-typescript output
Regenerate with `just generate` from the repo root.
## Project Structure
```
-graphql/schema.graphql # Shared GraphQL schema (source of truth)
+typespec/
+ main.tsp # API schema definition (source of truth)
+ tspconfig.yaml # TypeSpec compiler config
+openapi/
+ openapi.yaml # Generated OpenAPI 3.x spec
backend/
cmd/ # CLI commands (serve, migrate, create-user)
+ api/ # REST API handlers + generated server stubs
db/ # Database layer, migrations, sqlc queries
- graphql/resolver/ # GraphQL resolvers (edit these for backend logic)
feed/ # Feed fetching logic
auth/ # Authentication
config/ # Configuration
- gqlgen.yml # gqlgen config
+ context/ # Context helpers
sqlc.yaml # sqlc config
frontend/
src/
+ api/ # Generated TypeScript types
components/ # React components
pages/ # Page components
contexts/ # React contexts (auth)
- graphql/ # GraphQL queries/mutations
- services/ # GraphQL client setup
+ hooks/ # Custom hooks
+ services/ # API client setup
biome.json # Biome config
```
diff --git a/backend/api/converters.go b/backend/api/converters.go
new file mode 100644
index 0000000..0ccbdc0
--- /dev/null
+++ b/backend/api/converters.go
@@ -0,0 +1,79 @@
+package api
+
+import (
+ "strconv"
+
+ "undef.ninja/x/feedaka/db"
+)
+
+func dbFeedToAPI(f db.Feed, unreadCount int64) Feed {
+ return Feed{
+ Id: strconv.FormatInt(f.ID, 10),
+ Url: f.Url,
+ Title: f.Title,
+ FetchedAt: f.FetchedAt,
+ IsSubscribed: f.IsSubscribed == 1,
+ UnreadCount: int32(unreadCount),
+ }
+}
+
+type articleRow struct {
+ ID int64
+ FeedID int64
+ Guid string
+ Title string
+ Url string
+ IsRead int64
+ FeedID2 int64
+ FeedUrl string
+ FeedTitle string
+ FeedIsSubscribed int64
+}
+
+func toArticleRow(r any) articleRow {
+ switch v := r.(type) {
+ case db.GetArticlesPaginatedRow:
+ return articleRow{v.ID, v.FeedID, v.Guid, v.Title, v.Url, v.IsRead, v.FeedID2, v.FeedUrl, v.FeedTitle, v.FeedIsSubscribed}
+ case db.GetArticlesPaginatedAfterRow:
+ return articleRow{v.ID, v.FeedID, v.Guid, v.Title, v.Url, v.IsRead, v.FeedID2, v.FeedUrl, v.FeedTitle, v.FeedIsSubscribed}
+ case db.GetArticlesByFeedPaginatedRow:
+ return articleRow{v.ID, v.FeedID, v.Guid, v.Title, v.Url, v.IsRead, v.FeedID2, v.FeedUrl, v.FeedTitle, v.FeedIsSubscribed}
+ case db.GetArticlesByFeedPaginatedAfterRow:
+ return articleRow{v.ID, v.FeedID, v.Guid, v.Title, v.Url, v.IsRead, v.FeedID2, v.FeedUrl, v.FeedTitle, v.FeedIsSubscribed}
+ default:
+ panic("unexpected row type")
+ }
+}
+
+func rowToArticle(row articleRow) Article {
+ return Article{
+ Id: strconv.FormatInt(row.ID, 10),
+ FeedId: strconv.FormatInt(row.FeedID, 10),
+ Guid: row.Guid,
+ Title: row.Title,
+ Url: row.Url,
+ IsRead: row.IsRead == 1,
+ Feed: ArticleFeed{
+ Id: strconv.FormatInt(row.FeedID2, 10),
+ Url: row.FeedUrl,
+ Title: row.FeedTitle,
+ IsSubscribed: row.FeedIsSubscribed == 1,
+ },
+ }
+}
+
+func dbArticleToAPI(row db.GetArticleRow) Article {
+ return Article{
+ Id: strconv.FormatInt(row.ID, 10),
+ FeedId: strconv.FormatInt(row.FeedID, 10),
+ Guid: row.Guid,
+ Title: row.Title,
+ Url: row.Url,
+ IsRead: row.IsRead == 1,
+ Feed: ArticleFeed{
+ Id: strconv.FormatInt(row.FeedID2, 10),
+ Url: row.FeedUrl,
+ Title: row.FeedTitle,
+ },
+ }
+}
diff --git a/backend/api/echo_context.go b/backend/api/echo_context.go
new file mode 100644
index 0000000..b775850
--- /dev/null
+++ b/backend/api/echo_context.go
@@ -0,0 +1,21 @@
+package api
+
+import (
+ "context"
+ "errors"
+
+ "github.com/labstack/echo/v4"
+)
+
+type echoContextKey struct{}
+
+var errNoEchoContext = errors.New("echo context not found")
+
+func getEchoContext(ctx context.Context) echo.Context {
+ echoCtx, _ := ctx.Value(echoContextKey{}).(echo.Context)
+ return echoCtx
+}
+
+func WithEchoContext(ctx context.Context, echoCtx echo.Context) context.Context {
+ return context.WithValue(ctx, echoContextKey{}, echoCtx)
+}
diff --git a/backend/api/generated.go b/backend/api/generated.go
new file mode 100644
index 0000000..4288f40
--- /dev/null
+++ b/backend/api/generated.go
@@ -0,0 +1,1162 @@
+// Package api provides primitives to interact with the openapi HTTP API.
+//
+// Code generated by github.com/oapi-codegen/oapi-codegen/v2 version v2.5.1 DO NOT EDIT.
+package api
+
+import (
+ "context"
+ "encoding/json"
+ "fmt"
+ "net/http"
+
+ "github.com/labstack/echo/v4"
+ "github.com/oapi-codegen/runtime"
+ strictecho "github.com/oapi-codegen/runtime/strictmiddleware/echo"
+)
+
+// AddFeedRequest defines model for AddFeedRequest.
+type AddFeedRequest struct {
+ Url string `json:"url"`
+}
+
+// Article defines model for Article.
+type Article struct {
+ Feed ArticleFeed `json:"feed"`
+ FeedId string `json:"feedId"`
+ Guid string `json:"guid"`
+ Id string `json:"id"`
+ IsRead bool `json:"isRead"`
+ Title string `json:"title"`
+ Url string `json:"url"`
+}
+
+// ArticleConnection defines model for ArticleConnection.
+type ArticleConnection struct {
+ Articles []Article `json:"articles"`
+ PageInfo PageInfo `json:"pageInfo"`
+}
+
+// ArticleFeed defines model for ArticleFeed.
+type ArticleFeed struct {
+ Id string `json:"id"`
+ IsSubscribed bool `json:"isSubscribed"`
+ Title string `json:"title"`
+ Url string `json:"url"`
+}
+
+// ErrorResponse defines model for ErrorResponse.
+type ErrorResponse struct {
+ Message string `json:"message"`
+}
+
+// Feed defines model for Feed.
+type Feed struct {
+ FetchedAt string `json:"fetchedAt"`
+ Id string `json:"id"`
+ IsSubscribed bool `json:"isSubscribed"`
+ Title string `json:"title"`
+ UnreadCount int32 `json:"unreadCount"`
+ Url string `json:"url"`
+}
+
+// LoginRequest defines model for LoginRequest.
+type LoginRequest struct {
+ Password string `json:"password"`
+ Username string `json:"username"`
+}
+
+// LoginResponse defines model for LoginResponse.
+type LoginResponse struct {
+ User User `json:"user"`
+}
+
+// PageInfo defines model for PageInfo.
+type PageInfo struct {
+ EndCursor *string `json:"endCursor,omitempty"`
+ HasNextPage bool `json:"hasNextPage"`
+}
+
+// User defines model for User.
+type User struct {
+ Id string `json:"id"`
+ Username string `json:"username"`
+}
+
+// ArticlesListReadArticlesParams defines parameters for ArticlesListReadArticles.
+type ArticlesListReadArticlesParams struct {
+ FeedId *string `form:"feedId,omitempty" json:"feedId,omitempty"`
+ After *string `form:"after,omitempty" json:"after,omitempty"`
+ First *int32 `form:"first,omitempty" json:"first,omitempty"`
+}
+
+// ArticlesListUnreadArticlesParams defines parameters for ArticlesListUnreadArticles.
+type ArticlesListUnreadArticlesParams struct {
+ FeedId *string `form:"feedId,omitempty" json:"feedId,omitempty"`
+ After *string `form:"after,omitempty" json:"after,omitempty"`
+ First *int32 `form:"first,omitempty" json:"first,omitempty"`
+}
+
+// AuthLoginJSONRequestBody defines body for AuthLogin for application/json ContentType.
+type AuthLoginJSONRequestBody = LoginRequest
+
+// FeedsAddFeedJSONRequestBody defines body for FeedsAddFeed for application/json ContentType.
+type FeedsAddFeedJSONRequestBody = AddFeedRequest
+
+// ServerInterface represents all server handlers.
+type ServerInterface interface {
+
+ // (GET /api/articles/read)
+ ArticlesListReadArticles(ctx echo.Context, params ArticlesListReadArticlesParams) error
+
+ // (GET /api/articles/unread)
+ ArticlesListUnreadArticles(ctx echo.Context, params ArticlesListUnreadArticlesParams) error
+
+ // (GET /api/articles/{articleId})
+ ArticlesGetArticle(ctx echo.Context, articleId string) error
+
+ // (POST /api/articles/{articleId}/read)
+ ArticlesMarkArticleRead(ctx echo.Context, articleId string) error
+
+ // (POST /api/articles/{articleId}/unread)
+ ArticlesMarkArticleUnread(ctx echo.Context, articleId string) error
+
+ // (POST /api/auth/login)
+ AuthLogin(ctx echo.Context) error
+
+ // (POST /api/auth/logout)
+ AuthLogout(ctx echo.Context) error
+
+ // (GET /api/auth/me)
+ AuthGetCurrentUser(ctx echo.Context) error
+
+ // (GET /api/feeds)
+ FeedsListFeeds(ctx echo.Context) error
+
+ // (POST /api/feeds)
+ FeedsAddFeed(ctx echo.Context) error
+
+ // (DELETE /api/feeds/{feedId})
+ FeedsUnsubscribeFeed(ctx echo.Context, feedId string) error
+
+ // (GET /api/feeds/{feedId})
+ FeedsGetFeed(ctx echo.Context, feedId string) error
+
+ // (POST /api/feeds/{feedId}/read)
+ FeedsMarkFeedRead(ctx echo.Context, feedId string) error
+
+ // (POST /api/feeds/{feedId}/unread)
+ FeedsMarkFeedUnread(ctx echo.Context, feedId string) error
+}
+
+// ServerInterfaceWrapper converts echo contexts to parameters.
+type ServerInterfaceWrapper struct {
+ Handler ServerInterface
+}
+
+// ArticlesListReadArticles converts echo context to params.
+func (w *ServerInterfaceWrapper) ArticlesListReadArticles(ctx echo.Context) error {
+ var err error
+
+ // Parameter object where we will unmarshal all parameters from the context
+ var params ArticlesListReadArticlesParams
+ // ------------- Optional query parameter "feedId" -------------
+
+ err = runtime.BindQueryParameter("form", false, false, "feedId", ctx.QueryParams(), &params.FeedId)
+ if err != nil {
+ return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter feedId: %s", err))
+ }
+
+ // ------------- Optional query parameter "after" -------------
+
+ err = runtime.BindQueryParameter("form", false, false, "after", ctx.QueryParams(), &params.After)
+ if err != nil {
+ return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter after: %s", err))
+ }
+
+ // ------------- Optional query parameter "first" -------------
+
+ err = runtime.BindQueryParameter("form", false, false, "first", ctx.QueryParams(), &params.First)
+ if err != nil {
+ return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter first: %s", err))
+ }
+
+ // Invoke the callback with all the unmarshaled arguments
+ err = w.Handler.ArticlesListReadArticles(ctx, params)
+ return err
+}
+
+// ArticlesListUnreadArticles converts echo context to params.
+func (w *ServerInterfaceWrapper) ArticlesListUnreadArticles(ctx echo.Context) error {
+ var err error
+
+ // Parameter object where we will unmarshal all parameters from the context
+ var params ArticlesListUnreadArticlesParams
+ // ------------- Optional query parameter "feedId" -------------
+
+ err = runtime.BindQueryParameter("form", false, false, "feedId", ctx.QueryParams(), &params.FeedId)
+ if err != nil {
+ return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter feedId: %s", err))
+ }
+
+ // ------------- Optional query parameter "after" -------------
+
+ err = runtime.BindQueryParameter("form", false, false, "after", ctx.QueryParams(), &params.After)
+ if err != nil {
+ return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter after: %s", err))
+ }
+
+ // ------------- Optional query parameter "first" -------------
+
+ err = runtime.BindQueryParameter("form", false, false, "first", ctx.QueryParams(), &params.First)
+ if err != nil {
+ return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter first: %s", err))
+ }
+
+ // Invoke the callback with all the unmarshaled arguments
+ err = w.Handler.ArticlesListUnreadArticles(ctx, params)
+ return err
+}
+
+// ArticlesGetArticle converts echo context to params.
+func (w *ServerInterfaceWrapper) ArticlesGetArticle(ctx echo.Context) error {
+ var err error
+ // ------------- Path parameter "articleId" -------------
+ var articleId string
+
+ err = runtime.BindStyledParameterWithOptions("simple", "articleId", ctx.Param("articleId"), &articleId, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true})
+ if err != nil {
+ return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter articleId: %s", err))
+ }
+
+ // Invoke the callback with all the unmarshaled arguments
+ err = w.Handler.ArticlesGetArticle(ctx, articleId)
+ return err
+}
+
+// ArticlesMarkArticleRead converts echo context to params.
+func (w *ServerInterfaceWrapper) ArticlesMarkArticleRead(ctx echo.Context) error {
+ var err error
+ // ------------- Path parameter "articleId" -------------
+ var articleId string
+
+ err = runtime.BindStyledParameterWithOptions("simple", "articleId", ctx.Param("articleId"), &articleId, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true})
+ if err != nil {
+ return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter articleId: %s", err))
+ }
+
+ // Invoke the callback with all the unmarshaled arguments
+ err = w.Handler.ArticlesMarkArticleRead(ctx, articleId)
+ return err
+}
+
+// ArticlesMarkArticleUnread converts echo context to params.
+func (w *ServerInterfaceWrapper) ArticlesMarkArticleUnread(ctx echo.Context) error {
+ var err error
+ // ------------- Path parameter "articleId" -------------
+ var articleId string
+
+ err = runtime.BindStyledParameterWithOptions("simple", "articleId", ctx.Param("articleId"), &articleId, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true})
+ if err != nil {
+ return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter articleId: %s", err))
+ }
+
+ // Invoke the callback with all the unmarshaled arguments
+ err = w.Handler.ArticlesMarkArticleUnread(ctx, articleId)
+ return err
+}
+
+// AuthLogin converts echo context to params.
+func (w *ServerInterfaceWrapper) AuthLogin(ctx echo.Context) error {
+ var err error
+
+ // Invoke the callback with all the unmarshaled arguments
+ err = w.Handler.AuthLogin(ctx)
+ return err
+}
+
+// AuthLogout converts echo context to params.
+func (w *ServerInterfaceWrapper) AuthLogout(ctx echo.Context) error {
+ var err error
+
+ // Invoke the callback with all the unmarshaled arguments
+ err = w.Handler.AuthLogout(ctx)
+ return err
+}
+
+// AuthGetCurrentUser converts echo context to params.
+func (w *ServerInterfaceWrapper) AuthGetCurrentUser(ctx echo.Context) error {
+ var err error
+
+ // Invoke the callback with all the unmarshaled arguments
+ err = w.Handler.AuthGetCurrentUser(ctx)
+ return err
+}
+
+// FeedsListFeeds converts echo context to params.
+func (w *ServerInterfaceWrapper) FeedsListFeeds(ctx echo.Context) error {
+ var err error
+
+ // Invoke the callback with all the unmarshaled arguments
+ err = w.Handler.FeedsListFeeds(ctx)
+ return err
+}
+
+// FeedsAddFeed converts echo context to params.
+func (w *ServerInterfaceWrapper) FeedsAddFeed(ctx echo.Context) error {
+ var err error
+
+ // Invoke the callback with all the unmarshaled arguments
+ err = w.Handler.FeedsAddFeed(ctx)
+ return err
+}
+
+// FeedsUnsubscribeFeed converts echo context to params.
+func (w *ServerInterfaceWrapper) FeedsUnsubscribeFeed(ctx echo.Context) error {
+ var err error
+ // ------------- Path parameter "feedId" -------------
+ var feedId string
+
+ err = runtime.BindStyledParameterWithOptions("simple", "feedId", ctx.Param("feedId"), &feedId, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true})
+ if err != nil {
+ return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter feedId: %s", err))
+ }
+
+ // Invoke the callback with all the unmarshaled arguments
+ err = w.Handler.FeedsUnsubscribeFeed(ctx, feedId)
+ return err
+}
+
+// FeedsGetFeed converts echo context to params.
+func (w *ServerInterfaceWrapper) FeedsGetFeed(ctx echo.Context) error {
+ var err error
+ // ------------- Path parameter "feedId" -------------
+ var feedId string
+
+ err = runtime.BindStyledParameterWithOptions("simple", "feedId", ctx.Param("feedId"), &feedId, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true})
+ if err != nil {
+ return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter feedId: %s", err))
+ }
+
+ // Invoke the callback with all the unmarshaled arguments
+ err = w.Handler.FeedsGetFeed(ctx, feedId)
+ return err
+}
+
+// FeedsMarkFeedRead converts echo context to params.
+func (w *ServerInterfaceWrapper) FeedsMarkFeedRead(ctx echo.Context) error {
+ var err error
+ // ------------- Path parameter "feedId" -------------
+ var feedId string
+
+ err = runtime.BindStyledParameterWithOptions("simple", "feedId", ctx.Param("feedId"), &feedId, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true})
+ if err != nil {
+ return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter feedId: %s", err))
+ }
+
+ // Invoke the callback with all the unmarshaled arguments
+ err = w.Handler.FeedsMarkFeedRead(ctx, feedId)
+ return err
+}
+
+// FeedsMarkFeedUnread converts echo context to params.
+func (w *ServerInterfaceWrapper) FeedsMarkFeedUnread(ctx echo.Context) error {
+ var err error
+ // ------------- Path parameter "feedId" -------------
+ var feedId string
+
+ err = runtime.BindStyledParameterWithOptions("simple", "feedId", ctx.Param("feedId"), &feedId, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true})
+ if err != nil {
+ return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter feedId: %s", err))
+ }
+
+ // Invoke the callback with all the unmarshaled arguments
+ err = w.Handler.FeedsMarkFeedUnread(ctx, feedId)
+ return err
+}
+
+// This is a simple interface which specifies echo.Route addition functions which
+// are present on both echo.Echo and echo.Group, since we want to allow using
+// either of them for path registration
+type EchoRouter interface {
+ CONNECT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route
+ DELETE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route
+ GET(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route
+ HEAD(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route
+ OPTIONS(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route
+ PATCH(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route
+ POST(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route
+ PUT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route
+ TRACE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route
+}
+
+// RegisterHandlers adds each server route to the EchoRouter.
+func RegisterHandlers(router EchoRouter, si ServerInterface) {
+ RegisterHandlersWithBaseURL(router, si, "")
+}
+
+// Registers handlers, and prepends BaseURL to the paths, so that the paths
+// can be served under a prefix.
+func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL string) {
+
+ wrapper := ServerInterfaceWrapper{
+ Handler: si,
+ }
+
+ router.GET(baseURL+"/api/articles/read", wrapper.ArticlesListReadArticles)
+ router.GET(baseURL+"/api/articles/unread", wrapper.ArticlesListUnreadArticles)
+ router.GET(baseURL+"/api/articles/:articleId", wrapper.ArticlesGetArticle)
+ router.POST(baseURL+"/api/articles/:articleId/read", wrapper.ArticlesMarkArticleRead)
+ router.POST(baseURL+"/api/articles/:articleId/unread", wrapper.ArticlesMarkArticleUnread)
+ router.POST(baseURL+"/api/auth/login", wrapper.AuthLogin)
+ router.POST(baseURL+"/api/auth/logout", wrapper.AuthLogout)
+ router.GET(baseURL+"/api/auth/me", wrapper.AuthGetCurrentUser)
+ router.GET(baseURL+"/api/feeds", wrapper.FeedsListFeeds)
+ router.POST(baseURL+"/api/feeds", wrapper.FeedsAddFeed)
+ router.DELETE(baseURL+"/api/feeds/:feedId", wrapper.FeedsUnsubscribeFeed)
+ router.GET(baseURL+"/api/feeds/:feedId", wrapper.FeedsGetFeed)
+ router.POST(baseURL+"/api/feeds/:feedId/read", wrapper.FeedsMarkFeedRead)
+ router.POST(baseURL+"/api/feeds/:feedId/unread", wrapper.FeedsMarkFeedUnread)
+
+}
+
+type ArticlesListReadArticlesRequestObject struct {
+ Params ArticlesListReadArticlesParams
+}
+
+type ArticlesListReadArticlesResponseObject interface {
+ VisitArticlesListReadArticlesResponse(w http.ResponseWriter) error
+}
+
+type ArticlesListReadArticles200JSONResponse ArticleConnection
+
+func (response ArticlesListReadArticles200JSONResponse) VisitArticlesListReadArticlesResponse(w http.ResponseWriter) error {
+ w.Header().Set("Content-Type", "application/json")
+ w.WriteHeader(200)
+
+ return json.NewEncoder(w).Encode(response)
+}
+
+type ArticlesListUnreadArticlesRequestObject struct {
+ Params ArticlesListUnreadArticlesParams
+}
+
+type ArticlesListUnreadArticlesResponseObject interface {
+ VisitArticlesListUnreadArticlesResponse(w http.ResponseWriter) error
+}
+
+type ArticlesListUnreadArticles200JSONResponse ArticleConnection
+
+func (response ArticlesListUnreadArticles200JSONResponse) VisitArticlesListUnreadArticlesResponse(w http.ResponseWriter) error {
+ w.Header().Set("Content-Type", "application/json")
+ w.WriteHeader(200)
+
+ return json.NewEncoder(w).Encode(response)
+}
+
+type ArticlesGetArticleRequestObject struct {
+ ArticleId string `json:"articleId"`
+}
+
+type ArticlesGetArticleResponseObject interface {
+ VisitArticlesGetArticleResponse(w http.ResponseWriter) error
+}
+
+type ArticlesGetArticle200JSONResponse Article
+
+func (response ArticlesGetArticle200JSONResponse) VisitArticlesGetArticleResponse(w http.ResponseWriter) error {
+ w.Header().Set("Content-Type", "application/json")
+ w.WriteHeader(200)
+
+ return json.NewEncoder(w).Encode(response)
+}
+
+type ArticlesGetArticle404JSONResponse ErrorResponse
+
+func (response ArticlesGetArticle404JSONResponse) VisitArticlesGetArticleResponse(w http.ResponseWriter) error {
+ w.Header().Set("Content-Type", "application/json")
+ w.WriteHeader(404)
+
+ return json.NewEncoder(w).Encode(response)
+}
+
+type ArticlesMarkArticleReadRequestObject struct {
+ ArticleId string `json:"articleId"`
+}
+
+type ArticlesMarkArticleReadResponseObject interface {
+ VisitArticlesMarkArticleReadResponse(w http.ResponseWriter) error
+}
+
+type ArticlesMarkArticleRead200JSONResponse Article
+
+func (response ArticlesMarkArticleRead200JSONResponse) VisitArticlesMarkArticleReadResponse(w http.ResponseWriter) error {
+ w.Header().Set("Content-Type", "application/json")
+ w.WriteHeader(200)
+
+ return json.NewEncoder(w).Encode(response)
+}
+
+type ArticlesMarkArticleRead404JSONResponse ErrorResponse
+
+func (response ArticlesMarkArticleRead404JSONResponse) VisitArticlesMarkArticleReadResponse(w http.ResponseWriter) error {
+ w.Header().Set("Content-Type", "application/json")
+ w.WriteHeader(404)
+
+ return json.NewEncoder(w).Encode(response)
+}
+
+type ArticlesMarkArticleUnreadRequestObject struct {
+ ArticleId string `json:"articleId"`
+}
+
+type ArticlesMarkArticleUnreadResponseObject interface {
+ VisitArticlesMarkArticleUnreadResponse(w http.ResponseWriter) error
+}
+
+type ArticlesMarkArticleUnread200JSONResponse Article
+
+func (response ArticlesMarkArticleUnread200JSONResponse) VisitArticlesMarkArticleUnreadResponse(w http.ResponseWriter) error {
+ w.Header().Set("Content-Type", "application/json")
+ w.WriteHeader(200)
+
+ return json.NewEncoder(w).Encode(response)
+}
+
+type ArticlesMarkArticleUnread404JSONResponse ErrorResponse
+
+func (response ArticlesMarkArticleUnread404JSONResponse) VisitArticlesMarkArticleUnreadResponse(w http.ResponseWriter) error {
+ w.Header().Set("Content-Type", "application/json")
+ w.WriteHeader(404)
+
+ return json.NewEncoder(w).Encode(response)
+}
+
+type AuthLoginRequestObject struct {
+ Body *AuthLoginJSONRequestBody
+}
+
+type AuthLoginResponseObject interface {
+ VisitAuthLoginResponse(w http.ResponseWriter) error
+}
+
+type AuthLogin200JSONResponse LoginResponse
+
+func (response AuthLogin200JSONResponse) VisitAuthLoginResponse(w http.ResponseWriter) error {
+ w.Header().Set("Content-Type", "application/json")
+ w.WriteHeader(200)
+
+ return json.NewEncoder(w).Encode(response)
+}
+
+type AuthLogin401JSONResponse ErrorResponse
+
+func (response AuthLogin401JSONResponse) VisitAuthLoginResponse(w http.ResponseWriter) error {
+ w.Header().Set("Content-Type", "application/json")
+ w.WriteHeader(401)
+
+ return json.NewEncoder(w).Encode(response)
+}
+
+type AuthLogoutRequestObject struct {
+}
+
+type AuthLogoutResponseObject interface {
+ VisitAuthLogoutResponse(w http.ResponseWriter) error
+}
+
+type AuthLogout204Response struct {
+}
+
+func (response AuthLogout204Response) VisitAuthLogoutResponse(w http.ResponseWriter) error {
+ w.WriteHeader(204)
+ return nil
+}
+
+type AuthLogout401JSONResponse ErrorResponse
+
+func (response AuthLogout401JSONResponse) VisitAuthLogoutResponse(w http.ResponseWriter) error {
+ w.Header().Set("Content-Type", "application/json")
+ w.WriteHeader(401)
+
+ return json.NewEncoder(w).Encode(response)
+}
+
+type AuthGetCurrentUserRequestObject struct {
+}
+
+type AuthGetCurrentUserResponseObject interface {
+ VisitAuthGetCurrentUserResponse(w http.ResponseWriter) error
+}
+
+type AuthGetCurrentUser200JSONResponse User
+
+func (response AuthGetCurrentUser200JSONResponse) VisitAuthGetCurrentUserResponse(w http.ResponseWriter) error {
+ w.Header().Set("Content-Type", "application/json")
+ w.WriteHeader(200)
+
+ return json.NewEncoder(w).Encode(response)
+}
+
+type AuthGetCurrentUser401JSONResponse ErrorResponse
+
+func (response AuthGetCurrentUser401JSONResponse) VisitAuthGetCurrentUserResponse(w http.ResponseWriter) error {
+ w.Header().Set("Content-Type", "application/json")
+ w.WriteHeader(401)
+
+ return json.NewEncoder(w).Encode(response)
+}
+
+type FeedsListFeedsRequestObject struct {
+}
+
+type FeedsListFeedsResponseObject interface {
+ VisitFeedsListFeedsResponse(w http.ResponseWriter) error
+}
+
+type FeedsListFeeds200JSONResponse []Feed
+
+func (response FeedsListFeeds200JSONResponse) VisitFeedsListFeedsResponse(w http.ResponseWriter) error {
+ w.Header().Set("Content-Type", "application/json")
+ w.WriteHeader(200)
+
+ return json.NewEncoder(w).Encode(response)
+}
+
+type FeedsAddFeedRequestObject struct {
+ Body *FeedsAddFeedJSONRequestBody
+}
+
+type FeedsAddFeedResponseObject interface {
+ VisitFeedsAddFeedResponse(w http.ResponseWriter) error
+}
+
+type FeedsAddFeed201JSONResponse Feed
+
+func (response FeedsAddFeed201JSONResponse) VisitFeedsAddFeedResponse(w http.ResponseWriter) error {
+ w.Header().Set("Content-Type", "application/json")
+ w.WriteHeader(201)
+
+ return json.NewEncoder(w).Encode(response)
+}
+
+type FeedsAddFeed400JSONResponse ErrorResponse
+
+func (response FeedsAddFeed400JSONResponse) VisitFeedsAddFeedResponse(w http.ResponseWriter) error {
+ w.Header().Set("Content-Type", "application/json")
+ w.WriteHeader(400)
+
+ return json.NewEncoder(w).Encode(response)
+}
+
+type FeedsUnsubscribeFeedRequestObject struct {
+ FeedId string `json:"feedId"`
+}
+
+type FeedsUnsubscribeFeedResponseObject interface {
+ VisitFeedsUnsubscribeFeedResponse(w http.ResponseWriter) error
+}
+
+type FeedsUnsubscribeFeed204Response struct {
+}
+
+func (response FeedsUnsubscribeFeed204Response) VisitFeedsUnsubscribeFeedResponse(w http.ResponseWriter) error {
+ w.WriteHeader(204)
+ return nil
+}
+
+type FeedsUnsubscribeFeed404JSONResponse ErrorResponse
+
+func (response FeedsUnsubscribeFeed404JSONResponse) VisitFeedsUnsubscribeFeedResponse(w http.ResponseWriter) error {
+ w.Header().Set("Content-Type", "application/json")
+ w.WriteHeader(404)
+
+ return json.NewEncoder(w).Encode(response)
+}
+
+type FeedsGetFeedRequestObject struct {
+ FeedId string `json:"feedId"`
+}
+
+type FeedsGetFeedResponseObject interface {
+ VisitFeedsGetFeedResponse(w http.ResponseWriter) error
+}
+
+type FeedsGetFeed200JSONResponse Feed
+
+func (response FeedsGetFeed200JSONResponse) VisitFeedsGetFeedResponse(w http.ResponseWriter) error {
+ w.Header().Set("Content-Type", "application/json")
+ w.WriteHeader(200)
+
+ return json.NewEncoder(w).Encode(response)
+}
+
+type FeedsGetFeed404JSONResponse ErrorResponse
+
+func (response FeedsGetFeed404JSONResponse) VisitFeedsGetFeedResponse(w http.ResponseWriter) error {
+ w.Header().Set("Content-Type", "application/json")
+ w.WriteHeader(404)
+
+ return json.NewEncoder(w).Encode(response)
+}
+
+type FeedsMarkFeedReadRequestObject struct {
+ FeedId string `json:"feedId"`
+}
+
+type FeedsMarkFeedReadResponseObject interface {
+ VisitFeedsMarkFeedReadResponse(w http.ResponseWriter) error
+}
+
+type FeedsMarkFeedRead200JSONResponse Feed
+
+func (response FeedsMarkFeedRead200JSONResponse) VisitFeedsMarkFeedReadResponse(w http.ResponseWriter) error {
+ w.Header().Set("Content-Type", "application/json")
+ w.WriteHeader(200)
+
+ return json.NewEncoder(w).Encode(response)
+}
+
+type FeedsMarkFeedRead404JSONResponse ErrorResponse
+
+func (response FeedsMarkFeedRead404JSONResponse) VisitFeedsMarkFeedReadResponse(w http.ResponseWriter) error {
+ w.Header().Set("Content-Type", "application/json")
+ w.WriteHeader(404)
+
+ return json.NewEncoder(w).Encode(response)
+}
+
+type FeedsMarkFeedUnreadRequestObject struct {
+ FeedId string `json:"feedId"`
+}
+
+type FeedsMarkFeedUnreadResponseObject interface {
+ VisitFeedsMarkFeedUnreadResponse(w http.ResponseWriter) error
+}
+
+type FeedsMarkFeedUnread200JSONResponse Feed
+
+func (response FeedsMarkFeedUnread200JSONResponse) VisitFeedsMarkFeedUnreadResponse(w http.ResponseWriter) error {
+ w.Header().Set("Content-Type", "application/json")
+ w.WriteHeader(200)
+
+ return json.NewEncoder(w).Encode(response)
+}
+
+type FeedsMarkFeedUnread404JSONResponse ErrorResponse
+
+func (response FeedsMarkFeedUnread404JSONResponse) VisitFeedsMarkFeedUnreadResponse(w http.ResponseWriter) error {
+ w.Header().Set("Content-Type", "application/json")
+ w.WriteHeader(404)
+
+ return json.NewEncoder(w).Encode(response)
+}
+
+// StrictServerInterface represents all server handlers.
+type StrictServerInterface interface {
+
+ // (GET /api/articles/read)
+ ArticlesListReadArticles(ctx context.Context, request ArticlesListReadArticlesRequestObject) (ArticlesListReadArticlesResponseObject, error)
+
+ // (GET /api/articles/unread)
+ ArticlesListUnreadArticles(ctx context.Context, request ArticlesListUnreadArticlesRequestObject) (ArticlesListUnreadArticlesResponseObject, error)
+
+ // (GET /api/articles/{articleId})
+ ArticlesGetArticle(ctx context.Context, request ArticlesGetArticleRequestObject) (ArticlesGetArticleResponseObject, error)
+
+ // (POST /api/articles/{articleId}/read)
+ ArticlesMarkArticleRead(ctx context.Context, request ArticlesMarkArticleReadRequestObject) (ArticlesMarkArticleReadResponseObject, error)
+
+ // (POST /api/articles/{articleId}/unread)
+ ArticlesMarkArticleUnread(ctx context.Context, request ArticlesMarkArticleUnreadRequestObject) (ArticlesMarkArticleUnreadResponseObject, error)
+
+ // (POST /api/auth/login)
+ AuthLogin(ctx context.Context, request AuthLoginRequestObject) (AuthLoginResponseObject, error)
+
+ // (POST /api/auth/logout)
+ AuthLogout(ctx context.Context, request AuthLogoutRequestObject) (AuthLogoutResponseObject, error)
+
+ // (GET /api/auth/me)
+ AuthGetCurrentUser(ctx context.Context, request AuthGetCurrentUserRequestObject) (AuthGetCurrentUserResponseObject, error)
+
+ // (GET /api/feeds)
+ FeedsListFeeds(ctx context.Context, request FeedsListFeedsRequestObject) (FeedsListFeedsResponseObject, error)
+
+ // (POST /api/feeds)
+ FeedsAddFeed(ctx context.Context, request FeedsAddFeedRequestObject) (FeedsAddFeedResponseObject, error)
+
+ // (DELETE /api/feeds/{feedId})
+ FeedsUnsubscribeFeed(ctx context.Context, request FeedsUnsubscribeFeedRequestObject) (FeedsUnsubscribeFeedResponseObject, error)
+
+ // (GET /api/feeds/{feedId})
+ FeedsGetFeed(ctx context.Context, request FeedsGetFeedRequestObject) (FeedsGetFeedResponseObject, error)
+
+ // (POST /api/feeds/{feedId}/read)
+ FeedsMarkFeedRead(ctx context.Context, request FeedsMarkFeedReadRequestObject) (FeedsMarkFeedReadResponseObject, error)
+
+ // (POST /api/feeds/{feedId}/unread)
+ FeedsMarkFeedUnread(ctx context.Context, request FeedsMarkFeedUnreadRequestObject) (FeedsMarkFeedUnreadResponseObject, error)
+}
+
+type StrictHandlerFunc = strictecho.StrictEchoHandlerFunc
+type StrictMiddlewareFunc = strictecho.StrictEchoMiddlewareFunc
+
+func NewStrictHandler(ssi StrictServerInterface, middlewares []StrictMiddlewareFunc) ServerInterface {
+ return &strictHandler{ssi: ssi, middlewares: middlewares}
+}
+
+type strictHandler struct {
+ ssi StrictServerInterface
+ middlewares []StrictMiddlewareFunc
+}
+
+// ArticlesListReadArticles operation middleware
+func (sh *strictHandler) ArticlesListReadArticles(ctx echo.Context, params ArticlesListReadArticlesParams) error {
+ var request ArticlesListReadArticlesRequestObject
+
+ request.Params = params
+
+ handler := func(ctx echo.Context, request interface{}) (interface{}, error) {
+ return sh.ssi.ArticlesListReadArticles(ctx.Request().Context(), request.(ArticlesListReadArticlesRequestObject))
+ }
+ for _, middleware := range sh.middlewares {
+ handler = middleware(handler, "ArticlesListReadArticles")
+ }
+
+ response, err := handler(ctx, request)
+
+ if err != nil {
+ return err
+ } else if validResponse, ok := response.(ArticlesListReadArticlesResponseObject); ok {
+ return validResponse.VisitArticlesListReadArticlesResponse(ctx.Response())
+ } else if response != nil {
+ return fmt.Errorf("unexpected response type: %T", response)
+ }
+ return nil
+}
+
+// ArticlesListUnreadArticles operation middleware
+func (sh *strictHandler) ArticlesListUnreadArticles(ctx echo.Context, params ArticlesListUnreadArticlesParams) error {
+ var request ArticlesListUnreadArticlesRequestObject
+
+ request.Params = params
+
+ handler := func(ctx echo.Context, request interface{}) (interface{}, error) {
+ return sh.ssi.ArticlesListUnreadArticles(ctx.Request().Context(), request.(ArticlesListUnreadArticlesRequestObject))
+ }
+ for _, middleware := range sh.middlewares {
+ handler = middleware(handler, "ArticlesListUnreadArticles")
+ }
+
+ response, err := handler(ctx, request)
+
+ if err != nil {
+ return err
+ } else if validResponse, ok := response.(ArticlesListUnreadArticlesResponseObject); ok {
+ return validResponse.VisitArticlesListUnreadArticlesResponse(ctx.Response())
+ } else if response != nil {
+ return fmt.Errorf("unexpected response type: %T", response)
+ }
+ return nil
+}
+
+// ArticlesGetArticle operation middleware
+func (sh *strictHandler) ArticlesGetArticle(ctx echo.Context, articleId string) error {
+ var request ArticlesGetArticleRequestObject
+
+ request.ArticleId = articleId
+
+ handler := func(ctx echo.Context, request interface{}) (interface{}, error) {
+ return sh.ssi.ArticlesGetArticle(ctx.Request().Context(), request.(ArticlesGetArticleRequestObject))
+ }
+ for _, middleware := range sh.middlewares {
+ handler = middleware(handler, "ArticlesGetArticle")
+ }
+
+ response, err := handler(ctx, request)
+
+ if err != nil {
+ return err
+ } else if validResponse, ok := response.(ArticlesGetArticleResponseObject); ok {
+ return validResponse.VisitArticlesGetArticleResponse(ctx.Response())
+ } else if response != nil {
+ return fmt.Errorf("unexpected response type: %T", response)
+ }
+ return nil
+}
+
+// ArticlesMarkArticleRead operation middleware
+func (sh *strictHandler) ArticlesMarkArticleRead(ctx echo.Context, articleId string) error {
+ var request ArticlesMarkArticleReadRequestObject
+
+ request.ArticleId = articleId
+
+ handler := func(ctx echo.Context, request interface{}) (interface{}, error) {
+ return sh.ssi.ArticlesMarkArticleRead(ctx.Request().Context(), request.(ArticlesMarkArticleReadRequestObject))
+ }
+ for _, middleware := range sh.middlewares {
+ handler = middleware(handler, "ArticlesMarkArticleRead")
+ }
+
+ response, err := handler(ctx, request)
+
+ if err != nil {
+ return err
+ } else if validResponse, ok := response.(ArticlesMarkArticleReadResponseObject); ok {
+ return validResponse.VisitArticlesMarkArticleReadResponse(ctx.Response())
+ } else if response != nil {
+ return fmt.Errorf("unexpected response type: %T", response)
+ }
+ return nil
+}
+
+// ArticlesMarkArticleUnread operation middleware
+func (sh *strictHandler) ArticlesMarkArticleUnread(ctx echo.Context, articleId string) error {
+ var request ArticlesMarkArticleUnreadRequestObject
+
+ request.ArticleId = articleId
+
+ handler := func(ctx echo.Context, request interface{}) (interface{}, error) {
+ return sh.ssi.ArticlesMarkArticleUnread(ctx.Request().Context(), request.(ArticlesMarkArticleUnreadRequestObject))
+ }
+ for _, middleware := range sh.middlewares {
+ handler = middleware(handler, "ArticlesMarkArticleUnread")
+ }
+
+ response, err := handler(ctx, request)
+
+ if err != nil {
+ return err
+ } else if validResponse, ok := response.(ArticlesMarkArticleUnreadResponseObject); ok {
+ return validResponse.VisitArticlesMarkArticleUnreadResponse(ctx.Response())
+ } else if response != nil {
+ return fmt.Errorf("unexpected response type: %T", response)
+ }
+ return nil
+}
+
+// AuthLogin operation middleware
+func (sh *strictHandler) AuthLogin(ctx echo.Context) error {
+ var request AuthLoginRequestObject
+
+ var body AuthLoginJSONRequestBody
+ if err := ctx.Bind(&body); err != nil {
+ return err
+ }
+ request.Body = &body
+
+ handler := func(ctx echo.Context, request interface{}) (interface{}, error) {
+ return sh.ssi.AuthLogin(ctx.Request().Context(), request.(AuthLoginRequestObject))
+ }
+ for _, middleware := range sh.middlewares {
+ handler = middleware(handler, "AuthLogin")
+ }
+
+ response, err := handler(ctx, request)
+
+ if err != nil {
+ return err
+ } else if validResponse, ok := response.(AuthLoginResponseObject); ok {
+ return validResponse.VisitAuthLoginResponse(ctx.Response())
+ } else if response != nil {
+ return fmt.Errorf("unexpected response type: %T", response)
+ }
+ return nil
+}
+
+// AuthLogout operation middleware
+func (sh *strictHandler) AuthLogout(ctx echo.Context) error {
+ var request AuthLogoutRequestObject
+
+ handler := func(ctx echo.Context, request interface{}) (interface{}, error) {
+ return sh.ssi.AuthLogout(ctx.Request().Context(), request.(AuthLogoutRequestObject))
+ }
+ for _, middleware := range sh.middlewares {
+ handler = middleware(handler, "AuthLogout")
+ }
+
+ response, err := handler(ctx, request)
+
+ if err != nil {
+ return err
+ } else if validResponse, ok := response.(AuthLogoutResponseObject); ok {
+ return validResponse.VisitAuthLogoutResponse(ctx.Response())
+ } else if response != nil {
+ return fmt.Errorf("unexpected response type: %T", response)
+ }
+ return nil
+}
+
+// AuthGetCurrentUser operation middleware
+func (sh *strictHandler) AuthGetCurrentUser(ctx echo.Context) error {
+ var request AuthGetCurrentUserRequestObject
+
+ handler := func(ctx echo.Context, request interface{}) (interface{}, error) {
+ return sh.ssi.AuthGetCurrentUser(ctx.Request().Context(), request.(AuthGetCurrentUserRequestObject))
+ }
+ for _, middleware := range sh.middlewares {
+ handler = middleware(handler, "AuthGetCurrentUser")
+ }
+
+ response, err := handler(ctx, request)
+
+ if err != nil {
+ return err
+ } else if validResponse, ok := response.(AuthGetCurrentUserResponseObject); ok {
+ return validResponse.VisitAuthGetCurrentUserResponse(ctx.Response())
+ } else if response != nil {
+ return fmt.Errorf("unexpected response type: %T", response)
+ }
+ return nil
+}
+
+// FeedsListFeeds operation middleware
+func (sh *strictHandler) FeedsListFeeds(ctx echo.Context) error {
+ var request FeedsListFeedsRequestObject
+
+ handler := func(ctx echo.Context, request interface{}) (interface{}, error) {
+ return sh.ssi.FeedsListFeeds(ctx.Request().Context(), request.(FeedsListFeedsRequestObject))
+ }
+ for _, middleware := range sh.middlewares {
+ handler = middleware(handler, "FeedsListFeeds")
+ }
+
+ response, err := handler(ctx, request)
+
+ if err != nil {
+ return err
+ } else if validResponse, ok := response.(FeedsListFeedsResponseObject); ok {
+ return validResponse.VisitFeedsListFeedsResponse(ctx.Response())
+ } else if response != nil {
+ return fmt.Errorf("unexpected response type: %T", response)
+ }
+ return nil
+}
+
+// FeedsAddFeed operation middleware
+func (sh *strictHandler) FeedsAddFeed(ctx echo.Context) error {
+ var request FeedsAddFeedRequestObject
+
+ var body FeedsAddFeedJSONRequestBody
+ if err := ctx.Bind(&body); err != nil {
+ return err
+ }
+ request.Body = &body
+
+ handler := func(ctx echo.Context, request interface{}) (interface{}, error) {
+ return sh.ssi.FeedsAddFeed(ctx.Request().Context(), request.(FeedsAddFeedRequestObject))
+ }
+ for _, middleware := range sh.middlewares {
+ handler = middleware(handler, "FeedsAddFeed")
+ }
+
+ response, err := handler(ctx, request)
+
+ if err != nil {
+ return err
+ } else if validResponse, ok := response.(FeedsAddFeedResponseObject); ok {
+ return validResponse.VisitFeedsAddFeedResponse(ctx.Response())
+ } else if response != nil {
+ return fmt.Errorf("unexpected response type: %T", response)
+ }
+ return nil
+}
+
+// FeedsUnsubscribeFeed operation middleware
+func (sh *strictHandler) FeedsUnsubscribeFeed(ctx echo.Context, feedId string) error {
+ var request FeedsUnsubscribeFeedRequestObject
+
+ request.FeedId = feedId
+
+ handler := func(ctx echo.Context, request interface{}) (interface{}, error) {
+ return sh.ssi.FeedsUnsubscribeFeed(ctx.Request().Context(), request.(FeedsUnsubscribeFeedRequestObject))
+ }
+ for _, middleware := range sh.middlewares {
+ handler = middleware(handler, "FeedsUnsubscribeFeed")
+ }
+
+ response, err := handler(ctx, request)
+
+ if err != nil {
+ return err
+ } else if validResponse, ok := response.(FeedsUnsubscribeFeedResponseObject); ok {
+ return validResponse.VisitFeedsUnsubscribeFeedResponse(ctx.Response())
+ } else if response != nil {
+ return fmt.Errorf("unexpected response type: %T", response)
+ }
+ return nil
+}
+
+// FeedsGetFeed operation middleware
+func (sh *strictHandler) FeedsGetFeed(ctx echo.Context, feedId string) error {
+ var request FeedsGetFeedRequestObject
+
+ request.FeedId = feedId
+
+ handler := func(ctx echo.Context, request interface{}) (interface{}, error) {
+ return sh.ssi.FeedsGetFeed(ctx.Request().Context(), request.(FeedsGetFeedRequestObject))
+ }
+ for _, middleware := range sh.middlewares {
+ handler = middleware(handler, "FeedsGetFeed")
+ }
+
+ response, err := handler(ctx, request)
+
+ if err != nil {
+ return err
+ } else if validResponse, ok := response.(FeedsGetFeedResponseObject); ok {
+ return validResponse.VisitFeedsGetFeedResponse(ctx.Response())
+ } else if response != nil {
+ return fmt.Errorf("unexpected response type: %T", response)
+ }
+ return nil
+}
+
+// FeedsMarkFeedRead operation middleware
+func (sh *strictHandler) FeedsMarkFeedRead(ctx echo.Context, feedId string) error {
+ var request FeedsMarkFeedReadRequestObject
+
+ request.FeedId = feedId
+
+ handler := func(ctx echo.Context, request interface{}) (interface{}, error) {
+ return sh.ssi.FeedsMarkFeedRead(ctx.Request().Context(), request.(FeedsMarkFeedReadRequestObject))
+ }
+ for _, middleware := range sh.middlewares {
+ handler = middleware(handler, "FeedsMarkFeedRead")
+ }
+
+ response, err := handler(ctx, request)
+
+ if err != nil {
+ return err
+ } else if validResponse, ok := response.(FeedsMarkFeedReadResponseObject); ok {
+ return validResponse.VisitFeedsMarkFeedReadResponse(ctx.Response())
+ } else if response != nil {
+ return fmt.Errorf("unexpected response type: %T", response)
+ }
+ return nil
+}
+
+// FeedsMarkFeedUnread operation middleware
+func (sh *strictHandler) FeedsMarkFeedUnread(ctx echo.Context, feedId string) error {
+ var request FeedsMarkFeedUnreadRequestObject
+
+ request.FeedId = feedId
+
+ handler := func(ctx echo.Context, request interface{}) (interface{}, error) {
+ return sh.ssi.FeedsMarkFeedUnread(ctx.Request().Context(), request.(FeedsMarkFeedUnreadRequestObject))
+ }
+ for _, middleware := range sh.middlewares {
+ handler = middleware(handler, "FeedsMarkFeedUnread")
+ }
+
+ response, err := handler(ctx, request)
+
+ if err != nil {
+ return err
+ } else if validResponse, ok := response.(FeedsMarkFeedUnreadResponseObject); ok {
+ return validResponse.VisitFeedsMarkFeedUnreadResponse(ctx.Response())
+ } else if response != nil {
+ return fmt.Errorf("unexpected response type: %T", response)
+ }
+ return nil
+}
diff --git a/backend/api/handler.go b/backend/api/handler.go
new file mode 100644
index 0000000..c5df375
--- /dev/null
+++ b/backend/api/handler.go
@@ -0,0 +1,16 @@
+package api
+
+import (
+ "database/sql"
+
+ "undef.ninja/x/feedaka/auth"
+ "undef.ninja/x/feedaka/db"
+)
+
+type Handler struct {
+ DB *sql.DB
+ Queries *db.Queries
+ SessionConfig *auth.SessionConfig
+}
+
+var _ StrictServerInterface = (*Handler)(nil)
diff --git a/backend/api/handler_articles.go b/backend/api/handler_articles.go
new file mode 100644
index 0000000..d480ddc
--- /dev/null
+++ b/backend/api/handler_articles.go
@@ -0,0 +1,245 @@
+package api
+
+import (
+ "context"
+ "database/sql"
+ "fmt"
+ "strconv"
+
+ appcontext "undef.ninja/x/feedaka/context"
+ "undef.ninja/x/feedaka/db"
+)
+
+const defaultPageSize = 30
+const maxPageSize = 100
+
+func (h *Handler) ArticlesListUnreadArticles(ctx context.Context, request ArticlesListUnreadArticlesRequestObject) (ArticlesListUnreadArticlesResponseObject, error) {
+ conn, err := h.paginatedArticles(ctx, 0, request.Params.FeedId, request.Params.After, request.Params.First)
+ if err != nil {
+ return nil, err
+ }
+ return ArticlesListUnreadArticles200JSONResponse(*conn), nil
+}
+
+func (h *Handler) ArticlesListReadArticles(ctx context.Context, request ArticlesListReadArticlesRequestObject) (ArticlesListReadArticlesResponseObject, error) {
+ conn, err := h.paginatedArticles(ctx, 1, request.Params.FeedId, request.Params.After, request.Params.First)
+ if err != nil {
+ return nil, err
+ }
+ return ArticlesListReadArticles200JSONResponse(*conn), nil
+}
+
+func (h *Handler) ArticlesGetArticle(ctx context.Context, request ArticlesGetArticleRequestObject) (ArticlesGetArticleResponseObject, error) {
+ userID, ok := appcontext.GetUserID(ctx)
+ if !ok {
+ return nil, fmt.Errorf("authentication required")
+ }
+
+ articleID, err := strconv.ParseInt(request.ArticleId, 10, 64)
+ if err != nil {
+ return ArticlesGetArticle404JSONResponse{Message: "invalid article ID"}, nil
+ }
+
+ row, err := h.Queries.GetArticle(ctx, articleID)
+ if err != nil {
+ if err == sql.ErrNoRows {
+ return ArticlesGetArticle404JSONResponse{Message: "article not found"}, nil
+ }
+ return nil, err
+ }
+
+ f, err := h.Queries.GetFeed(ctx, row.FeedID)
+ if err != nil {
+ return nil, err
+ }
+ if f.UserID != userID {
+ return ArticlesGetArticle404JSONResponse{Message: "article not found"}, nil
+ }
+
+ article := dbArticleToAPI(row)
+ return ArticlesGetArticle200JSONResponse(article), nil
+}
+
+func (h *Handler) ArticlesMarkArticleRead(ctx context.Context, request ArticlesMarkArticleReadRequestObject) (ArticlesMarkArticleReadResponseObject, error) {
+ article, err := h.updateArticleReadStatus(ctx, request.ArticleId, 1)
+ if err != nil {
+ return nil, err
+ }
+ if article == nil {
+ return ArticlesMarkArticleRead404JSONResponse{Message: "article not found"}, nil
+ }
+ return ArticlesMarkArticleRead200JSONResponse(*article), nil
+}
+
+func (h *Handler) ArticlesMarkArticleUnread(ctx context.Context, request ArticlesMarkArticleUnreadRequestObject) (ArticlesMarkArticleUnreadResponseObject, error) {
+ article, err := h.updateArticleReadStatus(ctx, request.ArticleId, 0)
+ if err != nil {
+ return nil, err
+ }
+ if article == nil {
+ return ArticlesMarkArticleUnread404JSONResponse{Message: "article not found"}, nil
+ }
+ return ArticlesMarkArticleUnread200JSONResponse(*article), nil
+}
+
+func (h *Handler) updateArticleReadStatus(ctx context.Context, articleIdStr string, isRead int64) (*Article, error) {
+ userID, ok := appcontext.GetUserID(ctx)
+ if !ok {
+ return nil, fmt.Errorf("authentication required")
+ }
+
+ articleID, err := strconv.ParseInt(articleIdStr, 10, 64)
+ if err != nil {
+ return nil, nil
+ }
+
+ article, err := h.Queries.GetArticle(ctx, articleID)
+ if err != nil {
+ if err == sql.ErrNoRows {
+ return nil, nil
+ }
+ return nil, err
+ }
+
+ f, err := h.Queries.GetFeed(ctx, article.FeedID)
+ if err != nil {
+ return nil, err
+ }
+ if f.UserID != userID {
+ return nil, nil
+ }
+
+ err = h.Queries.UpdateArticleReadStatus(ctx, db.UpdateArticleReadStatusParams{
+ IsRead: isRead,
+ ID: article.ID,
+ })
+ if err != nil {
+ return nil, err
+ }
+
+ // Re-fetch for updated state
+ updated, err := h.Queries.GetArticle(ctx, articleID)
+ if err != nil {
+ return nil, err
+ }
+
+ result := dbArticleToAPI(updated)
+ return &result, nil
+}
+
+func (h *Handler) paginatedArticles(ctx context.Context, isRead int64, feedID *string, after *string, first *int32) (*ArticleConnection, error) {
+ userID, ok := appcontext.GetUserID(ctx)
+ if !ok {
+ return nil, fmt.Errorf("authentication required")
+ }
+
+ limit := int64(defaultPageSize)
+ if first != nil {
+ limit = int64(*first)
+ if limit <= 0 {
+ limit = int64(defaultPageSize)
+ }
+ if limit > maxPageSize {
+ limit = maxPageSize
+ }
+ }
+
+ fetchLimit := limit + 1
+
+ var rawRows []any
+
+ if feedID != nil {
+ parsedFeedID, err := strconv.ParseInt(*feedID, 10, 64)
+ if err != nil {
+ return nil, fmt.Errorf("invalid feed ID: %w", err)
+ }
+
+ if after != nil {
+ cursor, err := strconv.ParseInt(*after, 10, 64)
+ if err != nil {
+ return nil, fmt.Errorf("invalid cursor: %w", err)
+ }
+ rows, err := h.Queries.GetArticlesByFeedPaginatedAfter(ctx, db.GetArticlesByFeedPaginatedAfterParams{
+ IsRead: isRead,
+ UserID: userID,
+ FeedID: parsedFeedID,
+ ID: cursor,
+ Limit: fetchLimit,
+ })
+ if err != nil {
+ return nil, err
+ }
+ for _, row := range rows {
+ rawRows = append(rawRows, row)
+ }
+ } else {
+ rows, err := h.Queries.GetArticlesByFeedPaginated(ctx, db.GetArticlesByFeedPaginatedParams{
+ IsRead: isRead,
+ UserID: userID,
+ FeedID: parsedFeedID,
+ Limit: fetchLimit,
+ })
+ if err != nil {
+ return nil, err
+ }
+ for _, row := range rows {
+ rawRows = append(rawRows, row)
+ }
+ }
+ } else {
+ if after != nil {
+ cursor, err := strconv.ParseInt(*after, 10, 64)
+ if err != nil {
+ return nil, fmt.Errorf("invalid cursor: %w", err)
+ }
+ rows, err := h.Queries.GetArticlesPaginatedAfter(ctx, db.GetArticlesPaginatedAfterParams{
+ IsRead: isRead,
+ UserID: userID,
+ ID: cursor,
+ Limit: fetchLimit,
+ })
+ if err != nil {
+ return nil, err
+ }
+ for _, row := range rows {
+ rawRows = append(rawRows, row)
+ }
+ } else {
+ rows, err := h.Queries.GetArticlesPaginated(ctx, db.GetArticlesPaginatedParams{
+ IsRead: isRead,
+ UserID: userID,
+ Limit: fetchLimit,
+ })
+ if err != nil {
+ return nil, err
+ }
+ for _, row := range rows {
+ rawRows = append(rawRows, row)
+ }
+ }
+ }
+
+ hasNextPage := int64(len(rawRows)) > limit
+ if hasNextPage {
+ rawRows = rawRows[:limit]
+ }
+
+ articles := make([]Article, 0, len(rawRows))
+ for _, raw := range rawRows {
+ articles = append(articles, rowToArticle(toArticleRow(raw)))
+ }
+
+ var endCursor *string
+ if len(articles) > 0 {
+ lastID := articles[len(articles)-1].Id
+ endCursor = &lastID
+ }
+
+ return &ArticleConnection{
+ Articles: articles,
+ PageInfo: PageInfo{
+ HasNextPage: hasNextPage,
+ EndCursor: endCursor,
+ },
+ }, nil
+}
diff --git a/backend/api/handler_auth.go b/backend/api/handler_auth.go
new file mode 100644
index 0000000..6e10538
--- /dev/null
+++ b/backend/api/handler_auth.go
@@ -0,0 +1,73 @@
+package api
+
+import (
+ "context"
+ "database/sql"
+ "strconv"
+
+ "undef.ninja/x/feedaka/auth"
+ appcontext "undef.ninja/x/feedaka/context"
+)
+
+func (h *Handler) AuthLogin(ctx context.Context, request AuthLoginRequestObject) (AuthLoginResponseObject, error) {
+ user, err := h.Queries.GetUserByUsername(ctx, request.Body.Username)
+ if err != nil {
+ if err == sql.ErrNoRows {
+ return AuthLogin401JSONResponse{Message: "invalid credentials"}, nil
+ }
+ return AuthLogin401JSONResponse{Message: "invalid credentials"}, nil
+ }
+
+ if !auth.VerifyPassword(user.PasswordHash, request.Body.Password) {
+ return AuthLogin401JSONResponse{Message: "invalid credentials"}, nil
+ }
+
+ echoCtx := getEchoContext(ctx)
+ if echoCtx == nil {
+ return nil, errNoEchoContext
+ }
+
+ if err := h.SessionConfig.SetUserID(echoCtx, user.ID); err != nil {
+ return nil, err
+ }
+
+ return AuthLogin200JSONResponse{
+ User: User{
+ Id: strconv.FormatInt(user.ID, 10),
+ Username: user.Username,
+ },
+ }, nil
+}
+
+func (h *Handler) AuthLogout(ctx context.Context, _ AuthLogoutRequestObject) (AuthLogoutResponseObject, error) {
+ echoCtx := getEchoContext(ctx)
+ if echoCtx == nil {
+ return nil, errNoEchoContext
+ }
+
+ if err := h.SessionConfig.DestroySession(echoCtx); err != nil {
+ return nil, err
+ }
+
+ return AuthLogout204Response{}, nil
+}
+
+func (h *Handler) AuthGetCurrentUser(ctx context.Context, _ AuthGetCurrentUserRequestObject) (AuthGetCurrentUserResponseObject, error) {
+ userID, ok := appcontext.GetUserID(ctx)
+ if !ok {
+ return AuthGetCurrentUser401JSONResponse{Message: "authentication required"}, nil
+ }
+
+ user, err := h.Queries.GetUserByID(ctx, userID)
+ if err != nil {
+ if err == sql.ErrNoRows {
+ return AuthGetCurrentUser401JSONResponse{Message: "authentication required"}, nil
+ }
+ return nil, err
+ }
+
+ return AuthGetCurrentUser200JSONResponse{
+ Id: strconv.FormatInt(user.ID, 10),
+ Username: user.Username,
+ }, nil
+}
diff --git a/backend/api/handler_feeds.go b/backend/api/handler_feeds.go
new file mode 100644
index 0000000..f0a8785
--- /dev/null
+++ b/backend/api/handler_feeds.go
@@ -0,0 +1,185 @@
+package api
+
+import (
+ "context"
+ "database/sql"
+ "fmt"
+ "strconv"
+ "time"
+
+ appcontext "undef.ninja/x/feedaka/context"
+ "undef.ninja/x/feedaka/db"
+ "undef.ninja/x/feedaka/feed"
+)
+
+func (h *Handler) FeedsListFeeds(ctx context.Context, _ FeedsListFeedsRequestObject) (FeedsListFeedsResponseObject, error) {
+ userID, ok := appcontext.GetUserID(ctx)
+ if !ok {
+ return nil, fmt.Errorf("authentication required")
+ }
+
+ dbFeeds, err := h.Queries.GetFeeds(ctx, userID)
+ if err != nil {
+ return nil, err
+ }
+
+ unreadCounts, err := h.Queries.GetFeedUnreadCounts(ctx, userID)
+ if err != nil {
+ return nil, err
+ }
+ countMap := make(map[int64]int64, len(unreadCounts))
+ for _, uc := range unreadCounts {
+ countMap[uc.FeedID] = uc.UnreadCount
+ }
+
+ feeds := make(FeedsListFeeds200JSONResponse, 0, len(dbFeeds))
+ for _, f := range dbFeeds {
+ feeds = append(feeds, dbFeedToAPI(f, countMap[f.ID]))
+ }
+
+ return feeds, nil
+}
+
+func (h *Handler) FeedsAddFeed(ctx context.Context, request FeedsAddFeedRequestObject) (FeedsAddFeedResponseObject, error) {
+ userID, ok := appcontext.GetUserID(ctx)
+ if !ok {
+ return nil, fmt.Errorf("authentication required")
+ }
+
+ f, err := feed.Fetch(ctx, request.Body.Url)
+ if err != nil {
+ return FeedsAddFeed400JSONResponse{Message: fmt.Sprintf("failed to parse feed: %v", err)}, nil
+ }
+
+ dbFeed, err := h.Queries.CreateFeed(ctx, db.CreateFeedParams{
+ Url: request.Body.Url,
+ Title: f.Title,
+ FetchedAt: time.Now().UTC().Format(time.RFC3339),
+ UserID: userID,
+ })
+ if err != nil {
+ return FeedsAddFeed400JSONResponse{Message: fmt.Sprintf("failed to insert feed: %v", err)}, nil
+ }
+
+ if err := feed.Sync(ctx, h.Queries, dbFeed.ID, f); err != nil {
+ return FeedsAddFeed400JSONResponse{Message: fmt.Sprintf("failed to sync articles: %v", err)}, nil
+ }
+
+ return FeedsAddFeed201JSONResponse(dbFeedToAPI(dbFeed, 0)), nil
+}
+
+func (h *Handler) FeedsGetFeed(ctx context.Context, request FeedsGetFeedRequestObject) (FeedsGetFeedResponseObject, error) {
+ userID, ok := appcontext.GetUserID(ctx)
+ if !ok {
+ return nil, fmt.Errorf("authentication required")
+ }
+
+ feedID, err := strconv.ParseInt(request.FeedId, 10, 64)
+ if err != nil {
+ return FeedsGetFeed404JSONResponse{Message: "invalid feed ID"}, nil
+ }
+
+ dbFeed, err := h.Queries.GetFeed(ctx, feedID)
+ if err != nil {
+ if err == sql.ErrNoRows {
+ return FeedsGetFeed404JSONResponse{Message: "feed not found"}, nil
+ }
+ return nil, err
+ }
+
+ if dbFeed.UserID != userID {
+ return FeedsGetFeed404JSONResponse{Message: "feed not found"}, nil
+ }
+
+ return FeedsGetFeed200JSONResponse(dbFeedToAPI(dbFeed, 0)), nil
+}
+
+func (h *Handler) FeedsUnsubscribeFeed(ctx context.Context, request FeedsUnsubscribeFeedRequestObject) (FeedsUnsubscribeFeedResponseObject, error) {
+ userID, ok := appcontext.GetUserID(ctx)
+ if !ok {
+ return nil, fmt.Errorf("authentication required")
+ }
+
+ feedID, err := strconv.ParseInt(request.FeedId, 10, 64)
+ if err != nil {
+ return FeedsUnsubscribeFeed404JSONResponse{Message: "invalid feed ID"}, nil
+ }
+
+ dbFeed, err := h.Queries.GetFeed(ctx, feedID)
+ if err != nil {
+ if err == sql.ErrNoRows {
+ return FeedsUnsubscribeFeed404JSONResponse{Message: "feed not found"}, nil
+ }
+ return nil, err
+ }
+
+ if dbFeed.UserID != userID {
+ return FeedsUnsubscribeFeed404JSONResponse{Message: "feed not found"}, nil
+ }
+
+ if err := h.Queries.UnsubscribeFeed(ctx, feedID); err != nil {
+ return nil, err
+ }
+
+ return FeedsUnsubscribeFeed204Response{}, nil
+}
+
+func (h *Handler) FeedsMarkFeedRead(ctx context.Context, request FeedsMarkFeedReadRequestObject) (FeedsMarkFeedReadResponseObject, error) {
+ userID, ok := appcontext.GetUserID(ctx)
+ if !ok {
+ return nil, fmt.Errorf("authentication required")
+ }
+
+ feedID, err := strconv.ParseInt(request.FeedId, 10, 64)
+ if err != nil {
+ return FeedsMarkFeedRead404JSONResponse{Message: "invalid feed ID"}, nil
+ }
+
+ dbFeed, err := h.Queries.GetFeed(ctx, feedID)
+ if err != nil {
+ if err == sql.ErrNoRows {
+ return FeedsMarkFeedRead404JSONResponse{Message: "feed not found"}, nil
+ }
+ return nil, err
+ }
+
+ if dbFeed.UserID != userID {
+ return FeedsMarkFeedRead404JSONResponse{Message: "feed not found"}, nil
+ }
+
+ if err := h.Queries.MarkFeedArticlesRead(ctx, feedID); err != nil {
+ return nil, err
+ }
+
+ return FeedsMarkFeedRead200JSONResponse(dbFeedToAPI(dbFeed, 0)), nil
+}
+
+func (h *Handler) FeedsMarkFeedUnread(ctx context.Context, request FeedsMarkFeedUnreadRequestObject) (FeedsMarkFeedUnreadResponseObject, error) {
+ userID, ok := appcontext.GetUserID(ctx)
+ if !ok {
+ return nil, fmt.Errorf("authentication required")
+ }
+
+ feedID, err := strconv.ParseInt(request.FeedId, 10, 64)
+ if err != nil {
+ return FeedsMarkFeedUnread404JSONResponse{Message: "invalid feed ID"}, nil
+ }
+
+ dbFeed, err := h.Queries.GetFeed(ctx, feedID)
+ if err != nil {
+ if err == sql.ErrNoRows {
+ return FeedsMarkFeedUnread404JSONResponse{Message: "feed not found"}, nil
+ }
+ return nil, err
+ }
+
+ if dbFeed.UserID != userID {
+ return FeedsMarkFeedUnread404JSONResponse{Message: "feed not found"}, nil
+ }
+
+ if err := h.Queries.MarkFeedArticlesUnread(ctx, feedID); err != nil {
+ return nil, err
+ }
+
+ return FeedsMarkFeedUnread200JSONResponse(dbFeedToAPI(dbFeed, 0)), nil
+}
diff --git a/backend/api/oapi-codegen.yaml b/backend/api/oapi-codegen.yaml
new file mode 100644
index 0000000..bb775d9
--- /dev/null
+++ b/backend/api/oapi-codegen.yaml
@@ -0,0 +1,6 @@
+package: api
+output: generated.go
+generate:
+ echo-server: true
+ models: true
+ strict-server: true
diff --git a/backend/cmd/serve.go b/backend/cmd/serve.go
index e2d2df5..c65a19f 100644
--- a/backend/cmd/serve.go
+++ b/backend/cmd/serve.go
@@ -11,22 +11,16 @@ import (
"syscall"
"time"
- "github.com/99designs/gqlgen/graphql/handler"
- "github.com/99designs/gqlgen/graphql/handler/extension"
- "github.com/99designs/gqlgen/graphql/handler/lru"
- "github.com/99designs/gqlgen/graphql/handler/transport"
"github.com/hashicorp/go-multierror"
"github.com/labstack/echo-contrib/session"
"github.com/labstack/echo/v4"
"github.com/labstack/echo/v4/middleware"
- "github.com/vektah/gqlparser/v2/ast"
+ "undef.ninja/x/feedaka/api"
"undef.ninja/x/feedaka/auth"
"undef.ninja/x/feedaka/config"
"undef.ninja/x/feedaka/db"
"undef.ninja/x/feedaka/feed"
- "undef.ninja/x/feedaka/graphql"
- "undef.ninja/x/feedaka/graphql/resolver"
)
func fetchOneFeed(feedID int64, url string, ctx context.Context, queries *db.Queries) error {
@@ -113,41 +107,17 @@ func RunServe(database *sql.DB, cfg *config.Config, publicFS embed.FS) {
Filesystem: http.FS(publicFS),
}))
- // Setup GraphQL server
- srv := handler.New(graphql.NewExecutableSchema(graphql.Config{Resolvers: &resolver.Resolver{
+ handler := &api.Handler{
DB: database,
Queries: queries,
SessionConfig: sessionConfig,
- }}))
-
- srv.AddTransport(transport.Options{})
- srv.AddTransport(transport.GET{})
- srv.AddTransport(transport.POST{})
+ }
- srv.SetQueryCache(lru.New[*ast.QueryDocument](1000))
+ strictHandler := api.NewStrictHandler(handler, nil)
- srv.Use(extension.Introspection{})
- srv.Use(extension.AutomaticPersistedQuery{
- Cache: lru.New[string](100),
- })
-
- // GraphQL endpoints with authentication middleware
- graphqlGroup := e.Group("/graphql")
- graphqlGroup.Use(auth.SessionAuthMiddleware(sessionConfig))
- graphqlGroup.POST("", func(c echo.Context) error {
- // Add Echo context to GraphQL context
- ctx := context.WithValue(c.Request().Context(), "echo", c)
- req := c.Request().WithContext(ctx)
- srv.ServeHTTP(c.Response(), req)
- return nil
- })
- graphqlGroup.GET("", func(c echo.Context) error {
- // Add Echo context to GraphQL context
- ctx := context.WithValue(c.Request().Context(), "echo", c)
- req := c.Request().WithContext(ctx)
- srv.ServeHTTP(c.Response(), req)
- return nil
- })
+ // Register REST API routes with auth middleware
+ apiGroup := e.Group("", auth.SessionAuthMiddleware(sessionConfig), echoContextMiddleware())
+ api.RegisterHandlers(apiGroup, strictHandler)
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
@@ -183,3 +153,15 @@ func RunServe(database *sql.DB, cfg *config.Config, publicFS embed.FS) {
}
log.Println("Server stopped")
}
+
+// echoContextMiddleware injects echo.Context into request context
+// so strict server handlers can access it (needed for session operations)
+func echoContextMiddleware() echo.MiddlewareFunc {
+ return func(next echo.HandlerFunc) echo.HandlerFunc {
+ return func(c echo.Context) error {
+ ctx := api.WithEchoContext(c.Request().Context(), c)
+ c.SetRequest(c.Request().WithContext(ctx))
+ return next(c)
+ }
+ }
+}
diff --git a/backend/go.mod b/backend/go.mod
index 9e89c41..d8a84eb 100644
--- a/backend/go.mod
+++ b/backend/go.mod
@@ -5,14 +5,13 @@ go 1.23.0
toolchain go1.24.4
require (
- github.com/99designs/gqlgen v0.17.76
github.com/gorilla/sessions v1.4.0
github.com/hashicorp/go-multierror v1.1.1
github.com/labstack/echo-contrib v0.17.4
github.com/labstack/echo/v4 v4.13.4
github.com/mattn/go-sqlite3 v1.14.28
github.com/mmcdole/gofeed v1.3.0
- github.com/vektah/gqlparser/v2 v2.5.30
+ github.com/oapi-codegen/runtime v1.1.2
golang.org/x/crypto v0.39.0
)
@@ -20,37 +19,44 @@ require (
cel.dev/expr v0.20.0 // indirect
filippo.io/edwards25519 v1.1.0 // indirect
github.com/PuerkitoBio/goquery v1.10.3 // indirect
- github.com/agnivade/levenshtein v1.2.1 // indirect
github.com/andybalholm/cascadia v1.3.3 // indirect
github.com/antlr4-go/antlr/v4 v4.13.1 // indirect
- github.com/cpuguy83/go-md2man/v2 v2.0.7 // indirect
+ github.com/apapsch/go-jsonmerge/v2 v2.0.0 // indirect
github.com/cubicdaiya/gonp v1.0.4 // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
+ github.com/dprotaso/go-yit v0.0.0-20220510233725-9ba8df137936 // indirect
github.com/dustin/go-humanize v1.0.1 // indirect
github.com/fatih/structtag v1.2.0 // indirect
+ github.com/getkin/kin-openapi v0.133.0 // indirect
+ github.com/go-openapi/jsonpointer v0.21.0 // indirect
+ github.com/go-openapi/swag v0.23.0 // indirect
github.com/go-sql-driver/mysql v1.9.2 // indirect
- github.com/go-viper/mapstructure/v2 v2.3.0 // indirect
github.com/google/cel-go v0.24.1 // indirect
github.com/google/uuid v1.6.0 // indirect
github.com/gorilla/context v1.1.2 // indirect
github.com/gorilla/securecookie v1.1.2 // indirect
- github.com/gorilla/websocket v1.5.0 // indirect
github.com/hashicorp/errwrap v1.1.0 // indirect
- github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect
github.com/inconshreveable/mousetrap v1.1.0 // indirect
github.com/jackc/pgpassfile v1.0.0 // indirect
github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect
github.com/jackc/pgx/v5 v5.7.4 // indirect
github.com/jackc/puddle/v2 v2.2.2 // indirect
github.com/jinzhu/inflection v1.0.0 // indirect
+ github.com/josharian/intern v1.0.0 // indirect
github.com/json-iterator/go v1.1.12 // indirect
github.com/labstack/gommon v0.4.2 // indirect
+ github.com/mailru/easyjson v0.7.7 // indirect
github.com/mattn/go-colorable v0.1.14 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/mmcdole/goxpp v1.1.1 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
+ github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect
github.com/ncruces/go-strftime v0.1.9 // indirect
+ github.com/oapi-codegen/oapi-codegen/v2 v2.5.1 // indirect
+ github.com/oasdiff/yaml v0.0.0-20250309154309-f31be36b4037 // indirect
+ github.com/oasdiff/yaml3 v0.0.0-20250309153720-d2182401db90 // indirect
+ github.com/perimeterx/marshmallow v1.1.5 // indirect
github.com/pganalyze/pg_query_go/v6 v6.1.0 // indirect
github.com/pingcap/errors v0.11.5-0.20240311024730-e056997136bb // indirect
github.com/pingcap/failpoint v0.0.0-20240528011301-b51a646c7c86 // indirect
@@ -58,19 +64,19 @@ require (
github.com/pingcap/tidb/pkg/parser v0.0.0-20250324122243-d51e00e5bbf0 // indirect
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect
github.com/riza-io/grpc-go v0.2.0 // indirect
- github.com/russross/blackfriday/v2 v2.1.0 // indirect
- github.com/sosodev/duration v1.3.1 // indirect
+ github.com/speakeasy-api/jsonpath v0.6.0 // indirect
+ github.com/speakeasy-api/openapi-overlay v0.10.2 // indirect
github.com/spf13/cobra v1.9.1 // indirect
github.com/spf13/pflag v1.0.6 // indirect
github.com/sqlc-dev/sqlc v1.29.0 // indirect
github.com/stoewer/go-strcase v1.2.0 // indirect
github.com/tetratelabs/wazero v1.9.0 // indirect
- github.com/urfave/cli/v2 v2.27.7 // indirect
github.com/valyala/bytebufferpool v1.0.0 // indirect
github.com/valyala/fasttemplate v1.2.2 // indirect
+ github.com/vmware-labs/yaml-jsonpath v0.3.2 // indirect
github.com/wasilibs/go-pgquery v0.0.0-20250409022910-10ac41983c07 // indirect
github.com/wasilibs/wazero-helpers v0.0.0-20240620070341-3dff1577cd52 // indirect
- github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 // indirect
+ github.com/woodsbury/decimal128 v1.3.0 // indirect
go.uber.org/atomic v1.11.0 // indirect
go.uber.org/multierr v1.11.0 // indirect
go.uber.org/zap v1.27.0 // indirect
@@ -87,6 +93,7 @@ require (
google.golang.org/grpc v1.72.0 // indirect
google.golang.org/protobuf v1.36.6 // indirect
gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect
+ gopkg.in/yaml.v2 v2.4.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
modernc.org/libc v1.62.1 // indirect
modernc.org/mathutil v1.7.1 // indirect
@@ -95,6 +102,6 @@ require (
)
tool (
- github.com/99designs/gqlgen
+ github.com/oapi-codegen/oapi-codegen/v2/cmd/oapi-codegen
github.com/sqlc-dev/sqlc/cmd/sqlc
)
diff --git a/backend/go.sum b/backend/go.sum
index 277f378..094f1e3 100644
--- a/backend/go.sum
+++ b/backend/go.sum
@@ -2,49 +2,68 @@ cel.dev/expr v0.20.0 h1:OunBvVCfvpWlt4dN7zg3FM6TDkzOePe1+foGJ9AXeeI=
cel.dev/expr v0.20.0/go.mod h1:MrpN08Q+lEBs+bGYdLxxHkZoUSsCp0nSKTs0nTymJgw=
filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=
filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=
-github.com/99designs/gqlgen v0.17.76 h1:YsJBcfACWmXWU2t1yCjoGdOmqcTfOFpjbLAE443fmYI=
-github.com/99designs/gqlgen v0.17.76/go.mod h1:miiU+PkAnTIDKMQ1BseUOIVeQHoiwYDZGCswoxl7xec=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/PuerkitoBio/goquery v1.10.3 h1:pFYcNSqHxBD06Fpj/KsbStFRsgRATgnf3LeXiUkhzPo=
github.com/PuerkitoBio/goquery v1.10.3/go.mod h1:tMUX0zDMHXYlAQk6p35XxQMqMweEKB7iK7iLNd4RH4Y=
-github.com/agnivade/levenshtein v1.2.1 h1:EHBY3UOn1gwdy/VbFwgo4cxecRznFk7fKWN1KOX7eoM=
-github.com/agnivade/levenshtein v1.2.1/go.mod h1:QVVI16kDrtSuwcpd0p1+xMC6Z/VfhtCyDIjcwga4/DU=
-github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883 h1:bvNMNQO63//z+xNgfBlViaCIJKLlCJ6/fmUseuG0wVQ=
-github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8=
+github.com/RaveNoX/go-jsoncommentstrip v1.0.0/go.mod h1:78ihd09MekBnJnxpICcwzCMzGrKSKYe4AqU6PDYYpjk=
github.com/andybalholm/cascadia v1.3.3 h1:AG2YHrzJIm4BZ19iwJ/DAua6Btl3IwJX+VI4kktS1LM=
github.com/andybalholm/cascadia v1.3.3/go.mod h1:xNd9bqTn98Ln4DwST8/nG+H0yuB8Hmgu1YHNnWw0GeA=
github.com/antlr4-go/antlr/v4 v4.13.1 h1:SqQKkuVZ+zWkMMNkjy5FZe5mr5WURWnlpmOuzYWrPrQ=
github.com/antlr4-go/antlr/v4 v4.13.1/go.mod h1:GKmUxMtwp6ZgGwZSva4eWPC5mS6vUAmOABFgjdkM7Nw=
-github.com/arbovm/levenshtein v0.0.0-20160628152529-48b4e1c0c4d0 h1:jfIu9sQUG6Ig+0+Ap1h4unLjW6YQJpKZVmUzxsD4E/Q=
-github.com/arbovm/levenshtein v0.0.0-20160628152529-48b4e1c0c4d0/go.mod h1:t2tdKJDJF9BV14lnkjHmOQgcvEKgtqs5a1N3LNdJhGE=
+github.com/apapsch/go-jsonmerge/v2 v2.0.0 h1:axGnT1gRIfimI7gJifB699GoE/oq+F2MU7Dml6nw9rQ=
+github.com/apapsch/go-jsonmerge/v2 v2.0.0/go.mod h1:lvDnEdqiQrp0O42VQGgmlKpxL1AP2+08jFMw88y4klk=
github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
+github.com/bmatcuk/doublestar v1.1.1/go.mod h1:UD6OnuiIn0yFxxA2le/rnRU1G4RaI4UvFv1sNto9p6w=
+github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
+github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
+github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g=
-github.com/cpuguy83/go-md2man/v2 v2.0.7 h1:zbFlGlXEAKlwXpmvle3d8Oe3YnkKIK4xSRTd3sHPnBo=
-github.com/cpuguy83/go-md2man/v2 v2.0.7/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g=
github.com/cubicdaiya/gonp v1.0.4 h1:ky2uIAJh81WiLcGKBVD5R7KsM/36W6IqqTy6Bo6rGws=
github.com/cubicdaiya/gonp v1.0.4/go.mod h1:iWGuP/7+JVTn02OWhRemVbMmG1DOUnmrGTYYACpOI0I=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
-github.com/dgryski/trifles v0.0.0-20230903005119-f50d829f2e54 h1:SG7nF6SRlWhcT7cNTs5R6Hk4V2lcmLz2NsG2VnInyNo=
-github.com/dgryski/trifles v0.0.0-20230903005119-f50d829f2e54/go.mod h1:if7Fbed8SFyPtHLHbg49SI7NAdJiC5WIA09pe59rfAA=
+github.com/dprotaso/go-yit v0.0.0-20191028211022-135eb7262960/go.mod h1:9HQzr9D/0PGwMEbC3d5AB7oi67+h4TsQqItC1GVYG58=
+github.com/dprotaso/go-yit v0.0.0-20220510233725-9ba8df137936 h1:PRxIJD8XjimM5aTknUK9w6DHLDox2r2M3DI4i2pnd3w=
+github.com/dprotaso/go-yit v0.0.0-20220510233725-9ba8df137936/go.mod h1:ttYvX5qlB+mlV1okblJqcSMtR4c52UKxDiX9GRBS8+Q=
github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY=
github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
github.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=
github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=
+github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
+github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=
+github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
+github.com/getkin/kin-openapi v0.133.0 h1:pJdmNohVIJ97r4AUFtEXRXwESr8b0bD721u/Tz6k8PQ=
+github.com/getkin/kin-openapi v0.133.0/go.mod h1:boAciF6cXk5FhPqe/NQeBTeenbjqU4LhWBf09ILVvWE=
github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
+github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ=
+github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY=
+github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE=
+github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ=
github.com/go-sql-driver/mysql v1.9.2 h1:4cNKDYQ1I84SXslGddlsrMhc8k4LeDVj6Ad6WRjiHuU=
github.com/go-sql-driver/mysql v1.9.2/go.mod h1:qn46aNg1333BRMNU69Lq93t8du/dwxI64Gl8i5p1WMU=
-github.com/go-viper/mapstructure/v2 v2.3.0 h1:27XbWsHIqhbdR5TIC911OfYvgSaW93HM+dX7970Q7jk=
-github.com/go-viper/mapstructure/v2 v2.3.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM=
+github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=
+github.com/go-test/deep v1.0.8 h1:TDsG77qcSprGbC6vTN8OuXp5g+J+b5Pcguhf7Zt61VM=
+github.com/go-test/deep v1.0.8/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE=
+github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
+github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
+github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
+github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
+github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
+github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
+github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
github.com/google/cel-go v0.24.1 h1:jsBCtxG8mM5wiUJDSGUqU0K7Mtr3w7Eyv00rw4DiZxI=
github.com/google/cel-go v0.24.1/go.mod h1:Hdf9TqOaTNSFQA1ybQaRqATVoK7m/zcf7IMhGXP5zI8=
+github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
@@ -52,6 +71,7 @@ github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=
github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
+github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
github.com/google/pprof v0.0.0-20250317173921-a4b03ec1a45e h1:ijClszYn+mADRFY17kjQEVQ1XRhq2/JR1M3sGqeJoxs=
github.com/google/pprof v0.0.0-20250317173921-a4b03ec1a45e/go.mod h1:boTsfXsheKC2y+lKOCMpSfarhxDeIzfZG1jqGcPl3cA=
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
@@ -62,15 +82,13 @@ github.com/gorilla/securecookie v1.1.2 h1:YCIWL56dvtr73r6715mJs5ZvhtnY73hBvEF8kX
github.com/gorilla/securecookie v1.1.2/go.mod h1:NfCASbcHqRSY+3a8tlWJwsQap2VX5pwzwo4h3eOamfo=
github.com/gorilla/sessions v1.4.0 h1:kpIYOp/oi6MG/p5PgxApU8srsSw9tuFbt46Lt7auzqQ=
github.com/gorilla/sessions v1.4.0/go.mod h1:FLWm50oby91+hl7p/wRxDth9bWSuk0qVL2emc7lT5ik=
-github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc=
-github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=
github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=
github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=
-github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k=
-github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM=
+github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
+github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM=
@@ -83,11 +101,14 @@ github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo
github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4=
github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=
github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=
+github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
+github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
+github.com/juju/gnuflag v0.0.0-20171113085948-2ce1bb71843d/go.mod h1:2PavIy+JPciBPrBUjwbNvtwB6RQlve+hkpll6QSNmOE=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
-github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0=
-github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk=
+github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
+github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
@@ -98,6 +119,8 @@ github.com/labstack/echo/v4 v4.13.4 h1:oTZZW+T3s9gAu5L8vmzihV7/lkXGZuITzTQkTEhcX
github.com/labstack/echo/v4 v4.13.4/go.mod h1:g63b33BZ5vZzcIUF8AtRH40DrTlXnx4UMC8rBdndmjQ=
github.com/labstack/gommon v0.4.2 h1:F8qTUNXgG1+6WQmqoUWnz8WiEU60mXVVw0P4ht1WRA0=
github.com/labstack/gommon v0.4.2/go.mod h1:QlUFxVM+SNXhDL/Z7YhocGIBYOiwB0mXm1+1bAPHPyU=
+github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
+github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE=
github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8=
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
@@ -113,8 +136,35 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
+github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw=
+github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8=
github.com/ncruces/go-strftime v0.1.9 h1:bY0MQC28UADQmHmaF5dgpLmImcShSi2kHU9XLdhx/f4=
github.com/ncruces/go-strftime v0.1.9/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls=
+github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
+github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=
+github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU=
+github.com/oapi-codegen/oapi-codegen/v2 v2.5.1 h1:5vHNY1uuPBRBWqB2Dp0G7YB03phxLQZupZTIZaeorjc=
+github.com/oapi-codegen/oapi-codegen/v2 v2.5.1/go.mod h1:ro0npU1BWkcGpCgGD9QwPp44l5OIZ94tB3eabnT7DjQ=
+github.com/oapi-codegen/runtime v1.1.2 h1:P2+CubHq8fO4Q6fV1tqDBZHCwpVpvPg7oKiYzQgXIyI=
+github.com/oapi-codegen/runtime v1.1.2/go.mod h1:SK9X900oXmPWilYR5/WKPzt3Kqxn/uS/+lbpREv+eCg=
+github.com/oasdiff/yaml v0.0.0-20250309154309-f31be36b4037 h1:G7ERwszslrBzRxj//JalHPu/3yz+De2J+4aLtSRlHiY=
+github.com/oasdiff/yaml v0.0.0-20250309154309-f31be36b4037/go.mod h1:2bpvgLBZEtENV5scfDFEtB/5+1M4hkQhDQrccEJ/qGw=
+github.com/oasdiff/yaml3 v0.0.0-20250309153720-d2182401db90 h1:bQx3WeLcUWy+RletIKwUIt4x3t8n2SxavmoclizMb8c=
+github.com/oasdiff/yaml3 v0.0.0-20250309153720-d2182401db90/go.mod h1:y5+oSEHCPT/DGrS++Wc/479ERge0zTFxaF8PbGKcg2o=
+github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
+github.com/onsi/ginkgo v1.10.2/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
+github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
+github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc=
+github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0=
+github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c=
+github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
+github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
+github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
+github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY=
+github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw=
+github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro=
+github.com/perimeterx/marshmallow v1.1.5 h1:a2LALqQ1BlHM8PZblsDdidgv1mWi1DgC2UmX50IvK2s=
+github.com/perimeterx/marshmallow v1.1.5/go.mod h1:dsXbUu8CRzfYP5a87xpp0xq9S3u0Vchtcl8we9tYaXw=
github.com/pganalyze/pg_query_go/v6 v6.1.0 h1:jG5ZLhcVgL1FAw4C/0VNQaVmX1SUJx71wBGdtTtBvls=
github.com/pganalyze/pg_query_go/v6 v6.1.0/go.mod h1:nvTHIuoud6e1SfrUaFwHqT0i4b5Nr+1rPWVds3B5+50=
github.com/pingcap/errors v0.11.0/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8=
@@ -133,18 +183,20 @@ github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
github.com/riza-io/grpc-go v0.2.0 h1:2HxQKFVE7VuYstcJ8zqpN84VnAoJ4dCL6YFhJewNcHQ=
github.com/riza-io/grpc-go v0.2.0/go.mod h1:2bDvR9KkKC3KhtlSHfR3dAXjUMT86kg4UfWFyVGWqi8=
-github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ=
-github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog=
-github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
+github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=
+github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
-github.com/sergi/go-diff v1.3.1 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8=
-github.com/sergi/go-diff v1.3.1/go.mod h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NFbPK1I=
-github.com/sosodev/duration v1.3.1 h1:qtHBDMQ6lvMQsL15g4aopM4HEfOaYuhWBw3NPTtlqq4=
-github.com/sosodev/duration v1.3.1/go.mod h1:RQIBBX0+fMLc/D9+Jb/fwvVmo0eZvDDEERAikUR6SDg=
+github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0=
+github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM=
+github.com/speakeasy-api/jsonpath v0.6.0 h1:IhtFOV9EbXplhyRqsVhHoBmmYjblIRh5D1/g8DHMXJ8=
+github.com/speakeasy-api/jsonpath v0.6.0/go.mod h1:ymb2iSkyOycmzKwbEAYPJV/yi2rSmvBCLZJcyD+VVWw=
+github.com/speakeasy-api/openapi-overlay v0.10.2 h1:VOdQ03eGKeiHnpb1boZCGm7x8Haj6gST0P3SGTX95GU=
+github.com/speakeasy-api/openapi-overlay v0.10.2/go.mod h1:n0iOU7AqKpNFfEt6tq7qYITC4f0yzVVdFw0S7hukemg=
github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo=
github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0=
github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o=
github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
+github.com/spkg/bom v0.0.0-20160624110644-59b7046e48ad/go.mod h1:qLr4V1qq6nMqFKkMo8ZTx3f+BZEkzsRUY10Xsm2mwU0=
github.com/sqlc-dev/sqlc v1.29.0 h1:HQctoD7y/i29Bao53qXO7CZ/BV9NcvpGpsJWvz9nKWs=
github.com/sqlc-dev/sqlc v1.29.0/go.mod h1:BavmYw11px5AdPOjAVHmb9fctP5A8GTziC38wBF9tp0=
github.com/stoewer/go-strcase v1.2.0 h1:Z2iHWqGXH00XYgqDmNgQbIBxf3wrNq0F3feEy0ainaU=
@@ -154,24 +206,25 @@ github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UV
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
-github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
-github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
+github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=
+github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
github.com/tetratelabs/wazero v1.9.0 h1:IcZ56OuxrtaEz8UYNRHBrUa9bYeX9oVY93KspZZBf/I=
github.com/tetratelabs/wazero v1.9.0/go.mod h1:TSbcXCfFP0L2FGkRPxHphadXPjo1T6W+CseNNY7EkjM=
-github.com/urfave/cli/v2 v2.27.7 h1:bH59vdhbjLv3LAvIu6gd0usJHgoTTPhCFib8qqOwXYU=
-github.com/urfave/cli/v2 v2.27.7/go.mod h1:CyNAG/xg+iAOg0N4MPGZqVmv2rCoP267496AOXUZjA4=
+github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU=
+github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg=
github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo=
github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ=
-github.com/vektah/gqlparser/v2 v2.5.30 h1:EqLwGAFLIzt1wpx1IPpY67DwUujF1OfzgEyDsLrN6kE=
-github.com/vektah/gqlparser/v2 v2.5.30/go.mod h1:D1/VCZtV3LPnQrcPBeR/q5jkSQIPti0uYCP/RI0gIeo=
+github.com/vmware-labs/yaml-jsonpath v0.3.2 h1:/5QKeCBGdsInyDCyVNLbXyilb61MXGi9NP674f9Hobk=
+github.com/vmware-labs/yaml-jsonpath v0.3.2/go.mod h1:U6whw1z03QyqgWdgXxvVnQ90zN1BWz5V+51Ewf8k+rQ=
github.com/wasilibs/go-pgquery v0.0.0-20250409022910-10ac41983c07 h1:mJdDDPblDfPe7z7go8Dvv1AJQDI3eQ/5xith3q2mFlo=
github.com/wasilibs/go-pgquery v0.0.0-20250409022910-10ac41983c07/go.mod h1:Ak17IJ037caFp4jpCw/iQQ7/W74Sqpb1YuKJU6HTKfM=
github.com/wasilibs/wazero-helpers v0.0.0-20240620070341-3dff1577cd52 h1:OvLBa8SqJnZ6P+mjlzc2K7PM22rRUPE1x32G9DTPrC4=
github.com/wasilibs/wazero-helpers v0.0.0-20240620070341-3dff1577cd52/go.mod h1:jMeV4Vpbi8osrE/pKUxRZkVaA0EX7NZN0A9/oRzgpgY=
-github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 h1:gEOO8jv9F4OT7lGCjxCBTO/36wtF6j2nSip77qHd4x4=
-github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1/go.mod h1:Ohn+xnUBiLI6FVj/9LpzZWtj1/D6lUovWYBkxHVV3aM=
+github.com/woodsbury/decimal128 v1.3.0 h1:8pffMNWIlC0O5vbyHWFZAt5yWvWcrHA+3ovIIjVWss0=
+github.com/woodsbury/decimal128 v1.3.0/go.mod h1:C5UTmyTjW3JftjUFzOVhC20BEQa2a4ZKOB5I6Zjb+ds=
+github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA=
go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
@@ -201,6 +254,8 @@ go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI=
go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=
go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc=
golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
@@ -211,6 +266,7 @@ golang.org/x/crypto v0.39.0/go.mod h1:L+Xg3Wf6HoL4Bn4238Z6ft6KfEpN0tJGo53AAPC632
golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b h1:M2rDM6z3Fhozi9O7NWsxAkg/yqS/lQJ6PmkyIV3YP+o=
golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b/go.mod h1:3//PLf8L/X+8b4vuAfHzxeRUl04Adcb341+IGKfnqS8=
golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
@@ -218,9 +274,15 @@ golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
golang.org/x/mod v0.25.0 h1:n7a+ZbQKQA/Ysbyb0/6IbB1H/X41mKgbhfv7AfG/44w=
golang.org/x/mod v0.25.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww=
+golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
+golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk=
+golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
@@ -230,7 +292,9 @@ golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM=
golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4=
golang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=
golang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=
+golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
@@ -239,9 +303,20 @@ golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sync v0.15.0 h1:KWH3jNZsfyT6xfAfKiz6MRNmd46ByHDYaZ7KSkCtdW8=
golang.org/x/sync v0.15.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
+golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
@@ -264,6 +339,7 @@ golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY=
golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
@@ -280,6 +356,7 @@ golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3
golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58=
@@ -287,26 +364,45 @@ golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxb
golang.org/x/tools v0.34.0 h1:qIpSLOxeCYGg9TrcJokLBG4KFA6d795g0xkBkiESGlo=
golang.org/x/tools v0.34.0/go.mod h1:pAP9OwEaY1CAW3HOmg3hLZC5Z0CCmzjAF2UQMSqNARg=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
google.golang.org/genproto/googleapis/api v0.0.0-20250218202821-56aae31c358a h1:nwKuGPlUAt+aR+pcrkfFRrTU1BVrSmYyYMxYbUIVHr0=
google.golang.org/genproto/googleapis/api v0.0.0-20250218202821-56aae31c358a/go.mod h1:3kWAYMk1I75K4vykHtKt2ycnOgpA6974V7bREqbsenU=
google.golang.org/genproto/googleapis/rpc v0.0.0-20250218202821-56aae31c358a h1:51aaUVRocpvUOSQKM6Q7VuoaktNIaMCLuhZB6DKksq4=
google.golang.org/genproto/googleapis/rpc v0.0.0-20250218202821-56aae31c358a/go.mod h1:uRxBH1mhmO8PGhU89cMcHaXKZqO+OfakD8QQO0oYwlQ=
google.golang.org/grpc v1.72.0 h1:S7UkcVa60b5AAQTaO6ZKamFp1zMZSU0fGDK2WZLbBnM=
google.golang.org/grpc v1.72.0/go.mod h1:wH5Aktxcg25y1I3w7H69nHfXdOG3UiadoBtjh3izSDM=
+google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
+google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
+google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
+google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
+google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
+google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
+google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=
google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
+gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=
gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=
gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=
+gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
+gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
+gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
+gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
+gopkg.in/yaml.v3 v3.0.0-20191026110619-0b21df46bc1d/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
diff --git a/backend/gqlgen.yml b/backend/gqlgen.yml
deleted file mode 100644
index c09e9e2..0000000
--- a/backend/gqlgen.yml
+++ /dev/null
@@ -1,31 +0,0 @@
-schema:
- - ../graphql/schema.graphql
-
-exec:
- package: graphql
- layout: single-file
- filename: graphql/generated.go
-
-model:
- package: model
- filename: graphql/model/generated.go
-
-resolver:
- package: resolver
- layout: follow-schema
- dir: graphql/resolver
-
-models:
- ID:
- model:
- - github.com/99designs/gqlgen/graphql.ID
- - github.com/99designs/gqlgen/graphql.Int
- - github.com/99designs/gqlgen/graphql.Int64
- - github.com/99designs/gqlgen/graphql.Int32
- Int:
- model:
- - github.com/99designs/gqlgen/graphql.Int32
- Int64:
- model:
- - github.com/99designs/gqlgen/graphql.Int
- - github.com/99designs/gqlgen/graphql.Int64
diff --git a/backend/graphql/generated.go b/backend/graphql/generated.go
deleted file mode 100644
index ebc130a..0000000
--- a/backend/graphql/generated.go
+++ /dev/null
@@ -1,7011 +0,0 @@
-// Code generated by github.com/99designs/gqlgen, DO NOT EDIT.
-
-package graphql
-
-import (
- "bytes"
- "context"
- "errors"
- "fmt"
- "strconv"
- "sync"
- "sync/atomic"
-
- "github.com/99designs/gqlgen/graphql"
- "github.com/99designs/gqlgen/graphql/introspection"
- gqlparser "github.com/vektah/gqlparser/v2"
- "github.com/vektah/gqlparser/v2/ast"
- "undef.ninja/x/feedaka/graphql/model"
-)
-
-// region ************************** generated!.gotpl **************************
-
-// NewExecutableSchema creates an ExecutableSchema from the ResolverRoot interface.
-func NewExecutableSchema(cfg Config) graphql.ExecutableSchema {
- return &executableSchema{
- schema: cfg.Schema,
- resolvers: cfg.Resolvers,
- directives: cfg.Directives,
- complexity: cfg.Complexity,
- }
-}
-
-type Config struct {
- Schema *ast.Schema
- Resolvers ResolverRoot
- Directives DirectiveRoot
- Complexity ComplexityRoot
-}
-
-type ResolverRoot interface {
- Mutation() MutationResolver
- Query() QueryResolver
-}
-
-type DirectiveRoot struct {
-}
-
-type ComplexityRoot struct {
- Article struct {
- Feed func(childComplexity int) int
- FeedID func(childComplexity int) int
- GUID func(childComplexity int) int
- ID func(childComplexity int) int
- IsRead func(childComplexity int) int
- Title func(childComplexity int) int
- URL func(childComplexity int) int
- }
-
- ArticleConnection struct {
- Articles func(childComplexity int) int
- PageInfo func(childComplexity int) int
- }
-
- AuthPayload struct {
- User func(childComplexity int) int
- }
-
- Feed struct {
- Articles func(childComplexity int) int
- FetchedAt func(childComplexity int) int
- ID func(childComplexity int) int
- IsSubscribed func(childComplexity int) int
- Title func(childComplexity int) int
- URL func(childComplexity int) int
- UnreadCount func(childComplexity int) int
- }
-
- Mutation struct {
- AddFeed func(childComplexity int, url string) int
- Login func(childComplexity int, username string, password string) int
- Logout func(childComplexity int) int
- MarkArticleRead func(childComplexity int, id string) int
- MarkArticleUnread func(childComplexity int, id string) int
- MarkFeedRead func(childComplexity int, id string) int
- MarkFeedUnread func(childComplexity int, id string) int
- UnsubscribeFeed func(childComplexity int, id string) int
- }
-
- PageInfo struct {
- EndCursor func(childComplexity int) int
- HasNextPage func(childComplexity int) int
- }
-
- Query struct {
- Article func(childComplexity int, id string) int
- CurrentUser func(childComplexity int) int
- Feed func(childComplexity int, id string) int
- Feeds func(childComplexity int) int
- ReadArticles func(childComplexity int, feedID *string, after *string, first *int32) int
- UnreadArticles func(childComplexity int, feedID *string, after *string, first *int32) int
- }
-
- User struct {
- ID func(childComplexity int) int
- Username func(childComplexity int) int
- }
-}
-
-type MutationResolver interface {
- AddFeed(ctx context.Context, url string) (*model.Feed, error)
- UnsubscribeFeed(ctx context.Context, id string) (bool, error)
- MarkArticleRead(ctx context.Context, id string) (*model.Article, error)
- MarkArticleUnread(ctx context.Context, id string) (*model.Article, error)
- MarkFeedRead(ctx context.Context, id string) (*model.Feed, error)
- MarkFeedUnread(ctx context.Context, id string) (*model.Feed, error)
- Login(ctx context.Context, username string, password string) (*model.AuthPayload, error)
- Logout(ctx context.Context) (bool, error)
-}
-type QueryResolver interface {
- Feeds(ctx context.Context) ([]*model.Feed, error)
- UnreadArticles(ctx context.Context, feedID *string, after *string, first *int32) (*model.ArticleConnection, error)
- ReadArticles(ctx context.Context, feedID *string, after *string, first *int32) (*model.ArticleConnection, error)
- Feed(ctx context.Context, id string) (*model.Feed, error)
- Article(ctx context.Context, id string) (*model.Article, error)
- CurrentUser(ctx context.Context) (*model.User, error)
-}
-
-type executableSchema struct {
- schema *ast.Schema
- resolvers ResolverRoot
- directives DirectiveRoot
- complexity ComplexityRoot
-}
-
-func (e *executableSchema) Schema() *ast.Schema {
- if e.schema != nil {
- return e.schema
- }
- return parsedSchema
-}
-
-func (e *executableSchema) Complexity(ctx context.Context, typeName, field string, childComplexity int, rawArgs map[string]any) (int, bool) {
- ec := executionContext{nil, e, 0, 0, nil}
- _ = ec
- switch typeName + "." + field {
-
- case "Article.feed":
- if e.complexity.Article.Feed == nil {
- break
- }
-
- return e.complexity.Article.Feed(childComplexity), true
-
- case "Article.feedId":
- if e.complexity.Article.FeedID == nil {
- break
- }
-
- return e.complexity.Article.FeedID(childComplexity), true
-
- case "Article.guid":
- if e.complexity.Article.GUID == nil {
- break
- }
-
- return e.complexity.Article.GUID(childComplexity), true
-
- case "Article.id":
- if e.complexity.Article.ID == nil {
- break
- }
-
- return e.complexity.Article.ID(childComplexity), true
-
- case "Article.isRead":
- if e.complexity.Article.IsRead == nil {
- break
- }
-
- return e.complexity.Article.IsRead(childComplexity), true
-
- case "Article.title":
- if e.complexity.Article.Title == nil {
- break
- }
-
- return e.complexity.Article.Title(childComplexity), true
-
- case "Article.url":
- if e.complexity.Article.URL == nil {
- break
- }
-
- return e.complexity.Article.URL(childComplexity), true
-
- case "ArticleConnection.articles":
- if e.complexity.ArticleConnection.Articles == nil {
- break
- }
-
- return e.complexity.ArticleConnection.Articles(childComplexity), true
-
- case "ArticleConnection.pageInfo":
- if e.complexity.ArticleConnection.PageInfo == nil {
- break
- }
-
- return e.complexity.ArticleConnection.PageInfo(childComplexity), true
-
- case "AuthPayload.user":
- if e.complexity.AuthPayload.User == nil {
- break
- }
-
- return e.complexity.AuthPayload.User(childComplexity), true
-
- case "Feed.articles":
- if e.complexity.Feed.Articles == nil {
- break
- }
-
- return e.complexity.Feed.Articles(childComplexity), true
-
- case "Feed.fetchedAt":
- if e.complexity.Feed.FetchedAt == nil {
- break
- }
-
- return e.complexity.Feed.FetchedAt(childComplexity), true
-
- case "Feed.id":
- if e.complexity.Feed.ID == nil {
- break
- }
-
- return e.complexity.Feed.ID(childComplexity), true
-
- case "Feed.isSubscribed":
- if e.complexity.Feed.IsSubscribed == nil {
- break
- }
-
- return e.complexity.Feed.IsSubscribed(childComplexity), true
-
- case "Feed.title":
- if e.complexity.Feed.Title == nil {
- break
- }
-
- return e.complexity.Feed.Title(childComplexity), true
-
- case "Feed.url":
- if e.complexity.Feed.URL == nil {
- break
- }
-
- return e.complexity.Feed.URL(childComplexity), true
-
- case "Feed.unreadCount":
- if e.complexity.Feed.UnreadCount == nil {
- break
- }
-
- return e.complexity.Feed.UnreadCount(childComplexity), true
-
- case "Mutation.addFeed":
- if e.complexity.Mutation.AddFeed == nil {
- break
- }
-
- args, err := ec.field_Mutation_addFeed_args(ctx, rawArgs)
- if err != nil {
- return 0, false
- }
-
- return e.complexity.Mutation.AddFeed(childComplexity, args["url"].(string)), true
-
- case "Mutation.login":
- if e.complexity.Mutation.Login == nil {
- break
- }
-
- args, err := ec.field_Mutation_login_args(ctx, rawArgs)
- if err != nil {
- return 0, false
- }
-
- return e.complexity.Mutation.Login(childComplexity, args["username"].(string), args["password"].(string)), true
-
- case "Mutation.logout":
- if e.complexity.Mutation.Logout == nil {
- break
- }
-
- return e.complexity.Mutation.Logout(childComplexity), true
-
- case "Mutation.markArticleRead":
- if e.complexity.Mutation.MarkArticleRead == nil {
- break
- }
-
- args, err := ec.field_Mutation_markArticleRead_args(ctx, rawArgs)
- if err != nil {
- return 0, false
- }
-
- return e.complexity.Mutation.MarkArticleRead(childComplexity, args["id"].(string)), true
-
- case "Mutation.markArticleUnread":
- if e.complexity.Mutation.MarkArticleUnread == nil {
- break
- }
-
- args, err := ec.field_Mutation_markArticleUnread_args(ctx, rawArgs)
- if err != nil {
- return 0, false
- }
-
- return e.complexity.Mutation.MarkArticleUnread(childComplexity, args["id"].(string)), true
-
- case "Mutation.markFeedRead":
- if e.complexity.Mutation.MarkFeedRead == nil {
- break
- }
-
- args, err := ec.field_Mutation_markFeedRead_args(ctx, rawArgs)
- if err != nil {
- return 0, false
- }
-
- return e.complexity.Mutation.MarkFeedRead(childComplexity, args["id"].(string)), true
-
- case "Mutation.markFeedUnread":
- if e.complexity.Mutation.MarkFeedUnread == nil {
- break
- }
-
- args, err := ec.field_Mutation_markFeedUnread_args(ctx, rawArgs)
- if err != nil {
- return 0, false
- }
-
- return e.complexity.Mutation.MarkFeedUnread(childComplexity, args["id"].(string)), true
-
- case "Mutation.unsubscribeFeed":
- if e.complexity.Mutation.UnsubscribeFeed == nil {
- break
- }
-
- args, err := ec.field_Mutation_unsubscribeFeed_args(ctx, rawArgs)
- if err != nil {
- return 0, false
- }
-
- return e.complexity.Mutation.UnsubscribeFeed(childComplexity, args["id"].(string)), true
-
- case "PageInfo.endCursor":
- if e.complexity.PageInfo.EndCursor == nil {
- break
- }
-
- return e.complexity.PageInfo.EndCursor(childComplexity), true
-
- case "PageInfo.hasNextPage":
- if e.complexity.PageInfo.HasNextPage == nil {
- break
- }
-
- return e.complexity.PageInfo.HasNextPage(childComplexity), true
-
- case "Query.article":
- if e.complexity.Query.Article == nil {
- break
- }
-
- args, err := ec.field_Query_article_args(ctx, rawArgs)
- if err != nil {
- return 0, false
- }
-
- return e.complexity.Query.Article(childComplexity, args["id"].(string)), true
-
- case "Query.currentUser":
- if e.complexity.Query.CurrentUser == nil {
- break
- }
-
- return e.complexity.Query.CurrentUser(childComplexity), true
-
- case "Query.feed":
- if e.complexity.Query.Feed == nil {
- break
- }
-
- args, err := ec.field_Query_feed_args(ctx, rawArgs)
- if err != nil {
- return 0, false
- }
-
- return e.complexity.Query.Feed(childComplexity, args["id"].(string)), true
-
- case "Query.feeds":
- if e.complexity.Query.Feeds == nil {
- break
- }
-
- return e.complexity.Query.Feeds(childComplexity), true
-
- case "Query.readArticles":
- if e.complexity.Query.ReadArticles == nil {
- break
- }
-
- args, err := ec.field_Query_readArticles_args(ctx, rawArgs)
- if err != nil {
- return 0, false
- }
-
- return e.complexity.Query.ReadArticles(childComplexity, args["feedId"].(*string), args["after"].(*string), args["first"].(*int32)), true
-
- case "Query.unreadArticles":
- if e.complexity.Query.UnreadArticles == nil {
- break
- }
-
- args, err := ec.field_Query_unreadArticles_args(ctx, rawArgs)
- if err != nil {
- return 0, false
- }
-
- return e.complexity.Query.UnreadArticles(childComplexity, args["feedId"].(*string), args["after"].(*string), args["first"].(*int32)), true
-
- case "User.id":
- if e.complexity.User.ID == nil {
- break
- }
-
- return e.complexity.User.ID(childComplexity), true
-
- case "User.username":
- if e.complexity.User.Username == nil {
- break
- }
-
- return e.complexity.User.Username(childComplexity), true
-
- }
- return 0, false
-}
-
-func (e *executableSchema) Exec(ctx context.Context) graphql.ResponseHandler {
- opCtx := graphql.GetOperationContext(ctx)
- ec := executionContext{opCtx, e, 0, 0, make(chan graphql.DeferredResult)}
- inputUnmarshalMap := graphql.BuildUnmarshalerMap()
- first := true
-
- switch opCtx.Operation.Operation {
- case ast.Query:
- return func(ctx context.Context) *graphql.Response {
- var response graphql.Response
- var data graphql.Marshaler
- if first {
- first = false
- ctx = graphql.WithUnmarshalerMap(ctx, inputUnmarshalMap)
- data = ec._Query(ctx, opCtx.Operation.SelectionSet)
- } else {
- if atomic.LoadInt32(&ec.pendingDeferred) > 0 {
- result := <-ec.deferredResults
- atomic.AddInt32(&ec.pendingDeferred, -1)
- data = result.Result
- response.Path = result.Path
- response.Label = result.Label
- response.Errors = result.Errors
- } else {
- return nil
- }
- }
- var buf bytes.Buffer
- data.MarshalGQL(&buf)
- response.Data = buf.Bytes()
- if atomic.LoadInt32(&ec.deferred) > 0 {
- hasNext := atomic.LoadInt32(&ec.pendingDeferred) > 0
- response.HasNext = &hasNext
- }
-
- return &response
- }
- case ast.Mutation:
- return func(ctx context.Context) *graphql.Response {
- if !first {
- return nil
- }
- first = false
- ctx = graphql.WithUnmarshalerMap(ctx, inputUnmarshalMap)
- data := ec._Mutation(ctx, opCtx.Operation.SelectionSet)
- var buf bytes.Buffer
- data.MarshalGQL(&buf)
-
- return &graphql.Response{
- Data: buf.Bytes(),
- }
- }
-
- default:
- return graphql.OneShot(graphql.ErrorResponse(ctx, "unsupported GraphQL operation"))
- }
-}
-
-type executionContext struct {
- *graphql.OperationContext
- *executableSchema
- deferred int32
- pendingDeferred int32
- deferredResults chan graphql.DeferredResult
-}
-
-func (ec *executionContext) processDeferredGroup(dg graphql.DeferredGroup) {
- atomic.AddInt32(&ec.pendingDeferred, 1)
- go func() {
- ctx := graphql.WithFreshResponseContext(dg.Context)
- dg.FieldSet.Dispatch(ctx)
- ds := graphql.DeferredResult{
- Path: dg.Path,
- Label: dg.Label,
- Result: dg.FieldSet,
- Errors: graphql.GetErrors(ctx),
- }
- // null fields should bubble up
- if dg.FieldSet.Invalids > 0 {
- ds.Result = graphql.Null
- }
- ec.deferredResults <- ds
- }()
-}
-
-func (ec *executionContext) introspectSchema() (*introspection.Schema, error) {
- if ec.DisableIntrospection {
- return nil, errors.New("introspection disabled")
- }
- return introspection.WrapSchema(ec.Schema()), nil
-}
-
-func (ec *executionContext) introspectType(name string) (*introspection.Type, error) {
- if ec.DisableIntrospection {
- return nil, errors.New("introspection disabled")
- }
- return introspection.WrapTypeFromDef(ec.Schema(), ec.Schema().Types[name]), nil
-}
-
-var sources = []*ast.Source{
- {Name: "../../graphql/schema.graphql", Input: `scalar DateTime
-
-"""
-Represents a feed subscription in the system
-"""
-type Feed {
- """
- Unique identifier for the feed
- """
- id: ID!
-
- """
- URL of the RSS/Atom feed
- """
- url: String!
-
- """
- Title of the feed (extracted from feed metadata)
- """
- title: String!
-
- """
- Timestamp when the feed was last fetched
- """
- fetchedAt: DateTime!
-
- """
- Whether the user is currently subscribed to this feed
- """
- isSubscribed: Boolean!
-
- """
- Number of unread articles in this feed
- """
- unreadCount: Int!
-
- """
- Articles belonging to this feed
- """
- articles: [Article!]!
-}
-
-"""
-Represents an individual article/post from a feed
-"""
-type Article {
- """
- Unique identifier for the article
- """
- id: ID!
-
- """
- ID of the feed this article belongs to
- """
- feedId: ID!
-
- """
- GUID from the RSS/Atom feed (unique identifier from feed)
- """
- guid: String!
-
- """
- Title of the article
- """
- title: String!
-
- """
- URL/link to the original article
- """
- url: String!
-
- """
- Whether the article has been marked as read
- """
- isRead: Boolean!
-
- """
- The feed this article belongs to
- """
- feed: Feed!
-}
-
-"""
-Represents a user in the system
-"""
-type User {
- """
- Unique identifier for the user
- """
- id: ID!
-
- """
- Username of the user
- """
- username: String!
-}
-
-"""
-Pagination information for cursor-based pagination
-"""
-type PageInfo {
- """
- Whether there are more items after the last item in this page
- """
- hasNextPage: Boolean!
-
- """
- Cursor of the last item in this page
- """
- endCursor: ID
-}
-
-"""
-A paginated list of articles
-"""
-type ArticleConnection {
- """
- The list of articles
- """
- articles: [Article!]!
-
- """
- Pagination information
- """
- pageInfo: PageInfo!
-}
-
-"""
-Authentication payload returned from login mutation
-"""
-type AuthPayload {
- """
- The authenticated user
- """
- user: User!
-}
-
-"""
-Root query type for reading data
-"""
-type Query {
- """
- Get all feeds with their metadata
- """
- feeds: [Feed!]!
-
- """
- Get unread articles with optional feed filter and cursor-based pagination
- """
- unreadArticles(feedId: ID, after: ID, first: Int): ArticleConnection!
-
- """
- Get read articles with optional feed filter and cursor-based pagination
- """
- readArticles(feedId: ID, after: ID, first: Int): ArticleConnection!
-
- """
- Get a specific feed by ID
- """
- feed(id: ID!): Feed
-
- """
- Get a specific article by ID
- """
- article(id: ID!): Article
-
- """
- Get the currently authenticated user
- """
- currentUser: User
-}
-
-"""
-Root mutation type for modifying data
-"""
-type Mutation {
- """
- Add a new feed subscription
- """
- addFeed(url: String!): Feed!
-
- """
- Unsubscribe from a feed (preserves feed and article data)
- """
- unsubscribeFeed(id: ID!): Boolean!
-
- """
- Mark an article as read
- """
- markArticleRead(id: ID!): Article!
-
- """
- Mark an article as unread
- """
- markArticleUnread(id: ID!): Article!
-
- """
- Mark all articles in a feed as read
- """
- markFeedRead(id: ID!): Feed!
-
- """
- Mark all articles in a feed as unread
- """
- markFeedUnread(id: ID!): Feed!
-
- """
- Login with username and password. Creates a session cookie.
- """
- login(username: String!, password: String!): AuthPayload!
-
- """
- Logout the current user and destroy the session
- """
- logout: Boolean!
-}
-`, BuiltIn: false},
-}
-var parsedSchema = gqlparser.MustLoadSchema(sources...)
-
-// endregion ************************** generated!.gotpl **************************
-
-// region ***************************** args.gotpl *****************************
-
-func (ec *executionContext) field_Mutation_addFeed_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {
- var err error
- args := map[string]any{}
- arg0, err := ec.field_Mutation_addFeed_argsURL(ctx, rawArgs)
- if err != nil {
- return nil, err
- }
- args["url"] = arg0
- return args, nil
-}
-func (ec *executionContext) field_Mutation_addFeed_argsURL(
- ctx context.Context,
- rawArgs map[string]any,
-) (string, error) {
- if _, ok := rawArgs["url"]; !ok {
- var zeroVal string
- return zeroVal, nil
- }
-
- ctx = graphql.WithPathContext(ctx, graphql.NewPathWithField("url"))
- if tmp, ok := rawArgs["url"]; ok {
- return ec.unmarshalNString2string(ctx, tmp)
- }
-
- var zeroVal string
- return zeroVal, nil
-}
-
-func (ec *executionContext) field_Mutation_login_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {
- var err error
- args := map[string]any{}
- arg0, err := ec.field_Mutation_login_argsUsername(ctx, rawArgs)
- if err != nil {
- return nil, err
- }
- args["username"] = arg0
- arg1, err := ec.field_Mutation_login_argsPassword(ctx, rawArgs)
- if err != nil {
- return nil, err
- }
- args["password"] = arg1
- return args, nil
-}
-func (ec *executionContext) field_Mutation_login_argsUsername(
- ctx context.Context,
- rawArgs map[string]any,
-) (string, error) {
- if _, ok := rawArgs["username"]; !ok {
- var zeroVal string
- return zeroVal, nil
- }
-
- ctx = graphql.WithPathContext(ctx, graphql.NewPathWithField("username"))
- if tmp, ok := rawArgs["username"]; ok {
- return ec.unmarshalNString2string(ctx, tmp)
- }
-
- var zeroVal string
- return zeroVal, nil
-}
-
-func (ec *executionContext) field_Mutation_login_argsPassword(
- ctx context.Context,
- rawArgs map[string]any,
-) (string, error) {
- if _, ok := rawArgs["password"]; !ok {
- var zeroVal string
- return zeroVal, nil
- }
-
- ctx = graphql.WithPathContext(ctx, graphql.NewPathWithField("password"))
- if tmp, ok := rawArgs["password"]; ok {
- return ec.unmarshalNString2string(ctx, tmp)
- }
-
- var zeroVal string
- return zeroVal, nil
-}
-
-func (ec *executionContext) field_Mutation_markArticleRead_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {
- var err error
- args := map[string]any{}
- arg0, err := ec.field_Mutation_markArticleRead_argsID(ctx, rawArgs)
- if err != nil {
- return nil, err
- }
- args["id"] = arg0
- return args, nil
-}
-func (ec *executionContext) field_Mutation_markArticleRead_argsID(
- ctx context.Context,
- rawArgs map[string]any,
-) (string, error) {
- if _, ok := rawArgs["id"]; !ok {
- var zeroVal string
- return zeroVal, nil
- }
-
- ctx = graphql.WithPathContext(ctx, graphql.NewPathWithField("id"))
- if tmp, ok := rawArgs["id"]; ok {
- return ec.unmarshalNID2string(ctx, tmp)
- }
-
- var zeroVal string
- return zeroVal, nil
-}
-
-func (ec *executionContext) field_Mutation_markArticleUnread_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {
- var err error
- args := map[string]any{}
- arg0, err := ec.field_Mutation_markArticleUnread_argsID(ctx, rawArgs)
- if err != nil {
- return nil, err
- }
- args["id"] = arg0
- return args, nil
-}
-func (ec *executionContext) field_Mutation_markArticleUnread_argsID(
- ctx context.Context,
- rawArgs map[string]any,
-) (string, error) {
- if _, ok := rawArgs["id"]; !ok {
- var zeroVal string
- return zeroVal, nil
- }
-
- ctx = graphql.WithPathContext(ctx, graphql.NewPathWithField("id"))
- if tmp, ok := rawArgs["id"]; ok {
- return ec.unmarshalNID2string(ctx, tmp)
- }
-
- var zeroVal string
- return zeroVal, nil
-}
-
-func (ec *executionContext) field_Mutation_markFeedRead_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {
- var err error
- args := map[string]any{}
- arg0, err := ec.field_Mutation_markFeedRead_argsID(ctx, rawArgs)
- if err != nil {
- return nil, err
- }
- args["id"] = arg0
- return args, nil
-}
-func (ec *executionContext) field_Mutation_markFeedRead_argsID(
- ctx context.Context,
- rawArgs map[string]any,
-) (string, error) {
- if _, ok := rawArgs["id"]; !ok {
- var zeroVal string
- return zeroVal, nil
- }
-
- ctx = graphql.WithPathContext(ctx, graphql.NewPathWithField("id"))
- if tmp, ok := rawArgs["id"]; ok {
- return ec.unmarshalNID2string(ctx, tmp)
- }
-
- var zeroVal string
- return zeroVal, nil
-}
-
-func (ec *executionContext) field_Mutation_markFeedUnread_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {
- var err error
- args := map[string]any{}
- arg0, err := ec.field_Mutation_markFeedUnread_argsID(ctx, rawArgs)
- if err != nil {
- return nil, err
- }
- args["id"] = arg0
- return args, nil
-}
-func (ec *executionContext) field_Mutation_markFeedUnread_argsID(
- ctx context.Context,
- rawArgs map[string]any,
-) (string, error) {
- if _, ok := rawArgs["id"]; !ok {
- var zeroVal string
- return zeroVal, nil
- }
-
- ctx = graphql.WithPathContext(ctx, graphql.NewPathWithField("id"))
- if tmp, ok := rawArgs["id"]; ok {
- return ec.unmarshalNID2string(ctx, tmp)
- }
-
- var zeroVal string
- return zeroVal, nil
-}
-
-func (ec *executionContext) field_Mutation_unsubscribeFeed_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {
- var err error
- args := map[string]any{}
- arg0, err := ec.field_Mutation_unsubscribeFeed_argsID(ctx, rawArgs)
- if err != nil {
- return nil, err
- }
- args["id"] = arg0
- return args, nil
-}
-func (ec *executionContext) field_Mutation_unsubscribeFeed_argsID(
- ctx context.Context,
- rawArgs map[string]any,
-) (string, error) {
- if _, ok := rawArgs["id"]; !ok {
- var zeroVal string
- return zeroVal, nil
- }
-
- ctx = graphql.WithPathContext(ctx, graphql.NewPathWithField("id"))
- if tmp, ok := rawArgs["id"]; ok {
- return ec.unmarshalNID2string(ctx, tmp)
- }
-
- var zeroVal string
- return zeroVal, nil
-}
-
-func (ec *executionContext) field_Query___type_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {
- var err error
- args := map[string]any{}
- arg0, err := ec.field_Query___type_argsName(ctx, rawArgs)
- if err != nil {
- return nil, err
- }
- args["name"] = arg0
- return args, nil
-}
-func (ec *executionContext) field_Query___type_argsName(
- ctx context.Context,
- rawArgs map[string]any,
-) (string, error) {
- if _, ok := rawArgs["name"]; !ok {
- var zeroVal string
- return zeroVal, nil
- }
-
- ctx = graphql.WithPathContext(ctx, graphql.NewPathWithField("name"))
- if tmp, ok := rawArgs["name"]; ok {
- return ec.unmarshalNString2string(ctx, tmp)
- }
-
- var zeroVal string
- return zeroVal, nil
-}
-
-func (ec *executionContext) field_Query_article_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {
- var err error
- args := map[string]any{}
- arg0, err := ec.field_Query_article_argsID(ctx, rawArgs)
- if err != nil {
- return nil, err
- }
- args["id"] = arg0
- return args, nil
-}
-func (ec *executionContext) field_Query_article_argsID(
- ctx context.Context,
- rawArgs map[string]any,
-) (string, error) {
- if _, ok := rawArgs["id"]; !ok {
- var zeroVal string
- return zeroVal, nil
- }
-
- ctx = graphql.WithPathContext(ctx, graphql.NewPathWithField("id"))
- if tmp, ok := rawArgs["id"]; ok {
- return ec.unmarshalNID2string(ctx, tmp)
- }
-
- var zeroVal string
- return zeroVal, nil
-}
-
-func (ec *executionContext) field_Query_feed_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {
- var err error
- args := map[string]any{}
- arg0, err := ec.field_Query_feed_argsID(ctx, rawArgs)
- if err != nil {
- return nil, err
- }
- args["id"] = arg0
- return args, nil
-}
-func (ec *executionContext) field_Query_feed_argsID(
- ctx context.Context,
- rawArgs map[string]any,
-) (string, error) {
- if _, ok := rawArgs["id"]; !ok {
- var zeroVal string
- return zeroVal, nil
- }
-
- ctx = graphql.WithPathContext(ctx, graphql.NewPathWithField("id"))
- if tmp, ok := rawArgs["id"]; ok {
- return ec.unmarshalNID2string(ctx, tmp)
- }
-
- var zeroVal string
- return zeroVal, nil
-}
-
-func (ec *executionContext) field_Query_readArticles_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {
- var err error
- args := map[string]any{}
- arg0, err := ec.field_Query_readArticles_argsFeedID(ctx, rawArgs)
- if err != nil {
- return nil, err
- }
- args["feedId"] = arg0
- arg1, err := ec.field_Query_readArticles_argsAfter(ctx, rawArgs)
- if err != nil {
- return nil, err
- }
- args["after"] = arg1
- arg2, err := ec.field_Query_readArticles_argsFirst(ctx, rawArgs)
- if err != nil {
- return nil, err
- }
- args["first"] = arg2
- return args, nil
-}
-func (ec *executionContext) field_Query_readArticles_argsFeedID(
- ctx context.Context,
- rawArgs map[string]any,
-) (*string, error) {
- if _, ok := rawArgs["feedId"]; !ok {
- var zeroVal *string
- return zeroVal, nil
- }
-
- ctx = graphql.WithPathContext(ctx, graphql.NewPathWithField("feedId"))
- if tmp, ok := rawArgs["feedId"]; ok {
- return ec.unmarshalOID2ᚖstring(ctx, tmp)
- }
-
- var zeroVal *string
- return zeroVal, nil
-}
-
-func (ec *executionContext) field_Query_readArticles_argsAfter(
- ctx context.Context,
- rawArgs map[string]any,
-) (*string, error) {
- if _, ok := rawArgs["after"]; !ok {
- var zeroVal *string
- return zeroVal, nil
- }
-
- ctx = graphql.WithPathContext(ctx, graphql.NewPathWithField("after"))
- if tmp, ok := rawArgs["after"]; ok {
- return ec.unmarshalOID2ᚖstring(ctx, tmp)
- }
-
- var zeroVal *string
- return zeroVal, nil
-}
-
-func (ec *executionContext) field_Query_readArticles_argsFirst(
- ctx context.Context,
- rawArgs map[string]any,
-) (*int32, error) {
- if _, ok := rawArgs["first"]; !ok {
- var zeroVal *int32
- return zeroVal, nil
- }
-
- ctx = graphql.WithPathContext(ctx, graphql.NewPathWithField("first"))
- if tmp, ok := rawArgs["first"]; ok {
- return ec.unmarshalOInt2ᚖint32(ctx, tmp)
- }
-
- var zeroVal *int32
- return zeroVal, nil
-}
-
-func (ec *executionContext) field_Query_unreadArticles_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {
- var err error
- args := map[string]any{}
- arg0, err := ec.field_Query_unreadArticles_argsFeedID(ctx, rawArgs)
- if err != nil {
- return nil, err
- }
- args["feedId"] = arg0
- arg1, err := ec.field_Query_unreadArticles_argsAfter(ctx, rawArgs)
- if err != nil {
- return nil, err
- }
- args["after"] = arg1
- arg2, err := ec.field_Query_unreadArticles_argsFirst(ctx, rawArgs)
- if err != nil {
- return nil, err
- }
- args["first"] = arg2
- return args, nil
-}
-func (ec *executionContext) field_Query_unreadArticles_argsFeedID(
- ctx context.Context,
- rawArgs map[string]any,
-) (*string, error) {
- if _, ok := rawArgs["feedId"]; !ok {
- var zeroVal *string
- return zeroVal, nil
- }
-
- ctx = graphql.WithPathContext(ctx, graphql.NewPathWithField("feedId"))
- if tmp, ok := rawArgs["feedId"]; ok {
- return ec.unmarshalOID2ᚖstring(ctx, tmp)
- }
-
- var zeroVal *string
- return zeroVal, nil
-}
-
-func (ec *executionContext) field_Query_unreadArticles_argsAfter(
- ctx context.Context,
- rawArgs map[string]any,
-) (*string, error) {
- if _, ok := rawArgs["after"]; !ok {
- var zeroVal *string
- return zeroVal, nil
- }
-
- ctx = graphql.WithPathContext(ctx, graphql.NewPathWithField("after"))
- if tmp, ok := rawArgs["after"]; ok {
- return ec.unmarshalOID2ᚖstring(ctx, tmp)
- }
-
- var zeroVal *string
- return zeroVal, nil
-}
-
-func (ec *executionContext) field_Query_unreadArticles_argsFirst(
- ctx context.Context,
- rawArgs map[string]any,
-) (*int32, error) {
- if _, ok := rawArgs["first"]; !ok {
- var zeroVal *int32
- return zeroVal, nil
- }
-
- ctx = graphql.WithPathContext(ctx, graphql.NewPathWithField("first"))
- if tmp, ok := rawArgs["first"]; ok {
- return ec.unmarshalOInt2ᚖint32(ctx, tmp)
- }
-
- var zeroVal *int32
- return zeroVal, nil
-}
-
-func (ec *executionContext) field___Directive_args_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {
- var err error
- args := map[string]any{}
- arg0, err := ec.field___Directive_args_argsIncludeDeprecated(ctx, rawArgs)
- if err != nil {
- return nil, err
- }
- args["includeDeprecated"] = arg0
- return args, nil
-}
-func (ec *executionContext) field___Directive_args_argsIncludeDeprecated(
- ctx context.Context,
- rawArgs map[string]any,
-) (*bool, error) {
- if _, ok := rawArgs["includeDeprecated"]; !ok {
- var zeroVal *bool
- return zeroVal, nil
- }
-
- ctx = graphql.WithPathContext(ctx, graphql.NewPathWithField("includeDeprecated"))
- if tmp, ok := rawArgs["includeDeprecated"]; ok {
- return ec.unmarshalOBoolean2ᚖbool(ctx, tmp)
- }
-
- var zeroVal *bool
- return zeroVal, nil
-}
-
-func (ec *executionContext) field___Field_args_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {
- var err error
- args := map[string]any{}
- arg0, err := ec.field___Field_args_argsIncludeDeprecated(ctx, rawArgs)
- if err != nil {
- return nil, err
- }
- args["includeDeprecated"] = arg0
- return args, nil
-}
-func (ec *executionContext) field___Field_args_argsIncludeDeprecated(
- ctx context.Context,
- rawArgs map[string]any,
-) (*bool, error) {
- if _, ok := rawArgs["includeDeprecated"]; !ok {
- var zeroVal *bool
- return zeroVal, nil
- }
-
- ctx = graphql.WithPathContext(ctx, graphql.NewPathWithField("includeDeprecated"))
- if tmp, ok := rawArgs["includeDeprecated"]; ok {
- return ec.unmarshalOBoolean2ᚖbool(ctx, tmp)
- }
-
- var zeroVal *bool
- return zeroVal, nil
-}
-
-func (ec *executionContext) field___Type_enumValues_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {
- var err error
- args := map[string]any{}
- arg0, err := ec.field___Type_enumValues_argsIncludeDeprecated(ctx, rawArgs)
- if err != nil {
- return nil, err
- }
- args["includeDeprecated"] = arg0
- return args, nil
-}
-func (ec *executionContext) field___Type_enumValues_argsIncludeDeprecated(
- ctx context.Context,
- rawArgs map[string]any,
-) (bool, error) {
- if _, ok := rawArgs["includeDeprecated"]; !ok {
- var zeroVal bool
- return zeroVal, nil
- }
-
- ctx = graphql.WithPathContext(ctx, graphql.NewPathWithField("includeDeprecated"))
- if tmp, ok := rawArgs["includeDeprecated"]; ok {
- return ec.unmarshalOBoolean2bool(ctx, tmp)
- }
-
- var zeroVal bool
- return zeroVal, nil
-}
-
-func (ec *executionContext) field___Type_fields_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {
- var err error
- args := map[string]any{}
- arg0, err := ec.field___Type_fields_argsIncludeDeprecated(ctx, rawArgs)
- if err != nil {
- return nil, err
- }
- args["includeDeprecated"] = arg0
- return args, nil
-}
-func (ec *executionContext) field___Type_fields_argsIncludeDeprecated(
- ctx context.Context,
- rawArgs map[string]any,
-) (bool, error) {
- if _, ok := rawArgs["includeDeprecated"]; !ok {
- var zeroVal bool
- return zeroVal, nil
- }
-
- ctx = graphql.WithPathContext(ctx, graphql.NewPathWithField("includeDeprecated"))
- if tmp, ok := rawArgs["includeDeprecated"]; ok {
- return ec.unmarshalOBoolean2bool(ctx, tmp)
- }
-
- var zeroVal bool
- return zeroVal, nil
-}
-
-// endregion ***************************** args.gotpl *****************************
-
-// region ************************** directives.gotpl **************************
-
-// endregion ************************** directives.gotpl **************************
-
-// region **************************** field.gotpl *****************************
-
-func (ec *executionContext) _Article_id(ctx context.Context, field graphql.CollectedField, obj *model.Article) (ret graphql.Marshaler) {
- fc, err := ec.fieldContext_Article_id(ctx, field)
- if err != nil {
- return graphql.Null
- }
- ctx = graphql.WithFieldContext(ctx, fc)
- defer func() {
- if r := recover(); r != nil {
- ec.Error(ctx, ec.Recover(ctx, r))
- ret = graphql.Null
- }
- }()
- resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) {
- ctx = rctx // use context from middleware stack in children
- return obj.ID, nil
- })
- if err != nil {
- ec.Error(ctx, err)
- return graphql.Null
- }
- if resTmp == nil {
- if !graphql.HasFieldError(ctx, fc) {
- ec.Errorf(ctx, "must not be null")
- }
- return graphql.Null
- }
- res := resTmp.(string)
- fc.Result = res
- return ec.marshalNID2string(ctx, field.Selections, res)
-}
-
-func (ec *executionContext) fieldContext_Article_id(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
- fc = &graphql.FieldContext{
- Object: "Article",
- Field: field,
- IsMethod: false,
- IsResolver: false,
- Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {
- return nil, errors.New("field of type ID does not have child fields")
- },
- }
- return fc, nil
-}
-
-func (ec *executionContext) _Article_feedId(ctx context.Context, field graphql.CollectedField, obj *model.Article) (ret graphql.Marshaler) {
- fc, err := ec.fieldContext_Article_feedId(ctx, field)
- if err != nil {
- return graphql.Null
- }
- ctx = graphql.WithFieldContext(ctx, fc)
- defer func() {
- if r := recover(); r != nil {
- ec.Error(ctx, ec.Recover(ctx, r))
- ret = graphql.Null
- }
- }()
- resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) {
- ctx = rctx // use context from middleware stack in children
- return obj.FeedID, nil
- })
- if err != nil {
- ec.Error(ctx, err)
- return graphql.Null
- }
- if resTmp == nil {
- if !graphql.HasFieldError(ctx, fc) {
- ec.Errorf(ctx, "must not be null")
- }
- return graphql.Null
- }
- res := resTmp.(string)
- fc.Result = res
- return ec.marshalNID2string(ctx, field.Selections, res)
-}
-
-func (ec *executionContext) fieldContext_Article_feedId(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
- fc = &graphql.FieldContext{
- Object: "Article",
- Field: field,
- IsMethod: false,
- IsResolver: false,
- Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {
- return nil, errors.New("field of type ID does not have child fields")
- },
- }
- return fc, nil
-}
-
-func (ec *executionContext) _Article_guid(ctx context.Context, field graphql.CollectedField, obj *model.Article) (ret graphql.Marshaler) {
- fc, err := ec.fieldContext_Article_guid(ctx, field)
- if err != nil {
- return graphql.Null
- }
- ctx = graphql.WithFieldContext(ctx, fc)
- defer func() {
- if r := recover(); r != nil {
- ec.Error(ctx, ec.Recover(ctx, r))
- ret = graphql.Null
- }
- }()
- resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) {
- ctx = rctx // use context from middleware stack in children
- return obj.GUID, nil
- })
- if err != nil {
- ec.Error(ctx, err)
- return graphql.Null
- }
- if resTmp == nil {
- if !graphql.HasFieldError(ctx, fc) {
- ec.Errorf(ctx, "must not be null")
- }
- return graphql.Null
- }
- res := resTmp.(string)
- fc.Result = res
- return ec.marshalNString2string(ctx, field.Selections, res)
-}
-
-func (ec *executionContext) fieldContext_Article_guid(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
- fc = &graphql.FieldContext{
- Object: "Article",
- Field: field,
- IsMethod: false,
- IsResolver: false,
- Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {
- return nil, errors.New("field of type String does not have child fields")
- },
- }
- return fc, nil
-}
-
-func (ec *executionContext) _Article_title(ctx context.Context, field graphql.CollectedField, obj *model.Article) (ret graphql.Marshaler) {
- fc, err := ec.fieldContext_Article_title(ctx, field)
- if err != nil {
- return graphql.Null
- }
- ctx = graphql.WithFieldContext(ctx, fc)
- defer func() {
- if r := recover(); r != nil {
- ec.Error(ctx, ec.Recover(ctx, r))
- ret = graphql.Null
- }
- }()
- resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) {
- ctx = rctx // use context from middleware stack in children
- return obj.Title, nil
- })
- if err != nil {
- ec.Error(ctx, err)
- return graphql.Null
- }
- if resTmp == nil {
- if !graphql.HasFieldError(ctx, fc) {
- ec.Errorf(ctx, "must not be null")
- }
- return graphql.Null
- }
- res := resTmp.(string)
- fc.Result = res
- return ec.marshalNString2string(ctx, field.Selections, res)
-}
-
-func (ec *executionContext) fieldContext_Article_title(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
- fc = &graphql.FieldContext{
- Object: "Article",
- Field: field,
- IsMethod: false,
- IsResolver: false,
- Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {
- return nil, errors.New("field of type String does not have child fields")
- },
- }
- return fc, nil
-}
-
-func (ec *executionContext) _Article_url(ctx context.Context, field graphql.CollectedField, obj *model.Article) (ret graphql.Marshaler) {
- fc, err := ec.fieldContext_Article_url(ctx, field)
- if err != nil {
- return graphql.Null
- }
- ctx = graphql.WithFieldContext(ctx, fc)
- defer func() {
- if r := recover(); r != nil {
- ec.Error(ctx, ec.Recover(ctx, r))
- ret = graphql.Null
- }
- }()
- resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) {
- ctx = rctx // use context from middleware stack in children
- return obj.URL, nil
- })
- if err != nil {
- ec.Error(ctx, err)
- return graphql.Null
- }
- if resTmp == nil {
- if !graphql.HasFieldError(ctx, fc) {
- ec.Errorf(ctx, "must not be null")
- }
- return graphql.Null
- }
- res := resTmp.(string)
- fc.Result = res
- return ec.marshalNString2string(ctx, field.Selections, res)
-}
-
-func (ec *executionContext) fieldContext_Article_url(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
- fc = &graphql.FieldContext{
- Object: "Article",
- Field: field,
- IsMethod: false,
- IsResolver: false,
- Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {
- return nil, errors.New("field of type String does not have child fields")
- },
- }
- return fc, nil
-}
-
-func (ec *executionContext) _Article_isRead(ctx context.Context, field graphql.CollectedField, obj *model.Article) (ret graphql.Marshaler) {
- fc, err := ec.fieldContext_Article_isRead(ctx, field)
- if err != nil {
- return graphql.Null
- }
- ctx = graphql.WithFieldContext(ctx, fc)
- defer func() {
- if r := recover(); r != nil {
- ec.Error(ctx, ec.Recover(ctx, r))
- ret = graphql.Null
- }
- }()
- resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) {
- ctx = rctx // use context from middleware stack in children
- return obj.IsRead, nil
- })
- if err != nil {
- ec.Error(ctx, err)
- return graphql.Null
- }
- if resTmp == nil {
- if !graphql.HasFieldError(ctx, fc) {
- ec.Errorf(ctx, "must not be null")
- }
- return graphql.Null
- }
- res := resTmp.(bool)
- fc.Result = res
- return ec.marshalNBoolean2bool(ctx, field.Selections, res)
-}
-
-func (ec *executionContext) fieldContext_Article_isRead(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
- fc = &graphql.FieldContext{
- Object: "Article",
- Field: field,
- IsMethod: false,
- IsResolver: false,
- Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {
- return nil, errors.New("field of type Boolean does not have child fields")
- },
- }
- return fc, nil
-}
-
-func (ec *executionContext) _Article_feed(ctx context.Context, field graphql.CollectedField, obj *model.Article) (ret graphql.Marshaler) {
- fc, err := ec.fieldContext_Article_feed(ctx, field)
- if err != nil {
- return graphql.Null
- }
- ctx = graphql.WithFieldContext(ctx, fc)
- defer func() {
- if r := recover(); r != nil {
- ec.Error(ctx, ec.Recover(ctx, r))
- ret = graphql.Null
- }
- }()
- resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) {
- ctx = rctx // use context from middleware stack in children
- return obj.Feed, nil
- })
- if err != nil {
- ec.Error(ctx, err)
- return graphql.Null
- }
- if resTmp == nil {
- if !graphql.HasFieldError(ctx, fc) {
- ec.Errorf(ctx, "must not be null")
- }
- return graphql.Null
- }
- res := resTmp.(*model.Feed)
- fc.Result = res
- return ec.marshalNFeed2ᚖundefᚗninjaᚋxᚋfeedakaᚋgraphqlᚋmodelᚐFeed(ctx, field.Selections, res)
-}
-
-func (ec *executionContext) fieldContext_Article_feed(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
- fc = &graphql.FieldContext{
- Object: "Article",
- Field: field,
- IsMethod: false,
- IsResolver: false,
- Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {
- switch field.Name {
- case "id":
- return ec.fieldContext_Feed_id(ctx, field)
- case "url":
- return ec.fieldContext_Feed_url(ctx, field)
- case "title":
- return ec.fieldContext_Feed_title(ctx, field)
- case "fetchedAt":
- return ec.fieldContext_Feed_fetchedAt(ctx, field)
- case "isSubscribed":
- return ec.fieldContext_Feed_isSubscribed(ctx, field)
- case "unreadCount":
- return ec.fieldContext_Feed_unreadCount(ctx, field)
- case "articles":
- return ec.fieldContext_Feed_articles(ctx, field)
- }
- return nil, fmt.Errorf("no field named %q was found under type Feed", field.Name)
- },
- }
- return fc, nil
-}
-
-func (ec *executionContext) _ArticleConnection_articles(ctx context.Context, field graphql.CollectedField, obj *model.ArticleConnection) (ret graphql.Marshaler) {
- fc, err := ec.fieldContext_ArticleConnection_articles(ctx, field)
- if err != nil {
- return graphql.Null
- }
- ctx = graphql.WithFieldContext(ctx, fc)
- defer func() {
- if r := recover(); r != nil {
- ec.Error(ctx, ec.Recover(ctx, r))
- ret = graphql.Null
- }
- }()
- resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) {
- ctx = rctx // use context from middleware stack in children
- return obj.Articles, nil
- })
- if err != nil {
- ec.Error(ctx, err)
- return graphql.Null
- }
- if resTmp == nil {
- if !graphql.HasFieldError(ctx, fc) {
- ec.Errorf(ctx, "must not be null")
- }
- return graphql.Null
- }
- res := resTmp.([]*model.Article)
- fc.Result = res
- return ec.marshalNArticle2ᚕᚖundefᚗninjaᚋxᚋfeedakaᚋgraphqlᚋmodelᚐArticleᚄ(ctx, field.Selections, res)
-}
-
-func (ec *executionContext) fieldContext_ArticleConnection_articles(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
- fc = &graphql.FieldContext{
- Object: "ArticleConnection",
- Field: field,
- IsMethod: false,
- IsResolver: false,
- Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {
- switch field.Name {
- case "id":
- return ec.fieldContext_Article_id(ctx, field)
- case "feedId":
- return ec.fieldContext_Article_feedId(ctx, field)
- case "guid":
- return ec.fieldContext_Article_guid(ctx, field)
- case "title":
- return ec.fieldContext_Article_title(ctx, field)
- case "url":
- return ec.fieldContext_Article_url(ctx, field)
- case "isRead":
- return ec.fieldContext_Article_isRead(ctx, field)
- case "feed":
- return ec.fieldContext_Article_feed(ctx, field)
- }
- return nil, fmt.Errorf("no field named %q was found under type Article", field.Name)
- },
- }
- return fc, nil
-}
-
-func (ec *executionContext) _ArticleConnection_pageInfo(ctx context.Context, field graphql.CollectedField, obj *model.ArticleConnection) (ret graphql.Marshaler) {
- fc, err := ec.fieldContext_ArticleConnection_pageInfo(ctx, field)
- if err != nil {
- return graphql.Null
- }
- ctx = graphql.WithFieldContext(ctx, fc)
- defer func() {
- if r := recover(); r != nil {
- ec.Error(ctx, ec.Recover(ctx, r))
- ret = graphql.Null
- }
- }()
- resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) {
- ctx = rctx // use context from middleware stack in children
- return obj.PageInfo, nil
- })
- if err != nil {
- ec.Error(ctx, err)
- return graphql.Null
- }
- if resTmp == nil {
- if !graphql.HasFieldError(ctx, fc) {
- ec.Errorf(ctx, "must not be null")
- }
- return graphql.Null
- }
- res := resTmp.(*model.PageInfo)
- fc.Result = res
- return ec.marshalNPageInfo2ᚖundefᚗninjaᚋxᚋfeedakaᚋgraphqlᚋmodelᚐPageInfo(ctx, field.Selections, res)
-}
-
-func (ec *executionContext) fieldContext_ArticleConnection_pageInfo(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
- fc = &graphql.FieldContext{
- Object: "ArticleConnection",
- Field: field,
- IsMethod: false,
- IsResolver: false,
- Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {
- switch field.Name {
- case "hasNextPage":
- return ec.fieldContext_PageInfo_hasNextPage(ctx, field)
- case "endCursor":
- return ec.fieldContext_PageInfo_endCursor(ctx, field)
- }
- return nil, fmt.Errorf("no field named %q was found under type PageInfo", field.Name)
- },
- }
- return fc, nil
-}
-
-func (ec *executionContext) _AuthPayload_user(ctx context.Context, field graphql.CollectedField, obj *model.AuthPayload) (ret graphql.Marshaler) {
- fc, err := ec.fieldContext_AuthPayload_user(ctx, field)
- if err != nil {
- return graphql.Null
- }
- ctx = graphql.WithFieldContext(ctx, fc)
- defer func() {
- if r := recover(); r != nil {
- ec.Error(ctx, ec.Recover(ctx, r))
- ret = graphql.Null
- }
- }()
- resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) {
- ctx = rctx // use context from middleware stack in children
- return obj.User, nil
- })
- if err != nil {
- ec.Error(ctx, err)
- return graphql.Null
- }
- if resTmp == nil {
- if !graphql.HasFieldError(ctx, fc) {
- ec.Errorf(ctx, "must not be null")
- }
- return graphql.Null
- }
- res := resTmp.(*model.User)
- fc.Result = res
- return ec.marshalNUser2ᚖundefᚗninjaᚋxᚋfeedakaᚋgraphqlᚋmodelᚐUser(ctx, field.Selections, res)
-}
-
-func (ec *executionContext) fieldContext_AuthPayload_user(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
- fc = &graphql.FieldContext{
- Object: "AuthPayload",
- Field: field,
- IsMethod: false,
- IsResolver: false,
- Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {
- switch field.Name {
- case "id":
- return ec.fieldContext_User_id(ctx, field)
- case "username":
- return ec.fieldContext_User_username(ctx, field)
- }
- return nil, fmt.Errorf("no field named %q was found under type User", field.Name)
- },
- }
- return fc, nil
-}
-
-func (ec *executionContext) _Feed_id(ctx context.Context, field graphql.CollectedField, obj *model.Feed) (ret graphql.Marshaler) {
- fc, err := ec.fieldContext_Feed_id(ctx, field)
- if err != nil {
- return graphql.Null
- }
- ctx = graphql.WithFieldContext(ctx, fc)
- defer func() {
- if r := recover(); r != nil {
- ec.Error(ctx, ec.Recover(ctx, r))
- ret = graphql.Null
- }
- }()
- resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) {
- ctx = rctx // use context from middleware stack in children
- return obj.ID, nil
- })
- if err != nil {
- ec.Error(ctx, err)
- return graphql.Null
- }
- if resTmp == nil {
- if !graphql.HasFieldError(ctx, fc) {
- ec.Errorf(ctx, "must not be null")
- }
- return graphql.Null
- }
- res := resTmp.(string)
- fc.Result = res
- return ec.marshalNID2string(ctx, field.Selections, res)
-}
-
-func (ec *executionContext) fieldContext_Feed_id(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
- fc = &graphql.FieldContext{
- Object: "Feed",
- Field: field,
- IsMethod: false,
- IsResolver: false,
- Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {
- return nil, errors.New("field of type ID does not have child fields")
- },
- }
- return fc, nil
-}
-
-func (ec *executionContext) _Feed_url(ctx context.Context, field graphql.CollectedField, obj *model.Feed) (ret graphql.Marshaler) {
- fc, err := ec.fieldContext_Feed_url(ctx, field)
- if err != nil {
- return graphql.Null
- }
- ctx = graphql.WithFieldContext(ctx, fc)
- defer func() {
- if r := recover(); r != nil {
- ec.Error(ctx, ec.Recover(ctx, r))
- ret = graphql.Null
- }
- }()
- resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) {
- ctx = rctx // use context from middleware stack in children
- return obj.URL, nil
- })
- if err != nil {
- ec.Error(ctx, err)
- return graphql.Null
- }
- if resTmp == nil {
- if !graphql.HasFieldError(ctx, fc) {
- ec.Errorf(ctx, "must not be null")
- }
- return graphql.Null
- }
- res := resTmp.(string)
- fc.Result = res
- return ec.marshalNString2string(ctx, field.Selections, res)
-}
-
-func (ec *executionContext) fieldContext_Feed_url(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
- fc = &graphql.FieldContext{
- Object: "Feed",
- Field: field,
- IsMethod: false,
- IsResolver: false,
- Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {
- return nil, errors.New("field of type String does not have child fields")
- },
- }
- return fc, nil
-}
-
-func (ec *executionContext) _Feed_title(ctx context.Context, field graphql.CollectedField, obj *model.Feed) (ret graphql.Marshaler) {
- fc, err := ec.fieldContext_Feed_title(ctx, field)
- if err != nil {
- return graphql.Null
- }
- ctx = graphql.WithFieldContext(ctx, fc)
- defer func() {
- if r := recover(); r != nil {
- ec.Error(ctx, ec.Recover(ctx, r))
- ret = graphql.Null
- }
- }()
- resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) {
- ctx = rctx // use context from middleware stack in children
- return obj.Title, nil
- })
- if err != nil {
- ec.Error(ctx, err)
- return graphql.Null
- }
- if resTmp == nil {
- if !graphql.HasFieldError(ctx, fc) {
- ec.Errorf(ctx, "must not be null")
- }
- return graphql.Null
- }
- res := resTmp.(string)
- fc.Result = res
- return ec.marshalNString2string(ctx, field.Selections, res)
-}
-
-func (ec *executionContext) fieldContext_Feed_title(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
- fc = &graphql.FieldContext{
- Object: "Feed",
- Field: field,
- IsMethod: false,
- IsResolver: false,
- Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {
- return nil, errors.New("field of type String does not have child fields")
- },
- }
- return fc, nil
-}
-
-func (ec *executionContext) _Feed_fetchedAt(ctx context.Context, field graphql.CollectedField, obj *model.Feed) (ret graphql.Marshaler) {
- fc, err := ec.fieldContext_Feed_fetchedAt(ctx, field)
- if err != nil {
- return graphql.Null
- }
- ctx = graphql.WithFieldContext(ctx, fc)
- defer func() {
- if r := recover(); r != nil {
- ec.Error(ctx, ec.Recover(ctx, r))
- ret = graphql.Null
- }
- }()
- resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) {
- ctx = rctx // use context from middleware stack in children
- return obj.FetchedAt, nil
- })
- if err != nil {
- ec.Error(ctx, err)
- return graphql.Null
- }
- if resTmp == nil {
- if !graphql.HasFieldError(ctx, fc) {
- ec.Errorf(ctx, "must not be null")
- }
- return graphql.Null
- }
- res := resTmp.(string)
- fc.Result = res
- return ec.marshalNDateTime2string(ctx, field.Selections, res)
-}
-
-func (ec *executionContext) fieldContext_Feed_fetchedAt(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
- fc = &graphql.FieldContext{
- Object: "Feed",
- Field: field,
- IsMethod: false,
- IsResolver: false,
- Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {
- return nil, errors.New("field of type DateTime does not have child fields")
- },
- }
- return fc, nil
-}
-
-func (ec *executionContext) _Feed_isSubscribed(ctx context.Context, field graphql.CollectedField, obj *model.Feed) (ret graphql.Marshaler) {
- fc, err := ec.fieldContext_Feed_isSubscribed(ctx, field)
- if err != nil {
- return graphql.Null
- }
- ctx = graphql.WithFieldContext(ctx, fc)
- defer func() {
- if r := recover(); r != nil {
- ec.Error(ctx, ec.Recover(ctx, r))
- ret = graphql.Null
- }
- }()
- resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) {
- ctx = rctx // use context from middleware stack in children
- return obj.IsSubscribed, nil
- })
- if err != nil {
- ec.Error(ctx, err)
- return graphql.Null
- }
- if resTmp == nil {
- if !graphql.HasFieldError(ctx, fc) {
- ec.Errorf(ctx, "must not be null")
- }
- return graphql.Null
- }
- res := resTmp.(bool)
- fc.Result = res
- return ec.marshalNBoolean2bool(ctx, field.Selections, res)
-}
-
-func (ec *executionContext) fieldContext_Feed_isSubscribed(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
- fc = &graphql.FieldContext{
- Object: "Feed",
- Field: field,
- IsMethod: false,
- IsResolver: false,
- Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {
- return nil, errors.New("field of type Boolean does not have child fields")
- },
- }
- return fc, nil
-}
-
-func (ec *executionContext) _Feed_unreadCount(ctx context.Context, field graphql.CollectedField, obj *model.Feed) (ret graphql.Marshaler) {
- fc, err := ec.fieldContext_Feed_unreadCount(ctx, field)
- if err != nil {
- return graphql.Null
- }
- ctx = graphql.WithFieldContext(ctx, fc)
- defer func() {
- if r := recover(); r != nil {
- ec.Error(ctx, ec.Recover(ctx, r))
- ret = graphql.Null
- }
- }()
- resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) {
- ctx = rctx // use context from middleware stack in children
- return obj.UnreadCount, nil
- })
- if err != nil {
- ec.Error(ctx, err)
- return graphql.Null
- }
- if resTmp == nil {
- if !graphql.HasFieldError(ctx, fc) {
- ec.Errorf(ctx, "must not be null")
- }
- return graphql.Null
- }
- res := resTmp.(int32)
- fc.Result = res
- return ec.marshalNInt2int32(ctx, field.Selections, res)
-}
-
-func (ec *executionContext) fieldContext_Feed_unreadCount(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
- fc = &graphql.FieldContext{
- Object: "Feed",
- Field: field,
- IsMethod: false,
- IsResolver: false,
- Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {
- return nil, errors.New("field of type Int does not have child fields")
- },
- }
- return fc, nil
-}
-
-func (ec *executionContext) _Feed_articles(ctx context.Context, field graphql.CollectedField, obj *model.Feed) (ret graphql.Marshaler) {
- fc, err := ec.fieldContext_Feed_articles(ctx, field)
- if err != nil {
- return graphql.Null
- }
- ctx = graphql.WithFieldContext(ctx, fc)
- defer func() {
- if r := recover(); r != nil {
- ec.Error(ctx, ec.Recover(ctx, r))
- ret = graphql.Null
- }
- }()
- resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) {
- ctx = rctx // use context from middleware stack in children
- return obj.Articles, nil
- })
- if err != nil {
- ec.Error(ctx, err)
- return graphql.Null
- }
- if resTmp == nil {
- if !graphql.HasFieldError(ctx, fc) {
- ec.Errorf(ctx, "must not be null")
- }
- return graphql.Null
- }
- res := resTmp.([]*model.Article)
- fc.Result = res
- return ec.marshalNArticle2ᚕᚖundefᚗninjaᚋxᚋfeedakaᚋgraphqlᚋmodelᚐArticleᚄ(ctx, field.Selections, res)
-}
-
-func (ec *executionContext) fieldContext_Feed_articles(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
- fc = &graphql.FieldContext{
- Object: "Feed",
- Field: field,
- IsMethod: false,
- IsResolver: false,
- Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {
- switch field.Name {
- case "id":
- return ec.fieldContext_Article_id(ctx, field)
- case "feedId":
- return ec.fieldContext_Article_feedId(ctx, field)
- case "guid":
- return ec.fieldContext_Article_guid(ctx, field)
- case "title":
- return ec.fieldContext_Article_title(ctx, field)
- case "url":
- return ec.fieldContext_Article_url(ctx, field)
- case "isRead":
- return ec.fieldContext_Article_isRead(ctx, field)
- case "feed":
- return ec.fieldContext_Article_feed(ctx, field)
- }
- return nil, fmt.Errorf("no field named %q was found under type Article", field.Name)
- },
- }
- return fc, nil
-}
-
-func (ec *executionContext) _Mutation_addFeed(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {
- fc, err := ec.fieldContext_Mutation_addFeed(ctx, field)
- if err != nil {
- return graphql.Null
- }
- ctx = graphql.WithFieldContext(ctx, fc)
- defer func() {
- if r := recover(); r != nil {
- ec.Error(ctx, ec.Recover(ctx, r))
- ret = graphql.Null
- }
- }()
- resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) {
- ctx = rctx // use context from middleware stack in children
- return ec.resolvers.Mutation().AddFeed(rctx, fc.Args["url"].(string))
- })
- if err != nil {
- ec.Error(ctx, err)
- return graphql.Null
- }
- if resTmp == nil {
- if !graphql.HasFieldError(ctx, fc) {
- ec.Errorf(ctx, "must not be null")
- }
- return graphql.Null
- }
- res := resTmp.(*model.Feed)
- fc.Result = res
- return ec.marshalNFeed2ᚖundefᚗninjaᚋxᚋfeedakaᚋgraphqlᚋmodelᚐFeed(ctx, field.Selections, res)
-}
-
-func (ec *executionContext) fieldContext_Mutation_addFeed(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
- fc = &graphql.FieldContext{
- Object: "Mutation",
- Field: field,
- IsMethod: true,
- IsResolver: true,
- Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {
- switch field.Name {
- case "id":
- return ec.fieldContext_Feed_id(ctx, field)
- case "url":
- return ec.fieldContext_Feed_url(ctx, field)
- case "title":
- return ec.fieldContext_Feed_title(ctx, field)
- case "fetchedAt":
- return ec.fieldContext_Feed_fetchedAt(ctx, field)
- case "isSubscribed":
- return ec.fieldContext_Feed_isSubscribed(ctx, field)
- case "unreadCount":
- return ec.fieldContext_Feed_unreadCount(ctx, field)
- case "articles":
- return ec.fieldContext_Feed_articles(ctx, field)
- }
- return nil, fmt.Errorf("no field named %q was found under type Feed", field.Name)
- },
- }
- defer func() {
- if r := recover(); r != nil {
- err = ec.Recover(ctx, r)
- ec.Error(ctx, err)
- }
- }()
- ctx = graphql.WithFieldContext(ctx, fc)
- if fc.Args, err = ec.field_Mutation_addFeed_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {
- ec.Error(ctx, err)
- return fc, err
- }
- return fc, nil
-}
-
-func (ec *executionContext) _Mutation_unsubscribeFeed(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {
- fc, err := ec.fieldContext_Mutation_unsubscribeFeed(ctx, field)
- if err != nil {
- return graphql.Null
- }
- ctx = graphql.WithFieldContext(ctx, fc)
- defer func() {
- if r := recover(); r != nil {
- ec.Error(ctx, ec.Recover(ctx, r))
- ret = graphql.Null
- }
- }()
- resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) {
- ctx = rctx // use context from middleware stack in children
- return ec.resolvers.Mutation().UnsubscribeFeed(rctx, fc.Args["id"].(string))
- })
- if err != nil {
- ec.Error(ctx, err)
- return graphql.Null
- }
- if resTmp == nil {
- if !graphql.HasFieldError(ctx, fc) {
- ec.Errorf(ctx, "must not be null")
- }
- return graphql.Null
- }
- res := resTmp.(bool)
- fc.Result = res
- return ec.marshalNBoolean2bool(ctx, field.Selections, res)
-}
-
-func (ec *executionContext) fieldContext_Mutation_unsubscribeFeed(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
- fc = &graphql.FieldContext{
- Object: "Mutation",
- Field: field,
- IsMethod: true,
- IsResolver: true,
- Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {
- return nil, errors.New("field of type Boolean does not have child fields")
- },
- }
- defer func() {
- if r := recover(); r != nil {
- err = ec.Recover(ctx, r)
- ec.Error(ctx, err)
- }
- }()
- ctx = graphql.WithFieldContext(ctx, fc)
- if fc.Args, err = ec.field_Mutation_unsubscribeFeed_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {
- ec.Error(ctx, err)
- return fc, err
- }
- return fc, nil
-}
-
-func (ec *executionContext) _Mutation_markArticleRead(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {
- fc, err := ec.fieldContext_Mutation_markArticleRead(ctx, field)
- if err != nil {
- return graphql.Null
- }
- ctx = graphql.WithFieldContext(ctx, fc)
- defer func() {
- if r := recover(); r != nil {
- ec.Error(ctx, ec.Recover(ctx, r))
- ret = graphql.Null
- }
- }()
- resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) {
- ctx = rctx // use context from middleware stack in children
- return ec.resolvers.Mutation().MarkArticleRead(rctx, fc.Args["id"].(string))
- })
- if err != nil {
- ec.Error(ctx, err)
- return graphql.Null
- }
- if resTmp == nil {
- if !graphql.HasFieldError(ctx, fc) {
- ec.Errorf(ctx, "must not be null")
- }
- return graphql.Null
- }
- res := resTmp.(*model.Article)
- fc.Result = res
- return ec.marshalNArticle2ᚖundefᚗninjaᚋxᚋfeedakaᚋgraphqlᚋmodelᚐArticle(ctx, field.Selections, res)
-}
-
-func (ec *executionContext) fieldContext_Mutation_markArticleRead(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
- fc = &graphql.FieldContext{
- Object: "Mutation",
- Field: field,
- IsMethod: true,
- IsResolver: true,
- Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {
- switch field.Name {
- case "id":
- return ec.fieldContext_Article_id(ctx, field)
- case "feedId":
- return ec.fieldContext_Article_feedId(ctx, field)
- case "guid":
- return ec.fieldContext_Article_guid(ctx, field)
- case "title":
- return ec.fieldContext_Article_title(ctx, field)
- case "url":
- return ec.fieldContext_Article_url(ctx, field)
- case "isRead":
- return ec.fieldContext_Article_isRead(ctx, field)
- case "feed":
- return ec.fieldContext_Article_feed(ctx, field)
- }
- return nil, fmt.Errorf("no field named %q was found under type Article", field.Name)
- },
- }
- defer func() {
- if r := recover(); r != nil {
- err = ec.Recover(ctx, r)
- ec.Error(ctx, err)
- }
- }()
- ctx = graphql.WithFieldContext(ctx, fc)
- if fc.Args, err = ec.field_Mutation_markArticleRead_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {
- ec.Error(ctx, err)
- return fc, err
- }
- return fc, nil
-}
-
-func (ec *executionContext) _Mutation_markArticleUnread(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {
- fc, err := ec.fieldContext_Mutation_markArticleUnread(ctx, field)
- if err != nil {
- return graphql.Null
- }
- ctx = graphql.WithFieldContext(ctx, fc)
- defer func() {
- if r := recover(); r != nil {
- ec.Error(ctx, ec.Recover(ctx, r))
- ret = graphql.Null
- }
- }()
- resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) {
- ctx = rctx // use context from middleware stack in children
- return ec.resolvers.Mutation().MarkArticleUnread(rctx, fc.Args["id"].(string))
- })
- if err != nil {
- ec.Error(ctx, err)
- return graphql.Null
- }
- if resTmp == nil {
- if !graphql.HasFieldError(ctx, fc) {
- ec.Errorf(ctx, "must not be null")
- }
- return graphql.Null
- }
- res := resTmp.(*model.Article)
- fc.Result = res
- return ec.marshalNArticle2ᚖundefᚗninjaᚋxᚋfeedakaᚋgraphqlᚋmodelᚐArticle(ctx, field.Selections, res)
-}
-
-func (ec *executionContext) fieldContext_Mutation_markArticleUnread(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
- fc = &graphql.FieldContext{
- Object: "Mutation",
- Field: field,
- IsMethod: true,
- IsResolver: true,
- Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {
- switch field.Name {
- case "id":
- return ec.fieldContext_Article_id(ctx, field)
- case "feedId":
- return ec.fieldContext_Article_feedId(ctx, field)
- case "guid":
- return ec.fieldContext_Article_guid(ctx, field)
- case "title":
- return ec.fieldContext_Article_title(ctx, field)
- case "url":
- return ec.fieldContext_Article_url(ctx, field)
- case "isRead":
- return ec.fieldContext_Article_isRead(ctx, field)
- case "feed":
- return ec.fieldContext_Article_feed(ctx, field)
- }
- return nil, fmt.Errorf("no field named %q was found under type Article", field.Name)
- },
- }
- defer func() {
- if r := recover(); r != nil {
- err = ec.Recover(ctx, r)
- ec.Error(ctx, err)
- }
- }()
- ctx = graphql.WithFieldContext(ctx, fc)
- if fc.Args, err = ec.field_Mutation_markArticleUnread_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {
- ec.Error(ctx, err)
- return fc, err
- }
- return fc, nil
-}
-
-func (ec *executionContext) _Mutation_markFeedRead(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {
- fc, err := ec.fieldContext_Mutation_markFeedRead(ctx, field)
- if err != nil {
- return graphql.Null
- }
- ctx = graphql.WithFieldContext(ctx, fc)
- defer func() {
- if r := recover(); r != nil {
- ec.Error(ctx, ec.Recover(ctx, r))
- ret = graphql.Null
- }
- }()
- resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) {
- ctx = rctx // use context from middleware stack in children
- return ec.resolvers.Mutation().MarkFeedRead(rctx, fc.Args["id"].(string))
- })
- if err != nil {
- ec.Error(ctx, err)
- return graphql.Null
- }
- if resTmp == nil {
- if !graphql.HasFieldError(ctx, fc) {
- ec.Errorf(ctx, "must not be null")
- }
- return graphql.Null
- }
- res := resTmp.(*model.Feed)
- fc.Result = res
- return ec.marshalNFeed2ᚖundefᚗninjaᚋxᚋfeedakaᚋgraphqlᚋmodelᚐFeed(ctx, field.Selections, res)
-}
-
-func (ec *executionContext) fieldContext_Mutation_markFeedRead(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
- fc = &graphql.FieldContext{
- Object: "Mutation",
- Field: field,
- IsMethod: true,
- IsResolver: true,
- Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {
- switch field.Name {
- case "id":
- return ec.fieldContext_Feed_id(ctx, field)
- case "url":
- return ec.fieldContext_Feed_url(ctx, field)
- case "title":
- return ec.fieldContext_Feed_title(ctx, field)
- case "fetchedAt":
- return ec.fieldContext_Feed_fetchedAt(ctx, field)
- case "isSubscribed":
- return ec.fieldContext_Feed_isSubscribed(ctx, field)
- case "unreadCount":
- return ec.fieldContext_Feed_unreadCount(ctx, field)
- case "articles":
- return ec.fieldContext_Feed_articles(ctx, field)
- }
- return nil, fmt.Errorf("no field named %q was found under type Feed", field.Name)
- },
- }
- defer func() {
- if r := recover(); r != nil {
- err = ec.Recover(ctx, r)
- ec.Error(ctx, err)
- }
- }()
- ctx = graphql.WithFieldContext(ctx, fc)
- if fc.Args, err = ec.field_Mutation_markFeedRead_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {
- ec.Error(ctx, err)
- return fc, err
- }
- return fc, nil
-}
-
-func (ec *executionContext) _Mutation_markFeedUnread(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {
- fc, err := ec.fieldContext_Mutation_markFeedUnread(ctx, field)
- if err != nil {
- return graphql.Null
- }
- ctx = graphql.WithFieldContext(ctx, fc)
- defer func() {
- if r := recover(); r != nil {
- ec.Error(ctx, ec.Recover(ctx, r))
- ret = graphql.Null
- }
- }()
- resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) {
- ctx = rctx // use context from middleware stack in children
- return ec.resolvers.Mutation().MarkFeedUnread(rctx, fc.Args["id"].(string))
- })
- if err != nil {
- ec.Error(ctx, err)
- return graphql.Null
- }
- if resTmp == nil {
- if !graphql.HasFieldError(ctx, fc) {
- ec.Errorf(ctx, "must not be null")
- }
- return graphql.Null
- }
- res := resTmp.(*model.Feed)
- fc.Result = res
- return ec.marshalNFeed2ᚖundefᚗninjaᚋxᚋfeedakaᚋgraphqlᚋmodelᚐFeed(ctx, field.Selections, res)
-}
-
-func (ec *executionContext) fieldContext_Mutation_markFeedUnread(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
- fc = &graphql.FieldContext{
- Object: "Mutation",
- Field: field,
- IsMethod: true,
- IsResolver: true,
- Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {
- switch field.Name {
- case "id":
- return ec.fieldContext_Feed_id(ctx, field)
- case "url":
- return ec.fieldContext_Feed_url(ctx, field)
- case "title":
- return ec.fieldContext_Feed_title(ctx, field)
- case "fetchedAt":
- return ec.fieldContext_Feed_fetchedAt(ctx, field)
- case "isSubscribed":
- return ec.fieldContext_Feed_isSubscribed(ctx, field)
- case "unreadCount":
- return ec.fieldContext_Feed_unreadCount(ctx, field)
- case "articles":
- return ec.fieldContext_Feed_articles(ctx, field)
- }
- return nil, fmt.Errorf("no field named %q was found under type Feed", field.Name)
- },
- }
- defer func() {
- if r := recover(); r != nil {
- err = ec.Recover(ctx, r)
- ec.Error(ctx, err)
- }
- }()
- ctx = graphql.WithFieldContext(ctx, fc)
- if fc.Args, err = ec.field_Mutation_markFeedUnread_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {
- ec.Error(ctx, err)
- return fc, err
- }
- return fc, nil
-}
-
-func (ec *executionContext) _Mutation_login(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {
- fc, err := ec.fieldContext_Mutation_login(ctx, field)
- if err != nil {
- return graphql.Null
- }
- ctx = graphql.WithFieldContext(ctx, fc)
- defer func() {
- if r := recover(); r != nil {
- ec.Error(ctx, ec.Recover(ctx, r))
- ret = graphql.Null
- }
- }()
- resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) {
- ctx = rctx // use context from middleware stack in children
- return ec.resolvers.Mutation().Login(rctx, fc.Args["username"].(string), fc.Args["password"].(string))
- })
- if err != nil {
- ec.Error(ctx, err)
- return graphql.Null
- }
- if resTmp == nil {
- if !graphql.HasFieldError(ctx, fc) {
- ec.Errorf(ctx, "must not be null")
- }
- return graphql.Null
- }
- res := resTmp.(*model.AuthPayload)
- fc.Result = res
- return ec.marshalNAuthPayload2ᚖundefᚗninjaᚋxᚋfeedakaᚋgraphqlᚋmodelᚐAuthPayload(ctx, field.Selections, res)
-}
-
-func (ec *executionContext) fieldContext_Mutation_login(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
- fc = &graphql.FieldContext{
- Object: "Mutation",
- Field: field,
- IsMethod: true,
- IsResolver: true,
- Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {
- switch field.Name {
- case "user":
- return ec.fieldContext_AuthPayload_user(ctx, field)
- }
- return nil, fmt.Errorf("no field named %q was found under type AuthPayload", field.Name)
- },
- }
- defer func() {
- if r := recover(); r != nil {
- err = ec.Recover(ctx, r)
- ec.Error(ctx, err)
- }
- }()
- ctx = graphql.WithFieldContext(ctx, fc)
- if fc.Args, err = ec.field_Mutation_login_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {
- ec.Error(ctx, err)
- return fc, err
- }
- return fc, nil
-}
-
-func (ec *executionContext) _Mutation_logout(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {
- fc, err := ec.fieldContext_Mutation_logout(ctx, field)
- if err != nil {
- return graphql.Null
- }
- ctx = graphql.WithFieldContext(ctx, fc)
- defer func() {
- if r := recover(); r != nil {
- ec.Error(ctx, ec.Recover(ctx, r))
- ret = graphql.Null
- }
- }()
- resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) {
- ctx = rctx // use context from middleware stack in children
- return ec.resolvers.Mutation().Logout(rctx)
- })
- if err != nil {
- ec.Error(ctx, err)
- return graphql.Null
- }
- if resTmp == nil {
- if !graphql.HasFieldError(ctx, fc) {
- ec.Errorf(ctx, "must not be null")
- }
- return graphql.Null
- }
- res := resTmp.(bool)
- fc.Result = res
- return ec.marshalNBoolean2bool(ctx, field.Selections, res)
-}
-
-func (ec *executionContext) fieldContext_Mutation_logout(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
- fc = &graphql.FieldContext{
- Object: "Mutation",
- Field: field,
- IsMethod: true,
- IsResolver: true,
- Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {
- return nil, errors.New("field of type Boolean does not have child fields")
- },
- }
- return fc, nil
-}
-
-func (ec *executionContext) _PageInfo_hasNextPage(ctx context.Context, field graphql.CollectedField, obj *model.PageInfo) (ret graphql.Marshaler) {
- fc, err := ec.fieldContext_PageInfo_hasNextPage(ctx, field)
- if err != nil {
- return graphql.Null
- }
- ctx = graphql.WithFieldContext(ctx, fc)
- defer func() {
- if r := recover(); r != nil {
- ec.Error(ctx, ec.Recover(ctx, r))
- ret = graphql.Null
- }
- }()
- resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) {
- ctx = rctx // use context from middleware stack in children
- return obj.HasNextPage, nil
- })
- if err != nil {
- ec.Error(ctx, err)
- return graphql.Null
- }
- if resTmp == nil {
- if !graphql.HasFieldError(ctx, fc) {
- ec.Errorf(ctx, "must not be null")
- }
- return graphql.Null
- }
- res := resTmp.(bool)
- fc.Result = res
- return ec.marshalNBoolean2bool(ctx, field.Selections, res)
-}
-
-func (ec *executionContext) fieldContext_PageInfo_hasNextPage(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
- fc = &graphql.FieldContext{
- Object: "PageInfo",
- Field: field,
- IsMethod: false,
- IsResolver: false,
- Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {
- return nil, errors.New("field of type Boolean does not have child fields")
- },
- }
- return fc, nil
-}
-
-func (ec *executionContext) _PageInfo_endCursor(ctx context.Context, field graphql.CollectedField, obj *model.PageInfo) (ret graphql.Marshaler) {
- fc, err := ec.fieldContext_PageInfo_endCursor(ctx, field)
- if err != nil {
- return graphql.Null
- }
- ctx = graphql.WithFieldContext(ctx, fc)
- defer func() {
- if r := recover(); r != nil {
- ec.Error(ctx, ec.Recover(ctx, r))
- ret = graphql.Null
- }
- }()
- resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) {
- ctx = rctx // use context from middleware stack in children
- return obj.EndCursor, nil
- })
- if err != nil {
- ec.Error(ctx, err)
- return graphql.Null
- }
- if resTmp == nil {
- return graphql.Null
- }
- res := resTmp.(*string)
- fc.Result = res
- return ec.marshalOID2ᚖstring(ctx, field.Selections, res)
-}
-
-func (ec *executionContext) fieldContext_PageInfo_endCursor(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
- fc = &graphql.FieldContext{
- Object: "PageInfo",
- Field: field,
- IsMethod: false,
- IsResolver: false,
- Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {
- return nil, errors.New("field of type ID does not have child fields")
- },
- }
- return fc, nil
-}
-
-func (ec *executionContext) _Query_feeds(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {
- fc, err := ec.fieldContext_Query_feeds(ctx, field)
- if err != nil {
- return graphql.Null
- }
- ctx = graphql.WithFieldContext(ctx, fc)
- defer func() {
- if r := recover(); r != nil {
- ec.Error(ctx, ec.Recover(ctx, r))
- ret = graphql.Null
- }
- }()
- resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) {
- ctx = rctx // use context from middleware stack in children
- return ec.resolvers.Query().Feeds(rctx)
- })
- if err != nil {
- ec.Error(ctx, err)
- return graphql.Null
- }
- if resTmp == nil {
- if !graphql.HasFieldError(ctx, fc) {
- ec.Errorf(ctx, "must not be null")
- }
- return graphql.Null
- }
- res := resTmp.([]*model.Feed)
- fc.Result = res
- return ec.marshalNFeed2ᚕᚖundefᚗninjaᚋxᚋfeedakaᚋgraphqlᚋmodelᚐFeedᚄ(ctx, field.Selections, res)
-}
-
-func (ec *executionContext) fieldContext_Query_feeds(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
- fc = &graphql.FieldContext{
- Object: "Query",
- Field: field,
- IsMethod: true,
- IsResolver: true,
- Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {
- switch field.Name {
- case "id":
- return ec.fieldContext_Feed_id(ctx, field)
- case "url":
- return ec.fieldContext_Feed_url(ctx, field)
- case "title":
- return ec.fieldContext_Feed_title(ctx, field)
- case "fetchedAt":
- return ec.fieldContext_Feed_fetchedAt(ctx, field)
- case "isSubscribed":
- return ec.fieldContext_Feed_isSubscribed(ctx, field)
- case "unreadCount":
- return ec.fieldContext_Feed_unreadCount(ctx, field)
- case "articles":
- return ec.fieldContext_Feed_articles(ctx, field)
- }
- return nil, fmt.Errorf("no field named %q was found under type Feed", field.Name)
- },
- }
- return fc, nil
-}
-
-func (ec *executionContext) _Query_unreadArticles(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {
- fc, err := ec.fieldContext_Query_unreadArticles(ctx, field)
- if err != nil {
- return graphql.Null
- }
- ctx = graphql.WithFieldContext(ctx, fc)
- defer func() {
- if r := recover(); r != nil {
- ec.Error(ctx, ec.Recover(ctx, r))
- ret = graphql.Null
- }
- }()
- resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) {
- ctx = rctx // use context from middleware stack in children
- return ec.resolvers.Query().UnreadArticles(rctx, fc.Args["feedId"].(*string), fc.Args["after"].(*string), fc.Args["first"].(*int32))
- })
- if err != nil {
- ec.Error(ctx, err)
- return graphql.Null
- }
- if resTmp == nil {
- if !graphql.HasFieldError(ctx, fc) {
- ec.Errorf(ctx, "must not be null")
- }
- return graphql.Null
- }
- res := resTmp.(*model.ArticleConnection)
- fc.Result = res
- return ec.marshalNArticleConnection2ᚖundefᚗninjaᚋxᚋfeedakaᚋgraphqlᚋmodelᚐArticleConnection(ctx, field.Selections, res)
-}
-
-func (ec *executionContext) fieldContext_Query_unreadArticles(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
- fc = &graphql.FieldContext{
- Object: "Query",
- Field: field,
- IsMethod: true,
- IsResolver: true,
- Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {
- switch field.Name {
- case "articles":
- return ec.fieldContext_ArticleConnection_articles(ctx, field)
- case "pageInfo":
- return ec.fieldContext_ArticleConnection_pageInfo(ctx, field)
- }
- return nil, fmt.Errorf("no field named %q was found under type ArticleConnection", field.Name)
- },
- }
- defer func() {
- if r := recover(); r != nil {
- err = ec.Recover(ctx, r)
- ec.Error(ctx, err)
- }
- }()
- ctx = graphql.WithFieldContext(ctx, fc)
- if fc.Args, err = ec.field_Query_unreadArticles_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {
- ec.Error(ctx, err)
- return fc, err
- }
- return fc, nil
-}
-
-func (ec *executionContext) _Query_readArticles(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {
- fc, err := ec.fieldContext_Query_readArticles(ctx, field)
- if err != nil {
- return graphql.Null
- }
- ctx = graphql.WithFieldContext(ctx, fc)
- defer func() {
- if r := recover(); r != nil {
- ec.Error(ctx, ec.Recover(ctx, r))
- ret = graphql.Null
- }
- }()
- resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) {
- ctx = rctx // use context from middleware stack in children
- return ec.resolvers.Query().ReadArticles(rctx, fc.Args["feedId"].(*string), fc.Args["after"].(*string), fc.Args["first"].(*int32))
- })
- if err != nil {
- ec.Error(ctx, err)
- return graphql.Null
- }
- if resTmp == nil {
- if !graphql.HasFieldError(ctx, fc) {
- ec.Errorf(ctx, "must not be null")
- }
- return graphql.Null
- }
- res := resTmp.(*model.ArticleConnection)
- fc.Result = res
- return ec.marshalNArticleConnection2ᚖundefᚗninjaᚋxᚋfeedakaᚋgraphqlᚋmodelᚐArticleConnection(ctx, field.Selections, res)
-}
-
-func (ec *executionContext) fieldContext_Query_readArticles(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
- fc = &graphql.FieldContext{
- Object: "Query",
- Field: field,
- IsMethod: true,
- IsResolver: true,
- Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {
- switch field.Name {
- case "articles":
- return ec.fieldContext_ArticleConnection_articles(ctx, field)
- case "pageInfo":
- return ec.fieldContext_ArticleConnection_pageInfo(ctx, field)
- }
- return nil, fmt.Errorf("no field named %q was found under type ArticleConnection", field.Name)
- },
- }
- defer func() {
- if r := recover(); r != nil {
- err = ec.Recover(ctx, r)
- ec.Error(ctx, err)
- }
- }()
- ctx = graphql.WithFieldContext(ctx, fc)
- if fc.Args, err = ec.field_Query_readArticles_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {
- ec.Error(ctx, err)
- return fc, err
- }
- return fc, nil
-}
-
-func (ec *executionContext) _Query_feed(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {
- fc, err := ec.fieldContext_Query_feed(ctx, field)
- if err != nil {
- return graphql.Null
- }
- ctx = graphql.WithFieldContext(ctx, fc)
- defer func() {
- if r := recover(); r != nil {
- ec.Error(ctx, ec.Recover(ctx, r))
- ret = graphql.Null
- }
- }()
- resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) {
- ctx = rctx // use context from middleware stack in children
- return ec.resolvers.Query().Feed(rctx, fc.Args["id"].(string))
- })
- if err != nil {
- ec.Error(ctx, err)
- return graphql.Null
- }
- if resTmp == nil {
- return graphql.Null
- }
- res := resTmp.(*model.Feed)
- fc.Result = res
- return ec.marshalOFeed2ᚖundefᚗninjaᚋxᚋfeedakaᚋgraphqlᚋmodelᚐFeed(ctx, field.Selections, res)
-}
-
-func (ec *executionContext) fieldContext_Query_feed(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
- fc = &graphql.FieldContext{
- Object: "Query",
- Field: field,
- IsMethod: true,
- IsResolver: true,
- Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {
- switch field.Name {
- case "id":
- return ec.fieldContext_Feed_id(ctx, field)
- case "url":
- return ec.fieldContext_Feed_url(ctx, field)
- case "title":
- return ec.fieldContext_Feed_title(ctx, field)
- case "fetchedAt":
- return ec.fieldContext_Feed_fetchedAt(ctx, field)
- case "isSubscribed":
- return ec.fieldContext_Feed_isSubscribed(ctx, field)
- case "unreadCount":
- return ec.fieldContext_Feed_unreadCount(ctx, field)
- case "articles":
- return ec.fieldContext_Feed_articles(ctx, field)
- }
- return nil, fmt.Errorf("no field named %q was found under type Feed", field.Name)
- },
- }
- defer func() {
- if r := recover(); r != nil {
- err = ec.Recover(ctx, r)
- ec.Error(ctx, err)
- }
- }()
- ctx = graphql.WithFieldContext(ctx, fc)
- if fc.Args, err = ec.field_Query_feed_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {
- ec.Error(ctx, err)
- return fc, err
- }
- return fc, nil
-}
-
-func (ec *executionContext) _Query_article(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {
- fc, err := ec.fieldContext_Query_article(ctx, field)
- if err != nil {
- return graphql.Null
- }
- ctx = graphql.WithFieldContext(ctx, fc)
- defer func() {
- if r := recover(); r != nil {
- ec.Error(ctx, ec.Recover(ctx, r))
- ret = graphql.Null
- }
- }()
- resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) {
- ctx = rctx // use context from middleware stack in children
- return ec.resolvers.Query().Article(rctx, fc.Args["id"].(string))
- })
- if err != nil {
- ec.Error(ctx, err)
- return graphql.Null
- }
- if resTmp == nil {
- return graphql.Null
- }
- res := resTmp.(*model.Article)
- fc.Result = res
- return ec.marshalOArticle2ᚖundefᚗninjaᚋxᚋfeedakaᚋgraphqlᚋmodelᚐArticle(ctx, field.Selections, res)
-}
-
-func (ec *executionContext) fieldContext_Query_article(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
- fc = &graphql.FieldContext{
- Object: "Query",
- Field: field,
- IsMethod: true,
- IsResolver: true,
- Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {
- switch field.Name {
- case "id":
- return ec.fieldContext_Article_id(ctx, field)
- case "feedId":
- return ec.fieldContext_Article_feedId(ctx, field)
- case "guid":
- return ec.fieldContext_Article_guid(ctx, field)
- case "title":
- return ec.fieldContext_Article_title(ctx, field)
- case "url":
- return ec.fieldContext_Article_url(ctx, field)
- case "isRead":
- return ec.fieldContext_Article_isRead(ctx, field)
- case "feed":
- return ec.fieldContext_Article_feed(ctx, field)
- }
- return nil, fmt.Errorf("no field named %q was found under type Article", field.Name)
- },
- }
- defer func() {
- if r := recover(); r != nil {
- err = ec.Recover(ctx, r)
- ec.Error(ctx, err)
- }
- }()
- ctx = graphql.WithFieldContext(ctx, fc)
- if fc.Args, err = ec.field_Query_article_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {
- ec.Error(ctx, err)
- return fc, err
- }
- return fc, nil
-}
-
-func (ec *executionContext) _Query_currentUser(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {
- fc, err := ec.fieldContext_Query_currentUser(ctx, field)
- if err != nil {
- return graphql.Null
- }
- ctx = graphql.WithFieldContext(ctx, fc)
- defer func() {
- if r := recover(); r != nil {
- ec.Error(ctx, ec.Recover(ctx, r))
- ret = graphql.Null
- }
- }()
- resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) {
- ctx = rctx // use context from middleware stack in children
- return ec.resolvers.Query().CurrentUser(rctx)
- })
- if err != nil {
- ec.Error(ctx, err)
- return graphql.Null
- }
- if resTmp == nil {
- return graphql.Null
- }
- res := resTmp.(*model.User)
- fc.Result = res
- return ec.marshalOUser2ᚖundefᚗninjaᚋxᚋfeedakaᚋgraphqlᚋmodelᚐUser(ctx, field.Selections, res)
-}
-
-func (ec *executionContext) fieldContext_Query_currentUser(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
- fc = &graphql.FieldContext{
- Object: "Query",
- Field: field,
- IsMethod: true,
- IsResolver: true,
- Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {
- switch field.Name {
- case "id":
- return ec.fieldContext_User_id(ctx, field)
- case "username":
- return ec.fieldContext_User_username(ctx, field)
- }
- return nil, fmt.Errorf("no field named %q was found under type User", field.Name)
- },
- }
- return fc, nil
-}
-
-func (ec *executionContext) _Query___type(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {
- fc, err := ec.fieldContext_Query___type(ctx, field)
- if err != nil {
- return graphql.Null
- }
- ctx = graphql.WithFieldContext(ctx, fc)
- defer func() {
- if r := recover(); r != nil {
- ec.Error(ctx, ec.Recover(ctx, r))
- ret = graphql.Null
- }
- }()
- resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) {
- ctx = rctx // use context from middleware stack in children
- return ec.introspectType(fc.Args["name"].(string))
- })
- if err != nil {
- ec.Error(ctx, err)
- return graphql.Null
- }
- if resTmp == nil {
- return graphql.Null
- }
- res := resTmp.(*introspection.Type)
- fc.Result = res
- return ec.marshalO__Type2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType(ctx, field.Selections, res)
-}
-
-func (ec *executionContext) fieldContext_Query___type(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
- fc = &graphql.FieldContext{
- Object: "Query",
- Field: field,
- IsMethod: true,
- IsResolver: false,
- Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {
- switch field.Name {
- case "kind":
- return ec.fieldContext___Type_kind(ctx, field)
- case "name":
- return ec.fieldContext___Type_name(ctx, field)
- case "description":
- return ec.fieldContext___Type_description(ctx, field)
- case "specifiedByURL":
- return ec.fieldContext___Type_specifiedByURL(ctx, field)
- case "fields":
- return ec.fieldContext___Type_fields(ctx, field)
- case "interfaces":
- return ec.fieldContext___Type_interfaces(ctx, field)
- case "possibleTypes":
- return ec.fieldContext___Type_possibleTypes(ctx, field)
- case "enumValues":
- return ec.fieldContext___Type_enumValues(ctx, field)
- case "inputFields":
- return ec.fieldContext___Type_inputFields(ctx, field)
- case "ofType":
- return ec.fieldContext___Type_ofType(ctx, field)
- case "isOneOf":
- return ec.fieldContext___Type_isOneOf(ctx, field)
- }
- return nil, fmt.Errorf("no field named %q was found under type __Type", field.Name)
- },
- }
- defer func() {
- if r := recover(); r != nil {
- err = ec.Recover(ctx, r)
- ec.Error(ctx, err)
- }
- }()
- ctx = graphql.WithFieldContext(ctx, fc)
- if fc.Args, err = ec.field_Query___type_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {
- ec.Error(ctx, err)
- return fc, err
- }
- return fc, nil
-}
-
-func (ec *executionContext) _Query___schema(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {
- fc, err := ec.fieldContext_Query___schema(ctx, field)
- if err != nil {
- return graphql.Null
- }
- ctx = graphql.WithFieldContext(ctx, fc)
- defer func() {
- if r := recover(); r != nil {
- ec.Error(ctx, ec.Recover(ctx, r))
- ret = graphql.Null
- }
- }()
- resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) {
- ctx = rctx // use context from middleware stack in children
- return ec.introspectSchema()
- })
- if err != nil {
- ec.Error(ctx, err)
- return graphql.Null
- }
- if resTmp == nil {
- return graphql.Null
- }
- res := resTmp.(*introspection.Schema)
- fc.Result = res
- return ec.marshalO__Schema2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐSchema(ctx, field.Selections, res)
-}
-
-func (ec *executionContext) fieldContext_Query___schema(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
- fc = &graphql.FieldContext{
- Object: "Query",
- Field: field,
- IsMethod: true,
- IsResolver: false,
- Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {
- switch field.Name {
- case "description":
- return ec.fieldContext___Schema_description(ctx, field)
- case "types":
- return ec.fieldContext___Schema_types(ctx, field)
- case "queryType":
- return ec.fieldContext___Schema_queryType(ctx, field)
- case "mutationType":
- return ec.fieldContext___Schema_mutationType(ctx, field)
- case "subscriptionType":
- return ec.fieldContext___Schema_subscriptionType(ctx, field)
- case "directives":
- return ec.fieldContext___Schema_directives(ctx, field)
- }
- return nil, fmt.Errorf("no field named %q was found under type __Schema", field.Name)
- },
- }
- return fc, nil
-}
-
-func (ec *executionContext) _User_id(ctx context.Context, field graphql.CollectedField, obj *model.User) (ret graphql.Marshaler) {
- fc, err := ec.fieldContext_User_id(ctx, field)
- if err != nil {
- return graphql.Null
- }
- ctx = graphql.WithFieldContext(ctx, fc)
- defer func() {
- if r := recover(); r != nil {
- ec.Error(ctx, ec.Recover(ctx, r))
- ret = graphql.Null
- }
- }()
- resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) {
- ctx = rctx // use context from middleware stack in children
- return obj.ID, nil
- })
- if err != nil {
- ec.Error(ctx, err)
- return graphql.Null
- }
- if resTmp == nil {
- if !graphql.HasFieldError(ctx, fc) {
- ec.Errorf(ctx, "must not be null")
- }
- return graphql.Null
- }
- res := resTmp.(string)
- fc.Result = res
- return ec.marshalNID2string(ctx, field.Selections, res)
-}
-
-func (ec *executionContext) fieldContext_User_id(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
- fc = &graphql.FieldContext{
- Object: "User",
- Field: field,
- IsMethod: false,
- IsResolver: false,
- Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {
- return nil, errors.New("field of type ID does not have child fields")
- },
- }
- return fc, nil
-}
-
-func (ec *executionContext) _User_username(ctx context.Context, field graphql.CollectedField, obj *model.User) (ret graphql.Marshaler) {
- fc, err := ec.fieldContext_User_username(ctx, field)
- if err != nil {
- return graphql.Null
- }
- ctx = graphql.WithFieldContext(ctx, fc)
- defer func() {
- if r := recover(); r != nil {
- ec.Error(ctx, ec.Recover(ctx, r))
- ret = graphql.Null
- }
- }()
- resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) {
- ctx = rctx // use context from middleware stack in children
- return obj.Username, nil
- })
- if err != nil {
- ec.Error(ctx, err)
- return graphql.Null
- }
- if resTmp == nil {
- if !graphql.HasFieldError(ctx, fc) {
- ec.Errorf(ctx, "must not be null")
- }
- return graphql.Null
- }
- res := resTmp.(string)
- fc.Result = res
- return ec.marshalNString2string(ctx, field.Selections, res)
-}
-
-func (ec *executionContext) fieldContext_User_username(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
- fc = &graphql.FieldContext{
- Object: "User",
- Field: field,
- IsMethod: false,
- IsResolver: false,
- Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {
- return nil, errors.New("field of type String does not have child fields")
- },
- }
- return fc, nil
-}
-
-func (ec *executionContext) ___Directive_name(ctx context.Context, field graphql.CollectedField, obj *introspection.Directive) (ret graphql.Marshaler) {
- fc, err := ec.fieldContext___Directive_name(ctx, field)
- if err != nil {
- return graphql.Null
- }
- ctx = graphql.WithFieldContext(ctx, fc)
- defer func() {
- if r := recover(); r != nil {
- ec.Error(ctx, ec.Recover(ctx, r))
- ret = graphql.Null
- }
- }()
- resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) {
- ctx = rctx // use context from middleware stack in children
- return obj.Name, nil
- })
- if err != nil {
- ec.Error(ctx, err)
- return graphql.Null
- }
- if resTmp == nil {
- if !graphql.HasFieldError(ctx, fc) {
- ec.Errorf(ctx, "must not be null")
- }
- return graphql.Null
- }
- res := resTmp.(string)
- fc.Result = res
- return ec.marshalNString2string(ctx, field.Selections, res)
-}
-
-func (ec *executionContext) fieldContext___Directive_name(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
- fc = &graphql.FieldContext{
- Object: "__Directive",
- Field: field,
- IsMethod: false,
- IsResolver: false,
- Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {
- return nil, errors.New("field of type String does not have child fields")
- },
- }
- return fc, nil
-}
-
-func (ec *executionContext) ___Directive_description(ctx context.Context, field graphql.CollectedField, obj *introspection.Directive) (ret graphql.Marshaler) {
- fc, err := ec.fieldContext___Directive_description(ctx, field)
- if err != nil {
- return graphql.Null
- }
- ctx = graphql.WithFieldContext(ctx, fc)
- defer func() {
- if r := recover(); r != nil {
- ec.Error(ctx, ec.Recover(ctx, r))
- ret = graphql.Null
- }
- }()
- resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) {
- ctx = rctx // use context from middleware stack in children
- return obj.Description(), nil
- })
- if err != nil {
- ec.Error(ctx, err)
- return graphql.Null
- }
- if resTmp == nil {
- return graphql.Null
- }
- res := resTmp.(*string)
- fc.Result = res
- return ec.marshalOString2ᚖstring(ctx, field.Selections, res)
-}
-
-func (ec *executionContext) fieldContext___Directive_description(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
- fc = &graphql.FieldContext{
- Object: "__Directive",
- Field: field,
- IsMethod: true,
- IsResolver: false,
- Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {
- return nil, errors.New("field of type String does not have child fields")
- },
- }
- return fc, nil
-}
-
-func (ec *executionContext) ___Directive_isRepeatable(ctx context.Context, field graphql.CollectedField, obj *introspection.Directive) (ret graphql.Marshaler) {
- fc, err := ec.fieldContext___Directive_isRepeatable(ctx, field)
- if err != nil {
- return graphql.Null
- }
- ctx = graphql.WithFieldContext(ctx, fc)
- defer func() {
- if r := recover(); r != nil {
- ec.Error(ctx, ec.Recover(ctx, r))
- ret = graphql.Null
- }
- }()
- resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) {
- ctx = rctx // use context from middleware stack in children
- return obj.IsRepeatable, nil
- })
- if err != nil {
- ec.Error(ctx, err)
- return graphql.Null
- }
- if resTmp == nil {
- if !graphql.HasFieldError(ctx, fc) {
- ec.Errorf(ctx, "must not be null")
- }
- return graphql.Null
- }
- res := resTmp.(bool)
- fc.Result = res
- return ec.marshalNBoolean2bool(ctx, field.Selections, res)
-}
-
-func (ec *executionContext) fieldContext___Directive_isRepeatable(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
- fc = &graphql.FieldContext{
- Object: "__Directive",
- Field: field,
- IsMethod: false,
- IsResolver: false,
- Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {
- return nil, errors.New("field of type Boolean does not have child fields")
- },
- }
- return fc, nil
-}
-
-func (ec *executionContext) ___Directive_locations(ctx context.Context, field graphql.CollectedField, obj *introspection.Directive) (ret graphql.Marshaler) {
- fc, err := ec.fieldContext___Directive_locations(ctx, field)
- if err != nil {
- return graphql.Null
- }
- ctx = graphql.WithFieldContext(ctx, fc)
- defer func() {
- if r := recover(); r != nil {
- ec.Error(ctx, ec.Recover(ctx, r))
- ret = graphql.Null
- }
- }()
- resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) {
- ctx = rctx // use context from middleware stack in children
- return obj.Locations, nil
- })
- if err != nil {
- ec.Error(ctx, err)
- return graphql.Null
- }
- if resTmp == nil {
- if !graphql.HasFieldError(ctx, fc) {
- ec.Errorf(ctx, "must not be null")
- }
- return graphql.Null
- }
- res := resTmp.([]string)
- fc.Result = res
- return ec.marshalN__DirectiveLocation2ᚕstringᚄ(ctx, field.Selections, res)
-}
-
-func (ec *executionContext) fieldContext___Directive_locations(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
- fc = &graphql.FieldContext{
- Object: "__Directive",
- Field: field,
- IsMethod: false,
- IsResolver: false,
- Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {
- return nil, errors.New("field of type __DirectiveLocation does not have child fields")
- },
- }
- return fc, nil
-}
-
-func (ec *executionContext) ___Directive_args(ctx context.Context, field graphql.CollectedField, obj *introspection.Directive) (ret graphql.Marshaler) {
- fc, err := ec.fieldContext___Directive_args(ctx, field)
- if err != nil {
- return graphql.Null
- }
- ctx = graphql.WithFieldContext(ctx, fc)
- defer func() {
- if r := recover(); r != nil {
- ec.Error(ctx, ec.Recover(ctx, r))
- ret = graphql.Null
- }
- }()
- resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) {
- ctx = rctx // use context from middleware stack in children
- return obj.Args, nil
- })
- if err != nil {
- ec.Error(ctx, err)
- return graphql.Null
- }
- if resTmp == nil {
- if !graphql.HasFieldError(ctx, fc) {
- ec.Errorf(ctx, "must not be null")
- }
- return graphql.Null
- }
- res := resTmp.([]introspection.InputValue)
- fc.Result = res
- return ec.marshalN__InputValue2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐInputValueᚄ(ctx, field.Selections, res)
-}
-
-func (ec *executionContext) fieldContext___Directive_args(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
- fc = &graphql.FieldContext{
- Object: "__Directive",
- Field: field,
- IsMethod: false,
- IsResolver: false,
- Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {
- switch field.Name {
- case "name":
- return ec.fieldContext___InputValue_name(ctx, field)
- case "description":
- return ec.fieldContext___InputValue_description(ctx, field)
- case "type":
- return ec.fieldContext___InputValue_type(ctx, field)
- case "defaultValue":
- return ec.fieldContext___InputValue_defaultValue(ctx, field)
- case "isDeprecated":
- return ec.fieldContext___InputValue_isDeprecated(ctx, field)
- case "deprecationReason":
- return ec.fieldContext___InputValue_deprecationReason(ctx, field)
- }
- return nil, fmt.Errorf("no field named %q was found under type __InputValue", field.Name)
- },
- }
- defer func() {
- if r := recover(); r != nil {
- err = ec.Recover(ctx, r)
- ec.Error(ctx, err)
- }
- }()
- ctx = graphql.WithFieldContext(ctx, fc)
- if fc.Args, err = ec.field___Directive_args_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {
- ec.Error(ctx, err)
- return fc, err
- }
- return fc, nil
-}
-
-func (ec *executionContext) ___EnumValue_name(ctx context.Context, field graphql.CollectedField, obj *introspection.EnumValue) (ret graphql.Marshaler) {
- fc, err := ec.fieldContext___EnumValue_name(ctx, field)
- if err != nil {
- return graphql.Null
- }
- ctx = graphql.WithFieldContext(ctx, fc)
- defer func() {
- if r := recover(); r != nil {
- ec.Error(ctx, ec.Recover(ctx, r))
- ret = graphql.Null
- }
- }()
- resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) {
- ctx = rctx // use context from middleware stack in children
- return obj.Name, nil
- })
- if err != nil {
- ec.Error(ctx, err)
- return graphql.Null
- }
- if resTmp == nil {
- if !graphql.HasFieldError(ctx, fc) {
- ec.Errorf(ctx, "must not be null")
- }
- return graphql.Null
- }
- res := resTmp.(string)
- fc.Result = res
- return ec.marshalNString2string(ctx, field.Selections, res)
-}
-
-func (ec *executionContext) fieldContext___EnumValue_name(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
- fc = &graphql.FieldContext{
- Object: "__EnumValue",
- Field: field,
- IsMethod: false,
- IsResolver: false,
- Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {
- return nil, errors.New("field of type String does not have child fields")
- },
- }
- return fc, nil
-}
-
-func (ec *executionContext) ___EnumValue_description(ctx context.Context, field graphql.CollectedField, obj *introspection.EnumValue) (ret graphql.Marshaler) {
- fc, err := ec.fieldContext___EnumValue_description(ctx, field)
- if err != nil {
- return graphql.Null
- }
- ctx = graphql.WithFieldContext(ctx, fc)
- defer func() {
- if r := recover(); r != nil {
- ec.Error(ctx, ec.Recover(ctx, r))
- ret = graphql.Null
- }
- }()
- resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) {
- ctx = rctx // use context from middleware stack in children
- return obj.Description(), nil
- })
- if err != nil {
- ec.Error(ctx, err)
- return graphql.Null
- }
- if resTmp == nil {
- return graphql.Null
- }
- res := resTmp.(*string)
- fc.Result = res
- return ec.marshalOString2ᚖstring(ctx, field.Selections, res)
-}
-
-func (ec *executionContext) fieldContext___EnumValue_description(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
- fc = &graphql.FieldContext{
- Object: "__EnumValue",
- Field: field,
- IsMethod: true,
- IsResolver: false,
- Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {
- return nil, errors.New("field of type String does not have child fields")
- },
- }
- return fc, nil
-}
-
-func (ec *executionContext) ___EnumValue_isDeprecated(ctx context.Context, field graphql.CollectedField, obj *introspection.EnumValue) (ret graphql.Marshaler) {
- fc, err := ec.fieldContext___EnumValue_isDeprecated(ctx, field)
- if err != nil {
- return graphql.Null
- }
- ctx = graphql.WithFieldContext(ctx, fc)
- defer func() {
- if r := recover(); r != nil {
- ec.Error(ctx, ec.Recover(ctx, r))
- ret = graphql.Null
- }
- }()
- resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) {
- ctx = rctx // use context from middleware stack in children
- return obj.IsDeprecated(), nil
- })
- if err != nil {
- ec.Error(ctx, err)
- return graphql.Null
- }
- if resTmp == nil {
- if !graphql.HasFieldError(ctx, fc) {
- ec.Errorf(ctx, "must not be null")
- }
- return graphql.Null
- }
- res := resTmp.(bool)
- fc.Result = res
- return ec.marshalNBoolean2bool(ctx, field.Selections, res)
-}
-
-func (ec *executionContext) fieldContext___EnumValue_isDeprecated(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
- fc = &graphql.FieldContext{
- Object: "__EnumValue",
- Field: field,
- IsMethod: true,
- IsResolver: false,
- Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {
- return nil, errors.New("field of type Boolean does not have child fields")
- },
- }
- return fc, nil
-}
-
-func (ec *executionContext) ___EnumValue_deprecationReason(ctx context.Context, field graphql.CollectedField, obj *introspection.EnumValue) (ret graphql.Marshaler) {
- fc, err := ec.fieldContext___EnumValue_deprecationReason(ctx, field)
- if err != nil {
- return graphql.Null
- }
- ctx = graphql.WithFieldContext(ctx, fc)
- defer func() {
- if r := recover(); r != nil {
- ec.Error(ctx, ec.Recover(ctx, r))
- ret = graphql.Null
- }
- }()
- resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) {
- ctx = rctx // use context from middleware stack in children
- return obj.DeprecationReason(), nil
- })
- if err != nil {
- ec.Error(ctx, err)
- return graphql.Null
- }
- if resTmp == nil {
- return graphql.Null
- }
- res := resTmp.(*string)
- fc.Result = res
- return ec.marshalOString2ᚖstring(ctx, field.Selections, res)
-}
-
-func (ec *executionContext) fieldContext___EnumValue_deprecationReason(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
- fc = &graphql.FieldContext{
- Object: "__EnumValue",
- Field: field,
- IsMethod: true,
- IsResolver: false,
- Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {
- return nil, errors.New("field of type String does not have child fields")
- },
- }
- return fc, nil
-}
-
-func (ec *executionContext) ___Field_name(ctx context.Context, field graphql.CollectedField, obj *introspection.Field) (ret graphql.Marshaler) {
- fc, err := ec.fieldContext___Field_name(ctx, field)
- if err != nil {
- return graphql.Null
- }
- ctx = graphql.WithFieldContext(ctx, fc)
- defer func() {
- if r := recover(); r != nil {
- ec.Error(ctx, ec.Recover(ctx, r))
- ret = graphql.Null
- }
- }()
- resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) {
- ctx = rctx // use context from middleware stack in children
- return obj.Name, nil
- })
- if err != nil {
- ec.Error(ctx, err)
- return graphql.Null
- }
- if resTmp == nil {
- if !graphql.HasFieldError(ctx, fc) {
- ec.Errorf(ctx, "must not be null")
- }
- return graphql.Null
- }
- res := resTmp.(string)
- fc.Result = res
- return ec.marshalNString2string(ctx, field.Selections, res)
-}
-
-func (ec *executionContext) fieldContext___Field_name(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
- fc = &graphql.FieldContext{
- Object: "__Field",
- Field: field,
- IsMethod: false,
- IsResolver: false,
- Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {
- return nil, errors.New("field of type String does not have child fields")
- },
- }
- return fc, nil
-}
-
-func (ec *executionContext) ___Field_description(ctx context.Context, field graphql.CollectedField, obj *introspection.Field) (ret graphql.Marshaler) {
- fc, err := ec.fieldContext___Field_description(ctx, field)
- if err != nil {
- return graphql.Null
- }
- ctx = graphql.WithFieldContext(ctx, fc)
- defer func() {
- if r := recover(); r != nil {
- ec.Error(ctx, ec.Recover(ctx, r))
- ret = graphql.Null
- }
- }()
- resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) {
- ctx = rctx // use context from middleware stack in children
- return obj.Description(), nil
- })
- if err != nil {
- ec.Error(ctx, err)
- return graphql.Null
- }
- if resTmp == nil {
- return graphql.Null
- }
- res := resTmp.(*string)
- fc.Result = res
- return ec.marshalOString2ᚖstring(ctx, field.Selections, res)
-}
-
-func (ec *executionContext) fieldContext___Field_description(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
- fc = &graphql.FieldContext{
- Object: "__Field",
- Field: field,
- IsMethod: true,
- IsResolver: false,
- Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {
- return nil, errors.New("field of type String does not have child fields")
- },
- }
- return fc, nil
-}
-
-func (ec *executionContext) ___Field_args(ctx context.Context, field graphql.CollectedField, obj *introspection.Field) (ret graphql.Marshaler) {
- fc, err := ec.fieldContext___Field_args(ctx, field)
- if err != nil {
- return graphql.Null
- }
- ctx = graphql.WithFieldContext(ctx, fc)
- defer func() {
- if r := recover(); r != nil {
- ec.Error(ctx, ec.Recover(ctx, r))
- ret = graphql.Null
- }
- }()
- resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) {
- ctx = rctx // use context from middleware stack in children
- return obj.Args, nil
- })
- if err != nil {
- ec.Error(ctx, err)
- return graphql.Null
- }
- if resTmp == nil {
- if !graphql.HasFieldError(ctx, fc) {
- ec.Errorf(ctx, "must not be null")
- }
- return graphql.Null
- }
- res := resTmp.([]introspection.InputValue)
- fc.Result = res
- return ec.marshalN__InputValue2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐInputValueᚄ(ctx, field.Selections, res)
-}
-
-func (ec *executionContext) fieldContext___Field_args(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
- fc = &graphql.FieldContext{
- Object: "__Field",
- Field: field,
- IsMethod: false,
- IsResolver: false,
- Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {
- switch field.Name {
- case "name":
- return ec.fieldContext___InputValue_name(ctx, field)
- case "description":
- return ec.fieldContext___InputValue_description(ctx, field)
- case "type":
- return ec.fieldContext___InputValue_type(ctx, field)
- case "defaultValue":
- return ec.fieldContext___InputValue_defaultValue(ctx, field)
- case "isDeprecated":
- return ec.fieldContext___InputValue_isDeprecated(ctx, field)
- case "deprecationReason":
- return ec.fieldContext___InputValue_deprecationReason(ctx, field)
- }
- return nil, fmt.Errorf("no field named %q was found under type __InputValue", field.Name)
- },
- }
- defer func() {
- if r := recover(); r != nil {
- err = ec.Recover(ctx, r)
- ec.Error(ctx, err)
- }
- }()
- ctx = graphql.WithFieldContext(ctx, fc)
- if fc.Args, err = ec.field___Field_args_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {
- ec.Error(ctx, err)
- return fc, err
- }
- return fc, nil
-}
-
-func (ec *executionContext) ___Field_type(ctx context.Context, field graphql.CollectedField, obj *introspection.Field) (ret graphql.Marshaler) {
- fc, err := ec.fieldContext___Field_type(ctx, field)
- if err != nil {
- return graphql.Null
- }
- ctx = graphql.WithFieldContext(ctx, fc)
- defer func() {
- if r := recover(); r != nil {
- ec.Error(ctx, ec.Recover(ctx, r))
- ret = graphql.Null
- }
- }()
- resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) {
- ctx = rctx // use context from middleware stack in children
- return obj.Type, nil
- })
- if err != nil {
- ec.Error(ctx, err)
- return graphql.Null
- }
- if resTmp == nil {
- if !graphql.HasFieldError(ctx, fc) {
- ec.Errorf(ctx, "must not be null")
- }
- return graphql.Null
- }
- res := resTmp.(*introspection.Type)
- fc.Result = res
- return ec.marshalN__Type2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType(ctx, field.Selections, res)
-}
-
-func (ec *executionContext) fieldContext___Field_type(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
- fc = &graphql.FieldContext{
- Object: "__Field",
- Field: field,
- IsMethod: false,
- IsResolver: false,
- Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {
- switch field.Name {
- case "kind":
- return ec.fieldContext___Type_kind(ctx, field)
- case "name":
- return ec.fieldContext___Type_name(ctx, field)
- case "description":
- return ec.fieldContext___Type_description(ctx, field)
- case "specifiedByURL":
- return ec.fieldContext___Type_specifiedByURL(ctx, field)
- case "fields":
- return ec.fieldContext___Type_fields(ctx, field)
- case "interfaces":
- return ec.fieldContext___Type_interfaces(ctx, field)
- case "possibleTypes":
- return ec.fieldContext___Type_possibleTypes(ctx, field)
- case "enumValues":
- return ec.fieldContext___Type_enumValues(ctx, field)
- case "inputFields":
- return ec.fieldContext___Type_inputFields(ctx, field)
- case "ofType":
- return ec.fieldContext___Type_ofType(ctx, field)
- case "isOneOf":
- return ec.fieldContext___Type_isOneOf(ctx, field)
- }
- return nil, fmt.Errorf("no field named %q was found under type __Type", field.Name)
- },
- }
- return fc, nil
-}
-
-func (ec *executionContext) ___Field_isDeprecated(ctx context.Context, field graphql.CollectedField, obj *introspection.Field) (ret graphql.Marshaler) {
- fc, err := ec.fieldContext___Field_isDeprecated(ctx, field)
- if err != nil {
- return graphql.Null
- }
- ctx = graphql.WithFieldContext(ctx, fc)
- defer func() {
- if r := recover(); r != nil {
- ec.Error(ctx, ec.Recover(ctx, r))
- ret = graphql.Null
- }
- }()
- resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) {
- ctx = rctx // use context from middleware stack in children
- return obj.IsDeprecated(), nil
- })
- if err != nil {
- ec.Error(ctx, err)
- return graphql.Null
- }
- if resTmp == nil {
- if !graphql.HasFieldError(ctx, fc) {
- ec.Errorf(ctx, "must not be null")
- }
- return graphql.Null
- }
- res := resTmp.(bool)
- fc.Result = res
- return ec.marshalNBoolean2bool(ctx, field.Selections, res)
-}
-
-func (ec *executionContext) fieldContext___Field_isDeprecated(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
- fc = &graphql.FieldContext{
- Object: "__Field",
- Field: field,
- IsMethod: true,
- IsResolver: false,
- Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {
- return nil, errors.New("field of type Boolean does not have child fields")
- },
- }
- return fc, nil
-}
-
-func (ec *executionContext) ___Field_deprecationReason(ctx context.Context, field graphql.CollectedField, obj *introspection.Field) (ret graphql.Marshaler) {
- fc, err := ec.fieldContext___Field_deprecationReason(ctx, field)
- if err != nil {
- return graphql.Null
- }
- ctx = graphql.WithFieldContext(ctx, fc)
- defer func() {
- if r := recover(); r != nil {
- ec.Error(ctx, ec.Recover(ctx, r))
- ret = graphql.Null
- }
- }()
- resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) {
- ctx = rctx // use context from middleware stack in children
- return obj.DeprecationReason(), nil
- })
- if err != nil {
- ec.Error(ctx, err)
- return graphql.Null
- }
- if resTmp == nil {
- return graphql.Null
- }
- res := resTmp.(*string)
- fc.Result = res
- return ec.marshalOString2ᚖstring(ctx, field.Selections, res)
-}
-
-func (ec *executionContext) fieldContext___Field_deprecationReason(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
- fc = &graphql.FieldContext{
- Object: "__Field",
- Field: field,
- IsMethod: true,
- IsResolver: false,
- Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {
- return nil, errors.New("field of type String does not have child fields")
- },
- }
- return fc, nil
-}
-
-func (ec *executionContext) ___InputValue_name(ctx context.Context, field graphql.CollectedField, obj *introspection.InputValue) (ret graphql.Marshaler) {
- fc, err := ec.fieldContext___InputValue_name(ctx, field)
- if err != nil {
- return graphql.Null
- }
- ctx = graphql.WithFieldContext(ctx, fc)
- defer func() {
- if r := recover(); r != nil {
- ec.Error(ctx, ec.Recover(ctx, r))
- ret = graphql.Null
- }
- }()
- resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) {
- ctx = rctx // use context from middleware stack in children
- return obj.Name, nil
- })
- if err != nil {
- ec.Error(ctx, err)
- return graphql.Null
- }
- if resTmp == nil {
- if !graphql.HasFieldError(ctx, fc) {
- ec.Errorf(ctx, "must not be null")
- }
- return graphql.Null
- }
- res := resTmp.(string)
- fc.Result = res
- return ec.marshalNString2string(ctx, field.Selections, res)
-}
-
-func (ec *executionContext) fieldContext___InputValue_name(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
- fc = &graphql.FieldContext{
- Object: "__InputValue",
- Field: field,
- IsMethod: false,
- IsResolver: false,
- Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {
- return nil, errors.New("field of type String does not have child fields")
- },
- }
- return fc, nil
-}
-
-func (ec *executionContext) ___InputValue_description(ctx context.Context, field graphql.CollectedField, obj *introspection.InputValue) (ret graphql.Marshaler) {
- fc, err := ec.fieldContext___InputValue_description(ctx, field)
- if err != nil {
- return graphql.Null
- }
- ctx = graphql.WithFieldContext(ctx, fc)
- defer func() {
- if r := recover(); r != nil {
- ec.Error(ctx, ec.Recover(ctx, r))
- ret = graphql.Null
- }
- }()
- resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) {
- ctx = rctx // use context from middleware stack in children
- return obj.Description(), nil
- })
- if err != nil {
- ec.Error(ctx, err)
- return graphql.Null
- }
- if resTmp == nil {
- return graphql.Null
- }
- res := resTmp.(*string)
- fc.Result = res
- return ec.marshalOString2ᚖstring(ctx, field.Selections, res)
-}
-
-func (ec *executionContext) fieldContext___InputValue_description(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
- fc = &graphql.FieldContext{
- Object: "__InputValue",
- Field: field,
- IsMethod: true,
- IsResolver: false,
- Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {
- return nil, errors.New("field of type String does not have child fields")
- },
- }
- return fc, nil
-}
-
-func (ec *executionContext) ___InputValue_type(ctx context.Context, field graphql.CollectedField, obj *introspection.InputValue) (ret graphql.Marshaler) {
- fc, err := ec.fieldContext___InputValue_type(ctx, field)
- if err != nil {
- return graphql.Null
- }
- ctx = graphql.WithFieldContext(ctx, fc)
- defer func() {
- if r := recover(); r != nil {
- ec.Error(ctx, ec.Recover(ctx, r))
- ret = graphql.Null
- }
- }()
- resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) {
- ctx = rctx // use context from middleware stack in children
- return obj.Type, nil
- })
- if err != nil {
- ec.Error(ctx, err)
- return graphql.Null
- }
- if resTmp == nil {
- if !graphql.HasFieldError(ctx, fc) {
- ec.Errorf(ctx, "must not be null")
- }
- return graphql.Null
- }
- res := resTmp.(*introspection.Type)
- fc.Result = res
- return ec.marshalN__Type2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType(ctx, field.Selections, res)
-}
-
-func (ec *executionContext) fieldContext___InputValue_type(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
- fc = &graphql.FieldContext{
- Object: "__InputValue",
- Field: field,
- IsMethod: false,
- IsResolver: false,
- Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {
- switch field.Name {
- case "kind":
- return ec.fieldContext___Type_kind(ctx, field)
- case "name":
- return ec.fieldContext___Type_name(ctx, field)
- case "description":
- return ec.fieldContext___Type_description(ctx, field)
- case "specifiedByURL":
- return ec.fieldContext___Type_specifiedByURL(ctx, field)
- case "fields":
- return ec.fieldContext___Type_fields(ctx, field)
- case "interfaces":
- return ec.fieldContext___Type_interfaces(ctx, field)
- case "possibleTypes":
- return ec.fieldContext___Type_possibleTypes(ctx, field)
- case "enumValues":
- return ec.fieldContext___Type_enumValues(ctx, field)
- case "inputFields":
- return ec.fieldContext___Type_inputFields(ctx, field)
- case "ofType":
- return ec.fieldContext___Type_ofType(ctx, field)
- case "isOneOf":
- return ec.fieldContext___Type_isOneOf(ctx, field)
- }
- return nil, fmt.Errorf("no field named %q was found under type __Type", field.Name)
- },
- }
- return fc, nil
-}
-
-func (ec *executionContext) ___InputValue_defaultValue(ctx context.Context, field graphql.CollectedField, obj *introspection.InputValue) (ret graphql.Marshaler) {
- fc, err := ec.fieldContext___InputValue_defaultValue(ctx, field)
- if err != nil {
- return graphql.Null
- }
- ctx = graphql.WithFieldContext(ctx, fc)
- defer func() {
- if r := recover(); r != nil {
- ec.Error(ctx, ec.Recover(ctx, r))
- ret = graphql.Null
- }
- }()
- resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) {
- ctx = rctx // use context from middleware stack in children
- return obj.DefaultValue, nil
- })
- if err != nil {
- ec.Error(ctx, err)
- return graphql.Null
- }
- if resTmp == nil {
- return graphql.Null
- }
- res := resTmp.(*string)
- fc.Result = res
- return ec.marshalOString2ᚖstring(ctx, field.Selections, res)
-}
-
-func (ec *executionContext) fieldContext___InputValue_defaultValue(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
- fc = &graphql.FieldContext{
- Object: "__InputValue",
- Field: field,
- IsMethod: false,
- IsResolver: false,
- Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {
- return nil, errors.New("field of type String does not have child fields")
- },
- }
- return fc, nil
-}
-
-func (ec *executionContext) ___InputValue_isDeprecated(ctx context.Context, field graphql.CollectedField, obj *introspection.InputValue) (ret graphql.Marshaler) {
- fc, err := ec.fieldContext___InputValue_isDeprecated(ctx, field)
- if err != nil {
- return graphql.Null
- }
- ctx = graphql.WithFieldContext(ctx, fc)
- defer func() {
- if r := recover(); r != nil {
- ec.Error(ctx, ec.Recover(ctx, r))
- ret = graphql.Null
- }
- }()
- resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) {
- ctx = rctx // use context from middleware stack in children
- return obj.IsDeprecated(), nil
- })
- if err != nil {
- ec.Error(ctx, err)
- return graphql.Null
- }
- if resTmp == nil {
- if !graphql.HasFieldError(ctx, fc) {
- ec.Errorf(ctx, "must not be null")
- }
- return graphql.Null
- }
- res := resTmp.(bool)
- fc.Result = res
- return ec.marshalNBoolean2bool(ctx, field.Selections, res)
-}
-
-func (ec *executionContext) fieldContext___InputValue_isDeprecated(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
- fc = &graphql.FieldContext{
- Object: "__InputValue",
- Field: field,
- IsMethod: true,
- IsResolver: false,
- Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {
- return nil, errors.New("field of type Boolean does not have child fields")
- },
- }
- return fc, nil
-}
-
-func (ec *executionContext) ___InputValue_deprecationReason(ctx context.Context, field graphql.CollectedField, obj *introspection.InputValue) (ret graphql.Marshaler) {
- fc, err := ec.fieldContext___InputValue_deprecationReason(ctx, field)
- if err != nil {
- return graphql.Null
- }
- ctx = graphql.WithFieldContext(ctx, fc)
- defer func() {
- if r := recover(); r != nil {
- ec.Error(ctx, ec.Recover(ctx, r))
- ret = graphql.Null
- }
- }()
- resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) {
- ctx = rctx // use context from middleware stack in children
- return obj.DeprecationReason(), nil
- })
- if err != nil {
- ec.Error(ctx, err)
- return graphql.Null
- }
- if resTmp == nil {
- return graphql.Null
- }
- res := resTmp.(*string)
- fc.Result = res
- return ec.marshalOString2ᚖstring(ctx, field.Selections, res)
-}
-
-func (ec *executionContext) fieldContext___InputValue_deprecationReason(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
- fc = &graphql.FieldContext{
- Object: "__InputValue",
- Field: field,
- IsMethod: true,
- IsResolver: false,
- Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {
- return nil, errors.New("field of type String does not have child fields")
- },
- }
- return fc, nil
-}
-
-func (ec *executionContext) ___Schema_description(ctx context.Context, field graphql.CollectedField, obj *introspection.Schema) (ret graphql.Marshaler) {
- fc, err := ec.fieldContext___Schema_description(ctx, field)
- if err != nil {
- return graphql.Null
- }
- ctx = graphql.WithFieldContext(ctx, fc)
- defer func() {
- if r := recover(); r != nil {
- ec.Error(ctx, ec.Recover(ctx, r))
- ret = graphql.Null
- }
- }()
- resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) {
- ctx = rctx // use context from middleware stack in children
- return obj.Description(), nil
- })
- if err != nil {
- ec.Error(ctx, err)
- return graphql.Null
- }
- if resTmp == nil {
- return graphql.Null
- }
- res := resTmp.(*string)
- fc.Result = res
- return ec.marshalOString2ᚖstring(ctx, field.Selections, res)
-}
-
-func (ec *executionContext) fieldContext___Schema_description(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
- fc = &graphql.FieldContext{
- Object: "__Schema",
- Field: field,
- IsMethod: true,
- IsResolver: false,
- Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {
- return nil, errors.New("field of type String does not have child fields")
- },
- }
- return fc, nil
-}
-
-func (ec *executionContext) ___Schema_types(ctx context.Context, field graphql.CollectedField, obj *introspection.Schema) (ret graphql.Marshaler) {
- fc, err := ec.fieldContext___Schema_types(ctx, field)
- if err != nil {
- return graphql.Null
- }
- ctx = graphql.WithFieldContext(ctx, fc)
- defer func() {
- if r := recover(); r != nil {
- ec.Error(ctx, ec.Recover(ctx, r))
- ret = graphql.Null
- }
- }()
- resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) {
- ctx = rctx // use context from middleware stack in children
- return obj.Types(), nil
- })
- if err != nil {
- ec.Error(ctx, err)
- return graphql.Null
- }
- if resTmp == nil {
- if !graphql.HasFieldError(ctx, fc) {
- ec.Errorf(ctx, "must not be null")
- }
- return graphql.Null
- }
- res := resTmp.([]introspection.Type)
- fc.Result = res
- return ec.marshalN__Type2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐTypeᚄ(ctx, field.Selections, res)
-}
-
-func (ec *executionContext) fieldContext___Schema_types(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
- fc = &graphql.FieldContext{
- Object: "__Schema",
- Field: field,
- IsMethod: true,
- IsResolver: false,
- Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {
- switch field.Name {
- case "kind":
- return ec.fieldContext___Type_kind(ctx, field)
- case "name":
- return ec.fieldContext___Type_name(ctx, field)
- case "description":
- return ec.fieldContext___Type_description(ctx, field)
- case "specifiedByURL":
- return ec.fieldContext___Type_specifiedByURL(ctx, field)
- case "fields":
- return ec.fieldContext___Type_fields(ctx, field)
- case "interfaces":
- return ec.fieldContext___Type_interfaces(ctx, field)
- case "possibleTypes":
- return ec.fieldContext___Type_possibleTypes(ctx, field)
- case "enumValues":
- return ec.fieldContext___Type_enumValues(ctx, field)
- case "inputFields":
- return ec.fieldContext___Type_inputFields(ctx, field)
- case "ofType":
- return ec.fieldContext___Type_ofType(ctx, field)
- case "isOneOf":
- return ec.fieldContext___Type_isOneOf(ctx, field)
- }
- return nil, fmt.Errorf("no field named %q was found under type __Type", field.Name)
- },
- }
- return fc, nil
-}
-
-func (ec *executionContext) ___Schema_queryType(ctx context.Context, field graphql.CollectedField, obj *introspection.Schema) (ret graphql.Marshaler) {
- fc, err := ec.fieldContext___Schema_queryType(ctx, field)
- if err != nil {
- return graphql.Null
- }
- ctx = graphql.WithFieldContext(ctx, fc)
- defer func() {
- if r := recover(); r != nil {
- ec.Error(ctx, ec.Recover(ctx, r))
- ret = graphql.Null
- }
- }()
- resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) {
- ctx = rctx // use context from middleware stack in children
- return obj.QueryType(), nil
- })
- if err != nil {
- ec.Error(ctx, err)
- return graphql.Null
- }
- if resTmp == nil {
- if !graphql.HasFieldError(ctx, fc) {
- ec.Errorf(ctx, "must not be null")
- }
- return graphql.Null
- }
- res := resTmp.(*introspection.Type)
- fc.Result = res
- return ec.marshalN__Type2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType(ctx, field.Selections, res)
-}
-
-func (ec *executionContext) fieldContext___Schema_queryType(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
- fc = &graphql.FieldContext{
- Object: "__Schema",
- Field: field,
- IsMethod: true,
- IsResolver: false,
- Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {
- switch field.Name {
- case "kind":
- return ec.fieldContext___Type_kind(ctx, field)
- case "name":
- return ec.fieldContext___Type_name(ctx, field)
- case "description":
- return ec.fieldContext___Type_description(ctx, field)
- case "specifiedByURL":
- return ec.fieldContext___Type_specifiedByURL(ctx, field)
- case "fields":
- return ec.fieldContext___Type_fields(ctx, field)
- case "interfaces":
- return ec.fieldContext___Type_interfaces(ctx, field)
- case "possibleTypes":
- return ec.fieldContext___Type_possibleTypes(ctx, field)
- case "enumValues":
- return ec.fieldContext___Type_enumValues(ctx, field)
- case "inputFields":
- return ec.fieldContext___Type_inputFields(ctx, field)
- case "ofType":
- return ec.fieldContext___Type_ofType(ctx, field)
- case "isOneOf":
- return ec.fieldContext___Type_isOneOf(ctx, field)
- }
- return nil, fmt.Errorf("no field named %q was found under type __Type", field.Name)
- },
- }
- return fc, nil
-}
-
-func (ec *executionContext) ___Schema_mutationType(ctx context.Context, field graphql.CollectedField, obj *introspection.Schema) (ret graphql.Marshaler) {
- fc, err := ec.fieldContext___Schema_mutationType(ctx, field)
- if err != nil {
- return graphql.Null
- }
- ctx = graphql.WithFieldContext(ctx, fc)
- defer func() {
- if r := recover(); r != nil {
- ec.Error(ctx, ec.Recover(ctx, r))
- ret = graphql.Null
- }
- }()
- resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) {
- ctx = rctx // use context from middleware stack in children
- return obj.MutationType(), nil
- })
- if err != nil {
- ec.Error(ctx, err)
- return graphql.Null
- }
- if resTmp == nil {
- return graphql.Null
- }
- res := resTmp.(*introspection.Type)
- fc.Result = res
- return ec.marshalO__Type2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType(ctx, field.Selections, res)
-}
-
-func (ec *executionContext) fieldContext___Schema_mutationType(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
- fc = &graphql.FieldContext{
- Object: "__Schema",
- Field: field,
- IsMethod: true,
- IsResolver: false,
- Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {
- switch field.Name {
- case "kind":
- return ec.fieldContext___Type_kind(ctx, field)
- case "name":
- return ec.fieldContext___Type_name(ctx, field)
- case "description":
- return ec.fieldContext___Type_description(ctx, field)
- case "specifiedByURL":
- return ec.fieldContext___Type_specifiedByURL(ctx, field)
- case "fields":
- return ec.fieldContext___Type_fields(ctx, field)
- case "interfaces":
- return ec.fieldContext___Type_interfaces(ctx, field)
- case "possibleTypes":
- return ec.fieldContext___Type_possibleTypes(ctx, field)
- case "enumValues":
- return ec.fieldContext___Type_enumValues(ctx, field)
- case "inputFields":
- return ec.fieldContext___Type_inputFields(ctx, field)
- case "ofType":
- return ec.fieldContext___Type_ofType(ctx, field)
- case "isOneOf":
- return ec.fieldContext___Type_isOneOf(ctx, field)
- }
- return nil, fmt.Errorf("no field named %q was found under type __Type", field.Name)
- },
- }
- return fc, nil
-}
-
-func (ec *executionContext) ___Schema_subscriptionType(ctx context.Context, field graphql.CollectedField, obj *introspection.Schema) (ret graphql.Marshaler) {
- fc, err := ec.fieldContext___Schema_subscriptionType(ctx, field)
- if err != nil {
- return graphql.Null
- }
- ctx = graphql.WithFieldContext(ctx, fc)
- defer func() {
- if r := recover(); r != nil {
- ec.Error(ctx, ec.Recover(ctx, r))
- ret = graphql.Null
- }
- }()
- resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) {
- ctx = rctx // use context from middleware stack in children
- return obj.SubscriptionType(), nil
- })
- if err != nil {
- ec.Error(ctx, err)
- return graphql.Null
- }
- if resTmp == nil {
- return graphql.Null
- }
- res := resTmp.(*introspection.Type)
- fc.Result = res
- return ec.marshalO__Type2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType(ctx, field.Selections, res)
-}
-
-func (ec *executionContext) fieldContext___Schema_subscriptionType(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
- fc = &graphql.FieldContext{
- Object: "__Schema",
- Field: field,
- IsMethod: true,
- IsResolver: false,
- Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {
- switch field.Name {
- case "kind":
- return ec.fieldContext___Type_kind(ctx, field)
- case "name":
- return ec.fieldContext___Type_name(ctx, field)
- case "description":
- return ec.fieldContext___Type_description(ctx, field)
- case "specifiedByURL":
- return ec.fieldContext___Type_specifiedByURL(ctx, field)
- case "fields":
- return ec.fieldContext___Type_fields(ctx, field)
- case "interfaces":
- return ec.fieldContext___Type_interfaces(ctx, field)
- case "possibleTypes":
- return ec.fieldContext___Type_possibleTypes(ctx, field)
- case "enumValues":
- return ec.fieldContext___Type_enumValues(ctx, field)
- case "inputFields":
- return ec.fieldContext___Type_inputFields(ctx, field)
- case "ofType":
- return ec.fieldContext___Type_ofType(ctx, field)
- case "isOneOf":
- return ec.fieldContext___Type_isOneOf(ctx, field)
- }
- return nil, fmt.Errorf("no field named %q was found under type __Type", field.Name)
- },
- }
- return fc, nil
-}
-
-func (ec *executionContext) ___Schema_directives(ctx context.Context, field graphql.CollectedField, obj *introspection.Schema) (ret graphql.Marshaler) {
- fc, err := ec.fieldContext___Schema_directives(ctx, field)
- if err != nil {
- return graphql.Null
- }
- ctx = graphql.WithFieldContext(ctx, fc)
- defer func() {
- if r := recover(); r != nil {
- ec.Error(ctx, ec.Recover(ctx, r))
- ret = graphql.Null
- }
- }()
- resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) {
- ctx = rctx // use context from middleware stack in children
- return obj.Directives(), nil
- })
- if err != nil {
- ec.Error(ctx, err)
- return graphql.Null
- }
- if resTmp == nil {
- if !graphql.HasFieldError(ctx, fc) {
- ec.Errorf(ctx, "must not be null")
- }
- return graphql.Null
- }
- res := resTmp.([]introspection.Directive)
- fc.Result = res
- return ec.marshalN__Directive2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐDirectiveᚄ(ctx, field.Selections, res)
-}
-
-func (ec *executionContext) fieldContext___Schema_directives(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
- fc = &graphql.FieldContext{
- Object: "__Schema",
- Field: field,
- IsMethod: true,
- IsResolver: false,
- Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {
- switch field.Name {
- case "name":
- return ec.fieldContext___Directive_name(ctx, field)
- case "description":
- return ec.fieldContext___Directive_description(ctx, field)
- case "isRepeatable":
- return ec.fieldContext___Directive_isRepeatable(ctx, field)
- case "locations":
- return ec.fieldContext___Directive_locations(ctx, field)
- case "args":
- return ec.fieldContext___Directive_args(ctx, field)
- }
- return nil, fmt.Errorf("no field named %q was found under type __Directive", field.Name)
- },
- }
- return fc, nil
-}
-
-func (ec *executionContext) ___Type_kind(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) (ret graphql.Marshaler) {
- fc, err := ec.fieldContext___Type_kind(ctx, field)
- if err != nil {
- return graphql.Null
- }
- ctx = graphql.WithFieldContext(ctx, fc)
- defer func() {
- if r := recover(); r != nil {
- ec.Error(ctx, ec.Recover(ctx, r))
- ret = graphql.Null
- }
- }()
- resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) {
- ctx = rctx // use context from middleware stack in children
- return obj.Kind(), nil
- })
- if err != nil {
- ec.Error(ctx, err)
- return graphql.Null
- }
- if resTmp == nil {
- if !graphql.HasFieldError(ctx, fc) {
- ec.Errorf(ctx, "must not be null")
- }
- return graphql.Null
- }
- res := resTmp.(string)
- fc.Result = res
- return ec.marshalN__TypeKind2string(ctx, field.Selections, res)
-}
-
-func (ec *executionContext) fieldContext___Type_kind(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
- fc = &graphql.FieldContext{
- Object: "__Type",
- Field: field,
- IsMethod: true,
- IsResolver: false,
- Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {
- return nil, errors.New("field of type __TypeKind does not have child fields")
- },
- }
- return fc, nil
-}
-
-func (ec *executionContext) ___Type_name(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) (ret graphql.Marshaler) {
- fc, err := ec.fieldContext___Type_name(ctx, field)
- if err != nil {
- return graphql.Null
- }
- ctx = graphql.WithFieldContext(ctx, fc)
- defer func() {
- if r := recover(); r != nil {
- ec.Error(ctx, ec.Recover(ctx, r))
- ret = graphql.Null
- }
- }()
- resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) {
- ctx = rctx // use context from middleware stack in children
- return obj.Name(), nil
- })
- if err != nil {
- ec.Error(ctx, err)
- return graphql.Null
- }
- if resTmp == nil {
- return graphql.Null
- }
- res := resTmp.(*string)
- fc.Result = res
- return ec.marshalOString2ᚖstring(ctx, field.Selections, res)
-}
-
-func (ec *executionContext) fieldContext___Type_name(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
- fc = &graphql.FieldContext{
- Object: "__Type",
- Field: field,
- IsMethod: true,
- IsResolver: false,
- Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {
- return nil, errors.New("field of type String does not have child fields")
- },
- }
- return fc, nil
-}
-
-func (ec *executionContext) ___Type_description(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) (ret graphql.Marshaler) {
- fc, err := ec.fieldContext___Type_description(ctx, field)
- if err != nil {
- return graphql.Null
- }
- ctx = graphql.WithFieldContext(ctx, fc)
- defer func() {
- if r := recover(); r != nil {
- ec.Error(ctx, ec.Recover(ctx, r))
- ret = graphql.Null
- }
- }()
- resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) {
- ctx = rctx // use context from middleware stack in children
- return obj.Description(), nil
- })
- if err != nil {
- ec.Error(ctx, err)
- return graphql.Null
- }
- if resTmp == nil {
- return graphql.Null
- }
- res := resTmp.(*string)
- fc.Result = res
- return ec.marshalOString2ᚖstring(ctx, field.Selections, res)
-}
-
-func (ec *executionContext) fieldContext___Type_description(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
- fc = &graphql.FieldContext{
- Object: "__Type",
- Field: field,
- IsMethod: true,
- IsResolver: false,
- Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {
- return nil, errors.New("field of type String does not have child fields")
- },
- }
- return fc, nil
-}
-
-func (ec *executionContext) ___Type_specifiedByURL(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) (ret graphql.Marshaler) {
- fc, err := ec.fieldContext___Type_specifiedByURL(ctx, field)
- if err != nil {
- return graphql.Null
- }
- ctx = graphql.WithFieldContext(ctx, fc)
- defer func() {
- if r := recover(); r != nil {
- ec.Error(ctx, ec.Recover(ctx, r))
- ret = graphql.Null
- }
- }()
- resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) {
- ctx = rctx // use context from middleware stack in children
- return obj.SpecifiedByURL(), nil
- })
- if err != nil {
- ec.Error(ctx, err)
- return graphql.Null
- }
- if resTmp == nil {
- return graphql.Null
- }
- res := resTmp.(*string)
- fc.Result = res
- return ec.marshalOString2ᚖstring(ctx, field.Selections, res)
-}
-
-func (ec *executionContext) fieldContext___Type_specifiedByURL(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
- fc = &graphql.FieldContext{
- Object: "__Type",
- Field: field,
- IsMethod: true,
- IsResolver: false,
- Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {
- return nil, errors.New("field of type String does not have child fields")
- },
- }
- return fc, nil
-}
-
-func (ec *executionContext) ___Type_fields(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) (ret graphql.Marshaler) {
- fc, err := ec.fieldContext___Type_fields(ctx, field)
- if err != nil {
- return graphql.Null
- }
- ctx = graphql.WithFieldContext(ctx, fc)
- defer func() {
- if r := recover(); r != nil {
- ec.Error(ctx, ec.Recover(ctx, r))
- ret = graphql.Null
- }
- }()
- resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) {
- ctx = rctx // use context from middleware stack in children
- return obj.Fields(fc.Args["includeDeprecated"].(bool)), nil
- })
- if err != nil {
- ec.Error(ctx, err)
- return graphql.Null
- }
- if resTmp == nil {
- return graphql.Null
- }
- res := resTmp.([]introspection.Field)
- fc.Result = res
- return ec.marshalO__Field2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐFieldᚄ(ctx, field.Selections, res)
-}
-
-func (ec *executionContext) fieldContext___Type_fields(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
- fc = &graphql.FieldContext{
- Object: "__Type",
- Field: field,
- IsMethod: true,
- IsResolver: false,
- Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {
- switch field.Name {
- case "name":
- return ec.fieldContext___Field_name(ctx, field)
- case "description":
- return ec.fieldContext___Field_description(ctx, field)
- case "args":
- return ec.fieldContext___Field_args(ctx, field)
- case "type":
- return ec.fieldContext___Field_type(ctx, field)
- case "isDeprecated":
- return ec.fieldContext___Field_isDeprecated(ctx, field)
- case "deprecationReason":
- return ec.fieldContext___Field_deprecationReason(ctx, field)
- }
- return nil, fmt.Errorf("no field named %q was found under type __Field", field.Name)
- },
- }
- defer func() {
- if r := recover(); r != nil {
- err = ec.Recover(ctx, r)
- ec.Error(ctx, err)
- }
- }()
- ctx = graphql.WithFieldContext(ctx, fc)
- if fc.Args, err = ec.field___Type_fields_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {
- ec.Error(ctx, err)
- return fc, err
- }
- return fc, nil
-}
-
-func (ec *executionContext) ___Type_interfaces(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) (ret graphql.Marshaler) {
- fc, err := ec.fieldContext___Type_interfaces(ctx, field)
- if err != nil {
- return graphql.Null
- }
- ctx = graphql.WithFieldContext(ctx, fc)
- defer func() {
- if r := recover(); r != nil {
- ec.Error(ctx, ec.Recover(ctx, r))
- ret = graphql.Null
- }
- }()
- resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) {
- ctx = rctx // use context from middleware stack in children
- return obj.Interfaces(), nil
- })
- if err != nil {
- ec.Error(ctx, err)
- return graphql.Null
- }
- if resTmp == nil {
- return graphql.Null
- }
- res := resTmp.([]introspection.Type)
- fc.Result = res
- return ec.marshalO__Type2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐTypeᚄ(ctx, field.Selections, res)
-}
-
-func (ec *executionContext) fieldContext___Type_interfaces(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
- fc = &graphql.FieldContext{
- Object: "__Type",
- Field: field,
- IsMethod: true,
- IsResolver: false,
- Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {
- switch field.Name {
- case "kind":
- return ec.fieldContext___Type_kind(ctx, field)
- case "name":
- return ec.fieldContext___Type_name(ctx, field)
- case "description":
- return ec.fieldContext___Type_description(ctx, field)
- case "specifiedByURL":
- return ec.fieldContext___Type_specifiedByURL(ctx, field)
- case "fields":
- return ec.fieldContext___Type_fields(ctx, field)
- case "interfaces":
- return ec.fieldContext___Type_interfaces(ctx, field)
- case "possibleTypes":
- return ec.fieldContext___Type_possibleTypes(ctx, field)
- case "enumValues":
- return ec.fieldContext___Type_enumValues(ctx, field)
- case "inputFields":
- return ec.fieldContext___Type_inputFields(ctx, field)
- case "ofType":
- return ec.fieldContext___Type_ofType(ctx, field)
- case "isOneOf":
- return ec.fieldContext___Type_isOneOf(ctx, field)
- }
- return nil, fmt.Errorf("no field named %q was found under type __Type", field.Name)
- },
- }
- return fc, nil
-}
-
-func (ec *executionContext) ___Type_possibleTypes(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) (ret graphql.Marshaler) {
- fc, err := ec.fieldContext___Type_possibleTypes(ctx, field)
- if err != nil {
- return graphql.Null
- }
- ctx = graphql.WithFieldContext(ctx, fc)
- defer func() {
- if r := recover(); r != nil {
- ec.Error(ctx, ec.Recover(ctx, r))
- ret = graphql.Null
- }
- }()
- resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) {
- ctx = rctx // use context from middleware stack in children
- return obj.PossibleTypes(), nil
- })
- if err != nil {
- ec.Error(ctx, err)
- return graphql.Null
- }
- if resTmp == nil {
- return graphql.Null
- }
- res := resTmp.([]introspection.Type)
- fc.Result = res
- return ec.marshalO__Type2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐTypeᚄ(ctx, field.Selections, res)
-}
-
-func (ec *executionContext) fieldContext___Type_possibleTypes(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
- fc = &graphql.FieldContext{
- Object: "__Type",
- Field: field,
- IsMethod: true,
- IsResolver: false,
- Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {
- switch field.Name {
- case "kind":
- return ec.fieldContext___Type_kind(ctx, field)
- case "name":
- return ec.fieldContext___Type_name(ctx, field)
- case "description":
- return ec.fieldContext___Type_description(ctx, field)
- case "specifiedByURL":
- return ec.fieldContext___Type_specifiedByURL(ctx, field)
- case "fields":
- return ec.fieldContext___Type_fields(ctx, field)
- case "interfaces":
- return ec.fieldContext___Type_interfaces(ctx, field)
- case "possibleTypes":
- return ec.fieldContext___Type_possibleTypes(ctx, field)
- case "enumValues":
- return ec.fieldContext___Type_enumValues(ctx, field)
- case "inputFields":
- return ec.fieldContext___Type_inputFields(ctx, field)
- case "ofType":
- return ec.fieldContext___Type_ofType(ctx, field)
- case "isOneOf":
- return ec.fieldContext___Type_isOneOf(ctx, field)
- }
- return nil, fmt.Errorf("no field named %q was found under type __Type", field.Name)
- },
- }
- return fc, nil
-}
-
-func (ec *executionContext) ___Type_enumValues(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) (ret graphql.Marshaler) {
- fc, err := ec.fieldContext___Type_enumValues(ctx, field)
- if err != nil {
- return graphql.Null
- }
- ctx = graphql.WithFieldContext(ctx, fc)
- defer func() {
- if r := recover(); r != nil {
- ec.Error(ctx, ec.Recover(ctx, r))
- ret = graphql.Null
- }
- }()
- resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) {
- ctx = rctx // use context from middleware stack in children
- return obj.EnumValues(fc.Args["includeDeprecated"].(bool)), nil
- })
- if err != nil {
- ec.Error(ctx, err)
- return graphql.Null
- }
- if resTmp == nil {
- return graphql.Null
- }
- res := resTmp.([]introspection.EnumValue)
- fc.Result = res
- return ec.marshalO__EnumValue2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐEnumValueᚄ(ctx, field.Selections, res)
-}
-
-func (ec *executionContext) fieldContext___Type_enumValues(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
- fc = &graphql.FieldContext{
- Object: "__Type",
- Field: field,
- IsMethod: true,
- IsResolver: false,
- Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {
- switch field.Name {
- case "name":
- return ec.fieldContext___EnumValue_name(ctx, field)
- case "description":
- return ec.fieldContext___EnumValue_description(ctx, field)
- case "isDeprecated":
- return ec.fieldContext___EnumValue_isDeprecated(ctx, field)
- case "deprecationReason":
- return ec.fieldContext___EnumValue_deprecationReason(ctx, field)
- }
- return nil, fmt.Errorf("no field named %q was found under type __EnumValue", field.Name)
- },
- }
- defer func() {
- if r := recover(); r != nil {
- err = ec.Recover(ctx, r)
- ec.Error(ctx, err)
- }
- }()
- ctx = graphql.WithFieldContext(ctx, fc)
- if fc.Args, err = ec.field___Type_enumValues_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {
- ec.Error(ctx, err)
- return fc, err
- }
- return fc, nil
-}
-
-func (ec *executionContext) ___Type_inputFields(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) (ret graphql.Marshaler) {
- fc, err := ec.fieldContext___Type_inputFields(ctx, field)
- if err != nil {
- return graphql.Null
- }
- ctx = graphql.WithFieldContext(ctx, fc)
- defer func() {
- if r := recover(); r != nil {
- ec.Error(ctx, ec.Recover(ctx, r))
- ret = graphql.Null
- }
- }()
- resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) {
- ctx = rctx // use context from middleware stack in children
- return obj.InputFields(), nil
- })
- if err != nil {
- ec.Error(ctx, err)
- return graphql.Null
- }
- if resTmp == nil {
- return graphql.Null
- }
- res := resTmp.([]introspection.InputValue)
- fc.Result = res
- return ec.marshalO__InputValue2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐInputValueᚄ(ctx, field.Selections, res)
-}
-
-func (ec *executionContext) fieldContext___Type_inputFields(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
- fc = &graphql.FieldContext{
- Object: "__Type",
- Field: field,
- IsMethod: true,
- IsResolver: false,
- Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {
- switch field.Name {
- case "name":
- return ec.fieldContext___InputValue_name(ctx, field)
- case "description":
- return ec.fieldContext___InputValue_description(ctx, field)
- case "type":
- return ec.fieldContext___InputValue_type(ctx, field)
- case "defaultValue":
- return ec.fieldContext___InputValue_defaultValue(ctx, field)
- case "isDeprecated":
- return ec.fieldContext___InputValue_isDeprecated(ctx, field)
- case "deprecationReason":
- return ec.fieldContext___InputValue_deprecationReason(ctx, field)
- }
- return nil, fmt.Errorf("no field named %q was found under type __InputValue", field.Name)
- },
- }
- return fc, nil
-}
-
-func (ec *executionContext) ___Type_ofType(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) (ret graphql.Marshaler) {
- fc, err := ec.fieldContext___Type_ofType(ctx, field)
- if err != nil {
- return graphql.Null
- }
- ctx = graphql.WithFieldContext(ctx, fc)
- defer func() {
- if r := recover(); r != nil {
- ec.Error(ctx, ec.Recover(ctx, r))
- ret = graphql.Null
- }
- }()
- resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) {
- ctx = rctx // use context from middleware stack in children
- return obj.OfType(), nil
- })
- if err != nil {
- ec.Error(ctx, err)
- return graphql.Null
- }
- if resTmp == nil {
- return graphql.Null
- }
- res := resTmp.(*introspection.Type)
- fc.Result = res
- return ec.marshalO__Type2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType(ctx, field.Selections, res)
-}
-
-func (ec *executionContext) fieldContext___Type_ofType(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
- fc = &graphql.FieldContext{
- Object: "__Type",
- Field: field,
- IsMethod: true,
- IsResolver: false,
- Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {
- switch field.Name {
- case "kind":
- return ec.fieldContext___Type_kind(ctx, field)
- case "name":
- return ec.fieldContext___Type_name(ctx, field)
- case "description":
- return ec.fieldContext___Type_description(ctx, field)
- case "specifiedByURL":
- return ec.fieldContext___Type_specifiedByURL(ctx, field)
- case "fields":
- return ec.fieldContext___Type_fields(ctx, field)
- case "interfaces":
- return ec.fieldContext___Type_interfaces(ctx, field)
- case "possibleTypes":
- return ec.fieldContext___Type_possibleTypes(ctx, field)
- case "enumValues":
- return ec.fieldContext___Type_enumValues(ctx, field)
- case "inputFields":
- return ec.fieldContext___Type_inputFields(ctx, field)
- case "ofType":
- return ec.fieldContext___Type_ofType(ctx, field)
- case "isOneOf":
- return ec.fieldContext___Type_isOneOf(ctx, field)
- }
- return nil, fmt.Errorf("no field named %q was found under type __Type", field.Name)
- },
- }
- return fc, nil
-}
-
-func (ec *executionContext) ___Type_isOneOf(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) (ret graphql.Marshaler) {
- fc, err := ec.fieldContext___Type_isOneOf(ctx, field)
- if err != nil {
- return graphql.Null
- }
- ctx = graphql.WithFieldContext(ctx, fc)
- defer func() {
- if r := recover(); r != nil {
- ec.Error(ctx, ec.Recover(ctx, r))
- ret = graphql.Null
- }
- }()
- resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) {
- ctx = rctx // use context from middleware stack in children
- return obj.IsOneOf(), nil
- })
- if err != nil {
- ec.Error(ctx, err)
- return graphql.Null
- }
- if resTmp == nil {
- return graphql.Null
- }
- res := resTmp.(bool)
- fc.Result = res
- return ec.marshalOBoolean2bool(ctx, field.Selections, res)
-}
-
-func (ec *executionContext) fieldContext___Type_isOneOf(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
- fc = &graphql.FieldContext{
- Object: "__Type",
- Field: field,
- IsMethod: true,
- IsResolver: false,
- Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {
- return nil, errors.New("field of type Boolean does not have child fields")
- },
- }
- return fc, nil
-}
-
-// endregion **************************** field.gotpl *****************************
-
-// region **************************** input.gotpl *****************************
-
-// endregion **************************** input.gotpl *****************************
-
-// region ************************** interface.gotpl ***************************
-
-// endregion ************************** interface.gotpl ***************************
-
-// region **************************** object.gotpl ****************************
-
-var articleImplementors = []string{"Article"}
-
-func (ec *executionContext) _Article(ctx context.Context, sel ast.SelectionSet, obj *model.Article) graphql.Marshaler {
- fields := graphql.CollectFields(ec.OperationContext, sel, articleImplementors)
-
- out := graphql.NewFieldSet(fields)
- deferred := make(map[string]*graphql.FieldSet)
- for i, field := range fields {
- switch field.Name {
- case "__typename":
- out.Values[i] = graphql.MarshalString("Article")
- case "id":
- out.Values[i] = ec._Article_id(ctx, field, obj)
- if out.Values[i] == graphql.Null {
- out.Invalids++
- }
- case "feedId":
- out.Values[i] = ec._Article_feedId(ctx, field, obj)
- if out.Values[i] == graphql.Null {
- out.Invalids++
- }
- case "guid":
- out.Values[i] = ec._Article_guid(ctx, field, obj)
- if out.Values[i] == graphql.Null {
- out.Invalids++
- }
- case "title":
- out.Values[i] = ec._Article_title(ctx, field, obj)
- if out.Values[i] == graphql.Null {
- out.Invalids++
- }
- case "url":
- out.Values[i] = ec._Article_url(ctx, field, obj)
- if out.Values[i] == graphql.Null {
- out.Invalids++
- }
- case "isRead":
- out.Values[i] = ec._Article_isRead(ctx, field, obj)
- if out.Values[i] == graphql.Null {
- out.Invalids++
- }
- case "feed":
- out.Values[i] = ec._Article_feed(ctx, field, obj)
- if out.Values[i] == graphql.Null {
- out.Invalids++
- }
- default:
- panic("unknown field " + strconv.Quote(field.Name))
- }
- }
- out.Dispatch(ctx)
- if out.Invalids > 0 {
- return graphql.Null
- }
-
- atomic.AddInt32(&ec.deferred, int32(len(deferred)))
-
- for label, dfs := range deferred {
- ec.processDeferredGroup(graphql.DeferredGroup{
- Label: label,
- Path: graphql.GetPath(ctx),
- FieldSet: dfs,
- Context: ctx,
- })
- }
-
- return out
-}
-
-var articleConnectionImplementors = []string{"ArticleConnection"}
-
-func (ec *executionContext) _ArticleConnection(ctx context.Context, sel ast.SelectionSet, obj *model.ArticleConnection) graphql.Marshaler {
- fields := graphql.CollectFields(ec.OperationContext, sel, articleConnectionImplementors)
-
- out := graphql.NewFieldSet(fields)
- deferred := make(map[string]*graphql.FieldSet)
- for i, field := range fields {
- switch field.Name {
- case "__typename":
- out.Values[i] = graphql.MarshalString("ArticleConnection")
- case "articles":
- out.Values[i] = ec._ArticleConnection_articles(ctx, field, obj)
- if out.Values[i] == graphql.Null {
- out.Invalids++
- }
- case "pageInfo":
- out.Values[i] = ec._ArticleConnection_pageInfo(ctx, field, obj)
- if out.Values[i] == graphql.Null {
- out.Invalids++
- }
- default:
- panic("unknown field " + strconv.Quote(field.Name))
- }
- }
- out.Dispatch(ctx)
- if out.Invalids > 0 {
- return graphql.Null
- }
-
- atomic.AddInt32(&ec.deferred, int32(len(deferred)))
-
- for label, dfs := range deferred {
- ec.processDeferredGroup(graphql.DeferredGroup{
- Label: label,
- Path: graphql.GetPath(ctx),
- FieldSet: dfs,
- Context: ctx,
- })
- }
-
- return out
-}
-
-var authPayloadImplementors = []string{"AuthPayload"}
-
-func (ec *executionContext) _AuthPayload(ctx context.Context, sel ast.SelectionSet, obj *model.AuthPayload) graphql.Marshaler {
- fields := graphql.CollectFields(ec.OperationContext, sel, authPayloadImplementors)
-
- out := graphql.NewFieldSet(fields)
- deferred := make(map[string]*graphql.FieldSet)
- for i, field := range fields {
- switch field.Name {
- case "__typename":
- out.Values[i] = graphql.MarshalString("AuthPayload")
- case "user":
- out.Values[i] = ec._AuthPayload_user(ctx, field, obj)
- if out.Values[i] == graphql.Null {
- out.Invalids++
- }
- default:
- panic("unknown field " + strconv.Quote(field.Name))
- }
- }
- out.Dispatch(ctx)
- if out.Invalids > 0 {
- return graphql.Null
- }
-
- atomic.AddInt32(&ec.deferred, int32(len(deferred)))
-
- for label, dfs := range deferred {
- ec.processDeferredGroup(graphql.DeferredGroup{
- Label: label,
- Path: graphql.GetPath(ctx),
- FieldSet: dfs,
- Context: ctx,
- })
- }
-
- return out
-}
-
-var feedImplementors = []string{"Feed"}
-
-func (ec *executionContext) _Feed(ctx context.Context, sel ast.SelectionSet, obj *model.Feed) graphql.Marshaler {
- fields := graphql.CollectFields(ec.OperationContext, sel, feedImplementors)
-
- out := graphql.NewFieldSet(fields)
- deferred := make(map[string]*graphql.FieldSet)
- for i, field := range fields {
- switch field.Name {
- case "__typename":
- out.Values[i] = graphql.MarshalString("Feed")
- case "id":
- out.Values[i] = ec._Feed_id(ctx, field, obj)
- if out.Values[i] == graphql.Null {
- out.Invalids++
- }
- case "url":
- out.Values[i] = ec._Feed_url(ctx, field, obj)
- if out.Values[i] == graphql.Null {
- out.Invalids++
- }
- case "title":
- out.Values[i] = ec._Feed_title(ctx, field, obj)
- if out.Values[i] == graphql.Null {
- out.Invalids++
- }
- case "fetchedAt":
- out.Values[i] = ec._Feed_fetchedAt(ctx, field, obj)
- if out.Values[i] == graphql.Null {
- out.Invalids++
- }
- case "isSubscribed":
- out.Values[i] = ec._Feed_isSubscribed(ctx, field, obj)
- if out.Values[i] == graphql.Null {
- out.Invalids++
- }
- case "unreadCount":
- out.Values[i] = ec._Feed_unreadCount(ctx, field, obj)
- if out.Values[i] == graphql.Null {
- out.Invalids++
- }
- case "articles":
- out.Values[i] = ec._Feed_articles(ctx, field, obj)
- if out.Values[i] == graphql.Null {
- out.Invalids++
- }
- default:
- panic("unknown field " + strconv.Quote(field.Name))
- }
- }
- out.Dispatch(ctx)
- if out.Invalids > 0 {
- return graphql.Null
- }
-
- atomic.AddInt32(&ec.deferred, int32(len(deferred)))
-
- for label, dfs := range deferred {
- ec.processDeferredGroup(graphql.DeferredGroup{
- Label: label,
- Path: graphql.GetPath(ctx),
- FieldSet: dfs,
- Context: ctx,
- })
- }
-
- return out
-}
-
-var mutationImplementors = []string{"Mutation"}
-
-func (ec *executionContext) _Mutation(ctx context.Context, sel ast.SelectionSet) graphql.Marshaler {
- fields := graphql.CollectFields(ec.OperationContext, sel, mutationImplementors)
- ctx = graphql.WithFieldContext(ctx, &graphql.FieldContext{
- Object: "Mutation",
- })
-
- out := graphql.NewFieldSet(fields)
- deferred := make(map[string]*graphql.FieldSet)
- for i, field := range fields {
- innerCtx := graphql.WithRootFieldContext(ctx, &graphql.RootFieldContext{
- Object: field.Name,
- Field: field,
- })
-
- switch field.Name {
- case "__typename":
- out.Values[i] = graphql.MarshalString("Mutation")
- case "addFeed":
- out.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) {
- return ec._Mutation_addFeed(ctx, field)
- })
- if out.Values[i] == graphql.Null {
- out.Invalids++
- }
- case "unsubscribeFeed":
- out.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) {
- return ec._Mutation_unsubscribeFeed(ctx, field)
- })
- if out.Values[i] == graphql.Null {
- out.Invalids++
- }
- case "markArticleRead":
- out.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) {
- return ec._Mutation_markArticleRead(ctx, field)
- })
- if out.Values[i] == graphql.Null {
- out.Invalids++
- }
- case "markArticleUnread":
- out.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) {
- return ec._Mutation_markArticleUnread(ctx, field)
- })
- if out.Values[i] == graphql.Null {
- out.Invalids++
- }
- case "markFeedRead":
- out.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) {
- return ec._Mutation_markFeedRead(ctx, field)
- })
- if out.Values[i] == graphql.Null {
- out.Invalids++
- }
- case "markFeedUnread":
- out.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) {
- return ec._Mutation_markFeedUnread(ctx, field)
- })
- if out.Values[i] == graphql.Null {
- out.Invalids++
- }
- case "login":
- out.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) {
- return ec._Mutation_login(ctx, field)
- })
- if out.Values[i] == graphql.Null {
- out.Invalids++
- }
- case "logout":
- out.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) {
- return ec._Mutation_logout(ctx, field)
- })
- if out.Values[i] == graphql.Null {
- out.Invalids++
- }
- default:
- panic("unknown field " + strconv.Quote(field.Name))
- }
- }
- out.Dispatch(ctx)
- if out.Invalids > 0 {
- return graphql.Null
- }
-
- atomic.AddInt32(&ec.deferred, int32(len(deferred)))
-
- for label, dfs := range deferred {
- ec.processDeferredGroup(graphql.DeferredGroup{
- Label: label,
- Path: graphql.GetPath(ctx),
- FieldSet: dfs,
- Context: ctx,
- })
- }
-
- return out
-}
-
-var pageInfoImplementors = []string{"PageInfo"}
-
-func (ec *executionContext) _PageInfo(ctx context.Context, sel ast.SelectionSet, obj *model.PageInfo) graphql.Marshaler {
- fields := graphql.CollectFields(ec.OperationContext, sel, pageInfoImplementors)
-
- out := graphql.NewFieldSet(fields)
- deferred := make(map[string]*graphql.FieldSet)
- for i, field := range fields {
- switch field.Name {
- case "__typename":
- out.Values[i] = graphql.MarshalString("PageInfo")
- case "hasNextPage":
- out.Values[i] = ec._PageInfo_hasNextPage(ctx, field, obj)
- if out.Values[i] == graphql.Null {
- out.Invalids++
- }
- case "endCursor":
- out.Values[i] = ec._PageInfo_endCursor(ctx, field, obj)
- default:
- panic("unknown field " + strconv.Quote(field.Name))
- }
- }
- out.Dispatch(ctx)
- if out.Invalids > 0 {
- return graphql.Null
- }
-
- atomic.AddInt32(&ec.deferred, int32(len(deferred)))
-
- for label, dfs := range deferred {
- ec.processDeferredGroup(graphql.DeferredGroup{
- Label: label,
- Path: graphql.GetPath(ctx),
- FieldSet: dfs,
- Context: ctx,
- })
- }
-
- return out
-}
-
-var queryImplementors = []string{"Query"}
-
-func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) graphql.Marshaler {
- fields := graphql.CollectFields(ec.OperationContext, sel, queryImplementors)
- ctx = graphql.WithFieldContext(ctx, &graphql.FieldContext{
- Object: "Query",
- })
-
- out := graphql.NewFieldSet(fields)
- deferred := make(map[string]*graphql.FieldSet)
- for i, field := range fields {
- innerCtx := graphql.WithRootFieldContext(ctx, &graphql.RootFieldContext{
- Object: field.Name,
- Field: field,
- })
-
- switch field.Name {
- case "__typename":
- out.Values[i] = graphql.MarshalString("Query")
- case "feeds":
- field := field
-
- innerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {
- defer func() {
- if r := recover(); r != nil {
- ec.Error(ctx, ec.Recover(ctx, r))
- }
- }()
- res = ec._Query_feeds(ctx, field)
- if res == graphql.Null {
- atomic.AddUint32(&fs.Invalids, 1)
- }
- return res
- }
-
- rrm := func(ctx context.Context) graphql.Marshaler {
- return ec.OperationContext.RootResolverMiddleware(ctx,
- func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })
- }
-
- out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) })
- case "unreadArticles":
- field := field
-
- innerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {
- defer func() {
- if r := recover(); r != nil {
- ec.Error(ctx, ec.Recover(ctx, r))
- }
- }()
- res = ec._Query_unreadArticles(ctx, field)
- if res == graphql.Null {
- atomic.AddUint32(&fs.Invalids, 1)
- }
- return res
- }
-
- rrm := func(ctx context.Context) graphql.Marshaler {
- return ec.OperationContext.RootResolverMiddleware(ctx,
- func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })
- }
-
- out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) })
- case "readArticles":
- field := field
-
- innerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {
- defer func() {
- if r := recover(); r != nil {
- ec.Error(ctx, ec.Recover(ctx, r))
- }
- }()
- res = ec._Query_readArticles(ctx, field)
- if res == graphql.Null {
- atomic.AddUint32(&fs.Invalids, 1)
- }
- return res
- }
-
- rrm := func(ctx context.Context) graphql.Marshaler {
- return ec.OperationContext.RootResolverMiddleware(ctx,
- func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })
- }
-
- out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) })
- case "feed":
- field := field
-
- innerFunc := func(ctx context.Context, _ *graphql.FieldSet) (res graphql.Marshaler) {
- defer func() {
- if r := recover(); r != nil {
- ec.Error(ctx, ec.Recover(ctx, r))
- }
- }()
- res = ec._Query_feed(ctx, field)
- return res
- }
-
- rrm := func(ctx context.Context) graphql.Marshaler {
- return ec.OperationContext.RootResolverMiddleware(ctx,
- func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })
- }
-
- out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) })
- case "article":
- field := field
-
- innerFunc := func(ctx context.Context, _ *graphql.FieldSet) (res graphql.Marshaler) {
- defer func() {
- if r := recover(); r != nil {
- ec.Error(ctx, ec.Recover(ctx, r))
- }
- }()
- res = ec._Query_article(ctx, field)
- return res
- }
-
- rrm := func(ctx context.Context) graphql.Marshaler {
- return ec.OperationContext.RootResolverMiddleware(ctx,
- func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })
- }
-
- out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) })
- case "currentUser":
- field := field
-
- innerFunc := func(ctx context.Context, _ *graphql.FieldSet) (res graphql.Marshaler) {
- defer func() {
- if r := recover(); r != nil {
- ec.Error(ctx, ec.Recover(ctx, r))
- }
- }()
- res = ec._Query_currentUser(ctx, field)
- return res
- }
-
- rrm := func(ctx context.Context) graphql.Marshaler {
- return ec.OperationContext.RootResolverMiddleware(ctx,
- func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })
- }
-
- out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) })
- case "__type":
- out.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) {
- return ec._Query___type(ctx, field)
- })
- case "__schema":
- out.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) {
- return ec._Query___schema(ctx, field)
- })
- default:
- panic("unknown field " + strconv.Quote(field.Name))
- }
- }
- out.Dispatch(ctx)
- if out.Invalids > 0 {
- return graphql.Null
- }
-
- atomic.AddInt32(&ec.deferred, int32(len(deferred)))
-
- for label, dfs := range deferred {
- ec.processDeferredGroup(graphql.DeferredGroup{
- Label: label,
- Path: graphql.GetPath(ctx),
- FieldSet: dfs,
- Context: ctx,
- })
- }
-
- return out
-}
-
-var userImplementors = []string{"User"}
-
-func (ec *executionContext) _User(ctx context.Context, sel ast.SelectionSet, obj *model.User) graphql.Marshaler {
- fields := graphql.CollectFields(ec.OperationContext, sel, userImplementors)
-
- out := graphql.NewFieldSet(fields)
- deferred := make(map[string]*graphql.FieldSet)
- for i, field := range fields {
- switch field.Name {
- case "__typename":
- out.Values[i] = graphql.MarshalString("User")
- case "id":
- out.Values[i] = ec._User_id(ctx, field, obj)
- if out.Values[i] == graphql.Null {
- out.Invalids++
- }
- case "username":
- out.Values[i] = ec._User_username(ctx, field, obj)
- if out.Values[i] == graphql.Null {
- out.Invalids++
- }
- default:
- panic("unknown field " + strconv.Quote(field.Name))
- }
- }
- out.Dispatch(ctx)
- if out.Invalids > 0 {
- return graphql.Null
- }
-
- atomic.AddInt32(&ec.deferred, int32(len(deferred)))
-
- for label, dfs := range deferred {
- ec.processDeferredGroup(graphql.DeferredGroup{
- Label: label,
- Path: graphql.GetPath(ctx),
- FieldSet: dfs,
- Context: ctx,
- })
- }
-
- return out
-}
-
-var __DirectiveImplementors = []string{"__Directive"}
-
-func (ec *executionContext) ___Directive(ctx context.Context, sel ast.SelectionSet, obj *introspection.Directive) graphql.Marshaler {
- fields := graphql.CollectFields(ec.OperationContext, sel, __DirectiveImplementors)
-
- out := graphql.NewFieldSet(fields)
- deferred := make(map[string]*graphql.FieldSet)
- for i, field := range fields {
- switch field.Name {
- case "__typename":
- out.Values[i] = graphql.MarshalString("__Directive")
- case "name":
- out.Values[i] = ec.___Directive_name(ctx, field, obj)
- if out.Values[i] == graphql.Null {
- out.Invalids++
- }
- case "description":
- out.Values[i] = ec.___Directive_description(ctx, field, obj)
- case "isRepeatable":
- out.Values[i] = ec.___Directive_isRepeatable(ctx, field, obj)
- if out.Values[i] == graphql.Null {
- out.Invalids++
- }
- case "locations":
- out.Values[i] = ec.___Directive_locations(ctx, field, obj)
- if out.Values[i] == graphql.Null {
- out.Invalids++
- }
- case "args":
- out.Values[i] = ec.___Directive_args(ctx, field, obj)
- if out.Values[i] == graphql.Null {
- out.Invalids++
- }
- default:
- panic("unknown field " + strconv.Quote(field.Name))
- }
- }
- out.Dispatch(ctx)
- if out.Invalids > 0 {
- return graphql.Null
- }
-
- atomic.AddInt32(&ec.deferred, int32(len(deferred)))
-
- for label, dfs := range deferred {
- ec.processDeferredGroup(graphql.DeferredGroup{
- Label: label,
- Path: graphql.GetPath(ctx),
- FieldSet: dfs,
- Context: ctx,
- })
- }
-
- return out
-}
-
-var __EnumValueImplementors = []string{"__EnumValue"}
-
-func (ec *executionContext) ___EnumValue(ctx context.Context, sel ast.SelectionSet, obj *introspection.EnumValue) graphql.Marshaler {
- fields := graphql.CollectFields(ec.OperationContext, sel, __EnumValueImplementors)
-
- out := graphql.NewFieldSet(fields)
- deferred := make(map[string]*graphql.FieldSet)
- for i, field := range fields {
- switch field.Name {
- case "__typename":
- out.Values[i] = graphql.MarshalString("__EnumValue")
- case "name":
- out.Values[i] = ec.___EnumValue_name(ctx, field, obj)
- if out.Values[i] == graphql.Null {
- out.Invalids++
- }
- case "description":
- out.Values[i] = ec.___EnumValue_description(ctx, field, obj)
- case "isDeprecated":
- out.Values[i] = ec.___EnumValue_isDeprecated(ctx, field, obj)
- if out.Values[i] == graphql.Null {
- out.Invalids++
- }
- case "deprecationReason":
- out.Values[i] = ec.___EnumValue_deprecationReason(ctx, field, obj)
- default:
- panic("unknown field " + strconv.Quote(field.Name))
- }
- }
- out.Dispatch(ctx)
- if out.Invalids > 0 {
- return graphql.Null
- }
-
- atomic.AddInt32(&ec.deferred, int32(len(deferred)))
-
- for label, dfs := range deferred {
- ec.processDeferredGroup(graphql.DeferredGroup{
- Label: label,
- Path: graphql.GetPath(ctx),
- FieldSet: dfs,
- Context: ctx,
- })
- }
-
- return out
-}
-
-var __FieldImplementors = []string{"__Field"}
-
-func (ec *executionContext) ___Field(ctx context.Context, sel ast.SelectionSet, obj *introspection.Field) graphql.Marshaler {
- fields := graphql.CollectFields(ec.OperationContext, sel, __FieldImplementors)
-
- out := graphql.NewFieldSet(fields)
- deferred := make(map[string]*graphql.FieldSet)
- for i, field := range fields {
- switch field.Name {
- case "__typename":
- out.Values[i] = graphql.MarshalString("__Field")
- case "name":
- out.Values[i] = ec.___Field_name(ctx, field, obj)
- if out.Values[i] == graphql.Null {
- out.Invalids++
- }
- case "description":
- out.Values[i] = ec.___Field_description(ctx, field, obj)
- case "args":
- out.Values[i] = ec.___Field_args(ctx, field, obj)
- if out.Values[i] == graphql.Null {
- out.Invalids++
- }
- case "type":
- out.Values[i] = ec.___Field_type(ctx, field, obj)
- if out.Values[i] == graphql.Null {
- out.Invalids++
- }
- case "isDeprecated":
- out.Values[i] = ec.___Field_isDeprecated(ctx, field, obj)
- if out.Values[i] == graphql.Null {
- out.Invalids++
- }
- case "deprecationReason":
- out.Values[i] = ec.___Field_deprecationReason(ctx, field, obj)
- default:
- panic("unknown field " + strconv.Quote(field.Name))
- }
- }
- out.Dispatch(ctx)
- if out.Invalids > 0 {
- return graphql.Null
- }
-
- atomic.AddInt32(&ec.deferred, int32(len(deferred)))
-
- for label, dfs := range deferred {
- ec.processDeferredGroup(graphql.DeferredGroup{
- Label: label,
- Path: graphql.GetPath(ctx),
- FieldSet: dfs,
- Context: ctx,
- })
- }
-
- return out
-}
-
-var __InputValueImplementors = []string{"__InputValue"}
-
-func (ec *executionContext) ___InputValue(ctx context.Context, sel ast.SelectionSet, obj *introspection.InputValue) graphql.Marshaler {
- fields := graphql.CollectFields(ec.OperationContext, sel, __InputValueImplementors)
-
- out := graphql.NewFieldSet(fields)
- deferred := make(map[string]*graphql.FieldSet)
- for i, field := range fields {
- switch field.Name {
- case "__typename":
- out.Values[i] = graphql.MarshalString("__InputValue")
- case "name":
- out.Values[i] = ec.___InputValue_name(ctx, field, obj)
- if out.Values[i] == graphql.Null {
- out.Invalids++
- }
- case "description":
- out.Values[i] = ec.___InputValue_description(ctx, field, obj)
- case "type":
- out.Values[i] = ec.___InputValue_type(ctx, field, obj)
- if out.Values[i] == graphql.Null {
- out.Invalids++
- }
- case "defaultValue":
- out.Values[i] = ec.___InputValue_defaultValue(ctx, field, obj)
- case "isDeprecated":
- out.Values[i] = ec.___InputValue_isDeprecated(ctx, field, obj)
- if out.Values[i] == graphql.Null {
- out.Invalids++
- }
- case "deprecationReason":
- out.Values[i] = ec.___InputValue_deprecationReason(ctx, field, obj)
- default:
- panic("unknown field " + strconv.Quote(field.Name))
- }
- }
- out.Dispatch(ctx)
- if out.Invalids > 0 {
- return graphql.Null
- }
-
- atomic.AddInt32(&ec.deferred, int32(len(deferred)))
-
- for label, dfs := range deferred {
- ec.processDeferredGroup(graphql.DeferredGroup{
- Label: label,
- Path: graphql.GetPath(ctx),
- FieldSet: dfs,
- Context: ctx,
- })
- }
-
- return out
-}
-
-var __SchemaImplementors = []string{"__Schema"}
-
-func (ec *executionContext) ___Schema(ctx context.Context, sel ast.SelectionSet, obj *introspection.Schema) graphql.Marshaler {
- fields := graphql.CollectFields(ec.OperationContext, sel, __SchemaImplementors)
-
- out := graphql.NewFieldSet(fields)
- deferred := make(map[string]*graphql.FieldSet)
- for i, field := range fields {
- switch field.Name {
- case "__typename":
- out.Values[i] = graphql.MarshalString("__Schema")
- case "description":
- out.Values[i] = ec.___Schema_description(ctx, field, obj)
- case "types":
- out.Values[i] = ec.___Schema_types(ctx, field, obj)
- if out.Values[i] == graphql.Null {
- out.Invalids++
- }
- case "queryType":
- out.Values[i] = ec.___Schema_queryType(ctx, field, obj)
- if out.Values[i] == graphql.Null {
- out.Invalids++
- }
- case "mutationType":
- out.Values[i] = ec.___Schema_mutationType(ctx, field, obj)
- case "subscriptionType":
- out.Values[i] = ec.___Schema_subscriptionType(ctx, field, obj)
- case "directives":
- out.Values[i] = ec.___Schema_directives(ctx, field, obj)
- if out.Values[i] == graphql.Null {
- out.Invalids++
- }
- default:
- panic("unknown field " + strconv.Quote(field.Name))
- }
- }
- out.Dispatch(ctx)
- if out.Invalids > 0 {
- return graphql.Null
- }
-
- atomic.AddInt32(&ec.deferred, int32(len(deferred)))
-
- for label, dfs := range deferred {
- ec.processDeferredGroup(graphql.DeferredGroup{
- Label: label,
- Path: graphql.GetPath(ctx),
- FieldSet: dfs,
- Context: ctx,
- })
- }
-
- return out
-}
-
-var __TypeImplementors = []string{"__Type"}
-
-func (ec *executionContext) ___Type(ctx context.Context, sel ast.SelectionSet, obj *introspection.Type) graphql.Marshaler {
- fields := graphql.CollectFields(ec.OperationContext, sel, __TypeImplementors)
-
- out := graphql.NewFieldSet(fields)
- deferred := make(map[string]*graphql.FieldSet)
- for i, field := range fields {
- switch field.Name {
- case "__typename":
- out.Values[i] = graphql.MarshalString("__Type")
- case "kind":
- out.Values[i] = ec.___Type_kind(ctx, field, obj)
- if out.Values[i] == graphql.Null {
- out.Invalids++
- }
- case "name":
- out.Values[i] = ec.___Type_name(ctx, field, obj)
- case "description":
- out.Values[i] = ec.___Type_description(ctx, field, obj)
- case "specifiedByURL":
- out.Values[i] = ec.___Type_specifiedByURL(ctx, field, obj)
- case "fields":
- out.Values[i] = ec.___Type_fields(ctx, field, obj)
- case "interfaces":
- out.Values[i] = ec.___Type_interfaces(ctx, field, obj)
- case "possibleTypes":
- out.Values[i] = ec.___Type_possibleTypes(ctx, field, obj)
- case "enumValues":
- out.Values[i] = ec.___Type_enumValues(ctx, field, obj)
- case "inputFields":
- out.Values[i] = ec.___Type_inputFields(ctx, field, obj)
- case "ofType":
- out.Values[i] = ec.___Type_ofType(ctx, field, obj)
- case "isOneOf":
- out.Values[i] = ec.___Type_isOneOf(ctx, field, obj)
- default:
- panic("unknown field " + strconv.Quote(field.Name))
- }
- }
- out.Dispatch(ctx)
- if out.Invalids > 0 {
- return graphql.Null
- }
-
- atomic.AddInt32(&ec.deferred, int32(len(deferred)))
-
- for label, dfs := range deferred {
- ec.processDeferredGroup(graphql.DeferredGroup{
- Label: label,
- Path: graphql.GetPath(ctx),
- FieldSet: dfs,
- Context: ctx,
- })
- }
-
- return out
-}
-
-// endregion **************************** object.gotpl ****************************
-
-// region ***************************** type.gotpl *****************************
-
-func (ec *executionContext) marshalNArticle2undefᚗninjaᚋxᚋfeedakaᚋgraphqlᚋmodelᚐArticle(ctx context.Context, sel ast.SelectionSet, v model.Article) graphql.Marshaler {
- return ec._Article(ctx, sel, &v)
-}
-
-func (ec *executionContext) marshalNArticle2ᚕᚖundefᚗninjaᚋxᚋfeedakaᚋgraphqlᚋmodelᚐArticleᚄ(ctx context.Context, sel ast.SelectionSet, v []*model.Article) graphql.Marshaler {
- ret := make(graphql.Array, len(v))
- var wg sync.WaitGroup
- isLen1 := len(v) == 1
- if !isLen1 {
- wg.Add(len(v))
- }
- for i := range v {
- i := i
- fc := &graphql.FieldContext{
- Index: &i,
- Result: &v[i],
- }
- ctx := graphql.WithFieldContext(ctx, fc)
- f := func(i int) {
- defer func() {
- if r := recover(); r != nil {
- ec.Error(ctx, ec.Recover(ctx, r))
- ret = nil
- }
- }()
- if !isLen1 {
- defer wg.Done()
- }
- ret[i] = ec.marshalNArticle2ᚖundefᚗninjaᚋxᚋfeedakaᚋgraphqlᚋmodelᚐArticle(ctx, sel, v[i])
- }
- if isLen1 {
- f(i)
- } else {
- go f(i)
- }
-
- }
- wg.Wait()
-
- for _, e := range ret {
- if e == graphql.Null {
- return graphql.Null
- }
- }
-
- return ret
-}
-
-func (ec *executionContext) marshalNArticle2ᚖundefᚗninjaᚋxᚋfeedakaᚋgraphqlᚋmodelᚐArticle(ctx context.Context, sel ast.SelectionSet, v *model.Article) graphql.Marshaler {
- if v == nil {
- if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) {
- ec.Errorf(ctx, "the requested element is null which the schema does not allow")
- }
- return graphql.Null
- }
- return ec._Article(ctx, sel, v)
-}
-
-func (ec *executionContext) marshalNArticleConnection2undefᚗninjaᚋxᚋfeedakaᚋgraphqlᚋmodelᚐArticleConnection(ctx context.Context, sel ast.SelectionSet, v model.ArticleConnection) graphql.Marshaler {
- return ec._ArticleConnection(ctx, sel, &v)
-}
-
-func (ec *executionContext) marshalNArticleConnection2ᚖundefᚗninjaᚋxᚋfeedakaᚋgraphqlᚋmodelᚐArticleConnection(ctx context.Context, sel ast.SelectionSet, v *model.ArticleConnection) graphql.Marshaler {
- if v == nil {
- if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) {
- ec.Errorf(ctx, "the requested element is null which the schema does not allow")
- }
- return graphql.Null
- }
- return ec._ArticleConnection(ctx, sel, v)
-}
-
-func (ec *executionContext) marshalNAuthPayload2undefᚗninjaᚋxᚋfeedakaᚋgraphqlᚋmodelᚐAuthPayload(ctx context.Context, sel ast.SelectionSet, v model.AuthPayload) graphql.Marshaler {
- return ec._AuthPayload(ctx, sel, &v)
-}
-
-func (ec *executionContext) marshalNAuthPayload2ᚖundefᚗninjaᚋxᚋfeedakaᚋgraphqlᚋmodelᚐAuthPayload(ctx context.Context, sel ast.SelectionSet, v *model.AuthPayload) graphql.Marshaler {
- if v == nil {
- if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) {
- ec.Errorf(ctx, "the requested element is null which the schema does not allow")
- }
- return graphql.Null
- }
- return ec._AuthPayload(ctx, sel, v)
-}
-
-func (ec *executionContext) unmarshalNBoolean2bool(ctx context.Context, v any) (bool, error) {
- res, err := graphql.UnmarshalBoolean(v)
- return res, graphql.ErrorOnPath(ctx, err)
-}
-
-func (ec *executionContext) marshalNBoolean2bool(ctx context.Context, sel ast.SelectionSet, v bool) graphql.Marshaler {
- _ = sel
- res := graphql.MarshalBoolean(v)
- if res == graphql.Null {
- if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) {
- ec.Errorf(ctx, "the requested element is null which the schema does not allow")
- }
- }
- return res
-}
-
-func (ec *executionContext) unmarshalNDateTime2string(ctx context.Context, v any) (string, error) {
- res, err := graphql.UnmarshalString(v)
- return res, graphql.ErrorOnPath(ctx, err)
-}
-
-func (ec *executionContext) marshalNDateTime2string(ctx context.Context, sel ast.SelectionSet, v string) graphql.Marshaler {
- _ = sel
- res := graphql.MarshalString(v)
- if res == graphql.Null {
- if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) {
- ec.Errorf(ctx, "the requested element is null which the schema does not allow")
- }
- }
- return res
-}
-
-func (ec *executionContext) marshalNFeed2undefᚗninjaᚋxᚋfeedakaᚋgraphqlᚋmodelᚐFeed(ctx context.Context, sel ast.SelectionSet, v model.Feed) graphql.Marshaler {
- return ec._Feed(ctx, sel, &v)
-}
-
-func (ec *executionContext) marshalNFeed2ᚕᚖundefᚗninjaᚋxᚋfeedakaᚋgraphqlᚋmodelᚐFeedᚄ(ctx context.Context, sel ast.SelectionSet, v []*model.Feed) graphql.Marshaler {
- ret := make(graphql.Array, len(v))
- var wg sync.WaitGroup
- isLen1 := len(v) == 1
- if !isLen1 {
- wg.Add(len(v))
- }
- for i := range v {
- i := i
- fc := &graphql.FieldContext{
- Index: &i,
- Result: &v[i],
- }
- ctx := graphql.WithFieldContext(ctx, fc)
- f := func(i int) {
- defer func() {
- if r := recover(); r != nil {
- ec.Error(ctx, ec.Recover(ctx, r))
- ret = nil
- }
- }()
- if !isLen1 {
- defer wg.Done()
- }
- ret[i] = ec.marshalNFeed2ᚖundefᚗninjaᚋxᚋfeedakaᚋgraphqlᚋmodelᚐFeed(ctx, sel, v[i])
- }
- if isLen1 {
- f(i)
- } else {
- go f(i)
- }
-
- }
- wg.Wait()
-
- for _, e := range ret {
- if e == graphql.Null {
- return graphql.Null
- }
- }
-
- return ret
-}
-
-func (ec *executionContext) marshalNFeed2ᚖundefᚗninjaᚋxᚋfeedakaᚋgraphqlᚋmodelᚐFeed(ctx context.Context, sel ast.SelectionSet, v *model.Feed) graphql.Marshaler {
- if v == nil {
- if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) {
- ec.Errorf(ctx, "the requested element is null which the schema does not allow")
- }
- return graphql.Null
- }
- return ec._Feed(ctx, sel, v)
-}
-
-func (ec *executionContext) unmarshalNID2string(ctx context.Context, v any) (string, error) {
- res, err := graphql.UnmarshalID(v)
- return res, graphql.ErrorOnPath(ctx, err)
-}
-
-func (ec *executionContext) marshalNID2string(ctx context.Context, sel ast.SelectionSet, v string) graphql.Marshaler {
- _ = sel
- res := graphql.MarshalID(v)
- if res == graphql.Null {
- if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) {
- ec.Errorf(ctx, "the requested element is null which the schema does not allow")
- }
- }
- return res
-}
-
-func (ec *executionContext) unmarshalNInt2int32(ctx context.Context, v any) (int32, error) {
- res, err := graphql.UnmarshalInt32(v)
- return res, graphql.ErrorOnPath(ctx, err)
-}
-
-func (ec *executionContext) marshalNInt2int32(ctx context.Context, sel ast.SelectionSet, v int32) graphql.Marshaler {
- _ = sel
- res := graphql.MarshalInt32(v)
- if res == graphql.Null {
- if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) {
- ec.Errorf(ctx, "the requested element is null which the schema does not allow")
- }
- }
- return res
-}
-
-func (ec *executionContext) marshalNPageInfo2ᚖundefᚗninjaᚋxᚋfeedakaᚋgraphqlᚋmodelᚐPageInfo(ctx context.Context, sel ast.SelectionSet, v *model.PageInfo) graphql.Marshaler {
- if v == nil {
- if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) {
- ec.Errorf(ctx, "the requested element is null which the schema does not allow")
- }
- return graphql.Null
- }
- return ec._PageInfo(ctx, sel, v)
-}
-
-func (ec *executionContext) unmarshalNString2string(ctx context.Context, v any) (string, error) {
- res, err := graphql.UnmarshalString(v)
- return res, graphql.ErrorOnPath(ctx, err)
-}
-
-func (ec *executionContext) marshalNString2string(ctx context.Context, sel ast.SelectionSet, v string) graphql.Marshaler {
- _ = sel
- res := graphql.MarshalString(v)
- if res == graphql.Null {
- if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) {
- ec.Errorf(ctx, "the requested element is null which the schema does not allow")
- }
- }
- return res
-}
-
-func (ec *executionContext) marshalNUser2ᚖundefᚗninjaᚋxᚋfeedakaᚋgraphqlᚋmodelᚐUser(ctx context.Context, sel ast.SelectionSet, v *model.User) graphql.Marshaler {
- if v == nil {
- if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) {
- ec.Errorf(ctx, "the requested element is null which the schema does not allow")
- }
- return graphql.Null
- }
- return ec._User(ctx, sel, v)
-}
-
-func (ec *executionContext) marshalN__Directive2githubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐDirective(ctx context.Context, sel ast.SelectionSet, v introspection.Directive) graphql.Marshaler {
- return ec.___Directive(ctx, sel, &v)
-}
-
-func (ec *executionContext) marshalN__Directive2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐDirectiveᚄ(ctx context.Context, sel ast.SelectionSet, v []introspection.Directive) graphql.Marshaler {
- ret := make(graphql.Array, len(v))
- var wg sync.WaitGroup
- isLen1 := len(v) == 1
- if !isLen1 {
- wg.Add(len(v))
- }
- for i := range v {
- i := i
- fc := &graphql.FieldContext{
- Index: &i,
- Result: &v[i],
- }
- ctx := graphql.WithFieldContext(ctx, fc)
- f := func(i int) {
- defer func() {
- if r := recover(); r != nil {
- ec.Error(ctx, ec.Recover(ctx, r))
- ret = nil
- }
- }()
- if !isLen1 {
- defer wg.Done()
- }
- ret[i] = ec.marshalN__Directive2githubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐDirective(ctx, sel, v[i])
- }
- if isLen1 {
- f(i)
- } else {
- go f(i)
- }
-
- }
- wg.Wait()
-
- for _, e := range ret {
- if e == graphql.Null {
- return graphql.Null
- }
- }
-
- return ret
-}
-
-func (ec *executionContext) unmarshalN__DirectiveLocation2string(ctx context.Context, v any) (string, error) {
- res, err := graphql.UnmarshalString(v)
- return res, graphql.ErrorOnPath(ctx, err)
-}
-
-func (ec *executionContext) marshalN__DirectiveLocation2string(ctx context.Context, sel ast.SelectionSet, v string) graphql.Marshaler {
- _ = sel
- res := graphql.MarshalString(v)
- if res == graphql.Null {
- if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) {
- ec.Errorf(ctx, "the requested element is null which the schema does not allow")
- }
- }
- return res
-}
-
-func (ec *executionContext) unmarshalN__DirectiveLocation2ᚕstringᚄ(ctx context.Context, v any) ([]string, error) {
- var vSlice []any
- vSlice = graphql.CoerceList(v)
- var err error
- res := make([]string, len(vSlice))
- for i := range vSlice {
- ctx := graphql.WithPathContext(ctx, graphql.NewPathWithIndex(i))
- res[i], err = ec.unmarshalN__DirectiveLocation2string(ctx, vSlice[i])
- if err != nil {
- return nil, err
- }
- }
- return res, nil
-}
-
-func (ec *executionContext) marshalN__DirectiveLocation2ᚕstringᚄ(ctx context.Context, sel ast.SelectionSet, v []string) graphql.Marshaler {
- ret := make(graphql.Array, len(v))
- var wg sync.WaitGroup
- isLen1 := len(v) == 1
- if !isLen1 {
- wg.Add(len(v))
- }
- for i := range v {
- i := i
- fc := &graphql.FieldContext{
- Index: &i,
- Result: &v[i],
- }
- ctx := graphql.WithFieldContext(ctx, fc)
- f := func(i int) {
- defer func() {
- if r := recover(); r != nil {
- ec.Error(ctx, ec.Recover(ctx, r))
- ret = nil
- }
- }()
- if !isLen1 {
- defer wg.Done()
- }
- ret[i] = ec.marshalN__DirectiveLocation2string(ctx, sel, v[i])
- }
- if isLen1 {
- f(i)
- } else {
- go f(i)
- }
-
- }
- wg.Wait()
-
- for _, e := range ret {
- if e == graphql.Null {
- return graphql.Null
- }
- }
-
- return ret
-}
-
-func (ec *executionContext) marshalN__EnumValue2githubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐEnumValue(ctx context.Context, sel ast.SelectionSet, v introspection.EnumValue) graphql.Marshaler {
- return ec.___EnumValue(ctx, sel, &v)
-}
-
-func (ec *executionContext) marshalN__Field2githubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐField(ctx context.Context, sel ast.SelectionSet, v introspection.Field) graphql.Marshaler {
- return ec.___Field(ctx, sel, &v)
-}
-
-func (ec *executionContext) marshalN__InputValue2githubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐInputValue(ctx context.Context, sel ast.SelectionSet, v introspection.InputValue) graphql.Marshaler {
- return ec.___InputValue(ctx, sel, &v)
-}
-
-func (ec *executionContext) marshalN__InputValue2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐInputValueᚄ(ctx context.Context, sel ast.SelectionSet, v []introspection.InputValue) graphql.Marshaler {
- ret := make(graphql.Array, len(v))
- var wg sync.WaitGroup
- isLen1 := len(v) == 1
- if !isLen1 {
- wg.Add(len(v))
- }
- for i := range v {
- i := i
- fc := &graphql.FieldContext{
- Index: &i,
- Result: &v[i],
- }
- ctx := graphql.WithFieldContext(ctx, fc)
- f := func(i int) {
- defer func() {
- if r := recover(); r != nil {
- ec.Error(ctx, ec.Recover(ctx, r))
- ret = nil
- }
- }()
- if !isLen1 {
- defer wg.Done()
- }
- ret[i] = ec.marshalN__InputValue2githubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐInputValue(ctx, sel, v[i])
- }
- if isLen1 {
- f(i)
- } else {
- go f(i)
- }
-
- }
- wg.Wait()
-
- for _, e := range ret {
- if e == graphql.Null {
- return graphql.Null
- }
- }
-
- return ret
-}
-
-func (ec *executionContext) marshalN__Type2githubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType(ctx context.Context, sel ast.SelectionSet, v introspection.Type) graphql.Marshaler {
- return ec.___Type(ctx, sel, &v)
-}
-
-func (ec *executionContext) marshalN__Type2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐTypeᚄ(ctx context.Context, sel ast.SelectionSet, v []introspection.Type) graphql.Marshaler {
- ret := make(graphql.Array, len(v))
- var wg sync.WaitGroup
- isLen1 := len(v) == 1
- if !isLen1 {
- wg.Add(len(v))
- }
- for i := range v {
- i := i
- fc := &graphql.FieldContext{
- Index: &i,
- Result: &v[i],
- }
- ctx := graphql.WithFieldContext(ctx, fc)
- f := func(i int) {
- defer func() {
- if r := recover(); r != nil {
- ec.Error(ctx, ec.Recover(ctx, r))
- ret = nil
- }
- }()
- if !isLen1 {
- defer wg.Done()
- }
- ret[i] = ec.marshalN__Type2githubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType(ctx, sel, v[i])
- }
- if isLen1 {
- f(i)
- } else {
- go f(i)
- }
-
- }
- wg.Wait()
-
- for _, e := range ret {
- if e == graphql.Null {
- return graphql.Null
- }
- }
-
- return ret
-}
-
-func (ec *executionContext) marshalN__Type2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType(ctx context.Context, sel ast.SelectionSet, v *introspection.Type) graphql.Marshaler {
- if v == nil {
- if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) {
- ec.Errorf(ctx, "the requested element is null which the schema does not allow")
- }
- return graphql.Null
- }
- return ec.___Type(ctx, sel, v)
-}
-
-func (ec *executionContext) unmarshalN__TypeKind2string(ctx context.Context, v any) (string, error) {
- res, err := graphql.UnmarshalString(v)
- return res, graphql.ErrorOnPath(ctx, err)
-}
-
-func (ec *executionContext) marshalN__TypeKind2string(ctx context.Context, sel ast.SelectionSet, v string) graphql.Marshaler {
- _ = sel
- res := graphql.MarshalString(v)
- if res == graphql.Null {
- if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) {
- ec.Errorf(ctx, "the requested element is null which the schema does not allow")
- }
- }
- return res
-}
-
-func (ec *executionContext) marshalOArticle2ᚖundefᚗninjaᚋxᚋfeedakaᚋgraphqlᚋmodelᚐArticle(ctx context.Context, sel ast.SelectionSet, v *model.Article) graphql.Marshaler {
- if v == nil {
- return graphql.Null
- }
- return ec._Article(ctx, sel, v)
-}
-
-func (ec *executionContext) unmarshalOBoolean2bool(ctx context.Context, v any) (bool, error) {
- res, err := graphql.UnmarshalBoolean(v)
- return res, graphql.ErrorOnPath(ctx, err)
-}
-
-func (ec *executionContext) marshalOBoolean2bool(ctx context.Context, sel ast.SelectionSet, v bool) graphql.Marshaler {
- _ = sel
- _ = ctx
- res := graphql.MarshalBoolean(v)
- return res
-}
-
-func (ec *executionContext) unmarshalOBoolean2ᚖbool(ctx context.Context, v any) (*bool, error) {
- if v == nil {
- return nil, nil
- }
- res, err := graphql.UnmarshalBoolean(v)
- return &res, graphql.ErrorOnPath(ctx, err)
-}
-
-func (ec *executionContext) marshalOBoolean2ᚖbool(ctx context.Context, sel ast.SelectionSet, v *bool) graphql.Marshaler {
- if v == nil {
- return graphql.Null
- }
- _ = sel
- _ = ctx
- res := graphql.MarshalBoolean(*v)
- return res
-}
-
-func (ec *executionContext) marshalOFeed2ᚖundefᚗninjaᚋxᚋfeedakaᚋgraphqlᚋmodelᚐFeed(ctx context.Context, sel ast.SelectionSet, v *model.Feed) graphql.Marshaler {
- if v == nil {
- return graphql.Null
- }
- return ec._Feed(ctx, sel, v)
-}
-
-func (ec *executionContext) unmarshalOID2ᚖstring(ctx context.Context, v any) (*string, error) {
- if v == nil {
- return nil, nil
- }
- res, err := graphql.UnmarshalID(v)
- return &res, graphql.ErrorOnPath(ctx, err)
-}
-
-func (ec *executionContext) marshalOID2ᚖstring(ctx context.Context, sel ast.SelectionSet, v *string) graphql.Marshaler {
- if v == nil {
- return graphql.Null
- }
- _ = sel
- _ = ctx
- res := graphql.MarshalID(*v)
- return res
-}
-
-func (ec *executionContext) unmarshalOInt2ᚖint32(ctx context.Context, v any) (*int32, error) {
- if v == nil {
- return nil, nil
- }
- res, err := graphql.UnmarshalInt32(v)
- return &res, graphql.ErrorOnPath(ctx, err)
-}
-
-func (ec *executionContext) marshalOInt2ᚖint32(ctx context.Context, sel ast.SelectionSet, v *int32) graphql.Marshaler {
- if v == nil {
- return graphql.Null
- }
- _ = sel
- _ = ctx
- res := graphql.MarshalInt32(*v)
- return res
-}
-
-func (ec *executionContext) unmarshalOString2ᚖstring(ctx context.Context, v any) (*string, error) {
- if v == nil {
- return nil, nil
- }
- res, err := graphql.UnmarshalString(v)
- return &res, graphql.ErrorOnPath(ctx, err)
-}
-
-func (ec *executionContext) marshalOString2ᚖstring(ctx context.Context, sel ast.SelectionSet, v *string) graphql.Marshaler {
- if v == nil {
- return graphql.Null
- }
- _ = sel
- _ = ctx
- res := graphql.MarshalString(*v)
- return res
-}
-
-func (ec *executionContext) marshalOUser2ᚖundefᚗninjaᚋxᚋfeedakaᚋgraphqlᚋmodelᚐUser(ctx context.Context, sel ast.SelectionSet, v *model.User) graphql.Marshaler {
- if v == nil {
- return graphql.Null
- }
- return ec._User(ctx, sel, v)
-}
-
-func (ec *executionContext) marshalO__EnumValue2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐEnumValueᚄ(ctx context.Context, sel ast.SelectionSet, v []introspection.EnumValue) graphql.Marshaler {
- if v == nil {
- return graphql.Null
- }
- ret := make(graphql.Array, len(v))
- var wg sync.WaitGroup
- isLen1 := len(v) == 1
- if !isLen1 {
- wg.Add(len(v))
- }
- for i := range v {
- i := i
- fc := &graphql.FieldContext{
- Index: &i,
- Result: &v[i],
- }
- ctx := graphql.WithFieldContext(ctx, fc)
- f := func(i int) {
- defer func() {
- if r := recover(); r != nil {
- ec.Error(ctx, ec.Recover(ctx, r))
- ret = nil
- }
- }()
- if !isLen1 {
- defer wg.Done()
- }
- ret[i] = ec.marshalN__EnumValue2githubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐEnumValue(ctx, sel, v[i])
- }
- if isLen1 {
- f(i)
- } else {
- go f(i)
- }
-
- }
- wg.Wait()
-
- for _, e := range ret {
- if e == graphql.Null {
- return graphql.Null
- }
- }
-
- return ret
-}
-
-func (ec *executionContext) marshalO__Field2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐFieldᚄ(ctx context.Context, sel ast.SelectionSet, v []introspection.Field) graphql.Marshaler {
- if v == nil {
- return graphql.Null
- }
- ret := make(graphql.Array, len(v))
- var wg sync.WaitGroup
- isLen1 := len(v) == 1
- if !isLen1 {
- wg.Add(len(v))
- }
- for i := range v {
- i := i
- fc := &graphql.FieldContext{
- Index: &i,
- Result: &v[i],
- }
- ctx := graphql.WithFieldContext(ctx, fc)
- f := func(i int) {
- defer func() {
- if r := recover(); r != nil {
- ec.Error(ctx, ec.Recover(ctx, r))
- ret = nil
- }
- }()
- if !isLen1 {
- defer wg.Done()
- }
- ret[i] = ec.marshalN__Field2githubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐField(ctx, sel, v[i])
- }
- if isLen1 {
- f(i)
- } else {
- go f(i)
- }
-
- }
- wg.Wait()
-
- for _, e := range ret {
- if e == graphql.Null {
- return graphql.Null
- }
- }
-
- return ret
-}
-
-func (ec *executionContext) marshalO__InputValue2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐInputValueᚄ(ctx context.Context, sel ast.SelectionSet, v []introspection.InputValue) graphql.Marshaler {
- if v == nil {
- return graphql.Null
- }
- ret := make(graphql.Array, len(v))
- var wg sync.WaitGroup
- isLen1 := len(v) == 1
- if !isLen1 {
- wg.Add(len(v))
- }
- for i := range v {
- i := i
- fc := &graphql.FieldContext{
- Index: &i,
- Result: &v[i],
- }
- ctx := graphql.WithFieldContext(ctx, fc)
- f := func(i int) {
- defer func() {
- if r := recover(); r != nil {
- ec.Error(ctx, ec.Recover(ctx, r))
- ret = nil
- }
- }()
- if !isLen1 {
- defer wg.Done()
- }
- ret[i] = ec.marshalN__InputValue2githubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐInputValue(ctx, sel, v[i])
- }
- if isLen1 {
- f(i)
- } else {
- go f(i)
- }
-
- }
- wg.Wait()
-
- for _, e := range ret {
- if e == graphql.Null {
- return graphql.Null
- }
- }
-
- return ret
-}
-
-func (ec *executionContext) marshalO__Schema2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐSchema(ctx context.Context, sel ast.SelectionSet, v *introspection.Schema) graphql.Marshaler {
- if v == nil {
- return graphql.Null
- }
- return ec.___Schema(ctx, sel, v)
-}
-
-func (ec *executionContext) marshalO__Type2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐTypeᚄ(ctx context.Context, sel ast.SelectionSet, v []introspection.Type) graphql.Marshaler {
- if v == nil {
- return graphql.Null
- }
- ret := make(graphql.Array, len(v))
- var wg sync.WaitGroup
- isLen1 := len(v) == 1
- if !isLen1 {
- wg.Add(len(v))
- }
- for i := range v {
- i := i
- fc := &graphql.FieldContext{
- Index: &i,
- Result: &v[i],
- }
- ctx := graphql.WithFieldContext(ctx, fc)
- f := func(i int) {
- defer func() {
- if r := recover(); r != nil {
- ec.Error(ctx, ec.Recover(ctx, r))
- ret = nil
- }
- }()
- if !isLen1 {
- defer wg.Done()
- }
- ret[i] = ec.marshalN__Type2githubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType(ctx, sel, v[i])
- }
- if isLen1 {
- f(i)
- } else {
- go f(i)
- }
-
- }
- wg.Wait()
-
- for _, e := range ret {
- if e == graphql.Null {
- return graphql.Null
- }
- }
-
- return ret
-}
-
-func (ec *executionContext) marshalO__Type2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType(ctx context.Context, sel ast.SelectionSet, v *introspection.Type) graphql.Marshaler {
- if v == nil {
- return graphql.Null
- }
- return ec.___Type(ctx, sel, v)
-}
-
-// endregion ***************************** type.gotpl *****************************
diff --git a/backend/graphql/model/generated.go b/backend/graphql/model/generated.go
deleted file mode 100644
index a305535..0000000
--- a/backend/graphql/model/generated.go
+++ /dev/null
@@ -1,77 +0,0 @@
-// Code generated by github.com/99designs/gqlgen, DO NOT EDIT.
-
-package model
-
-// Represents an individual article/post from a feed
-type Article struct {
- // Unique identifier for the article
- ID string `json:"id"`
- // ID of the feed this article belongs to
- FeedID string `json:"feedId"`
- // GUID from the RSS/Atom feed (unique identifier from feed)
- GUID string `json:"guid"`
- // Title of the article
- Title string `json:"title"`
- // URL/link to the original article
- URL string `json:"url"`
- // Whether the article has been marked as read
- IsRead bool `json:"isRead"`
- // The feed this article belongs to
- Feed *Feed `json:"feed"`
-}
-
-// A paginated list of articles
-type ArticleConnection struct {
- // The list of articles
- Articles []*Article `json:"articles"`
- // Pagination information
- PageInfo *PageInfo `json:"pageInfo"`
-}
-
-// Authentication payload returned from login mutation
-type AuthPayload struct {
- // The authenticated user
- User *User `json:"user"`
-}
-
-// Represents a feed subscription in the system
-type Feed struct {
- // Unique identifier for the feed
- ID string `json:"id"`
- // URL of the RSS/Atom feed
- URL string `json:"url"`
- // Title of the feed (extracted from feed metadata)
- Title string `json:"title"`
- // Timestamp when the feed was last fetched
- FetchedAt string `json:"fetchedAt"`
- // Whether the user is currently subscribed to this feed
- IsSubscribed bool `json:"isSubscribed"`
- // Number of unread articles in this feed
- UnreadCount int32 `json:"unreadCount"`
- // Articles belonging to this feed
- Articles []*Article `json:"articles"`
-}
-
-// Root mutation type for modifying data
-type Mutation struct {
-}
-
-// Pagination information for cursor-based pagination
-type PageInfo struct {
- // Whether there are more items after the last item in this page
- HasNextPage bool `json:"hasNextPage"`
- // Cursor of the last item in this page
- EndCursor *string `json:"endCursor,omitempty"`
-}
-
-// Root query type for reading data
-type Query struct {
-}
-
-// Represents a user in the system
-type User struct {
- // Unique identifier for the user
- ID string `json:"id"`
- // Username of the user
- Username string `json:"username"`
-}
diff --git a/backend/graphql/resolver/auth_helpers.go b/backend/graphql/resolver/auth_helpers.go
deleted file mode 100644
index dcc09fb..0000000
--- a/backend/graphql/resolver/auth_helpers.go
+++ /dev/null
@@ -1,29 +0,0 @@
-package resolver
-
-import (
- "context"
- "errors"
- "fmt"
-
- "github.com/labstack/echo/v4"
- appcontext "undef.ninja/x/feedaka/context"
-)
-
-// getUserIDFromContext retrieves the authenticated user ID from context
-// This is a wrapper around the GetUserID function from the context package
-func getUserIDFromContext(ctx context.Context) (int64, error) {
- userID, ok := appcontext.GetUserID(ctx)
- if !ok {
- return 0, fmt.Errorf("authentication required")
- }
- return userID, nil
-}
-
-// Helper function to get Echo context from GraphQL context
-func getEchoContext(ctx context.Context) (echo.Context, error) {
- echoCtx, ok := ctx.Value("echo").(echo.Context)
- if !ok {
- return nil, errors.New("echo context not found")
- }
- return echoCtx, nil
-}
diff --git a/backend/graphql/resolver/pagination.go b/backend/graphql/resolver/pagination.go
deleted file mode 100644
index 1a14650..0000000
--- a/backend/graphql/resolver/pagination.go
+++ /dev/null
@@ -1,177 +0,0 @@
-package resolver
-
-import (
- "context"
- "fmt"
- "strconv"
-
- "undef.ninja/x/feedaka/db"
- "undef.ninja/x/feedaka/graphql/model"
-)
-
-const defaultPageSize = 30
-const maxPageSize = 100
-
-// articleRow is a common interface for all paginated article query rows.
-type articleRow struct {
- ID int64
- FeedID int64
- Guid string
- Title string
- Url string
- IsRead int64
- FeedID2 int64
- FeedUrl string
- FeedTitle string
- FeedIsSubscribed int64
-}
-
-func toArticleRow(r any) articleRow {
- switch v := r.(type) {
- case db.GetArticlesPaginatedRow:
- return articleRow{v.ID, v.FeedID, v.Guid, v.Title, v.Url, v.IsRead, v.FeedID2, v.FeedUrl, v.FeedTitle, v.FeedIsSubscribed}
- case db.GetArticlesPaginatedAfterRow:
- return articleRow{v.ID, v.FeedID, v.Guid, v.Title, v.Url, v.IsRead, v.FeedID2, v.FeedUrl, v.FeedTitle, v.FeedIsSubscribed}
- case db.GetArticlesByFeedPaginatedRow:
- return articleRow{v.ID, v.FeedID, v.Guid, v.Title, v.Url, v.IsRead, v.FeedID2, v.FeedUrl, v.FeedTitle, v.FeedIsSubscribed}
- case db.GetArticlesByFeedPaginatedAfterRow:
- return articleRow{v.ID, v.FeedID, v.Guid, v.Title, v.Url, v.IsRead, v.FeedID2, v.FeedUrl, v.FeedTitle, v.FeedIsSubscribed}
- default:
- panic("unexpected row type")
- }
-}
-
-func rowToArticle(row articleRow) *model.Article {
- return &model.Article{
- ID: strconv.FormatInt(row.ID, 10),
- FeedID: strconv.FormatInt(row.FeedID, 10),
- GUID: row.Guid,
- Title: row.Title,
- URL: row.Url,
- IsRead: row.IsRead == 1,
- Feed: &model.Feed{
- ID: strconv.FormatInt(row.FeedID2, 10),
- URL: row.FeedUrl,
- Title: row.FeedTitle,
- IsSubscribed: row.FeedIsSubscribed == 1,
- },
- }
-}
-
-func (r *queryResolver) paginatedArticles(ctx context.Context, isRead int64, feedID *string, after *string, first *int32) (*model.ArticleConnection, error) {
- userID, err := getUserIDFromContext(ctx)
- if err != nil {
- return nil, err
- }
-
- limit := int64(defaultPageSize)
- if first != nil {
- limit = int64(*first)
- if limit <= 0 {
- limit = int64(defaultPageSize)
- }
- if limit > maxPageSize {
- limit = maxPageSize
- }
- }
-
- // Fetch limit+1 to determine hasNextPage
- fetchLimit := limit + 1
-
- var rawRows []any
-
- if feedID != nil {
- parsedFeedID, err := strconv.ParseInt(*feedID, 10, 64)
- if err != nil {
- return nil, fmt.Errorf("invalid feed ID: %w", err)
- }
-
- if after != nil {
- cursor, err := strconv.ParseInt(*after, 10, 64)
- if err != nil {
- return nil, fmt.Errorf("invalid cursor: %w", err)
- }
- rows, err := r.Queries.GetArticlesByFeedPaginatedAfter(ctx, db.GetArticlesByFeedPaginatedAfterParams{
- IsRead: isRead,
- UserID: userID,
- FeedID: parsedFeedID,
- ID: cursor,
- Limit: fetchLimit,
- })
- if err != nil {
- return nil, fmt.Errorf("failed to query articles: %w", err)
- }
- for _, row := range rows {
- rawRows = append(rawRows, row)
- }
- } else {
- rows, err := r.Queries.GetArticlesByFeedPaginated(ctx, db.GetArticlesByFeedPaginatedParams{
- IsRead: isRead,
- UserID: userID,
- FeedID: parsedFeedID,
- Limit: fetchLimit,
- })
- if err != nil {
- return nil, fmt.Errorf("failed to query articles: %w", err)
- }
- for _, row := range rows {
- rawRows = append(rawRows, row)
- }
- }
- } else {
- if after != nil {
- cursor, err := strconv.ParseInt(*after, 10, 64)
- if err != nil {
- return nil, fmt.Errorf("invalid cursor: %w", err)
- }
- rows, err := r.Queries.GetArticlesPaginatedAfter(ctx, db.GetArticlesPaginatedAfterParams{
- IsRead: isRead,
- UserID: userID,
- ID: cursor,
- Limit: fetchLimit,
- })
- if err != nil {
- return nil, fmt.Errorf("failed to query articles: %w", err)
- }
- for _, row := range rows {
- rawRows = append(rawRows, row)
- }
- } else {
- rows, err := r.Queries.GetArticlesPaginated(ctx, db.GetArticlesPaginatedParams{
- IsRead: isRead,
- UserID: userID,
- Limit: fetchLimit,
- })
- if err != nil {
- return nil, fmt.Errorf("failed to query articles: %w", err)
- }
- for _, row := range rows {
- rawRows = append(rawRows, row)
- }
- }
- }
-
- hasNextPage := int64(len(rawRows)) > limit
- if hasNextPage {
- rawRows = rawRows[:limit]
- }
-
- articles := make([]*model.Article, 0, len(rawRows))
- for _, raw := range rawRows {
- articles = append(articles, rowToArticle(toArticleRow(raw)))
- }
-
- var endCursor *string
- if len(articles) > 0 {
- lastID := articles[len(articles)-1].ID
- endCursor = &lastID
- }
-
- return &model.ArticleConnection{
- Articles: articles,
- PageInfo: &model.PageInfo{
- HasNextPage: hasNextPage,
- EndCursor: endCursor,
- },
- }, nil
-}
diff --git a/backend/graphql/resolver/resolver.go b/backend/graphql/resolver/resolver.go
deleted file mode 100644
index dea85a0..0000000
--- a/backend/graphql/resolver/resolver.go
+++ /dev/null
@@ -1,18 +0,0 @@
-package resolver
-
-import (
- "database/sql"
-
- "undef.ninja/x/feedaka/auth"
- "undef.ninja/x/feedaka/db"
-)
-
-// This file will not be regenerated automatically.
-//
-// It serves as dependency injection for your app, add any dependencies you require here.
-
-type Resolver struct {
- DB *sql.DB
- Queries *db.Queries
- SessionConfig *auth.SessionConfig
-}
diff --git a/backend/graphql/resolver/schema.resolvers.go b/backend/graphql/resolver/schema.resolvers.go
deleted file mode 100644
index 0392945..0000000
--- a/backend/graphql/resolver/schema.resolvers.go
+++ /dev/null
@@ -1,461 +0,0 @@
-package resolver
-
-// This file will be automatically regenerated based on the schema, any resolver implementations
-// will be copied through when generating and any unknown code will be moved to the end.
-// Code generated by github.com/99designs/gqlgen version v0.17.76
-
-import (
- "context"
- "database/sql"
- "fmt"
- "strconv"
- "time"
-
- "undef.ninja/x/feedaka/auth"
- "undef.ninja/x/feedaka/db"
- "undef.ninja/x/feedaka/feed"
- gql "undef.ninja/x/feedaka/graphql"
- "undef.ninja/x/feedaka/graphql/model"
-)
-
-// AddFeed is the resolver for the addFeed field.
-func (r *mutationResolver) AddFeed(ctx context.Context, url string) (*model.Feed, error) {
- userID, err := getUserIDFromContext(ctx)
- if err != nil {
- return nil, err
- }
-
- // Fetch the feed to get its title
- f, err := feed.Fetch(ctx, url)
- if err != nil {
- return nil, fmt.Errorf("failed to parse feed: %w", err)
- }
-
- // Insert the feed into the database
- dbFeed, err := r.Queries.CreateFeed(ctx, db.CreateFeedParams{
- Url: url,
- Title: f.Title,
- FetchedAt: time.Now().UTC().Format(time.RFC3339),
- UserID: userID,
- })
- if err != nil {
- return nil, fmt.Errorf("failed to insert feed: %w", err)
- }
-
- // Sync articles from the feed
- if err := feed.Sync(ctx, r.Queries, dbFeed.ID, f); err != nil {
- return nil, fmt.Errorf("failed to sync articles: %w", err)
- }
-
- return &model.Feed{
- ID: strconv.FormatInt(dbFeed.ID, 10),
- URL: dbFeed.Url,
- Title: dbFeed.Title,
- FetchedAt: dbFeed.FetchedAt,
- IsSubscribed: dbFeed.IsSubscribed == 1,
- }, nil
-}
-
-// UnsubscribeFeed is the resolver for the unsubscribeFeed field.
-func (r *mutationResolver) UnsubscribeFeed(ctx context.Context, id string) (bool, error) {
- userID, err := getUserIDFromContext(ctx)
- if err != nil {
- return false, err
- }
-
- feedID, err := strconv.ParseInt(id, 10, 64)
- if err != nil {
- return false, fmt.Errorf("invalid feed ID: %w", err)
- }
-
- // Fetch feed
- feed, err := r.Queries.GetFeed(ctx, feedID)
- if err != nil {
- if err == sql.ErrNoRows {
- return false, fmt.Errorf("feed not found")
- }
- return false, fmt.Errorf("failed to query feed: %w", err)
- }
-
- // Check authorization
- if feed.UserID != userID {
- return false, fmt.Errorf("forbidden: you don't have access to this feed")
- }
-
- err = r.Queries.UnsubscribeFeed(ctx, feed.ID)
- if err != nil {
- return false, fmt.Errorf("failed to unsubscribe from feed: %w", err)
- }
-
- return true, nil
-}
-
-// MarkArticleRead is the resolver for the markArticleRead field.
-func (r *mutationResolver) MarkArticleRead(ctx context.Context, id string) (*model.Article, error) {
- userID, err := getUserIDFromContext(ctx)
- if err != nil {
- return nil, err
- }
-
- articleID, err := strconv.ParseInt(id, 10, 64)
- if err != nil {
- return nil, fmt.Errorf("invalid article ID: %w", err)
- }
-
- // Fetch article
- article, err := r.Queries.GetArticle(ctx, articleID)
- if err != nil {
- if err == sql.ErrNoRows {
- return nil, fmt.Errorf("article not found")
- }
- return nil, fmt.Errorf("failed to query article: %w", err)
- }
-
- // Check authorization (article belongs to a feed owned by user)
- feed, err := r.Queries.GetFeed(ctx, article.FeedID)
- if err != nil {
- return nil, fmt.Errorf("failed to query feed: %w", err)
- }
- if feed.UserID != userID {
- return nil, fmt.Errorf("forbidden: you don't have access to this article")
- }
-
- // Update the article's read status
- err = r.Queries.UpdateArticleReadStatus(ctx, db.UpdateArticleReadStatusParams{
- IsRead: 1,
- ID: article.ID,
- })
- if err != nil {
- return nil, fmt.Errorf("failed to mark article as read: %w", err)
- }
-
- // Fetch the updated article
- return r.Query().Article(ctx, id)
-}
-
-// MarkArticleUnread is the resolver for the markArticleUnread field.
-func (r *mutationResolver) MarkArticleUnread(ctx context.Context, id string) (*model.Article, error) {
- userID, err := getUserIDFromContext(ctx)
- if err != nil {
- return nil, err
- }
-
- articleID, err := strconv.ParseInt(id, 10, 64)
- if err != nil {
- return nil, fmt.Errorf("invalid article ID: %w", err)
- }
-
- // Fetch article
- article, err := r.Queries.GetArticle(ctx, articleID)
- if err != nil {
- if err == sql.ErrNoRows {
- return nil, fmt.Errorf("article not found")
- }
- return nil, fmt.Errorf("failed to query article: %w", err)
- }
-
- // Check authorization (article belongs to a feed owned by user)
- feed, err := r.Queries.GetFeed(ctx, article.FeedID)
- if err != nil {
- return nil, fmt.Errorf("failed to query feed: %w", err)
- }
- if feed.UserID != userID {
- return nil, fmt.Errorf("forbidden: you don't have access to this article")
- }
-
- // Update the article's read status
- err = r.Queries.UpdateArticleReadStatus(ctx, db.UpdateArticleReadStatusParams{
- IsRead: 0,
- ID: article.ID,
- })
- if err != nil {
- return nil, fmt.Errorf("failed to mark article as unread: %w", err)
- }
-
- // Fetch the updated article
- return r.Query().Article(ctx, id)
-}
-
-// MarkFeedRead is the resolver for the markFeedRead field.
-func (r *mutationResolver) MarkFeedRead(ctx context.Context, id string) (*model.Feed, error) {
- userID, err := getUserIDFromContext(ctx)
- if err != nil {
- return nil, err
- }
-
- feedID, err := strconv.ParseInt(id, 10, 64)
- if err != nil {
- return nil, fmt.Errorf("invalid feed ID: %w", err)
- }
-
- // Fetch feed
- feed, err := r.Queries.GetFeed(ctx, feedID)
- if err != nil {
- if err == sql.ErrNoRows {
- return nil, fmt.Errorf("feed not found")
- }
- return nil, fmt.Errorf("failed to query feed: %w", err)
- }
-
- // Check authorization
- if feed.UserID != userID {
- return nil, fmt.Errorf("forbidden: you don't have access to this feed")
- }
-
- // Update all articles in the feed to be read
- err = r.Queries.MarkFeedArticlesRead(ctx, feed.ID)
- if err != nil {
- return nil, fmt.Errorf("failed to mark feed as read: %w", err)
- }
-
- // Fetch the updated feed
- return r.Query().Feed(ctx, id)
-}
-
-// MarkFeedUnread is the resolver for the markFeedUnread field.
-func (r *mutationResolver) MarkFeedUnread(ctx context.Context, id string) (*model.Feed, error) {
- userID, err := getUserIDFromContext(ctx)
- if err != nil {
- return nil, err
- }
-
- feedID, err := strconv.ParseInt(id, 10, 64)
- if err != nil {
- return nil, fmt.Errorf("invalid feed ID: %w", err)
- }
-
- // Fetch feed
- feed, err := r.Queries.GetFeed(ctx, feedID)
- if err != nil {
- if err == sql.ErrNoRows {
- return nil, fmt.Errorf("feed not found")
- }
- return nil, fmt.Errorf("failed to query feed: %w", err)
- }
-
- // Check authorization
- if feed.UserID != userID {
- return nil, fmt.Errorf("forbidden: you don't have access to this feed")
- }
-
- // Update all articles in the feed to be unread
- err = r.Queries.MarkFeedArticlesUnread(ctx, feed.ID)
- if err != nil {
- return nil, fmt.Errorf("failed to mark feed as unread: %w", err)
- }
-
- // Fetch the updated feed
- return r.Query().Feed(ctx, id)
-}
-
-// Login is the resolver for the login field.
-func (r *mutationResolver) Login(ctx context.Context, username string, password string) (*model.AuthPayload, error) {
- // Verify user credentials
- user, err := r.Queries.GetUserByUsername(ctx, username)
- if err != nil {
- if err == sql.ErrNoRows {
- return nil, fmt.Errorf("invalid credentials")
- }
- return nil, fmt.Errorf("failed to query user: %w", err)
- }
-
- // Verify password
- if !auth.VerifyPassword(user.PasswordHash, password) {
- return nil, fmt.Errorf("invalid credentials")
- }
-
- // Get Echo context to create session
- echoCtx, err := getEchoContext(ctx)
- if err != nil {
- return nil, fmt.Errorf("failed to get echo context: %w", err)
- }
-
- // Create session and store user ID
- if err := r.SessionConfig.SetUserID(echoCtx, user.ID); err != nil {
- return nil, fmt.Errorf("failed to create session: %w", err)
- }
-
- return &model.AuthPayload{
- User: &model.User{
- ID: strconv.FormatInt(user.ID, 10),
- Username: user.Username,
- },
- }, nil
-}
-
-// Logout is the resolver for the logout field.
-func (r *mutationResolver) Logout(ctx context.Context) (bool, error) {
- // Get Echo context to destroy session
- echoCtx, err := getEchoContext(ctx)
- if err != nil {
- return false, fmt.Errorf("failed to get echo context: %w", err)
- }
-
- // Destroy session
- if err := r.SessionConfig.DestroySession(echoCtx); err != nil {
- return false, fmt.Errorf("failed to destroy session: %w", err)
- }
-
- return true, nil
-}
-
-// Feeds is the resolver for the feeds field.
-func (r *queryResolver) Feeds(ctx context.Context) ([]*model.Feed, error) {
- userID, err := getUserIDFromContext(ctx)
- if err != nil {
- return nil, err
- }
-
- dbFeeds, err := r.Queries.GetFeeds(ctx, userID)
- if err != nil {
- return nil, fmt.Errorf("failed to query feeds: %w", err)
- }
-
- // Fetch unread counts for all feeds
- unreadCounts, err := r.Queries.GetFeedUnreadCounts(ctx, userID)
- if err != nil {
- return nil, fmt.Errorf("failed to query unread counts: %w", err)
- }
- countMap := make(map[int64]int64, len(unreadCounts))
- for _, uc := range unreadCounts {
- countMap[uc.FeedID] = uc.UnreadCount
- }
-
- var feeds []*model.Feed
- for _, dbFeed := range dbFeeds {
- feeds = append(feeds, &model.Feed{
- ID: strconv.FormatInt(dbFeed.ID, 10),
- URL: dbFeed.Url,
- Title: dbFeed.Title,
- FetchedAt: dbFeed.FetchedAt,
- IsSubscribed: dbFeed.IsSubscribed == 1,
- UnreadCount: int32(countMap[dbFeed.ID]),
- })
- }
-
- return feeds, nil
-}
-
-// UnreadArticles is the resolver for the unreadArticles field.
-func (r *queryResolver) UnreadArticles(ctx context.Context, feedID *string, after *string, first *int32) (*model.ArticleConnection, error) {
- return r.paginatedArticles(ctx, 0, feedID, after, first)
-}
-
-// ReadArticles is the resolver for the readArticles field.
-func (r *queryResolver) ReadArticles(ctx context.Context, feedID *string, after *string, first *int32) (*model.ArticleConnection, error) {
- return r.paginatedArticles(ctx, 1, feedID, after, first)
-}
-
-// Feed is the resolver for the feed field.
-func (r *queryResolver) Feed(ctx context.Context, id string) (*model.Feed, error) {
- userID, err := getUserIDFromContext(ctx)
- if err != nil {
- return nil, err
- }
-
- feedID, err := strconv.ParseInt(id, 10, 64)
- if err != nil {
- return nil, fmt.Errorf("invalid feed ID: %w", err)
- }
-
- // Fetch feed
- dbFeed, err := r.Queries.GetFeed(ctx, feedID)
- if err != nil {
- if err == sql.ErrNoRows {
- return nil, fmt.Errorf("feed not found")
- }
- return nil, fmt.Errorf("failed to query feed: %w", err)
- }
-
- // Check authorization
- if dbFeed.UserID != userID {
- return nil, fmt.Errorf("forbidden: you don't have access to this feed")
- }
-
- return &model.Feed{
- ID: strconv.FormatInt(dbFeed.ID, 10),
- URL: dbFeed.Url,
- Title: dbFeed.Title,
- FetchedAt: dbFeed.FetchedAt,
- IsSubscribed: dbFeed.IsSubscribed == 1,
- }, nil
-}
-
-// Article is the resolver for the article field.
-func (r *queryResolver) Article(ctx context.Context, id string) (*model.Article, error) {
- userID, err := getUserIDFromContext(ctx)
- if err != nil {
- return nil, err
- }
-
- articleID, err := strconv.ParseInt(id, 10, 64)
- if err != nil {
- return nil, fmt.Errorf("invalid article ID: %w", err)
- }
-
- // Fetch article
- row, err := r.Queries.GetArticle(ctx, articleID)
- if err != nil {
- if err == sql.ErrNoRows {
- return nil, fmt.Errorf("article not found")
- }
- return nil, fmt.Errorf("failed to query article: %w", err)
- }
-
- // Check authorization (article's feed belongs to user)
- // Note: GetArticle already joins with feeds table and returns feed info,
- // but we need to check the user_id. Since GetArticleRow doesn't include user_id,
- // we need to fetch the feed separately.
- feed, err := r.Queries.GetFeed(ctx, row.FeedID)
- if err != nil {
- return nil, fmt.Errorf("failed to query feed: %w", err)
- }
- if feed.UserID != userID {
- return nil, fmt.Errorf("forbidden: you don't have access to this article")
- }
-
- return &model.Article{
- ID: strconv.FormatInt(row.ID, 10),
- FeedID: strconv.FormatInt(row.FeedID, 10),
- GUID: row.Guid,
- Title: row.Title,
- URL: row.Url,
- IsRead: row.IsRead == 1,
- Feed: &model.Feed{
- ID: strconv.FormatInt(row.FeedID2, 10),
- URL: row.FeedUrl,
- Title: row.FeedTitle,
- },
- }, nil
-}
-
-// CurrentUser is the resolver for the currentUser field.
-func (r *queryResolver) CurrentUser(ctx context.Context) (*model.User, error) {
- userID, err := getUserIDFromContext(ctx)
- if err != nil {
- // Not authenticated - return nil (not an error)
- return nil, nil
- }
-
- user, err := r.Queries.GetUserByID(ctx, userID)
- if err != nil {
- if err == sql.ErrNoRows {
- return nil, nil
- }
- return nil, fmt.Errorf("failed to query user: %w", err)
- }
-
- return &model.User{
- ID: strconv.FormatInt(user.ID, 10),
- Username: user.Username,
- }, nil
-}
-
-// Mutation returns gql.MutationResolver implementation.
-func (r *Resolver) Mutation() gql.MutationResolver { return &mutationResolver{r} }
-
-// Query returns gql.QueryResolver implementation.
-func (r *Resolver) Query() gql.QueryResolver { return &queryResolver{r} }
-
-type mutationResolver struct{ *Resolver }
-type queryResolver struct{ *Resolver }
diff --git a/backend/main.go b/backend/main.go
index 1d09685..bd1e990 100644
--- a/backend/main.go
+++ b/backend/main.go
@@ -13,7 +13,7 @@ import (
)
//go:generate go tool sqlc generate
-//go:generate go tool gqlgen generate
+//go:generate go tool oapi-codegen -package api -generate types,echo-server,strict-server -o api/generated.go ../openapi/openapi.yaml
var (
//go:embed public/*
diff --git a/frontend/biome.json b/frontend/biome.json
index b7bb492..b7e06e9 100644
--- a/frontend/biome.json
+++ b/frontend/biome.json
@@ -6,7 +6,7 @@
"useIgnoreFile": true
},
"files": {
- "includes": ["**", "!src/graphql/generated/*.ts"],
+ "includes": ["**", "!src/api/generated.d.ts"],
"ignoreUnknown": true
},
"css": {
diff --git a/frontend/graphql-codegen.ts b/frontend/graphql-codegen.ts
deleted file mode 100644
index d5339a4..0000000
--- a/frontend/graphql-codegen.ts
+++ /dev/null
@@ -1,23 +0,0 @@
-import type { CodegenConfig } from "@graphql-codegen/cli";
-
-const config: CodegenConfig = {
- overwrite: true,
- schema: "src/graphql/schema.graphql",
- documents: ["src/graphql/*.graphql"],
- generates: {
- "src/graphql/generated/": {
- preset: "client",
- plugins: [],
- config: {
- enumsAsTypes: true,
- skipTypename: true,
- useTypeImports: true,
- scalars: {
- DateTime: "string",
- },
- },
- },
- },
-};
-
-export default config;
diff --git a/frontend/package-lock.json b/frontend/package-lock.json
index 67d7405..1dfe685 100644
--- a/frontend/package-lock.json
+++ b/frontend/package-lock.json
@@ -12,40 +12,24 @@
"@fortawesome/free-solid-svg-icons": "^6.7.2",
"@fortawesome/react-fontawesome": "^0.2.6",
"@tailwindcss/vite": "^4.1.17",
- "graphql": "^16.12.0",
+ "openapi-fetch": "^0.17.0",
"react": "^19.2.1",
"react-dom": "^19.2.1",
"tailwindcss": "^4.1.11",
- "urql": "^4.2.2",
"wouter": "^3.8.1"
},
"devDependencies": {
"@biomejs/biome": "^2.3.8",
- "@graphql-codegen/cli": "^5.0.7",
- "@graphql-codegen/client-preset": "^4.8.3",
"@types/react": "^19.2.7",
"@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^4.7.0",
"globals": "^16.5.0",
+ "openapi-typescript": "^7.13.0",
"typescript": "~5.8.3",
"vite": "^7.2.6",
"vite-plugin-pwa": "^1.2.0"
}
},
- "node_modules/@0no-co/graphql.web": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/@0no-co/graphql.web/-/graphql.web-1.2.0.tgz",
- "integrity": "sha512-/1iHy9TTr63gE1YcR5idjx8UREz1s0kFhydf3bBLCXyqjhkIc6igAzTOx3zPifCwFR87tsh/4Pa9cNts6d2otw==",
- "license": "MIT",
- "peerDependencies": {
- "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0"
- },
- "peerDependenciesMeta": {
- "graphql": {
- "optional": true
- }
- }
- },
"node_modules/@apideck/better-ajv-errors": {
"version": "0.3.6",
"resolved": "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.6.tgz",
@@ -64,31 +48,6 @@
"ajv": ">=8"
}
},
- "node_modules/@ardatan/relay-compiler": {
- "version": "12.0.3",
- "resolved": "https://registry.npmjs.org/@ardatan/relay-compiler/-/relay-compiler-12.0.3.tgz",
- "integrity": "sha512-mBDFOGvAoVlWaWqs3hm1AciGHSQE1rqFc/liZTyYz/Oek9yZdT5H26pH2zAFuEiTiBVPPyMuqf5VjOFPI2DGsQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/generator": "^7.26.10",
- "@babel/parser": "^7.26.10",
- "@babel/runtime": "^7.26.10",
- "chalk": "^4.0.0",
- "fb-watchman": "^2.0.0",
- "immutable": "~3.7.6",
- "invariant": "^2.2.4",
- "nullthrows": "^1.1.1",
- "relay-runtime": "12.0.0",
- "signedsource": "^1.0.0"
- },
- "bin": {
- "relay-compiler": "bin/relay-compiler"
- },
- "peerDependencies": {
- "graphql": "*"
- }
- },
"node_modules/@babel/code-frame": {
"version": "7.27.1",
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz",
@@ -1808,50 +1767,6 @@
"node": ">=14.21.3"
}
},
- "node_modules/@envelop/core": {
- "version": "5.4.0",
- "resolved": "https://registry.npmjs.org/@envelop/core/-/core-5.4.0.tgz",
- "integrity": "sha512-/1fat63pySE8rw/dZZArEVytLD90JApY85deDJ0/34gm+yhQ3k70CloSUevxoOE4YCGveG3s9SJJfQeeB4NAtQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@envelop/instrumentation": "^1.0.0",
- "@envelop/types": "^5.2.1",
- "@whatwg-node/promise-helpers": "^1.2.4",
- "tslib": "^2.5.0"
- },
- "engines": {
- "node": ">=18.0.0"
- }
- },
- "node_modules/@envelop/instrumentation": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/@envelop/instrumentation/-/instrumentation-1.0.0.tgz",
- "integrity": "sha512-cxgkB66RQB95H3X27jlnxCRNTmPuSTgmBAq6/4n2Dtv4hsk4yz8FadA1ggmd0uZzvKqWD6CR+WFgTjhDqg7eyw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@whatwg-node/promise-helpers": "^1.2.1",
- "tslib": "^2.5.0"
- },
- "engines": {
- "node": ">=18.0.0"
- }
- },
- "node_modules/@envelop/types": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/@envelop/types/-/types-5.2.1.tgz",
- "integrity": "sha512-CsFmA3u3c2QoLDTfEpGr4t25fjMU31nyvse7IzWTvb0ZycuPjMjb0fjlheh+PbhBYb9YLugnT2uY6Mwcg1o+Zg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@whatwg-node/promise-helpers": "^1.0.0",
- "tslib": "^2.5.0"
- },
- "engines": {
- "node": ">=18.0.0"
- }
- },
"node_modules/@esbuild/aix-ppc64": {
"version": "0.25.12",
"resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz",
@@ -2268,13 +2183,6 @@
"node": ">=18"
}
},
- "node_modules/@fastify/busboy": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-3.2.0.tgz",
- "integrity": "sha512-m9FVDXU3GT2ITSe0UaMA5rU3QkfC/UXtCU8y0gSN/GugTqtVldOBWIB5V6V3sbmenVZUIpU6f+mPEO2+m5iTaA==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/@fortawesome/fontawesome-common-types": {
"version": "6.7.2",
"resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.7.2.tgz",
@@ -2321,920 +2229,6 @@
"react": "^16.3 || ^17.0.0 || ^18.0.0 || ^19.0.0"
}
},
- "node_modules/@graphql-codegen/add": {
- "version": "5.0.3",
- "resolved": "https://registry.npmjs.org/@graphql-codegen/add/-/add-5.0.3.tgz",
- "integrity": "sha512-SxXPmramkth8XtBlAHu4H4jYcYXM/o3p01+psU+0NADQowA8jtYkK6MW5rV6T+CxkEaNZItfSmZRPgIuypcqnA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@graphql-codegen/plugin-helpers": "^5.0.3",
- "tslib": "~2.6.0"
- },
- "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"
- }
- },
- "node_modules/@graphql-codegen/add/node_modules/tslib": {
- "version": "2.6.3",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz",
- "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==",
- "dev": true,
- "license": "0BSD"
- },
- "node_modules/@graphql-codegen/cli": {
- "version": "5.0.7",
- "resolved": "https://registry.npmjs.org/@graphql-codegen/cli/-/cli-5.0.7.tgz",
- "integrity": "sha512-h/sxYvSaWtxZxo8GtaA8SvcHTyViaaPd7dweF/hmRDpaQU1o3iU3EZxlcJ+oLTunU0tSMFsnrIXm/mhXxI11Cw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/generator": "^7.18.13",
- "@babel/template": "^7.18.10",
- "@babel/types": "^7.18.13",
- "@graphql-codegen/client-preset": "^4.8.2",
- "@graphql-codegen/core": "^4.0.2",
- "@graphql-codegen/plugin-helpers": "^5.1.1",
- "@graphql-tools/apollo-engine-loader": "^8.0.0",
- "@graphql-tools/code-file-loader": "^8.0.0",
- "@graphql-tools/git-loader": "^8.0.0",
- "@graphql-tools/github-loader": "^8.0.0",
- "@graphql-tools/graphql-file-loader": "^8.0.0",
- "@graphql-tools/json-file-loader": "^8.0.0",
- "@graphql-tools/load": "^8.1.0",
- "@graphql-tools/prisma-loader": "^8.0.0",
- "@graphql-tools/url-loader": "^8.0.0",
- "@graphql-tools/utils": "^10.0.0",
- "@whatwg-node/fetch": "^0.10.0",
- "chalk": "^4.1.0",
- "cosmiconfig": "^8.1.3",
- "debounce": "^1.2.0",
- "detect-indent": "^6.0.0",
- "graphql-config": "^5.1.1",
- "inquirer": "^8.0.0",
- "is-glob": "^4.0.1",
- "jiti": "^1.17.1",
- "json-to-pretty-yaml": "^1.2.2",
- "listr2": "^4.0.5",
- "log-symbols": "^4.0.0",
- "micromatch": "^4.0.5",
- "shell-quote": "^1.7.3",
- "string-env-interpolation": "^1.0.1",
- "ts-log": "^2.2.3",
- "tslib": "^2.4.0",
- "yaml": "^2.3.1",
- "yargs": "^17.0.0"
- },
- "bin": {
- "gql-gen": "cjs/bin.js",
- "graphql-code-generator": "cjs/bin.js",
- "graphql-codegen": "cjs/bin.js",
- "graphql-codegen-esm": "esm/bin.js"
- },
- "engines": {
- "node": ">=16"
- },
- "peerDependencies": {
- "@parcel/watcher": "^2.1.0",
- "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"
- },
- "peerDependenciesMeta": {
- "@parcel/watcher": {
- "optional": true
- }
- }
- },
- "node_modules/@graphql-codegen/client-preset": {
- "version": "4.8.3",
- "resolved": "https://registry.npmjs.org/@graphql-codegen/client-preset/-/client-preset-4.8.3.tgz",
- "integrity": "sha512-QpEsPSO9fnRxA6Z66AmBuGcwHjZ6dYSxYo5ycMlYgSPzAbyG8gn/kWljofjJfWqSY+T/lRn+r8IXTH14ml24vQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.20.2",
- "@babel/template": "^7.20.7",
- "@graphql-codegen/add": "^5.0.3",
- "@graphql-codegen/gql-tag-operations": "4.0.17",
- "@graphql-codegen/plugin-helpers": "^5.1.1",
- "@graphql-codegen/typed-document-node": "^5.1.2",
- "@graphql-codegen/typescript": "^4.1.6",
- "@graphql-codegen/typescript-operations": "^4.6.1",
- "@graphql-codegen/visitor-plugin-common": "^5.8.0",
- "@graphql-tools/documents": "^1.0.0",
- "@graphql-tools/utils": "^10.0.0",
- "@graphql-typed-document-node/core": "3.2.0",
- "tslib": "~2.6.0"
- },
- "engines": {
- "node": ">=16"
- },
- "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",
- "graphql-sock": "^1.0.0"
- },
- "peerDependenciesMeta": {
- "graphql-sock": {
- "optional": true
- }
- }
- },
- "node_modules/@graphql-codegen/client-preset/node_modules/tslib": {
- "version": "2.6.3",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz",
- "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==",
- "dev": true,
- "license": "0BSD"
- },
- "node_modules/@graphql-codegen/core": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/@graphql-codegen/core/-/core-4.0.2.tgz",
- "integrity": "sha512-IZbpkhwVqgizcjNiaVzNAzm/xbWT6YnGgeOLwVjm4KbJn3V2jchVtuzHH09G5/WkkLSk2wgbXNdwjM41JxO6Eg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@graphql-codegen/plugin-helpers": "^5.0.3",
- "@graphql-tools/schema": "^10.0.0",
- "@graphql-tools/utils": "^10.0.0",
- "tslib": "~2.6.0"
- },
- "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"
- }
- },
- "node_modules/@graphql-codegen/core/node_modules/tslib": {
- "version": "2.6.3",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz",
- "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==",
- "dev": true,
- "license": "0BSD"
- },
- "node_modules/@graphql-codegen/gql-tag-operations": {
- "version": "4.0.17",
- "resolved": "https://registry.npmjs.org/@graphql-codegen/gql-tag-operations/-/gql-tag-operations-4.0.17.tgz",
- "integrity": "sha512-2pnvPdIG6W9OuxkrEZ6hvZd142+O3B13lvhrZ48yyEBh2ujtmKokw0eTwDHtlXUqjVS0I3q7+HB2y12G/m69CA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@graphql-codegen/plugin-helpers": "^5.1.0",
- "@graphql-codegen/visitor-plugin-common": "5.8.0",
- "@graphql-tools/utils": "^10.0.0",
- "auto-bind": "~4.0.0",
- "tslib": "~2.6.0"
- },
- "engines": {
- "node": ">=16"
- },
- "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"
- }
- },
- "node_modules/@graphql-codegen/gql-tag-operations/node_modules/tslib": {
- "version": "2.6.3",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz",
- "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==",
- "dev": true,
- "license": "0BSD"
- },
- "node_modules/@graphql-codegen/plugin-helpers": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/@graphql-codegen/plugin-helpers/-/plugin-helpers-5.1.1.tgz",
- "integrity": "sha512-28GHODK2HY1NhdyRcPP3sCz0Kqxyfiz7boIZ8qIxFYmpLYnlDgiYok5fhFLVSZihyOpCs4Fa37gVHf/Q4I2FEg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@graphql-tools/utils": "^10.0.0",
- "change-case-all": "1.0.15",
- "common-tags": "1.8.2",
- "import-from": "4.0.0",
- "lodash": "~4.17.0",
- "tslib": "~2.6.0"
- },
- "engines": {
- "node": ">=16"
- },
- "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"
- }
- },
- "node_modules/@graphql-codegen/plugin-helpers/node_modules/tslib": {
- "version": "2.6.3",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz",
- "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==",
- "dev": true,
- "license": "0BSD"
- },
- "node_modules/@graphql-codegen/schema-ast": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/@graphql-codegen/schema-ast/-/schema-ast-4.1.0.tgz",
- "integrity": "sha512-kZVn0z+th9SvqxfKYgztA6PM7mhnSZaj4fiuBWvMTqA+QqQ9BBed6Pz41KuD/jr0gJtnlr2A4++/0VlpVbCTmQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@graphql-codegen/plugin-helpers": "^5.0.3",
- "@graphql-tools/utils": "^10.0.0",
- "tslib": "~2.6.0"
- },
- "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"
- }
- },
- "node_modules/@graphql-codegen/schema-ast/node_modules/tslib": {
- "version": "2.6.3",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz",
- "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==",
- "dev": true,
- "license": "0BSD"
- },
- "node_modules/@graphql-codegen/typed-document-node": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/@graphql-codegen/typed-document-node/-/typed-document-node-5.1.2.tgz",
- "integrity": "sha512-jaxfViDqFRbNQmfKwUY8hDyjnLTw2Z7DhGutxoOiiAI0gE/LfPe0LYaVFKVmVOOD7M3bWxoWfu4slrkbWbUbEw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@graphql-codegen/plugin-helpers": "^5.1.0",
- "@graphql-codegen/visitor-plugin-common": "5.8.0",
- "auto-bind": "~4.0.0",
- "change-case-all": "1.0.15",
- "tslib": "~2.6.0"
- },
- "engines": {
- "node": ">=16"
- },
- "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"
- }
- },
- "node_modules/@graphql-codegen/typed-document-node/node_modules/tslib": {
- "version": "2.6.3",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz",
- "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==",
- "dev": true,
- "license": "0BSD"
- },
- "node_modules/@graphql-codegen/typescript": {
- "version": "4.1.6",
- "resolved": "https://registry.npmjs.org/@graphql-codegen/typescript/-/typescript-4.1.6.tgz",
- "integrity": "sha512-vpw3sfwf9A7S+kIUjyFxuvrywGxd4lmwmyYnnDVjVE4kSQ6Td3DpqaPTy8aNQ6O96vFoi/bxbZS2BW49PwSUUA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@graphql-codegen/plugin-helpers": "^5.1.0",
- "@graphql-codegen/schema-ast": "^4.0.2",
- "@graphql-codegen/visitor-plugin-common": "5.8.0",
- "auto-bind": "~4.0.0",
- "tslib": "~2.6.0"
- },
- "engines": {
- "node": ">=16"
- },
- "peerDependencies": {
- "graphql": "^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0"
- }
- },
- "node_modules/@graphql-codegen/typescript-operations": {
- "version": "4.6.1",
- "resolved": "https://registry.npmjs.org/@graphql-codegen/typescript-operations/-/typescript-operations-4.6.1.tgz",
- "integrity": "sha512-k92laxhih7s0WZ8j5WMIbgKwhe64C0As6x+PdcvgZFMudDJ7rPJ/hFqJ9DCRxNjXoHmSjnr6VUuQZq4lT1RzCA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@graphql-codegen/plugin-helpers": "^5.1.0",
- "@graphql-codegen/typescript": "^4.1.6",
- "@graphql-codegen/visitor-plugin-common": "5.8.0",
- "auto-bind": "~4.0.0",
- "tslib": "~2.6.0"
- },
- "engines": {
- "node": ">=16"
- },
- "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",
- "graphql-sock": "^1.0.0"
- },
- "peerDependenciesMeta": {
- "graphql-sock": {
- "optional": true
- }
- }
- },
- "node_modules/@graphql-codegen/typescript-operations/node_modules/tslib": {
- "version": "2.6.3",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz",
- "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==",
- "dev": true,
- "license": "0BSD"
- },
- "node_modules/@graphql-codegen/typescript/node_modules/tslib": {
- "version": "2.6.3",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz",
- "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==",
- "dev": true,
- "license": "0BSD"
- },
- "node_modules/@graphql-codegen/visitor-plugin-common": {
- "version": "5.8.0",
- "resolved": "https://registry.npmjs.org/@graphql-codegen/visitor-plugin-common/-/visitor-plugin-common-5.8.0.tgz",
- "integrity": "sha512-lC1E1Kmuzi3WZUlYlqB4fP6+CvbKH9J+haU1iWmgsBx5/sO2ROeXJG4Dmt8gP03bI2BwjiwV5WxCEMlyeuzLnA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@graphql-codegen/plugin-helpers": "^5.1.0",
- "@graphql-tools/optimize": "^2.0.0",
- "@graphql-tools/relay-operation-optimizer": "^7.0.0",
- "@graphql-tools/utils": "^10.0.0",
- "auto-bind": "~4.0.0",
- "change-case-all": "1.0.15",
- "dependency-graph": "^0.11.0",
- "graphql-tag": "^2.11.0",
- "parse-filepath": "^1.0.2",
- "tslib": "~2.6.0"
- },
- "engines": {
- "node": ">=16"
- },
- "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"
- }
- },
- "node_modules/@graphql-codegen/visitor-plugin-common/node_modules/tslib": {
- "version": "2.6.3",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz",
- "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==",
- "dev": true,
- "license": "0BSD"
- },
- "node_modules/@graphql-hive/signal": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/@graphql-hive/signal/-/signal-1.0.0.tgz",
- "integrity": "sha512-RiwLMc89lTjvyLEivZ/qxAC5nBHoS2CtsWFSOsN35sxG9zoo5Z+JsFHM8MlvmO9yt+MJNIyC5MLE1rsbOphlag==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=18.0.0"
- }
- },
- "node_modules/@graphql-tools/apollo-engine-loader": {
- "version": "8.0.27",
- "resolved": "https://registry.npmjs.org/@graphql-tools/apollo-engine-loader/-/apollo-engine-loader-8.0.27.tgz",
- "integrity": "sha512-XT4BvqmRXkVaT8GgNb9/pr8u4M4vTcvGuI2GlvK+albrJNIV8VxTpsdVYma3kw+VtSIYrxEvLixlfDA/KdmDpg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@graphql-tools/utils": "^10.11.0",
- "@whatwg-node/fetch": "^0.10.13",
- "sync-fetch": "0.6.0-2",
- "tslib": "^2.4.0"
- },
- "engines": {
- "node": ">=16.0.0"
- },
- "peerDependencies": {
- "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0"
- }
- },
- "node_modules/@graphql-tools/batch-execute": {
- "version": "9.0.19",
- "resolved": "https://registry.npmjs.org/@graphql-tools/batch-execute/-/batch-execute-9.0.19.tgz",
- "integrity": "sha512-VGamgY4PLzSx48IHPoblRw0oTaBa7S26RpZXt0Y4NN90ytoE0LutlpB2484RbkfcTjv9wa64QD474+YP1kEgGA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@graphql-tools/utils": "^10.9.1",
- "@whatwg-node/promise-helpers": "^1.3.0",
- "dataloader": "^2.2.3",
- "tslib": "^2.8.1"
- },
- "engines": {
- "node": ">=18.0.0"
- },
- "peerDependencies": {
- "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0"
- }
- },
- "node_modules/@graphql-tools/code-file-loader": {
- "version": "8.1.27",
- "resolved": "https://registry.npmjs.org/@graphql-tools/code-file-loader/-/code-file-loader-8.1.27.tgz",
- "integrity": "sha512-q3GDbm+7m3DiAnqxa+lYMgYZd49+ez6iGFfXHmzP6qAnf5WlBxRNKNjNVuxOgoV30DCr+vOJfoXeU7VN1qqGWQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@graphql-tools/graphql-tag-pluck": "8.3.26",
- "@graphql-tools/utils": "^10.11.0",
- "globby": "^11.0.3",
- "tslib": "^2.4.0",
- "unixify": "^1.0.0"
- },
- "engines": {
- "node": ">=16.0.0"
- },
- "peerDependencies": {
- "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0"
- }
- },
- "node_modules/@graphql-tools/delegate": {
- "version": "10.2.23",
- "resolved": "https://registry.npmjs.org/@graphql-tools/delegate/-/delegate-10.2.23.tgz",
- "integrity": "sha512-xrPtl7f1LxS+B6o+W7ueuQh67CwRkfl+UKJncaslnqYdkxKmNBB4wnzVcW8ZsRdwbsla/v43PtwAvSlzxCzq2w==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@graphql-tools/batch-execute": "^9.0.19",
- "@graphql-tools/executor": "^1.4.9",
- "@graphql-tools/schema": "^10.0.25",
- "@graphql-tools/utils": "^10.9.1",
- "@repeaterjs/repeater": "^3.0.6",
- "@whatwg-node/promise-helpers": "^1.3.0",
- "dataloader": "^2.2.3",
- "dset": "^3.1.2",
- "tslib": "^2.8.1"
- },
- "engines": {
- "node": ">=18.0.0"
- },
- "peerDependencies": {
- "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0"
- }
- },
- "node_modules/@graphql-tools/documents": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/@graphql-tools/documents/-/documents-1.0.1.tgz",
- "integrity": "sha512-aweoMH15wNJ8g7b2r4C4WRuJxZ0ca8HtNO54rkye/3duxTkW4fGBEutCx03jCIr5+a1l+4vFJNP859QnAVBVCA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "lodash.sortby": "^4.7.0",
- "tslib": "^2.4.0"
- },
- "engines": {
- "node": ">=16.0.0"
- },
- "peerDependencies": {
- "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0"
- }
- },
- "node_modules/@graphql-tools/executor": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/@graphql-tools/executor/-/executor-1.5.0.tgz",
- "integrity": "sha512-3HzAxfexmynEWwRB56t/BT+xYKEYLGPvJudR1jfs+XZX8bpfqujEhqVFoxmkpEE8BbFcKuBNoQyGkTi1eFJ+hA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@graphql-tools/utils": "^10.11.0",
- "@graphql-typed-document-node/core": "^3.2.0",
- "@repeaterjs/repeater": "^3.0.4",
- "@whatwg-node/disposablestack": "^0.0.6",
- "@whatwg-node/promise-helpers": "^1.0.0",
- "tslib": "^2.4.0"
- },
- "engines": {
- "node": ">=16.0.0"
- },
- "peerDependencies": {
- "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0"
- }
- },
- "node_modules/@graphql-tools/executor-common": {
- "version": "0.0.4",
- "resolved": "https://registry.npmjs.org/@graphql-tools/executor-common/-/executor-common-0.0.4.tgz",
- "integrity": "sha512-SEH/OWR+sHbknqZyROCFHcRrbZeUAyjCsgpVWCRjqjqRbiJiXq6TxNIIOmpXgkrXWW/2Ev4Wms6YSGJXjdCs6Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@envelop/core": "^5.2.3",
- "@graphql-tools/utils": "^10.8.1"
- },
- "engines": {
- "node": ">=18.0.0"
- },
- "peerDependencies": {
- "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0"
- }
- },
- "node_modules/@graphql-tools/executor-graphql-ws": {
- "version": "2.0.7",
- "resolved": "https://registry.npmjs.org/@graphql-tools/executor-graphql-ws/-/executor-graphql-ws-2.0.7.tgz",
- "integrity": "sha512-J27za7sKF6RjhmvSOwOQFeNhNHyP4f4niqPnerJmq73OtLx9Y2PGOhkXOEB0PjhvPJceuttkD2O1yMgEkTGs3Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@graphql-tools/executor-common": "^0.0.6",
- "@graphql-tools/utils": "^10.9.1",
- "@whatwg-node/disposablestack": "^0.0.6",
- "graphql-ws": "^6.0.6",
- "isomorphic-ws": "^5.0.0",
- "tslib": "^2.8.1",
- "ws": "^8.18.3"
- },
- "engines": {
- "node": ">=18.0.0"
- },
- "peerDependencies": {
- "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0"
- }
- },
- "node_modules/@graphql-tools/executor-graphql-ws/node_modules/@graphql-tools/executor-common": {
- "version": "0.0.6",
- "resolved": "https://registry.npmjs.org/@graphql-tools/executor-common/-/executor-common-0.0.6.tgz",
- "integrity": "sha512-JAH/R1zf77CSkpYATIJw+eOJwsbWocdDjY+avY7G+P5HCXxwQjAjWVkJI1QJBQYjPQDVxwf1fmTZlIN3VOadow==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@envelop/core": "^5.3.0",
- "@graphql-tools/utils": "^10.9.1"
- },
- "engines": {
- "node": ">=18.0.0"
- },
- "peerDependencies": {
- "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0"
- }
- },
- "node_modules/@graphql-tools/executor-http": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/@graphql-tools/executor-http/-/executor-http-1.3.3.tgz",
- "integrity": "sha512-LIy+l08/Ivl8f8sMiHW2ebyck59JzyzO/yF9SFS4NH6MJZUezA1xThUXCDIKhHiD56h/gPojbkpcFvM2CbNE7A==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@graphql-hive/signal": "^1.0.0",
- "@graphql-tools/executor-common": "^0.0.4",
- "@graphql-tools/utils": "^10.8.1",
- "@repeaterjs/repeater": "^3.0.4",
- "@whatwg-node/disposablestack": "^0.0.6",
- "@whatwg-node/fetch": "^0.10.4",
- "@whatwg-node/promise-helpers": "^1.3.0",
- "meros": "^1.2.1",
- "tslib": "^2.8.1"
- },
- "engines": {
- "node": ">=18.0.0"
- },
- "peerDependencies": {
- "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0"
- }
- },
- "node_modules/@graphql-tools/executor-legacy-ws": {
- "version": "1.1.24",
- "resolved": "https://registry.npmjs.org/@graphql-tools/executor-legacy-ws/-/executor-legacy-ws-1.1.24.tgz",
- "integrity": "sha512-wfSpOJCxeBcwVXy3JS4TB4oLwVICuVKPlPQhcAjTRPWYwKerE0HosgUzxCX1fEQ4l1B1OMgKWRglGpoXExKqsQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@graphql-tools/utils": "^10.11.0",
- "@types/ws": "^8.0.0",
- "isomorphic-ws": "^5.0.0",
- "tslib": "^2.4.0",
- "ws": "^8.17.1"
- },
- "engines": {
- "node": ">=16.0.0"
- },
- "peerDependencies": {
- "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0"
- }
- },
- "node_modules/@graphql-tools/git-loader": {
- "version": "8.0.31",
- "resolved": "https://registry.npmjs.org/@graphql-tools/git-loader/-/git-loader-8.0.31.tgz",
- "integrity": "sha512-xVHM1JecjpU2P0aOj/IaIUc3w6It8sWOdrJElWFZdY9yfWRqXFYwfemtsn/JOrJDIJXYeGpJ304OeqJD5vFIEw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@graphql-tools/graphql-tag-pluck": "8.3.26",
- "@graphql-tools/utils": "^10.11.0",
- "is-glob": "4.0.3",
- "micromatch": "^4.0.8",
- "tslib": "^2.4.0",
- "unixify": "^1.0.0"
- },
- "engines": {
- "node": ">=16.0.0"
- },
- "peerDependencies": {
- "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0"
- }
- },
- "node_modules/@graphql-tools/github-loader": {
- "version": "8.0.22",
- "resolved": "https://registry.npmjs.org/@graphql-tools/github-loader/-/github-loader-8.0.22.tgz",
- "integrity": "sha512-uQ4JNcNPsyMkTIgzeSbsoT9hogLjYrZooLUYd173l5eUGUi49EAcsGdiBCKaKfEjanv410FE8hjaHr7fjSRkJw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@graphql-tools/executor-http": "^1.1.9",
- "@graphql-tools/graphql-tag-pluck": "^8.3.21",
- "@graphql-tools/utils": "^10.9.1",
- "@whatwg-node/fetch": "^0.10.0",
- "@whatwg-node/promise-helpers": "^1.0.0",
- "sync-fetch": "0.6.0-2",
- "tslib": "^2.4.0"
- },
- "engines": {
- "node": ">=16.0.0"
- },
- "peerDependencies": {
- "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0"
- }
- },
- "node_modules/@graphql-tools/graphql-file-loader": {
- "version": "8.1.8",
- "resolved": "https://registry.npmjs.org/@graphql-tools/graphql-file-loader/-/graphql-file-loader-8.1.8.tgz",
- "integrity": "sha512-dZi9Cw+NWEzJAqzIUON9qjZfjebjcoT4H6jqLkEoAv6kRtTq52m4BLXgFWjMHU7PNLE9OOHB9St7UeZQL+GYrw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@graphql-tools/import": "7.1.8",
- "@graphql-tools/utils": "^10.11.0",
- "globby": "^11.0.3",
- "tslib": "^2.4.0",
- "unixify": "^1.0.0"
- },
- "engines": {
- "node": ">=16.0.0"
- },
- "peerDependencies": {
- "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0"
- }
- },
- "node_modules/@graphql-tools/graphql-tag-pluck": {
- "version": "8.3.26",
- "resolved": "https://registry.npmjs.org/@graphql-tools/graphql-tag-pluck/-/graphql-tag-pluck-8.3.26.tgz",
- "integrity": "sha512-hLsX++KA3YR/PnNJGBq1weSAY8XUUAQFfOSHanLHA2qs5lcNgU6KWbiLiRsJ/B/ZNi2ZO687dhzeZ4h4Yt0V6Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/core": "^7.26.10",
- "@babel/parser": "^7.26.10",
- "@babel/plugin-syntax-import-assertions": "^7.26.0",
- "@babel/traverse": "^7.26.10",
- "@babel/types": "^7.26.10",
- "@graphql-tools/utils": "^10.11.0",
- "tslib": "^2.4.0"
- },
- "engines": {
- "node": ">=16.0.0"
- },
- "peerDependencies": {
- "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0"
- }
- },
- "node_modules/@graphql-tools/import": {
- "version": "7.1.8",
- "resolved": "https://registry.npmjs.org/@graphql-tools/import/-/import-7.1.8.tgz",
- "integrity": "sha512-aUKHMbaeHhCkS867mNCk9sJuvd9xE3Ocr+alwdvILkDxHf7Xaumx4mK8tN9FAXeKhQWGGD5QpkIBnUzt2xoX/A==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@graphql-tools/utils": "^10.11.0",
- "@theguild/federation-composition": "^0.21.0",
- "resolve-from": "5.0.0",
- "tslib": "^2.4.0"
- },
- "engines": {
- "node": ">=16.0.0"
- },
- "peerDependencies": {
- "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0"
- }
- },
- "node_modules/@graphql-tools/json-file-loader": {
- "version": "8.0.25",
- "resolved": "https://registry.npmjs.org/@graphql-tools/json-file-loader/-/json-file-loader-8.0.25.tgz",
- "integrity": "sha512-Dnr9z818Kdn3rfoZO/+/ZQUqWavjV7AhEp4edV1mGsX+J1HFkNC3WMl6MD3W0hth2HWLQpCFJDdOPnchxnFNfA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@graphql-tools/utils": "^10.11.0",
- "globby": "^11.0.3",
- "tslib": "^2.4.0",
- "unixify": "^1.0.0"
- },
- "engines": {
- "node": ">=16.0.0"
- },
- "peerDependencies": {
- "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0"
- }
- },
- "node_modules/@graphql-tools/load": {
- "version": "8.1.7",
- "resolved": "https://registry.npmjs.org/@graphql-tools/load/-/load-8.1.7.tgz",
- "integrity": "sha512-RxrHOC4vVI50+Q1mwgpmTVCB/UDDYVEGD/g/hP3tT2BW9F3rJ7Z3Lmt/nGfPQuWPao3w6vgJ9oSAWtism7CU5w==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@graphql-tools/schema": "^10.0.30",
- "@graphql-tools/utils": "^10.11.0",
- "p-limit": "3.1.0",
- "tslib": "^2.4.0"
- },
- "engines": {
- "node": ">=16.0.0"
- },
- "peerDependencies": {
- "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0"
- }
- },
- "node_modules/@graphql-tools/merge": {
- "version": "9.1.6",
- "resolved": "https://registry.npmjs.org/@graphql-tools/merge/-/merge-9.1.6.tgz",
- "integrity": "sha512-bTnP+4oom4nDjmkS3Ykbe+ljAp/RIiWP3R35COMmuucS24iQxGLa9Hn8VMkLIoaoPxgz6xk+dbC43jtkNsFoBw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@graphql-tools/utils": "^10.11.0",
- "tslib": "^2.4.0"
- },
- "engines": {
- "node": ">=16.0.0"
- },
- "peerDependencies": {
- "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0"
- }
- },
- "node_modules/@graphql-tools/optimize": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/@graphql-tools/optimize/-/optimize-2.0.0.tgz",
- "integrity": "sha512-nhdT+CRGDZ+bk68ic+Jw1OZ99YCDIKYA5AlVAnBHJvMawSx9YQqQAIj4refNc1/LRieGiuWvhbG3jvPVYho0Dg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "tslib": "^2.4.0"
- },
- "engines": {
- "node": ">=16.0.0"
- },
- "peerDependencies": {
- "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0"
- }
- },
- "node_modules/@graphql-tools/prisma-loader": {
- "version": "8.0.17",
- "resolved": "https://registry.npmjs.org/@graphql-tools/prisma-loader/-/prisma-loader-8.0.17.tgz",
- "integrity": "sha512-fnuTLeQhqRbA156pAyzJYN0KxCjKYRU5bz1q/SKOwElSnAU4k7/G1kyVsWLh7fneY78LoMNH5n+KlFV8iQlnyg==",
- "deprecated": "This package was intended to be used with an older versions of Prisma.\\nThe newer versions of Prisma has a different approach to GraphQL integration.\\nTherefore, this package is no longer needed and has been deprecated and removed.\\nLearn more: https://www.prisma.io/graphql",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@graphql-tools/url-loader": "^8.0.15",
- "@graphql-tools/utils": "^10.5.6",
- "@types/js-yaml": "^4.0.0",
- "@whatwg-node/fetch": "^0.10.0",
- "chalk": "^4.1.0",
- "debug": "^4.3.1",
- "dotenv": "^16.0.0",
- "graphql-request": "^6.0.0",
- "http-proxy-agent": "^7.0.0",
- "https-proxy-agent": "^7.0.0",
- "jose": "^5.0.0",
- "js-yaml": "^4.0.0",
- "lodash": "^4.17.20",
- "scuid": "^1.1.0",
- "tslib": "^2.4.0",
- "yaml-ast-parser": "^0.0.43"
- },
- "engines": {
- "node": ">=16.0.0"
- },
- "peerDependencies": {
- "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0"
- }
- },
- "node_modules/@graphql-tools/relay-operation-optimizer": {
- "version": "7.0.26",
- "resolved": "https://registry.npmjs.org/@graphql-tools/relay-operation-optimizer/-/relay-operation-optimizer-7.0.26.tgz",
- "integrity": "sha512-cVdS2Hw4hg/WgPVV2wRIzZM975pW5k4vdih3hR4SvEDQVr6MmozmlTQSqzMyi9yg8LKTq540Oz3bYQa286yGmg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@ardatan/relay-compiler": "^12.0.3",
- "@graphql-tools/utils": "^10.11.0",
- "tslib": "^2.4.0"
- },
- "engines": {
- "node": ">=16.0.0"
- },
- "peerDependencies": {
- "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0"
- }
- },
- "node_modules/@graphql-tools/schema": {
- "version": "10.0.30",
- "resolved": "https://registry.npmjs.org/@graphql-tools/schema/-/schema-10.0.30.tgz",
- "integrity": "sha512-yPXU17uM/LR90t92yYQqn9mAJNOVZJc0nQtYeZyZeQZeQjwIGlTubvvoDL0fFVk+wZzs4YQOgds2NwSA4npodA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@graphql-tools/merge": "^9.1.6",
- "@graphql-tools/utils": "^10.11.0",
- "tslib": "^2.4.0"
- },
- "engines": {
- "node": ">=16.0.0"
- },
- "peerDependencies": {
- "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0"
- }
- },
- "node_modules/@graphql-tools/url-loader": {
- "version": "8.0.33",
- "resolved": "https://registry.npmjs.org/@graphql-tools/url-loader/-/url-loader-8.0.33.tgz",
- "integrity": "sha512-Fu626qcNHcqAj8uYd7QRarcJn5XZ863kmxsg1sm0fyjyfBJnsvC7ddFt6Hayz5kxVKfsnjxiDfPMXanvsQVBKw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@graphql-tools/executor-graphql-ws": "^2.0.1",
- "@graphql-tools/executor-http": "^1.1.9",
- "@graphql-tools/executor-legacy-ws": "^1.1.19",
- "@graphql-tools/utils": "^10.9.1",
- "@graphql-tools/wrap": "^10.0.16",
- "@types/ws": "^8.0.0",
- "@whatwg-node/fetch": "^0.10.0",
- "@whatwg-node/promise-helpers": "^1.0.0",
- "isomorphic-ws": "^5.0.0",
- "sync-fetch": "0.6.0-2",
- "tslib": "^2.4.0",
- "ws": "^8.17.1"
- },
- "engines": {
- "node": ">=16.0.0"
- },
- "peerDependencies": {
- "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0"
- }
- },
- "node_modules/@graphql-tools/utils": {
- "version": "10.11.0",
- "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.11.0.tgz",
- "integrity": "sha512-iBFR9GXIs0gCD+yc3hoNswViL1O5josI33dUqiNStFI/MHLCEPduasceAcazRH77YONKNiviHBV8f7OgcT4o2Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@graphql-typed-document-node/core": "^3.1.1",
- "@whatwg-node/promise-helpers": "^1.0.0",
- "cross-inspect": "1.0.1",
- "tslib": "^2.4.0"
- },
- "engines": {
- "node": ">=16.0.0"
- },
- "peerDependencies": {
- "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0"
- }
- },
- "node_modules/@graphql-tools/wrap": {
- "version": "10.1.4",
- "resolved": "https://registry.npmjs.org/@graphql-tools/wrap/-/wrap-10.1.4.tgz",
- "integrity": "sha512-7pyNKqXProRjlSdqOtrbnFRMQAVamCmEREilOXtZujxY6kYit3tvWWSjUrcIOheltTffoRh7EQSjpy2JDCzasg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@graphql-tools/delegate": "^10.2.23",
- "@graphql-tools/schema": "^10.0.25",
- "@graphql-tools/utils": "^10.9.1",
- "@whatwg-node/promise-helpers": "^1.3.0",
- "tslib": "^2.8.1"
- },
- "engines": {
- "node": ">=18.0.0"
- },
- "peerDependencies": {
- "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0"
- }
- },
- "node_modules/@graphql-typed-document-node/core": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.2.0.tgz",
- "integrity": "sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==",
- "dev": true,
- "license": "MIT",
- "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"
- }
- },
- "node_modules/@inquirer/external-editor": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.3.tgz",
- "integrity": "sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "chardet": "^2.1.1",
- "iconv-lite": "^0.7.0"
- },
- "engines": {
- "node": ">=18"
- },
- "peerDependencies": {
- "@types/node": ">=18"
- },
- "peerDependenciesMeta": {
- "@types/node": {
- "optional": true
- }
- }
- },
"node_modules/@isaacs/balanced-match": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz",
@@ -3417,51 +2411,72 @@
"@jridgewell/sourcemap-codec": "^1.4.14"
}
},
- "node_modules/@nodelib/fs.scandir": {
- "version": "2.1.5",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
- "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "node_modules/@redocly/ajv": {
+ "version": "8.17.4",
+ "resolved": "https://registry.npmjs.org/@redocly/ajv/-/ajv-8.17.4.tgz",
+ "integrity": "sha512-BieiCML/IgP6x99HZByJSt7fJE4ipgzO7KAFss92Bs+PEI35BhY7vGIysFXLT+YmS7nHtQjZjhOQyPPEf7xGHA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@nodelib/fs.stat": "2.0.5",
- "run-parallel": "^1.1.9"
+ "fast-deep-equal": "^3.1.3",
+ "fast-uri": "^3.0.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2"
},
- "engines": {
- "node": ">= 8"
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
}
},
- "node_modules/@nodelib/fs.stat": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
- "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+ "node_modules/@redocly/config": {
+ "version": "0.22.2",
+ "resolved": "https://registry.npmjs.org/@redocly/config/-/config-0.22.2.tgz",
+ "integrity": "sha512-roRDai8/zr2S9YfmzUfNhKjOF0NdcOIqF7bhf4MVC5UxpjIysDjyudvlAiVbpPHp3eDRWbdzUgtkK1a7YiDNyQ==",
"dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 8"
- }
+ "license": "MIT"
},
- "node_modules/@nodelib/fs.walk": {
- "version": "1.2.8",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
- "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+ "node_modules/@redocly/openapi-core": {
+ "version": "1.34.6",
+ "resolved": "https://registry.npmjs.org/@redocly/openapi-core/-/openapi-core-1.34.6.tgz",
+ "integrity": "sha512-2+O+riuIUgVSuLl3Lyh5AplWZyVMNuG2F98/o6NrutKJfW4/GTZdPpZlIphS0HGgcOHgmWcCSHj+dWFlZaGSHw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@nodelib/fs.scandir": "2.1.5",
- "fastq": "^1.6.0"
+ "@redocly/ajv": "^8.11.2",
+ "@redocly/config": "^0.22.0",
+ "colorette": "^1.2.0",
+ "https-proxy-agent": "^7.0.5",
+ "js-levenshtein": "^1.1.6",
+ "js-yaml": "^4.1.0",
+ "minimatch": "^5.0.1",
+ "pluralize": "^8.0.0",
+ "yaml-ast-parser": "0.0.43"
},
"engines": {
- "node": ">= 8"
+ "node": ">=18.17.0",
+ "npm": ">=9.5.0"
}
},
- "node_modules/@repeaterjs/repeater": {
- "version": "3.0.6",
- "resolved": "https://registry.npmjs.org/@repeaterjs/repeater/-/repeater-3.0.6.tgz",
- "integrity": "sha512-Javneu5lsuhwNCryN+pXH93VPQ8g0dBX7wItHFgYiwQmzE1sVdg5tWHiOgHywzL2W21XQopa7IwIEnNbmeUJYA==",
+ "node_modules/@redocly/openapi-core/node_modules/colorette": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz",
+ "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==",
"dev": true,
"license": "MIT"
},
+ "node_modules/@redocly/openapi-core/node_modules/minimatch": {
+ "version": "5.1.6",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
+ "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/@rolldown/pluginutils": {
"version": "1.0.0-beta.27",
"resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz",
@@ -4128,25 +3143,6 @@
"vite": "^5.2.0 || ^6 || ^7"
}
},
- "node_modules/@theguild/federation-composition": {
- "version": "0.21.0",
- "resolved": "https://registry.npmjs.org/@theguild/federation-composition/-/federation-composition-0.21.0.tgz",
- "integrity": "sha512-cdQ9rDEtBpT553DLLtcsSjtSDIadibIxAD3K5r0eUuDOfxx+es7Uk+aOucfqMlNOM3eybsgJN3T2SQmEsINwmw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "constant-case": "^3.0.4",
- "debug": "4.4.3",
- "json5": "^2.2.3",
- "lodash.sortby": "^4.7.0"
- },
- "engines": {
- "node": ">=18"
- },
- "peerDependencies": {
- "graphql": "^16.0.0"
- }
- },
"node_modules/@types/babel__core": {
"version": "7.20.5",
"resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
@@ -4198,19 +3194,13 @@
"integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
"license": "MIT"
},
- "node_modules/@types/js-yaml": {
- "version": "4.0.9",
- "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.9.tgz",
- "integrity": "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/@types/node": {
"version": "24.10.1",
"resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.1.tgz",
"integrity": "sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ==",
- "devOptional": true,
"license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"undici-types": "~7.16.0"
}
@@ -4249,26 +3239,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/@types/ws": {
- "version": "8.18.1",
- "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz",
- "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/node": "*"
- }
- },
- "node_modules/@urql/core": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/@urql/core/-/core-5.2.0.tgz",
- "integrity": "sha512-/n0ieD0mvvDnVAXEQgX/7qJiVcvYvNkOHeBvkwtylfjydar123caCXcl58PXFY11oU1oquJocVXHxLAbtv4x1A==",
- "license": "MIT",
- "dependencies": {
- "@0no-co/graphql.web": "^1.0.13",
- "wonka": "^6.3.2"
- }
- },
"node_modules/@vitejs/plugin-react": {
"version": "4.7.0",
"resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz",
@@ -4290,63 +3260,6 @@
"vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0"
}
},
- "node_modules/@whatwg-node/disposablestack": {
- "version": "0.0.6",
- "resolved": "https://registry.npmjs.org/@whatwg-node/disposablestack/-/disposablestack-0.0.6.tgz",
- "integrity": "sha512-LOtTn+JgJvX8WfBVJtF08TGrdjuFzGJc4mkP8EdDI8ADbvO7kiexYep1o8dwnt0okb0jYclCDXF13xU7Ge4zSw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@whatwg-node/promise-helpers": "^1.0.0",
- "tslib": "^2.6.3"
- },
- "engines": {
- "node": ">=18.0.0"
- }
- },
- "node_modules/@whatwg-node/fetch": {
- "version": "0.10.13",
- "resolved": "https://registry.npmjs.org/@whatwg-node/fetch/-/fetch-0.10.13.tgz",
- "integrity": "sha512-b4PhJ+zYj4357zwk4TTuF2nEe0vVtOrwdsrNo5hL+u1ojXNhh1FgJ6pg1jzDlwlT4oBdzfSwaBwMCtFCsIWg8Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@whatwg-node/node-fetch": "^0.8.3",
- "urlpattern-polyfill": "^10.0.0"
- },
- "engines": {
- "node": ">=18.0.0"
- }
- },
- "node_modules/@whatwg-node/node-fetch": {
- "version": "0.8.4",
- "resolved": "https://registry.npmjs.org/@whatwg-node/node-fetch/-/node-fetch-0.8.4.tgz",
- "integrity": "sha512-AlKLc57loGoyYlrzDbejB9EeR+pfdJdGzbYnkEuZaGekFboBwzfVYVMsy88PMriqPI1ORpiGYGgSSWpx7a2sDA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@fastify/busboy": "^3.1.1",
- "@whatwg-node/disposablestack": "^0.0.6",
- "@whatwg-node/promise-helpers": "^1.3.2",
- "tslib": "^2.6.3"
- },
- "engines": {
- "node": ">=18.0.0"
- }
- },
- "node_modules/@whatwg-node/promise-helpers": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/@whatwg-node/promise-helpers/-/promise-helpers-1.3.2.tgz",
- "integrity": "sha512-Nst5JdK47VIl9UcGwtv2Rcgyn5lWtZ0/mhRQ4G8NN2isxpq2TO30iqHzmwoJycjWuyUfg3GFXqP/gFHXeV57IA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "tslib": "^2.6.3"
- },
- "engines": {
- "node": ">=16.0.0"
- }
- },
"node_modules/acorn": {
"version": "8.15.0",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz",
@@ -4370,20 +3283,6 @@
"node": ">= 14"
}
},
- "node_modules/aggregate-error": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz",
- "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "clean-stack": "^2.0.0",
- "indent-string": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/ajv": {
"version": "8.17.1",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
@@ -4401,20 +3300,14 @@
"url": "https://github.com/sponsors/epoberezkin"
}
},
- "node_modules/ansi-escapes": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
- "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
+ "node_modules/ansi-colors": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz",
+ "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "type-fest": "^0.21.3"
- },
"engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "node": ">=6"
}
},
"node_modules/ansi-regex": {
@@ -4467,16 +3360,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/array-union": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
- "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/arraybuffer.prototype.slice": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz",
@@ -4499,23 +3382,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/asap": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
- "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/astral-regex": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
- "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/async": {
"version": "3.2.6",
"resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz",
@@ -4543,19 +3409,6 @@
"node": ">= 4.0.0"
}
},
- "node_modules/auto-bind": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/auto-bind/-/auto-bind-4.0.0.tgz",
- "integrity": "sha512-Hdw8qdNiqdJ8LqT0iK0sVzkFbzg6fhnQqqfWhBDxcHZvU75+B+ayzTy8x+k5Ix0Y92XOhOUlx74ps+bA6BeYMQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/available-typed-arrays": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz",
@@ -4621,27 +3474,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/base64-js": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
- "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
- "license": "MIT"
- },
"node_modules/baseline-browser-mapping": {
"version": "2.9.4",
"resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.4.tgz",
@@ -4652,18 +3484,6 @@
"baseline-browser-mapping": "dist/cli.js"
}
},
- "node_modules/bl": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz",
- "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "buffer": "^5.5.0",
- "inherits": "^2.0.4",
- "readable-stream": "^3.4.0"
- }
- },
"node_modules/brace-expansion": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
@@ -4674,19 +3494,6 @@
"balanced-match": "^1.0.0"
}
},
- "node_modules/braces": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
- "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "fill-range": "^7.1.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/browserslist": {
"version": "4.28.1",
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz",
@@ -4721,41 +3528,6 @@
"node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
}
},
- "node_modules/bser": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz",
- "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "node-int64": "^0.4.0"
- }
- },
- "node_modules/buffer": {
- "version": "5.7.1",
- "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
- "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "base64-js": "^1.3.1",
- "ieee754": "^1.1.13"
- }
- },
"node_modules/buffer-from": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
@@ -4813,27 +3585,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/callsites": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
- "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/camel-case": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz",
- "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "pascal-case": "^3.1.2",
- "tslib": "^2.0.3"
- }
- },
"node_modules/caniuse-lite": {
"version": "1.0.30001759",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001759.tgz",
@@ -4855,188 +3606,6 @@
],
"license": "CC-BY-4.0"
},
- "node_modules/capital-case": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/capital-case/-/capital-case-1.0.4.tgz",
- "integrity": "sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "no-case": "^3.0.4",
- "tslib": "^2.0.3",
- "upper-case-first": "^2.0.2"
- }
- },
- "node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/change-case": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/change-case/-/change-case-4.1.2.tgz",
- "integrity": "sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "camel-case": "^4.1.2",
- "capital-case": "^1.0.4",
- "constant-case": "^3.0.4",
- "dot-case": "^3.0.4",
- "header-case": "^2.0.4",
- "no-case": "^3.0.4",
- "param-case": "^3.0.4",
- "pascal-case": "^3.1.2",
- "path-case": "^3.0.4",
- "sentence-case": "^3.0.4",
- "snake-case": "^3.0.4",
- "tslib": "^2.0.3"
- }
- },
- "node_modules/change-case-all": {
- "version": "1.0.15",
- "resolved": "https://registry.npmjs.org/change-case-all/-/change-case-all-1.0.15.tgz",
- "integrity": "sha512-3+GIFhk3sNuvFAJKU46o26OdzudQlPNBCu1ZQi3cMeMHhty1bhDxu2WrEilVNYaGvqUtR1VSigFcJOiS13dRhQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "change-case": "^4.1.2",
- "is-lower-case": "^2.0.2",
- "is-upper-case": "^2.0.2",
- "lower-case": "^2.0.2",
- "lower-case-first": "^2.0.2",
- "sponge-case": "^1.0.1",
- "swap-case": "^2.0.2",
- "title-case": "^3.0.3",
- "upper-case": "^2.0.2",
- "upper-case-first": "^2.0.2"
- }
- },
- "node_modules/chardet": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.1.tgz",
- "integrity": "sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/clean-stack": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
- "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/cli-cursor": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
- "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "restore-cursor": "^3.1.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/cli-spinners": {
- "version": "2.9.2",
- "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz",
- "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/cli-truncate": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz",
- "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "slice-ansi": "^3.0.0",
- "string-width": "^4.2.0"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/cli-width": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz",
- "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==",
- "dev": true,
- "license": "ISC",
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/cliui": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
- "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "string-width": "^4.2.0",
- "strip-ansi": "^6.0.1",
- "wrap-ansi": "^7.0.0"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/cliui/node_modules/wrap-ansi": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
- "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^4.0.0",
- "string-width": "^4.1.0",
- "strip-ansi": "^6.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
- }
- },
- "node_modules/clone": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
- "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.8"
- }
- },
"node_modules/color-convert": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
@@ -5057,13 +3626,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/colorette": {
- "version": "2.0.20",
- "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz",
- "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/commander": {
"version": "2.20.3",
"resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
@@ -5081,18 +3643,6 @@
"node": ">=4.0.0"
}
},
- "node_modules/constant-case": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-3.0.4.tgz",
- "integrity": "sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "no-case": "^3.0.4",
- "tslib": "^2.0.3",
- "upper-case": "^2.0.2"
- }
- },
"node_modules/convert-source-map": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
@@ -5114,56 +3664,6 @@
"url": "https://opencollective.com/core-js"
}
},
- "node_modules/cosmiconfig": {
- "version": "8.3.6",
- "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz",
- "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "import-fresh": "^3.3.0",
- "js-yaml": "^4.1.0",
- "parse-json": "^5.2.0",
- "path-type": "^4.0.0"
- },
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "url": "https://github.com/sponsors/d-fischer"
- },
- "peerDependencies": {
- "typescript": ">=4.9.5"
- },
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- }
- }
- },
- "node_modules/cross-fetch": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.2.0.tgz",
- "integrity": "sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "node-fetch": "^2.7.0"
- }
- },
- "node_modules/cross-inspect": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/cross-inspect/-/cross-inspect-1.0.1.tgz",
- "integrity": "sha512-Pcw1JTvZLSJH83iiGWt6fRcT+BjZlCDRVwYLbUcHzv/CRpB7r0MlSrGbIyQvVSNyGnbt7G4AXuyCiDR3POvZ1A==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "tslib": "^2.4.0"
- },
- "engines": {
- "node": ">=16.0.0"
- }
- },
"node_modules/cross-spawn": {
"version": "7.0.6",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
@@ -5196,16 +3696,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/data-uri-to-buffer": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz",
- "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 12"
- }
- },
"node_modules/data-view-buffer": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz",
@@ -5260,20 +3750,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/dataloader": {
- "version": "2.2.3",
- "resolved": "https://registry.npmjs.org/dataloader/-/dataloader-2.2.3.tgz",
- "integrity": "sha512-y2krtASINtPFS1rSDjacrFgn1dcUuoREVabwlOGOe4SdxenREqwjwjElAdwvbGM7kgZz9a3KVicWR7vcz8rnzA==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/debounce": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz",
- "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/debug": {
"version": "4.4.3",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
@@ -5302,19 +3778,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/defaults": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz",
- "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "clone": "^1.0.2"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/define-data-property": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
@@ -5351,26 +3814,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/dependency-graph": {
- "version": "0.11.0",
- "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz",
- "integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.6.0"
- }
- },
- "node_modules/detect-indent": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz",
- "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/detect-libc": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
@@ -5380,53 +3823,6 @@
"node": ">=8"
}
},
- "node_modules/dir-glob": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
- "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "path-type": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/dot-case": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz",
- "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "no-case": "^3.0.4",
- "tslib": "^2.0.3"
- }
- },
- "node_modules/dotenv": {
- "version": "16.6.1",
- "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz",
- "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==",
- "dev": true,
- "license": "BSD-2-Clause",
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://dotenvx.com"
- }
- },
- "node_modules/dset": {
- "version": "3.1.4",
- "resolved": "https://registry.npmjs.org/dset/-/dset-3.1.4.tgz",
- "integrity": "sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=4"
- }
- },
"node_modules/dunder-proto": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
@@ -5492,16 +3888,6 @@
"node": ">=10.13.0"
}
},
- "node_modules/error-ex": {
- "version": "1.3.4",
- "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz",
- "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-arrayish": "^0.2.1"
- }
- },
"node_modules/es-abstract": {
"version": "1.24.0",
"resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz",
@@ -5689,16 +4075,6 @@
"node": ">=6"
}
},
- "node_modules/escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.8.0"
- }
- },
"node_modules/estree-walker": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
@@ -5723,23 +4099,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/fast-glob": {
- "version": "3.3.3",
- "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
- "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@nodelib/fs.stat": "^2.0.2",
- "@nodelib/fs.walk": "^1.2.3",
- "glob-parent": "^5.1.2",
- "merge2": "^1.3.0",
- "micromatch": "^4.0.8"
- },
- "engines": {
- "node": ">=8.6.0"
- }
- },
"node_modules/fast-json-stable-stringify": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
@@ -5764,89 +4123,6 @@
],
"license": "BSD-3-Clause"
},
- "node_modules/fastq": {
- "version": "1.19.1",
- "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz",
- "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "reusify": "^1.0.4"
- }
- },
- "node_modules/fb-watchman": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz",
- "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "bser": "2.1.1"
- }
- },
- "node_modules/fbjs": {
- "version": "3.0.5",
- "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-3.0.5.tgz",
- "integrity": "sha512-ztsSx77JBtkuMrEypfhgc3cI0+0h+svqeie7xHbh1k/IKdcydnvadp/mUaGgjAOXQmQSxsqgaRhS3q9fy+1kxg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "cross-fetch": "^3.1.5",
- "fbjs-css-vars": "^1.0.0",
- "loose-envify": "^1.0.0",
- "object-assign": "^4.1.0",
- "promise": "^7.1.1",
- "setimmediate": "^1.0.5",
- "ua-parser-js": "^1.0.35"
- }
- },
- "node_modules/fbjs-css-vars": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz",
- "integrity": "sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/fetch-blob": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz",
- "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/jimmywarting"
- },
- {
- "type": "paypal",
- "url": "https://paypal.me/jimmywarting"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "node-domexception": "^1.0.0",
- "web-streams-polyfill": "^3.0.3"
- },
- "engines": {
- "node": "^12.20 || >= 14.13"
- }
- },
- "node_modules/figures": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz",
- "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "escape-string-regexp": "^1.0.5"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/filelist": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz",
@@ -5870,19 +4146,6 @@
"node": ">=10"
}
},
- "node_modules/fill-range": {
- "version": "7.1.1",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
- "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "to-regex-range": "^5.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/for-each": {
"version": "0.3.5",
"resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz",
@@ -5929,19 +4192,6 @@
"url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/formdata-polyfill": {
- "version": "4.0.10",
- "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz",
- "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "fetch-blob": "^3.1.2"
- },
- "engines": {
- "node": ">=12.20.0"
- }
- },
"node_modules/fs-extra": {
"version": "9.1.0",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
@@ -6033,16 +4283,6 @@
"node": ">=6.9.0"
}
},
- "node_modules/get-caller-file": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
- "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
- "dev": true,
- "license": "ISC",
- "engines": {
- "node": "6.* || 8.* || >= 10.*"
- }
- },
"node_modules/get-intrinsic": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
@@ -6131,19 +4371,6 @@
"url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/glob-parent": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
- "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "is-glob": "^4.0.1"
- },
- "engines": {
- "node": ">= 6"
- }
- },
"node_modules/glob/node_modules/minimatch": {
"version": "10.1.1",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz",
@@ -6190,27 +4417,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/globby": {
- "version": "11.1.0",
- "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
- "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "array-union": "^2.1.0",
- "dir-glob": "^3.0.1",
- "fast-glob": "^3.2.9",
- "ignore": "^5.2.0",
- "merge2": "^1.4.1",
- "slash": "^3.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/gopd": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
@@ -6230,118 +4436,6 @@
"integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
"license": "ISC"
},
- "node_modules/graphql": {
- "version": "16.12.0",
- "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.12.0.tgz",
- "integrity": "sha512-DKKrynuQRne0PNpEbzuEdHlYOMksHSUI8Zc9Unei5gTsMNA2/vMpoMz/yKba50pejK56qj98qM0SjYxAKi13gQ==",
- "license": "MIT",
- "engines": {
- "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0"
- }
- },
- "node_modules/graphql-config": {
- "version": "5.1.5",
- "resolved": "https://registry.npmjs.org/graphql-config/-/graphql-config-5.1.5.tgz",
- "integrity": "sha512-mG2LL1HccpU8qg5ajLROgdsBzx/o2M6kgI3uAmoaXiSH9PCUbtIyLomLqUtCFaAeG2YCFsl0M5cfQ9rKmDoMVA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@graphql-tools/graphql-file-loader": "^8.0.0",
- "@graphql-tools/json-file-loader": "^8.0.0",
- "@graphql-tools/load": "^8.1.0",
- "@graphql-tools/merge": "^9.0.0",
- "@graphql-tools/url-loader": "^8.0.0",
- "@graphql-tools/utils": "^10.0.0",
- "cosmiconfig": "^8.1.0",
- "jiti": "^2.0.0",
- "minimatch": "^9.0.5",
- "string-env-interpolation": "^1.0.1",
- "tslib": "^2.4.0"
- },
- "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
- }
- }
- },
- "node_modules/graphql-config/node_modules/jiti": {
- "version": "2.6.1",
- "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz",
- "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==",
- "dev": true,
- "license": "MIT",
- "bin": {
- "jiti": "lib/jiti-cli.mjs"
- }
- },
- "node_modules/graphql-request": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/graphql-request/-/graphql-request-6.1.0.tgz",
- "integrity": "sha512-p+XPfS4q7aIpKVcgmnZKhMNqhltk20hfXtkaIkTfjjmiKMJ5xrt5c743cL03y/K7y1rg3WrIC49xGiEQ4mxdNw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@graphql-typed-document-node/core": "^3.2.0",
- "cross-fetch": "^3.1.5"
- },
- "peerDependencies": {
- "graphql": "14 - 16"
- }
- },
- "node_modules/graphql-tag": {
- "version": "2.12.6",
- "resolved": "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.12.6.tgz",
- "integrity": "sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "tslib": "^2.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "peerDependencies": {
- "graphql": "^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0"
- }
- },
- "node_modules/graphql-ws": {
- "version": "6.0.6",
- "resolved": "https://registry.npmjs.org/graphql-ws/-/graphql-ws-6.0.6.tgz",
- "integrity": "sha512-zgfER9s+ftkGKUZgc0xbx8T7/HMO4AV5/YuYiFc+AtgcO5T0v8AxYYNQ+ltzuzDZgNkYJaFspm5MMYLjQzrkmw==",
- "dev": true,
- "license": "MIT",
- "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
- }
- }
- },
"node_modules/has-bigints": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz",
@@ -6355,16 +4449,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/has-property-descriptors": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
@@ -6436,31 +4520,6 @@
"node": ">= 0.4"
}
},
- "node_modules/header-case": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/header-case/-/header-case-2.0.4.tgz",
- "integrity": "sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "capital-case": "^1.0.4",
- "tslib": "^2.0.3"
- }
- },
- "node_modules/http-proxy-agent": {
- "version": "7.0.2",
- "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz",
- "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "agent-base": "^7.1.0",
- "debug": "^4.3.4"
- },
- "engines": {
- "node": ">= 14"
- }
- },
"node_modules/https-proxy-agent": {
"version": "7.0.6",
"resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz",
@@ -6475,23 +4534,6 @@
"node": ">= 14"
}
},
- "node_modules/iconv-lite": {
- "version": "0.7.0",
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz",
- "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "safer-buffer": ">= 2.1.2 < 3.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/express"
- }
- },
"node_modules/idb": {
"version": "7.1.1",
"resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz",
@@ -6499,131 +4541,19 @@
"dev": true,
"license": "ISC"
},
- "node_modules/ieee754": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
- "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
- "license": "BSD-3-Clause"
- },
- "node_modules/ignore": {
- "version": "5.3.2",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
- "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 4"
- }
- },
- "node_modules/immutable": {
- "version": "3.7.6",
- "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.7.6.tgz",
- "integrity": "sha512-AizQPcaofEtO11RZhPPHBOJRdo/20MKQF9mBLnVkBoyHi1/zXK8fzVdnEpSV9gxqtnh6Qomfp3F0xT5qP/vThw==",
- "dev": true,
- "license": "BSD-3-Clause",
- "engines": {
- "node": ">=0.8.0"
- }
- },
- "node_modules/import-fresh": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz",
- "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "parent-module": "^1.0.0",
- "resolve-from": "^4.0.0"
- },
- "engines": {
- "node": ">=6"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/import-fresh/node_modules/resolve-from": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
- "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/import-from": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/import-from/-/import-from-4.0.0.tgz",
- "integrity": "sha512-P9J71vT5nLlDeV8FHs5nNxaLbrpfAV5cF5srvbZfpwpcJoM/xZR3hiv+q+SAnuSmuGbXMWud063iIMx/V/EWZQ==",
+ "node_modules/index-to-position": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/index-to-position/-/index-to-position-1.2.0.tgz",
+ "integrity": "sha512-Yg7+ztRkqslMAS2iFaU+Oa4KTSidr63OsFGlOrJoW981kIYO3CGCS3wA95P1mUi/IVSJkn0D479KTJpVpvFNuw==",
"dev": true,
"license": "MIT",
"engines": {
- "node": ">=12.2"
+ "node": ">=18"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/indent-string": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
- "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/inherits": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/inquirer": {
- "version": "8.2.7",
- "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.7.tgz",
- "integrity": "sha512-UjOaSel/iddGZJ5xP/Eixh6dY1XghiBw4XK13rCCIJcJfyhhoul/7KhLLUGtebEj6GDYM6Vnx/mVsjx2L/mFIA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@inquirer/external-editor": "^1.0.0",
- "ansi-escapes": "^4.2.1",
- "chalk": "^4.1.1",
- "cli-cursor": "^3.1.0",
- "cli-width": "^3.0.0",
- "figures": "^3.0.0",
- "lodash": "^4.17.21",
- "mute-stream": "0.0.8",
- "ora": "^5.4.1",
- "run-async": "^2.4.0",
- "rxjs": "^7.5.5",
- "string-width": "^4.1.0",
- "strip-ansi": "^6.0.0",
- "through": "^2.3.6",
- "wrap-ansi": "^6.0.1"
- },
- "engines": {
- "node": ">=12.0.0"
- }
- },
"node_modules/internal-slot": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz",
@@ -6639,30 +4569,6 @@
"node": ">= 0.4"
}
},
- "node_modules/invariant": {
- "version": "2.2.4",
- "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
- "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "loose-envify": "^1.0.0"
- }
- },
- "node_modules/is-absolute": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz",
- "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-relative": "^1.0.0",
- "is-windows": "^1.0.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/is-array-buffer": {
"version": "3.0.5",
"resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz",
@@ -6681,13 +4587,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/is-arrayish": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
- "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/is-async-function": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz",
@@ -6805,16 +4704,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/is-extglob": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
- "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/is-finalizationregistry": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz",
@@ -6861,39 +4750,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/is-glob": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
- "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-extglob": "^2.1.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-interactive": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz",
- "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/is-lower-case": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/is-lower-case/-/is-lower-case-2.0.2.tgz",
- "integrity": "sha512-bVcMJy4X5Og6VZfdOZstSexlEy20Sr0k/p/b2IlQJlfdKAQuMpiv5w2Ccxb8sKdRUNAG1PnHVHjFSdRDVS6NlQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "tslib": "^2.0.3"
- }
- },
"node_modules/is-map": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz",
@@ -6927,16 +4783,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/is-number": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
- "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.12.0"
- }
- },
"node_modules/is-number-object": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz",
@@ -6993,19 +4839,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/is-relative": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz",
- "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-unc-path": "^1.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/is-set": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz",
@@ -7099,42 +4932,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/is-unc-path": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz",
- "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "unc-path-regex": "^0.1.2"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-unicode-supported": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
- "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/is-upper-case": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/is-upper-case/-/is-upper-case-2.0.2.tgz",
- "integrity": "sha512-44pxmxAvnnAOwBg4tHPnkfvgjPwbc5QIsSstNU+YcJ1ovxVzCWpSGosPJOZh/a1tdl81fbgnLc9LLv+x2ywbPQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "tslib": "^2.0.3"
- }
- },
"node_modules/is-weakmap": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz",
@@ -7181,16 +4978,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/is-windows": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
- "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/isarray": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
@@ -7205,16 +4992,6 @@
"dev": true,
"license": "ISC"
},
- "node_modules/isomorphic-ws": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-5.0.0.tgz",
- "integrity": "sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==",
- "dev": true,
- "license": "MIT",
- "peerDependencies": {
- "ws": "*"
- }
- },
"node_modules/jackspeak": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.1.tgz",
@@ -7253,20 +5030,21 @@
"version": "1.21.7",
"resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz",
"integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==",
- "devOptional": true,
"license": "MIT",
+ "optional": true,
+ "peer": true,
"bin": {
"jiti": "bin/jiti.js"
}
},
- "node_modules/jose": {
- "version": "5.10.0",
- "resolved": "https://registry.npmjs.org/jose/-/jose-5.10.0.tgz",
- "integrity": "sha512-s+3Al/p9g32Iq+oqXxkW//7jk2Vig6FF1CFqzVXoTUXt2qz89YWbL+OwS17NFYEvxC35n0FKeGO2LGYSxeM2Gg==",
+ "node_modules/js-levenshtein": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz",
+ "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==",
"dev": true,
"license": "MIT",
- "funding": {
- "url": "https://github.com/sponsors/panva"
+ "engines": {
+ "node": ">=0.10.0"
}
},
"node_modules/js-tokens": {
@@ -7301,13 +5079,6 @@
"node": ">=6"
}
},
- "node_modules/json-parse-even-better-errors": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
- "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/json-schema": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz",
@@ -7322,20 +5093,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/json-to-pretty-yaml": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/json-to-pretty-yaml/-/json-to-pretty-yaml-1.2.2.tgz",
- "integrity": "sha512-rvm6hunfCcqegwYaG5T4yKJWxc9FXFgBVrcTZ4XfSVRwa5HA/Xs+vB/Eo9treYYHCeNM0nrSUr82V/M31Urc7A==",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "remedial": "^1.0.7",
- "remove-trailing-spaces": "^1.0.6"
- },
- "engines": {
- "node": ">= 0.2.0"
- }
- },
"node_modules/json5": {
"version": "2.2.3",
"resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
@@ -7631,59 +5388,6 @@
"url": "https://opencollective.com/parcel"
}
},
- "node_modules/lines-and-columns": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
- "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/listr2": {
- "version": "4.0.5",
- "resolved": "https://registry.npmjs.org/listr2/-/listr2-4.0.5.tgz",
- "integrity": "sha512-juGHV1doQdpNT3GSTs9IUN43QJb7KHdF9uqg7Vufs/tG9VTzpFphqF4pm/ICdAABGQxsyNn9CiYA3StkI6jpwA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "cli-truncate": "^2.1.0",
- "colorette": "^2.0.16",
- "log-update": "^4.0.0",
- "p-map": "^4.0.0",
- "rfdc": "^1.3.0",
- "rxjs": "^7.5.5",
- "through": "^2.3.8",
- "wrap-ansi": "^7.0.0"
- },
- "engines": {
- "node": ">=12"
- },
- "peerDependencies": {
- "enquirer": ">= 2.3.0 < 3"
- },
- "peerDependenciesMeta": {
- "enquirer": {
- "optional": true
- }
- }
- },
- "node_modules/listr2/node_modules/wrap-ansi": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
- "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^4.0.0",
- "string-width": "^4.1.0",
- "strip-ansi": "^6.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
- }
- },
"node_modules/lodash": {
"version": "4.17.21",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
@@ -7705,60 +5409,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/log-symbols": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
- "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "chalk": "^4.1.0",
- "is-unicode-supported": "^0.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/log-update": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz",
- "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ansi-escapes": "^4.3.0",
- "cli-cursor": "^3.1.0",
- "slice-ansi": "^4.0.0",
- "wrap-ansi": "^6.2.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/log-update/node_modules/slice-ansi": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
- "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^4.0.0",
- "astral-regex": "^2.0.0",
- "is-fullwidth-code-point": "^3.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/slice-ansi?sponsor=1"
- }
- },
"node_modules/loose-envify": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
@@ -7771,26 +5421,6 @@
"loose-envify": "cli.js"
}
},
- "node_modules/lower-case": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz",
- "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "tslib": "^2.0.3"
- }
- },
- "node_modules/lower-case-first": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/lower-case-first/-/lower-case-first-2.0.2.tgz",
- "integrity": "sha512-EVm/rR94FJTZi3zefZ82fLWab+GX14LJN4HrWBcuo6Evmsl9hEfnqxgcHCKb9q+mNf6EVdsjx/qucYFIIB84pg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "tslib": "^2.0.3"
- }
- },
"node_modules/lru-cache": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
@@ -7810,16 +5440,6 @@
"@jridgewell/sourcemap-codec": "^1.5.5"
}
},
- "node_modules/map-cache": {
- "version": "0.2.2",
- "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
- "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/math-intrinsics": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
@@ -7830,74 +5450,6 @@
"node": ">= 0.4"
}
},
- "node_modules/merge2": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
- "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/meros": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/meros/-/meros-1.3.2.tgz",
- "integrity": "sha512-Q3mobPbvEx7XbwhnC1J1r60+5H6EZyNccdzSz0eGexJRwouUtTZxPVRGdqKtxlpD84ScK4+tIGldkqDtCKdI0A==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=13"
- },
- "peerDependencies": {
- "@types/node": ">=13"
- },
- "peerDependenciesMeta": {
- "@types/node": {
- "optional": true
- }
- }
- },
- "node_modules/micromatch": {
- "version": "4.0.8",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
- "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "braces": "^3.0.3",
- "picomatch": "^2.3.1"
- },
- "engines": {
- "node": ">=8.6"
- }
- },
- "node_modules/mimic-fn": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
- "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/minimatch": {
- "version": "9.0.5",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
- "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "brace-expansion": "^2.0.1"
- },
- "engines": {
- "node": ">=16 || 14 >=14.17"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
"node_modules/minipass": {
"version": "7.1.2",
"resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
@@ -7921,13 +5473,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/mute-stream": {
- "version": "0.0.8",
- "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz",
- "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==",
- "dev": true,
- "license": "ISC"
- },
"node_modules/nanoid": {
"version": "3.3.11",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
@@ -7946,66 +5491,6 @@
"node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
}
},
- "node_modules/no-case": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz",
- "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "lower-case": "^2.0.2",
- "tslib": "^2.0.3"
- }
- },
- "node_modules/node-domexception": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz",
- "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==",
- "deprecated": "Use your platform's native DOMException instead",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/jimmywarting"
- },
- {
- "type": "github",
- "url": "https://paypal.me/jimmywarting"
- }
- ],
- "license": "MIT",
- "engines": {
- "node": ">=10.5.0"
- }
- },
- "node_modules/node-fetch": {
- "version": "2.7.0",
- "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
- "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "whatwg-url": "^5.0.0"
- },
- "engines": {
- "node": "4.x || >=6.0.0"
- },
- "peerDependencies": {
- "encoding": "^0.1.0"
- },
- "peerDependenciesMeta": {
- "encoding": {
- "optional": true
- }
- }
- },
- "node_modules/node-int64": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz",
- "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/node-releases": {
"version": "2.0.27",
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz",
@@ -8013,26 +5498,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/normalize-path": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
- "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "remove-trailing-separator": "^1.0.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/nullthrows": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz",
- "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/object-assign": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
@@ -8086,94 +5551,109 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/onetime": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
- "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+ "node_modules/openapi-fetch": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/openapi-fetch/-/openapi-fetch-0.17.0.tgz",
+ "integrity": "sha512-PsbZR1wAPcG91eEthKhN+Zn92FMHxv+/faECIwjXdxfTODGSGegYv0sc1Olz+HYPvKOuoXfp+0pA2XVt2cI0Ig==",
+ "license": "MIT",
+ "dependencies": {
+ "openapi-typescript-helpers": "^0.1.0"
+ }
+ },
+ "node_modules/openapi-typescript": {
+ "version": "7.13.0",
+ "resolved": "https://registry.npmjs.org/openapi-typescript/-/openapi-typescript-7.13.0.tgz",
+ "integrity": "sha512-EFP392gcqXS7ntPvbhBzbF8TyBA+baIYEm791Hy5YkjDYKTnk/Tn5OQeKm5BIZvJihpp8Zzr4hzx0Irde1LNGQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "mimic-fn": "^2.1.0"
+ "@redocly/openapi-core": "^1.34.6",
+ "ansi-colors": "^4.1.3",
+ "change-case": "^5.4.4",
+ "parse-json": "^8.3.0",
+ "supports-color": "^10.2.2",
+ "yargs-parser": "^21.1.1"
},
- "engines": {
- "node": ">=6"
+ "bin": {
+ "openapi-typescript": "bin/cli.js"
},
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "peerDependencies": {
+ "typescript": "^5.x"
}
},
- "node_modules/ora": {
- "version": "5.4.1",
- "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz",
- "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==",
+ "node_modules/openapi-typescript-helpers": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/openapi-typescript-helpers/-/openapi-typescript-helpers-0.1.0.tgz",
+ "integrity": "sha512-OKTGPthhivLw/fHz6c3OPtg72vi86qaMlqbJuVJ23qOvQ+53uw1n7HdmkJFibloF7QEjDrDkzJiOJuockM/ljw==",
+ "license": "MIT"
+ },
+ "node_modules/openapi-typescript/node_modules/change-case": {
+ "version": "5.4.4",
+ "resolved": "https://registry.npmjs.org/change-case/-/change-case-5.4.4.tgz",
+ "integrity": "sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/openapi-typescript/node_modules/parse-json": {
+ "version": "8.3.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-8.3.0.tgz",
+ "integrity": "sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "bl": "^4.1.0",
- "chalk": "^4.1.0",
- "cli-cursor": "^3.1.0",
- "cli-spinners": "^2.5.0",
- "is-interactive": "^1.0.0",
- "is-unicode-supported": "^0.1.0",
- "log-symbols": "^4.1.0",
- "strip-ansi": "^6.0.0",
- "wcwidth": "^1.0.1"
+ "@babel/code-frame": "^7.26.2",
+ "index-to-position": "^1.1.0",
+ "type-fest": "^4.39.1"
},
"engines": {
- "node": ">=10"
+ "node": ">=18"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/own-keys": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz",
- "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==",
+ "node_modules/openapi-typescript/node_modules/supports-color": {
+ "version": "10.2.2",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-10.2.2.tgz",
+ "integrity": "sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "get-intrinsic": "^1.2.6",
- "object-keys": "^1.1.1",
- "safe-push-apply": "^1.0.0"
- },
"engines": {
- "node": ">= 0.4"
+ "node": ">=18"
},
"funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
}
},
- "node_modules/p-limit": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
- "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "node_modules/openapi-typescript/node_modules/type-fest": {
+ "version": "4.41.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz",
+ "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==",
"dev": true,
- "license": "MIT",
- "dependencies": {
- "yocto-queue": "^0.1.0"
- },
+ "license": "(MIT OR CC0-1.0)",
"engines": {
- "node": ">=10"
+ "node": ">=16"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/p-map": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz",
- "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==",
+ "node_modules/own-keys": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz",
+ "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "aggregate-error": "^3.0.0"
+ "get-intrinsic": "^1.2.6",
+ "object-keys": "^1.1.1",
+ "safe-push-apply": "^1.0.0"
},
"engines": {
- "node": ">=10"
+ "node": ">= 0.4"
},
"funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/package-json-from-dist": {
@@ -8183,86 +5663,6 @@
"dev": true,
"license": "BlueOak-1.0.0"
},
- "node_modules/param-case": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz",
- "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "dot-case": "^3.0.4",
- "tslib": "^2.0.3"
- }
- },
- "node_modules/parent-module": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
- "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "callsites": "^3.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/parse-filepath": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz",
- "integrity": "sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-absolute": "^1.0.0",
- "map-cache": "^0.2.0",
- "path-root": "^0.1.1"
- },
- "engines": {
- "node": ">=0.8"
- }
- },
- "node_modules/parse-json": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
- "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/code-frame": "^7.0.0",
- "error-ex": "^1.3.1",
- "json-parse-even-better-errors": "^2.3.0",
- "lines-and-columns": "^1.1.6"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/pascal-case": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz",
- "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "no-case": "^3.0.4",
- "tslib": "^2.0.3"
- }
- },
- "node_modules/path-case": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/path-case/-/path-case-3.0.4.tgz",
- "integrity": "sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "dot-case": "^3.0.4",
- "tslib": "^2.0.3"
- }
- },
"node_modules/path-key": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
@@ -8280,29 +5680,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/path-root": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz",
- "integrity": "sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "path-root-regex": "^0.1.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/path-root-regex": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz",
- "integrity": "sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/path-scurry": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz",
@@ -8330,16 +5707,6 @@
"node": "20 || >=22"
}
},
- "node_modules/path-type": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
- "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/picocolors": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
@@ -8359,6 +5726,16 @@
"url": "https://github.com/sponsors/jonschlinkert"
}
},
+ "node_modules/pluralize": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz",
+ "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
"node_modules/possible-typed-array-names": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz",
@@ -8410,16 +5787,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/promise": {
- "version": "7.3.1",
- "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz",
- "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "asap": "~2.0.3"
- }
- },
"node_modules/prop-types": {
"version": "15.8.1",
"resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
@@ -8441,27 +5808,6 @@
"node": ">=6"
}
},
- "node_modules/queue-microtask": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
- "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
- "license": "MIT"
- },
"node_modules/randombytes": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
@@ -8509,21 +5855,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/readable-stream": {
- "version": "3.6.2",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
- "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "inherits": "^2.0.3",
- "string_decoder": "^1.1.1",
- "util-deprecate": "^1.0.1"
- },
- "engines": {
- "node": ">= 6"
- }
- },
"node_modules/reflect.getprototypeof": {
"version": "1.0.10",
"resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz",
@@ -8635,52 +5966,6 @@
"regjsparser": "bin/parser"
}
},
- "node_modules/relay-runtime": {
- "version": "12.0.0",
- "resolved": "https://registry.npmjs.org/relay-runtime/-/relay-runtime-12.0.0.tgz",
- "integrity": "sha512-QU6JKr1tMsry22DXNy9Whsq5rmvwr3LSZiiWV/9+DFpuTWvp+WFhobWMc8TC4OjKFfNhEZy7mOiqUAn5atQtug==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/runtime": "^7.0.0",
- "fbjs": "^3.0.0",
- "invariant": "^2.2.4"
- }
- },
- "node_modules/remedial": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/remedial/-/remedial-1.0.8.tgz",
- "integrity": "sha512-/62tYiOe6DzS5BqVsNpH/nkGlX45C/Sp6V+NtiN6JQNS1Viay7cWkazmRkrQrdFj2eshDe96SIQNIoMxqhzBOg==",
- "dev": true,
- "license": "(MIT OR Apache-2.0)",
- "engines": {
- "node": "*"
- }
- },
- "node_modules/remove-trailing-separator": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
- "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/remove-trailing-spaces": {
- "version": "1.0.9",
- "resolved": "https://registry.npmjs.org/remove-trailing-spaces/-/remove-trailing-spaces-1.0.9.tgz",
- "integrity": "sha512-xzG7w5IRijvIkHIjDk65URsJJ7k4J95wmcArY5PRcmjldIOl7oTvG8+X2Ag690R7SfwiOcHrWZKVc1Pp5WIOzA==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/require-directory": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
- "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/require-from-string": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
@@ -8712,48 +5997,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/resolve-from": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
- "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/restore-cursor": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
- "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "onetime": "^5.1.0",
- "signal-exit": "^3.0.2"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/reusify": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz",
- "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "iojs": ">=1.0.0",
- "node": ">=0.10.0"
- }
- },
- "node_modules/rfdc": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz",
- "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/rollup": {
"version": "4.53.3",
"resolved": "https://registry.npmjs.org/rollup/-/rollup-4.53.3.tgz",
@@ -8795,50 +6038,6 @@
"fsevents": "~2.3.2"
}
},
- "node_modules/run-async": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz",
- "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.12.0"
- }
- },
- "node_modules/run-parallel": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
- "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "queue-microtask": "^1.2.2"
- }
- },
- "node_modules/rxjs": {
- "version": "7.8.2",
- "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz",
- "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "tslib": "^2.1.0"
- }
- },
"node_modules/safe-array-concat": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz",
@@ -8915,26 +6114,12 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/safer-buffer": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
- "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/scheduler": {
"version": "0.27.0",
"resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz",
"integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==",
"license": "MIT"
},
- "node_modules/scuid": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/scuid/-/scuid-1.1.0.tgz",
- "integrity": "sha512-MuCAyrGZcTLfQoH2XoBlQ8C6bzwN88XT/0slOGz0pn8+gIP85BOAfYa44ZXQUTOwRwPU0QvgU+V+OSajl/59Xg==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/semver": {
"version": "6.3.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
@@ -8945,18 +6130,6 @@
"semver": "bin/semver.js"
}
},
- "node_modules/sentence-case": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-3.0.4.tgz",
- "integrity": "sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "no-case": "^3.0.4",
- "tslib": "^2.0.3",
- "upper-case-first": "^2.0.2"
- }
- },
"node_modules/serialize-javascript": {
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz",
@@ -9016,13 +6189,6 @@
"node": ">= 0.4"
}
},
- "node_modules/setimmediate": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
- "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/shebang-command": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
@@ -9046,19 +6212,6 @@
"node": ">=8"
}
},
- "node_modules/shell-quote": {
- "version": "1.8.3",
- "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz",
- "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
"node_modules/side-channel": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
@@ -9135,45 +6288,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/signal-exit": {
- "version": "3.0.7",
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
- "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/signedsource": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/signedsource/-/signedsource-1.0.0.tgz",
- "integrity": "sha512-6+eerH9fEnNmi/hyM1DXcRK3pWdoMQtlkQ+ns0ntzunjKqp5i3sKCc80ym8Fib3iaYhdJUOPdhlJWj1tvge2Ww==",
- "dev": true,
- "license": "BSD-3-Clause"
- },
- "node_modules/slash": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
- "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/slice-ansi": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz",
- "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^4.0.0",
- "astral-regex": "^2.0.0",
- "is-fullwidth-code-point": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/smob": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/smob/-/smob-1.5.0.tgz",
@@ -9181,17 +6295,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/snake-case": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz",
- "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "dot-case": "^3.0.4",
- "tslib": "^2.0.3"
- }
- },
"node_modules/source-map": {
"version": "0.8.0-beta.0",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz",
@@ -9273,16 +6376,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/sponge-case": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/sponge-case/-/sponge-case-1.0.1.tgz",
- "integrity": "sha512-dblb9Et4DAtiZ5YSUZHLl4XhH4uK80GhAZrVXdN4O2P4gQ40Wa5UIOPUHlA/nFd2PLblBZWUioLMMAVrgpoYcA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "tslib": "^2.0.3"
- }
- },
"node_modules/stop-iteration-iterator": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz",
@@ -9297,23 +6390,6 @@
"node": ">= 0.4"
}
},
- "node_modules/string_decoder": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
- "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "safe-buffer": "~5.2.0"
- }
- },
- "node_modules/string-env-interpolation": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/string-env-interpolation/-/string-env-interpolation-1.0.1.tgz",
- "integrity": "sha512-78lwMoCcn0nNu8LszbP1UA7g55OeE4v7rCeWnM5B453rnNr4aq+5it3FEYtZrSEiMvHZOZ9Jlqb0OD0M2VInqg==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/string-width": {
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
@@ -9484,19 +6560,6 @@
"node": ">=10"
}
},
- "node_modules/supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/supports-preserve-symlinks-flag": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
@@ -9510,50 +6573,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/swap-case": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/swap-case/-/swap-case-2.0.2.tgz",
- "integrity": "sha512-kc6S2YS/2yXbtkSMunBtKdah4VFETZ8Oh6ONSmSd9bRxhqTrtARUCBUiWXH3xVPpvR7tz2CSnkuXVE42EcGnMw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "tslib": "^2.0.3"
- }
- },
- "node_modules/sync-fetch": {
- "version": "0.6.0-2",
- "resolved": "https://registry.npmjs.org/sync-fetch/-/sync-fetch-0.6.0-2.tgz",
- "integrity": "sha512-c7AfkZ9udatCuAy9RSfiGPpeOKKUAUK5e1cXadLOGUjasdxqYqAK0jTNkM/FSEyJ3a5Ra27j/tw/PS0qLmaF/A==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "node-fetch": "^3.3.2",
- "timeout-signal": "^2.0.0",
- "whatwg-mimetype": "^4.0.0"
- },
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/sync-fetch/node_modules/node-fetch": {
- "version": "3.3.2",
- "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz",
- "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "data-uri-to-buffer": "^4.0.0",
- "fetch-blob": "^3.1.4",
- "formdata-polyfill": "^4.0.10"
- },
- "engines": {
- "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/node-fetch"
- }
- },
"node_modules/tailwindcss": {
"version": "4.1.17",
"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.17.tgz",
@@ -9634,23 +6653,6 @@
"node": ">=10"
}
},
- "node_modules/through": {
- "version": "2.3.8",
- "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
- "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/timeout-signal": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/timeout-signal/-/timeout-signal-2.0.0.tgz",
- "integrity": "sha512-YBGpG4bWsHoPvofT6y/5iqulfXIiIErl5B0LdtHT1mGXDFTAhhRrbUpTvBgYbovr+3cKblya2WAOcpoy90XguA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=16"
- }
- },
"node_modules/tinyglobby": {
"version": "0.2.15",
"resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz",
@@ -9696,62 +6698,12 @@
"url": "https://github.com/sponsors/jonschlinkert"
}
},
- "node_modules/title-case": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/title-case/-/title-case-3.0.3.tgz",
- "integrity": "sha512-e1zGYRvbffpcHIrnuqT0Dh+gEJtDaxDSoG4JAIpq4oDFyooziLBIiYQv0GBT4FUAnUop5uZ1hiIAj7oAF6sOCA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "tslib": "^2.0.3"
- }
- },
- "node_modules/to-regex-range": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
- "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-number": "^7.0.0"
- },
- "engines": {
- "node": ">=8.0"
- }
- },
- "node_modules/tr46": {
- "version": "0.0.3",
- "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
- "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ts-log": {
- "version": "2.2.7",
- "resolved": "https://registry.npmjs.org/ts-log/-/ts-log-2.2.7.tgz",
- "integrity": "sha512-320x5Ggei84AxzlXp91QkIGSw5wgaLT6GeAH0KsqDmRZdVWW2OiSeVvElVoatk3f7nicwXlElXsoFkARiGE2yg==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/tslib": {
"version": "2.8.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
- "devOptional": true,
- "license": "0BSD"
- },
- "node_modules/type-fest": {
- "version": "0.21.3",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
- "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
- "dev": true,
- "license": "(MIT OR CC0-1.0)",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
+ "license": "0BSD",
+ "optional": true
},
"node_modules/typed-array-buffer": {
"version": "1.0.3",
@@ -9845,33 +6797,6 @@
"node": ">=14.17"
}
},
- "node_modules/ua-parser-js": {
- "version": "1.0.41",
- "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.41.tgz",
- "integrity": "sha512-LbBDqdIC5s8iROCUjMbW1f5dJQTEFB1+KO9ogbvlb3nm9n4YHa5p4KTvFPWvh2Hs8gZMBuiB1/8+pdfe/tDPug==",
- "dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/ua-parser-js"
- },
- {
- "type": "paypal",
- "url": "https://paypal.me/faisalman"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/faisalman"
- }
- ],
- "license": "MIT",
- "bin": {
- "ua-parser-js": "script/cli.js"
- },
- "engines": {
- "node": "*"
- }
- },
"node_modules/unbox-primitive": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz",
@@ -9891,22 +6816,13 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/unc-path-regex": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz",
- "integrity": "sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/undici-types": {
"version": "7.16.0",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz",
"integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==",
- "devOptional": true,
- "license": "MIT"
+ "license": "MIT",
+ "optional": true,
+ "peer": true
},
"node_modules/unicode-canonical-property-names-ecmascript": {
"version": "2.0.1",
@@ -9975,19 +6891,6 @@
"node": ">= 10.0.0"
}
},
- "node_modules/unixify": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/unixify/-/unixify-1.0.0.tgz",
- "integrity": "sha512-6bc58dPYhCMHHuwxldQxO3RRNZ4eCogZ/st++0+fcC1nr0jiGUtAdBJ2qzmLQWSxbtz42pWt4QQMiZ9HvZf5cg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "normalize-path": "^2.1.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/upath": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz",
@@ -10030,47 +6933,6 @@
"browserslist": ">= 4.21.0"
}
},
- "node_modules/upper-case": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-2.0.2.tgz",
- "integrity": "sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "tslib": "^2.0.3"
- }
- },
- "node_modules/upper-case-first": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.2.tgz",
- "integrity": "sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "tslib": "^2.0.3"
- }
- },
- "node_modules/urlpattern-polyfill": {
- "version": "10.1.0",
- "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.1.0.tgz",
- "integrity": "sha512-IGjKp/o0NL3Bso1PymYURCJxMPNAf/ILOpendP9f5B6e1rTJgdgiOvgfoT8VxCAdY+Wisb9uhGaJJf3yZ2V9nw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/urql": {
- "version": "4.2.2",
- "resolved": "https://registry.npmjs.org/urql/-/urql-4.2.2.tgz",
- "integrity": "sha512-3GgqNa6iF7bC4hY/ImJKN4REQILcSU9VKcKL8gfELZM8mM5BnLH1BsCc8kBdnVGD1LIFOs4W3O2idNHhON1r0w==",
- "license": "MIT",
- "dependencies": {
- "@urql/core": "^5.1.1",
- "wonka": "^6.3.2"
- },
- "peerDependencies": {
- "@urql/core": "^5.0.0",
- "react": ">= 16.8.0"
- }
- },
"node_modules/use-sync-external-store": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz",
@@ -10080,13 +6942,6 @@
"react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
}
},
- "node_modules/util-deprecate": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
- "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/vite": {
"version": "7.2.6",
"resolved": "https://registry.npmjs.org/vite/-/vite-7.2.6.tgz",
@@ -10221,54 +7076,6 @@
"url": "https://github.com/sponsors/jonschlinkert"
}
},
- "node_modules/wcwidth": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz",
- "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "defaults": "^1.0.3"
- }
- },
- "node_modules/web-streams-polyfill": {
- "version": "3.3.3",
- "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz",
- "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/webidl-conversions": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
- "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==",
- "dev": true,
- "license": "BSD-2-Clause"
- },
- "node_modules/whatwg-mimetype": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz",
- "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/whatwg-url": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
- "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "tr46": "~0.0.3",
- "webidl-conversions": "^3.0.0"
- }
- },
"node_modules/which": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
@@ -10374,12 +7181,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/wonka": {
- "version": "6.3.5",
- "resolved": "https://registry.npmjs.org/wonka/-/wonka-6.3.5.tgz",
- "integrity": "sha512-SSil+ecw6B4/Dm7Pf2sAshKQ5hWFvfyGlfPbEd6A14dOH6VDjrmbY86u6nZvy9omGwwIPFR8V41+of1EezgoUw==",
- "license": "MIT"
- },
"node_modules/workbox-background-sync": {
"version": "7.4.0",
"resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-7.4.0.tgz",
@@ -10710,21 +7511,6 @@
"react": ">=16.8.0"
}
},
- "node_modules/wrap-ansi": {
- "version": "6.2.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
- "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^4.0.0",
- "string-width": "^4.1.0",
- "strip-ansi": "^6.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/wrap-ansi-cjs": {
"name": "wrap-ansi",
"version": "7.0.0",
@@ -10744,38 +7530,6 @@
"url": "https://github.com/chalk/wrap-ansi?sponsor=1"
}
},
- "node_modules/ws": {
- "version": "8.18.3",
- "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz",
- "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==",
- "dev": true,
- "license": "MIT",
- "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
- }
- }
- },
- "node_modules/y18n": {
- "version": "5.0.8",
- "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
- "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
- "dev": true,
- "license": "ISC",
- "engines": {
- "node": ">=10"
- }
- },
"node_modules/yallist": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
@@ -10787,8 +7541,9 @@
"version": "2.8.2",
"resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz",
"integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==",
- "devOptional": true,
"license": "ISC",
+ "optional": true,
+ "peer": true,
"bin": {
"yaml": "bin.mjs"
},
@@ -10806,25 +7561,6 @@
"dev": true,
"license": "Apache-2.0"
},
- "node_modules/yargs": {
- "version": "17.7.2",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
- "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "cliui": "^8.0.1",
- "escalade": "^3.1.1",
- "get-caller-file": "^2.0.5",
- "require-directory": "^2.1.1",
- "string-width": "^4.2.3",
- "y18n": "^5.0.5",
- "yargs-parser": "^21.1.1"
- },
- "engines": {
- "node": ">=12"
- }
- },
"node_modules/yargs-parser": {
"version": "21.1.1",
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
@@ -10834,19 +7570,6 @@
"engines": {
"node": ">=12"
}
- },
- "node_modules/yocto-queue": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
- "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
}
}
}
diff --git a/frontend/package.json b/frontend/package.json
index 977bb7e..807431a 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -8,8 +8,7 @@
"check": "biome check .",
"dev": "vite",
"fix": "biome check --write .",
- "generate": "npm run graphql-codegen",
- "graphql-codegen": "graphql-codegen --config graphql-codegen.ts",
+ "generate": "openapi-typescript ../openapi/openapi.yaml -o src/api/generated.d.ts",
"preview": "vite preview"
},
"dependencies": {
@@ -17,21 +16,19 @@
"@fortawesome/free-solid-svg-icons": "^6.7.2",
"@fortawesome/react-fontawesome": "^0.2.6",
"@tailwindcss/vite": "^4.1.17",
- "graphql": "^16.12.0",
+ "openapi-fetch": "^0.17.0",
"react": "^19.2.1",
"react-dom": "^19.2.1",
"tailwindcss": "^4.1.11",
- "urql": "^4.2.2",
"wouter": "^3.8.1"
},
"devDependencies": {
"@biomejs/biome": "^2.3.8",
- "@graphql-codegen/cli": "^5.0.7",
- "@graphql-codegen/client-preset": "^4.8.3",
"@types/react": "^19.2.7",
"@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^4.7.0",
"globals": "^16.5.0",
+ "openapi-typescript": "^7.13.0",
"typescript": "~5.8.3",
"vite": "^7.2.6",
"vite-plugin-pwa": "^1.2.0"
diff --git a/frontend/src/api/generated.d.ts b/frontend/src/api/generated.d.ts
new file mode 100644
index 0000000..ae8fa60
--- /dev/null
+++ b/frontend/src/api/generated.d.ts
@@ -0,0 +1,666 @@
+/**
+ * This file was auto-generated by openapi-typescript.
+ * Do not make direct changes to the file.
+ */
+
+export interface paths {
+ "/api/articles/read": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get: operations["Articles_listReadArticles"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/api/articles/unread": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get: operations["Articles_listUnreadArticles"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/api/articles/{articleId}": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get: operations["Articles_getArticle"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/api/articles/{articleId}/read": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ post: operations["Articles_markArticleRead"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/api/articles/{articleId}/unread": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ post: operations["Articles_markArticleUnread"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/api/auth/login": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ post: operations["Auth_login"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/api/auth/logout": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ post: operations["Auth_logout"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/api/auth/me": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get: operations["Auth_getCurrentUser"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/api/feeds": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get: operations["Feeds_listFeeds"];
+ put?: never;
+ post: operations["Feeds_addFeed"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/api/feeds/{feedId}": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get: operations["Feeds_getFeed"];
+ put?: never;
+ post?: never;
+ delete: operations["Feeds_unsubscribeFeed"];
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/api/feeds/{feedId}/read": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ post: operations["Feeds_markFeedRead"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/api/feeds/{feedId}/unread": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ post: operations["Feeds_markFeedUnread"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+}
+export type webhooks = Record<string, never>;
+export interface components {
+ schemas: {
+ AddFeedRequest: {
+ url: string;
+ };
+ Article: {
+ id: string;
+ feedId: string;
+ guid: string;
+ title: string;
+ url: string;
+ isRead: boolean;
+ feed: components["schemas"]["ArticleFeed"];
+ };
+ ArticleConnection: {
+ articles: components["schemas"]["Article"][];
+ pageInfo: components["schemas"]["PageInfo"];
+ };
+ ArticleFeed: {
+ id: string;
+ url: string;
+ title: string;
+ isSubscribed: boolean;
+ };
+ ErrorResponse: {
+ message: string;
+ };
+ Feed: {
+ id: string;
+ url: string;
+ title: string;
+ fetchedAt: string;
+ isSubscribed: boolean;
+ /** Format: int32 */
+ unreadCount: number;
+ };
+ LoginRequest: {
+ username: string;
+ password: string;
+ };
+ LoginResponse: {
+ user: components["schemas"]["User"];
+ };
+ PageInfo: {
+ hasNextPage: boolean;
+ endCursor?: string;
+ };
+ User: {
+ id: string;
+ username: string;
+ };
+ };
+ responses: never;
+ parameters: never;
+ requestBodies: never;
+ headers: never;
+ pathItems: never;
+}
+export type $defs = Record<string, never>;
+export interface operations {
+ Articles_listReadArticles: {
+ parameters: {
+ query?: {
+ feedId?: string;
+ after?: string;
+ first?: number;
+ };
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description The request has succeeded. */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["ArticleConnection"];
+ };
+ };
+ };
+ };
+ Articles_listUnreadArticles: {
+ parameters: {
+ query?: {
+ feedId?: string;
+ after?: string;
+ first?: number;
+ };
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description The request has succeeded. */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["ArticleConnection"];
+ };
+ };
+ };
+ };
+ Articles_getArticle: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ articleId: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description The request has succeeded. */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["Article"];
+ };
+ };
+ /** @description The server cannot find the requested resource. */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["ErrorResponse"];
+ };
+ };
+ };
+ };
+ Articles_markArticleRead: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ articleId: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description The request has succeeded. */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["Article"];
+ };
+ };
+ /** @description The server cannot find the requested resource. */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["ErrorResponse"];
+ };
+ };
+ };
+ };
+ Articles_markArticleUnread: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ articleId: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description The request has succeeded. */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["Article"];
+ };
+ };
+ /** @description The server cannot find the requested resource. */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["ErrorResponse"];
+ };
+ };
+ };
+ };
+ Auth_login: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ requestBody: {
+ content: {
+ "application/json": components["schemas"]["LoginRequest"];
+ };
+ };
+ responses: {
+ /** @description The request has succeeded. */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["LoginResponse"];
+ };
+ };
+ /** @description Access is unauthorized. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["ErrorResponse"];
+ };
+ };
+ };
+ };
+ Auth_logout: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description There is no content to send for this request, but the headers may be useful. */
+ 204: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content?: never;
+ };
+ /** @description Access is unauthorized. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["ErrorResponse"];
+ };
+ };
+ };
+ };
+ Auth_getCurrentUser: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description The request has succeeded. */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["User"];
+ };
+ };
+ /** @description Access is unauthorized. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["ErrorResponse"];
+ };
+ };
+ };
+ };
+ Feeds_listFeeds: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description The request has succeeded. */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["Feed"][];
+ };
+ };
+ };
+ };
+ Feeds_addFeed: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ requestBody: {
+ content: {
+ "application/json": components["schemas"]["AddFeedRequest"];
+ };
+ };
+ responses: {
+ /** @description The request has succeeded and a new resource has been created as a result. */
+ 201: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["Feed"];
+ };
+ };
+ /** @description The server could not understand the request due to invalid syntax. */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["ErrorResponse"];
+ };
+ };
+ };
+ };
+ Feeds_getFeed: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ feedId: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description The request has succeeded. */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["Feed"];
+ };
+ };
+ /** @description The server cannot find the requested resource. */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["ErrorResponse"];
+ };
+ };
+ };
+ };
+ Feeds_unsubscribeFeed: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ feedId: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description There is no content to send for this request, but the headers may be useful. */
+ 204: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content?: never;
+ };
+ /** @description The server cannot find the requested resource. */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["ErrorResponse"];
+ };
+ };
+ };
+ };
+ Feeds_markFeedRead: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ feedId: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description The request has succeeded. */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["Feed"];
+ };
+ };
+ /** @description The server cannot find the requested resource. */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["ErrorResponse"];
+ };
+ };
+ };
+ };
+ Feeds_markFeedUnread: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ feedId: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description The request has succeeded. */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["Feed"];
+ };
+ };
+ /** @description The server cannot find the requested resource. */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["ErrorResponse"];
+ };
+ };
+ };
+ };
+}
diff --git a/frontend/src/components/AddFeedForm.tsx b/frontend/src/components/AddFeedForm.tsx
index 9a56574..a60d86d 100644
--- a/frontend/src/components/AddFeedForm.tsx
+++ b/frontend/src/components/AddFeedForm.tsx
@@ -1,31 +1,31 @@
import { faPlus, faSpinner } from "@fortawesome/free-solid-svg-icons";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { useState } from "react";
-import { useMutation } from "urql";
-import { AddFeedDocument } from "../graphql/generated/graphql";
+import { api } from "../services/api-client";
interface Props {
onFeedAdded?: () => void;
}
-const urqlContextFeed = { additionalTypenames: ["Feed"] };
-
export function AddFeedForm({ onFeedAdded }: Props) {
const [url, setUrl] = useState("");
const [error, setError] = useState<string | null>(null);
- const [{ fetching }, addFeed] = useMutation(AddFeedDocument);
+ const [fetching, setFetching] = useState(false);
const handleSubmit = async (e: React.FormEvent) => {
e.preventDefault();
if (!url.trim()) return;
setError(null);
+ setFetching(true);
try {
- const result = await addFeed({ url: url.trim() }, urqlContextFeed);
- if (result.error) {
- setError(result.error.message);
- } else if (result.data) {
+ const { data, error: fetchError } = await api.POST("/api/feeds", {
+ body: { url: url.trim() },
+ });
+ if (fetchError) {
+ setError(fetchError.message);
+ } else if (data) {
setUrl("");
onFeedAdded?.();
}
@@ -33,6 +33,8 @@ export function AddFeedForm({ onFeedAdded }: Props) {
setError(
error instanceof Error ? error.message : "Failed to subscribe to feed",
);
+ } finally {
+ setFetching(false);
}
};
diff --git a/frontend/src/components/ArticleItem.tsx b/frontend/src/components/ArticleItem.tsx
index dbdaf44..37664a9 100644
--- a/frontend/src/components/ArticleItem.tsx
+++ b/frontend/src/components/ArticleItem.tsx
@@ -1,30 +1,16 @@
import { faCheck, faCircle } from "@fortawesome/free-solid-svg-icons";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
-import { useMutation } from "urql";
-import type {
- GetReadArticlesQuery,
- GetUnreadArticlesQuery,
-} from "../graphql/generated/graphql";
-import {
- MarkArticleReadDocument,
- MarkArticleUnreadDocument,
-} from "../graphql/generated/graphql";
+import type { components } from "../api/generated";
+import { api } from "../services/api-client";
-type Article =
- | GetUnreadArticlesQuery["unreadArticles"]["articles"][number]
- | GetReadArticlesQuery["readArticles"]["articles"][number];
+type Article = components["schemas"]["Article"];
interface Props {
article: Article;
onReadChange?: (articleId: string, isRead: boolean) => void;
}
-const urqlContextArticle = { additionalTypenames: ["Article"] };
-
export function ArticleItem({ article, onReadChange }: Props) {
- const [, markArticleRead] = useMutation(MarkArticleReadDocument);
- const [, markArticleUnread] = useMutation(MarkArticleUnreadDocument);
-
const handleToggleRead = async (
articleId: string,
isCurrentlyRead: boolean,
@@ -33,18 +19,23 @@ export function ArticleItem({ article, onReadChange }: Props) {
onReadChange?.(articleId, newReadState);
if (isCurrentlyRead) {
- await markArticleUnread({ id: articleId }, urqlContextArticle);
+ await api.POST("/api/articles/{articleId}/unread", {
+ params: { path: { articleId } },
+ });
} else {
- await markArticleRead({ id: articleId }, urqlContextArticle);
+ await api.POST("/api/articles/{articleId}/read", {
+ params: { path: { articleId } },
+ });
}
};
const handleArticleClick = async (article: Article) => {
- // Open article in new tab and mark as read if it's unread
window.open(article.url, "_blank", "noreferrer");
if (!article.isRead) {
onReadChange?.(article.id, true);
- await markArticleRead({ id: article.id }, urqlContextArticle);
+ await api.POST("/api/articles/{articleId}/read", {
+ params: { path: { articleId: article.id } },
+ });
}
};
diff --git a/frontend/src/components/ArticleList.tsx b/frontend/src/components/ArticleList.tsx
index ccf7826..2238a43 100644
--- a/frontend/src/components/ArticleList.tsx
+++ b/frontend/src/components/ArticleList.tsx
@@ -1,16 +1,11 @@
import { useState } from "react";
-import type {
- GetReadArticlesQuery,
- GetUnreadArticlesQuery,
-} from "../graphql/generated/graphql";
+import type { components } from "../api/generated";
import { ArticleItem } from "./ArticleItem";
-type ArticleType =
- | GetUnreadArticlesQuery["unreadArticles"]["articles"]
- | GetReadArticlesQuery["readArticles"]["articles"];
+type Article = components["schemas"]["Article"];
interface Props {
- articles: ArticleType;
+ articles: Article[];
isReadView?: boolean;
isSingleFeed?: boolean;
hasNextPage?: boolean;
@@ -82,7 +77,7 @@ export function ArticleList({
},
{} as Record<
string,
- { feed: { id: string; title: string }; articles: typeof articles }
+ { feed: { id: string; title: string }; articles: Article[] }
>,
);
diff --git a/frontend/src/components/FeedItem.tsx b/frontend/src/components/FeedItem.tsx
index 8333f75..1fb9001 100644
--- a/frontend/src/components/FeedItem.tsx
+++ b/frontend/src/components/FeedItem.tsx
@@ -1,33 +1,29 @@
import { faCheck, faCircle, faTrash } from "@fortawesome/free-solid-svg-icons";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
-import { useMutation } from "urql";
-import type { GetFeedsQuery } from "../graphql/generated/graphql";
-import {
- MarkFeedReadDocument,
- MarkFeedUnreadDocument,
- UnsubscribeFeedDocument,
-} from "../graphql/generated/graphql";
+import type { components } from "../api/generated";
+import { api } from "../services/api-client";
-type Feed = NonNullable<GetFeedsQuery["feeds"]>[0];
+type Feed = components["schemas"]["Feed"];
interface Props {
feed: Feed;
onFeedUnsubscribed?: () => void;
+ onFeedChanged?: () => void;
}
-const urqlContextFeed = { additionalTypenames: ["Feed"] };
-
-export function FeedItem({ feed, onFeedUnsubscribed }: Props) {
- const [, markFeedRead] = useMutation(MarkFeedReadDocument);
- const [, markFeedUnread] = useMutation(MarkFeedUnreadDocument);
- const [, unsubscribeFeed] = useMutation(UnsubscribeFeedDocument);
-
+export function FeedItem({ feed, onFeedUnsubscribed, onFeedChanged }: Props) {
const handleMarkAllRead = async (feedId: string) => {
- await markFeedRead({ id: feedId }, urqlContextFeed);
+ await api.POST("/api/feeds/{feedId}/read", {
+ params: { path: { feedId } },
+ });
+ onFeedChanged?.();
};
const handleMarkAllUnread = async (feedId: string) => {
- await markFeedUnread({ id: feedId }, urqlContextFeed);
+ await api.POST("/api/feeds/{feedId}/unread", {
+ params: { path: { feedId } },
+ });
+ onFeedChanged?.();
};
const handleUnsubscribeFeed = async (feedId: string) => {
@@ -35,7 +31,9 @@ export function FeedItem({ feed, onFeedUnsubscribed }: Props) {
"Are you sure you want to unsubscribe from this feed?",
);
if (confirmed) {
- await unsubscribeFeed({ id: feedId }, urqlContextFeed);
+ await api.DELETE("/api/feeds/{feedId}", {
+ params: { path: { feedId } },
+ });
onFeedUnsubscribed?.();
}
};
diff --git a/frontend/src/components/FeedList.tsx b/frontend/src/components/FeedList.tsx
index 24bcfc7..a3ba124 100644
--- a/frontend/src/components/FeedList.tsx
+++ b/frontend/src/components/FeedList.tsx
@@ -1,18 +1,43 @@
-import { useQuery } from "urql";
-import { GetFeedsDocument } from "../graphql/generated/graphql";
+import { useCallback, useEffect, useState } from "react";
+import type { components } from "../api/generated";
+import { api } from "../services/api-client";
import { FeedItem } from "./FeedItem";
+type Feed = components["schemas"]["Feed"];
+
interface Props {
onFeedUnsubscribed?: () => void;
}
-const urqlContextFeed = { additionalTypenames: ["Feed"] };
-
export function FeedList({ onFeedUnsubscribed }: Props) {
- const [{ data, fetching, error }] = useQuery({
- query: GetFeedsDocument,
- context: urqlContextFeed,
- });
+ const [feeds, setFeeds] = useState<Feed[]>([]);
+ const [fetching, setFetching] = useState(true);
+ const [error, setError] = useState<string | null>(null);
+
+ const fetchFeeds = useCallback(async () => {
+ setFetching(true);
+ const { data } = await api.GET("/api/feeds");
+ if (data) {
+ setFeeds(data);
+ setError(null);
+ } else {
+ setError("Failed to load feeds");
+ }
+ setFetching(false);
+ }, []);
+
+ useEffect(() => {
+ fetchFeeds();
+ }, [fetchFeeds]);
+
+ const handleFeedUnsubscribed = () => {
+ fetchFeeds();
+ onFeedUnsubscribed?.();
+ };
+
+ const handleFeedChanged = () => {
+ fetchFeeds();
+ };
if (fetching) {
return (
@@ -24,11 +49,11 @@ export function FeedList({ onFeedUnsubscribed }: Props) {
if (error) {
return (
<div className="rounded-lg bg-red-50 p-4 text-sm text-red-600">
- Error: {error.message}
+ Error: {error}
</div>
);
}
- if (!data?.feeds || data.feeds.length === 0) {
+ if (feeds.length === 0) {
return (
<div className="py-8 text-center">
<p className="text-sm text-stone-400">No feeds added yet.</p>
@@ -38,11 +63,12 @@ export function FeedList({ onFeedUnsubscribed }: Props) {
return (
<div className="space-y-3">
- {data.feeds.map((feed) => (
+ {feeds.map((feed) => (
<FeedItem
key={feed.id}
feed={feed}
- onFeedUnsubscribed={onFeedUnsubscribed}
+ onFeedUnsubscribed={handleFeedUnsubscribed}
+ onFeedChanged={handleFeedChanged}
/>
))}
</div>
diff --git a/frontend/src/components/FeedSidebar.tsx b/frontend/src/components/FeedSidebar.tsx
index 73d9504..4f50566 100644
--- a/frontend/src/components/FeedSidebar.tsx
+++ b/frontend/src/components/FeedSidebar.tsx
@@ -1,23 +1,35 @@
-import { useQuery } from "urql";
+import { useCallback, useEffect, useState } from "react";
import { useLocation, useSearch } from "wouter";
-import { GetFeedsDocument } from "../graphql/generated/graphql";
+import type { components } from "../api/generated";
+import { api } from "../services/api-client";
+
+type Feed = components["schemas"]["Feed"];
interface Props {
basePath: string;
}
-const urqlContextFeed = { additionalTypenames: ["Feed", "Article"] };
-
export function FeedSidebar({ basePath }: Props) {
const search = useSearch();
const [, setLocation] = useLocation();
const params = new URLSearchParams(search);
const selectedFeedId = params.get("feed");
- const [{ data, fetching }] = useQuery({
- query: GetFeedsDocument,
- context: urqlContextFeed,
- });
+ const [feeds, setFeeds] = useState<Feed[]>([]);
+ const [fetching, setFetching] = useState(true);
+
+ const fetchFeeds = useCallback(async () => {
+ setFetching(true);
+ const { data } = await api.GET("/api/feeds");
+ if (data) {
+ setFeeds(data);
+ }
+ setFetching(false);
+ }, []);
+
+ useEffect(() => {
+ fetchFeeds();
+ }, [fetchFeeds]);
const handleSelect = (feedId: string | null) => {
if (feedId) {
@@ -49,7 +61,7 @@ export function FeedSidebar({ basePath }: Props) {
{fetching && (
<li className="px-3 py-1.5 text-xs text-stone-400">Loading...</li>
)}
- {data?.feeds.map((feed) => (
+ {feeds.map((feed) => (
<li key={feed.id}>
<button
type="button"
diff --git a/frontend/src/contexts/AuthContext.tsx b/frontend/src/contexts/AuthContext.tsx
index 7e38786..9b157cb 100644
--- a/frontend/src/contexts/AuthContext.tsx
+++ b/frontend/src/contexts/AuthContext.tsx
@@ -1,10 +1,12 @@
-import { createContext, type ReactNode, useContext } from "react";
-import { useMutation, useQuery } from "urql";
import {
- GetCurrentUserDocument,
- LoginDocument,
- LogoutDocument,
-} from "../graphql/generated/graphql";
+ createContext,
+ type ReactNode,
+ useCallback,
+ useContext,
+ useEffect,
+ useState,
+} from "react";
+import { api } from "../services/api-client";
type LoginResult = { success: true } | { success: false; error: string };
@@ -17,56 +19,43 @@ interface AuthContextType {
const AuthContext = createContext<AuthContextType | undefined>(undefined);
-const urqlContextUser = { additionalTypenames: ["User"] };
-
export function AuthProvider({ children }: { children: ReactNode }) {
- const [, executeLogin] = useMutation(LoginDocument);
- const [, executeLogout] = useMutation(LogoutDocument);
- const [currentUserResult, reexecuteGetCurrentUser] = useQuery({
- query: GetCurrentUserDocument,
- context: urqlContextUser,
- });
+ const [isLoggedIn, setIsLoggedIn] = useState(false);
+ const [isLoading, setIsLoading] = useState(true);
+
+ const checkAuth = useCallback(async () => {
+ const { data } = await api.GET("/api/auth/me");
+ setIsLoggedIn(!!data);
+ setIsLoading(false);
+ }, []);
- const isLoggedIn = !!currentUserResult.data?.currentUser;
- const isLoading = currentUserResult.fetching || currentUserResult.stale;
+ useEffect(() => {
+ checkAuth();
+ }, [checkAuth]);
const login = async (
username: string,
password: string,
): Promise<LoginResult> => {
- try {
- const result = await executeLogin(
- { username, password },
- urqlContextUser,
- );
-
- if (result.error) {
- const errorMessage =
- result.error.graphQLErrors[0]?.message || result.error.message;
- return { success: false, error: errorMessage };
- }
+ const { data, error } = await api.POST("/api/auth/login", {
+ body: { username, password },
+ });
- if (result.data?.login?.user) {
- reexecuteGetCurrentUser({ requestPolicy: "network-only" });
- return { success: true };
- }
+ if (error) {
+ return { success: false, error: error.message };
+ }
- const errorMessage = "Invalid username or password";
- return { success: false, error: errorMessage };
- } catch (error) {
- const errorMessage =
- error instanceof Error ? error.message : "An unknown error occurred";
- console.error("Login failed:", error);
- return { success: false, error: errorMessage };
+ if (data?.user) {
+ setIsLoggedIn(true);
+ return { success: true };
}
+
+ return { success: false, error: "Invalid username or password" };
};
const logout = async () => {
- try {
- await executeLogout({}, urqlContextUser);
- } catch (error) {
- console.error("Logout failed:", error);
- }
+ await api.POST("/api/auth/logout");
+ setIsLoggedIn(false);
};
return (
diff --git a/frontend/src/graphql/generated/fragment-masking.ts b/frontend/src/graphql/generated/fragment-masking.ts
deleted file mode 100644
index 743a364..0000000
--- a/frontend/src/graphql/generated/fragment-masking.ts
+++ /dev/null
@@ -1,87 +0,0 @@
-/* eslint-disable */
-import type { ResultOf, DocumentTypeDecoration, TypedDocumentNode } from '@graphql-typed-document-node/core';
-import type { FragmentDefinitionNode } from 'graphql';
-import type { Incremental } from './graphql';
-
-
-export type FragmentType<TDocumentType extends DocumentTypeDecoration<any, any>> = TDocumentType extends DocumentTypeDecoration<
- infer TType,
- any
->
- ? [TType] extends [{ ' $fragmentName'?: infer TKey }]
- ? TKey extends string
- ? { ' $fragmentRefs'?: { [key in TKey]: TType } }
- : never
- : never
- : never;
-
-// return non-nullable if `fragmentType` is non-nullable
-export function useFragment<TType>(
- _documentNode: DocumentTypeDecoration<TType, any>,
- fragmentType: FragmentType<DocumentTypeDecoration<TType, any>>
-): TType;
-// return nullable if `fragmentType` is undefined
-export function useFragment<TType>(
- _documentNode: DocumentTypeDecoration<TType, any>,
- fragmentType: FragmentType<DocumentTypeDecoration<TType, any>> | undefined
-): TType | undefined;
-// return nullable if `fragmentType` is nullable
-export function useFragment<TType>(
- _documentNode: DocumentTypeDecoration<TType, any>,
- fragmentType: FragmentType<DocumentTypeDecoration<TType, any>> | null
-): TType | null;
-// return nullable if `fragmentType` is nullable or undefined
-export function useFragment<TType>(
- _documentNode: DocumentTypeDecoration<TType, any>,
- fragmentType: FragmentType<DocumentTypeDecoration<TType, any>> | null | undefined
-): TType | null | undefined;
-// return array of non-nullable if `fragmentType` is array of non-nullable
-export function useFragment<TType>(
- _documentNode: DocumentTypeDecoration<TType, any>,
- fragmentType: Array<FragmentType<DocumentTypeDecoration<TType, any>>>
-): Array<TType>;
-// return array of nullable if `fragmentType` is array of nullable
-export function useFragment<TType>(
- _documentNode: DocumentTypeDecoration<TType, any>,
- fragmentType: Array<FragmentType<DocumentTypeDecoration<TType, any>>> | null | undefined
-): Array<TType> | null | undefined;
-// return readonly array of non-nullable if `fragmentType` is array of non-nullable
-export function useFragment<TType>(
- _documentNode: DocumentTypeDecoration<TType, any>,
- fragmentType: ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>>
-): ReadonlyArray<TType>;
-// return readonly array of nullable if `fragmentType` is array of nullable
-export function useFragment<TType>(
- _documentNode: DocumentTypeDecoration<TType, any>,
- fragmentType: ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>> | null | undefined
-): ReadonlyArray<TType> | null | undefined;
-export function useFragment<TType>(
- _documentNode: DocumentTypeDecoration<TType, any>,
- fragmentType: FragmentType<DocumentTypeDecoration<TType, any>> | Array<FragmentType<DocumentTypeDecoration<TType, any>>> | ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>> | null | undefined
-): TType | Array<TType> | ReadonlyArray<TType> | null | undefined {
- return fragmentType as any;
-}
-
-
-export function makeFragmentData<
- F extends DocumentTypeDecoration<any, any>,
- FT extends ResultOf<F>
->(data: FT, _fragment: F): FragmentType<F> {
- return data as FragmentType<F>;
-}
-export function isFragmentReady<TQuery, TFrag>(
- queryNode: DocumentTypeDecoration<TQuery, any>,
- fragmentNode: TypedDocumentNode<TFrag>,
- data: FragmentType<TypedDocumentNode<Incremental<TFrag>, any>> | null | undefined
-): data is FragmentType<typeof fragmentNode> {
- const deferredFields = (queryNode as { __meta__?: { deferredFields: Record<string, (keyof TFrag)[]> } }).__meta__
- ?.deferredFields;
-
- if (!deferredFields) return true;
-
- const fragDef = fragmentNode.definitions[0] as FragmentDefinitionNode | undefined;
- const fragName = fragDef?.name?.value;
-
- const fields = (fragName && deferredFields[fragName]) || [];
- return fields.length > 0 && fields.every(field => data && field in data);
-}
diff --git a/frontend/src/graphql/generated/gql.ts b/frontend/src/graphql/generated/gql.ts
deleted file mode 100644
index 40e292f..0000000
--- a/frontend/src/graphql/generated/gql.ts
+++ /dev/null
@@ -1,52 +0,0 @@
-/* eslint-disable */
-import * as types from './graphql';
-import type { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';
-
-/**
- * Map of all GraphQL operations in the project.
- *
- * This map has several performance disadvantages:
- * 1. It is not tree-shakeable, so it will include all operations in the project.
- * 2. It is not minifiable, so the string of a GraphQL query will be multiple times inside the bundle.
- * 3. It does not support dead code elimination, so it will add unused operations.
- *
- * Therefore it is highly recommended to use the babel or swc plugin for production.
- * Learn more about it here: https://the-guild.dev/graphql/codegen/plugins/presets/preset-client#reducing-bundle-size
- */
-type Documents = {
- "mutation AddFeed($url: String!) {\n addFeed(url: $url) {\n id\n url\n title\n fetchedAt\n }\n}\n\nmutation UnsubscribeFeed($id: ID!) {\n unsubscribeFeed(id: $id)\n}\n\nmutation MarkArticleRead($id: ID!) {\n markArticleRead(id: $id) {\n id\n feedId\n guid\n title\n url\n isRead\n }\n}\n\nmutation MarkArticleUnread($id: ID!) {\n markArticleUnread(id: $id) {\n id\n feedId\n guid\n title\n url\n isRead\n }\n}\n\nmutation MarkFeedRead($id: ID!) {\n markFeedRead(id: $id) {\n id\n url\n title\n fetchedAt\n }\n}\n\nmutation MarkFeedUnread($id: ID!) {\n markFeedUnread(id: $id) {\n id\n url\n title\n fetchedAt\n }\n}\n\nmutation Login($username: String!, $password: String!) {\n login(username: $username, password: $password) {\n user {\n id\n username\n }\n }\n}\n\nmutation Logout {\n logout\n}": typeof types.AddFeedDocument,
- "query GetFeeds {\n feeds {\n id\n url\n title\n fetchedAt\n isSubscribed\n unreadCount\n }\n}\n\nquery GetUnreadArticles($feedId: ID, $after: ID, $first: Int) {\n unreadArticles(feedId: $feedId, after: $after, first: $first) {\n articles {\n id\n feedId\n guid\n title\n url\n isRead\n feed {\n id\n title\n isSubscribed\n }\n }\n pageInfo {\n hasNextPage\n endCursor\n }\n }\n}\n\nquery GetReadArticles($feedId: ID, $after: ID, $first: Int) {\n readArticles(feedId: $feedId, after: $after, first: $first) {\n articles {\n id\n feedId\n guid\n title\n url\n isRead\n feed {\n id\n title\n isSubscribed\n }\n }\n pageInfo {\n hasNextPage\n endCursor\n }\n }\n}\n\nquery GetFeed($id: ID!) {\n feed(id: $id) {\n id\n url\n title\n fetchedAt\n isSubscribed\n articles {\n id\n guid\n title\n url\n isRead\n }\n }\n}\n\nquery GetArticle($id: ID!) {\n article(id: $id) {\n id\n feedId\n guid\n title\n url\n isRead\n feed {\n id\n title\n isSubscribed\n }\n }\n}\n\nquery GetCurrentUser {\n currentUser {\n id\n username\n }\n}": typeof types.GetFeedsDocument,
-};
-const documents: Documents = {
- "mutation AddFeed($url: String!) {\n addFeed(url: $url) {\n id\n url\n title\n fetchedAt\n }\n}\n\nmutation UnsubscribeFeed($id: ID!) {\n unsubscribeFeed(id: $id)\n}\n\nmutation MarkArticleRead($id: ID!) {\n markArticleRead(id: $id) {\n id\n feedId\n guid\n title\n url\n isRead\n }\n}\n\nmutation MarkArticleUnread($id: ID!) {\n markArticleUnread(id: $id) {\n id\n feedId\n guid\n title\n url\n isRead\n }\n}\n\nmutation MarkFeedRead($id: ID!) {\n markFeedRead(id: $id) {\n id\n url\n title\n fetchedAt\n }\n}\n\nmutation MarkFeedUnread($id: ID!) {\n markFeedUnread(id: $id) {\n id\n url\n title\n fetchedAt\n }\n}\n\nmutation Login($username: String!, $password: String!) {\n login(username: $username, password: $password) {\n user {\n id\n username\n }\n }\n}\n\nmutation Logout {\n logout\n}": types.AddFeedDocument,
- "query GetFeeds {\n feeds {\n id\n url\n title\n fetchedAt\n isSubscribed\n unreadCount\n }\n}\n\nquery GetUnreadArticles($feedId: ID, $after: ID, $first: Int) {\n unreadArticles(feedId: $feedId, after: $after, first: $first) {\n articles {\n id\n feedId\n guid\n title\n url\n isRead\n feed {\n id\n title\n isSubscribed\n }\n }\n pageInfo {\n hasNextPage\n endCursor\n }\n }\n}\n\nquery GetReadArticles($feedId: ID, $after: ID, $first: Int) {\n readArticles(feedId: $feedId, after: $after, first: $first) {\n articles {\n id\n feedId\n guid\n title\n url\n isRead\n feed {\n id\n title\n isSubscribed\n }\n }\n pageInfo {\n hasNextPage\n endCursor\n }\n }\n}\n\nquery GetFeed($id: ID!) {\n feed(id: $id) {\n id\n url\n title\n fetchedAt\n isSubscribed\n articles {\n id\n guid\n title\n url\n isRead\n }\n }\n}\n\nquery GetArticle($id: ID!) {\n article(id: $id) {\n id\n feedId\n guid\n title\n url\n isRead\n feed {\n id\n title\n isSubscribed\n }\n }\n}\n\nquery GetCurrentUser {\n currentUser {\n id\n username\n }\n}": types.GetFeedsDocument,
-};
-
-/**
- * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
- *
- *
- * @example
- * ```ts
- * const query = graphql(`query GetUser($id: ID!) { user(id: $id) { name } }`);
- * ```
- *
- * The query argument is unknown!
- * Please regenerate the types.
- */
-export function graphql(source: string): unknown;
-
-/**
- * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
- */
-export function graphql(source: "mutation AddFeed($url: String!) {\n addFeed(url: $url) {\n id\n url\n title\n fetchedAt\n }\n}\n\nmutation UnsubscribeFeed($id: ID!) {\n unsubscribeFeed(id: $id)\n}\n\nmutation MarkArticleRead($id: ID!) {\n markArticleRead(id: $id) {\n id\n feedId\n guid\n title\n url\n isRead\n }\n}\n\nmutation MarkArticleUnread($id: ID!) {\n markArticleUnread(id: $id) {\n id\n feedId\n guid\n title\n url\n isRead\n }\n}\n\nmutation MarkFeedRead($id: ID!) {\n markFeedRead(id: $id) {\n id\n url\n title\n fetchedAt\n }\n}\n\nmutation MarkFeedUnread($id: ID!) {\n markFeedUnread(id: $id) {\n id\n url\n title\n fetchedAt\n }\n}\n\nmutation Login($username: String!, $password: String!) {\n login(username: $username, password: $password) {\n user {\n id\n username\n }\n }\n}\n\nmutation Logout {\n logout\n}"): (typeof documents)["mutation AddFeed($url: String!) {\n addFeed(url: $url) {\n id\n url\n title\n fetchedAt\n }\n}\n\nmutation UnsubscribeFeed($id: ID!) {\n unsubscribeFeed(id: $id)\n}\n\nmutation MarkArticleRead($id: ID!) {\n markArticleRead(id: $id) {\n id\n feedId\n guid\n title\n url\n isRead\n }\n}\n\nmutation MarkArticleUnread($id: ID!) {\n markArticleUnread(id: $id) {\n id\n feedId\n guid\n title\n url\n isRead\n }\n}\n\nmutation MarkFeedRead($id: ID!) {\n markFeedRead(id: $id) {\n id\n url\n title\n fetchedAt\n }\n}\n\nmutation MarkFeedUnread($id: ID!) {\n markFeedUnread(id: $id) {\n id\n url\n title\n fetchedAt\n }\n}\n\nmutation Login($username: String!, $password: String!) {\n login(username: $username, password: $password) {\n user {\n id\n username\n }\n }\n}\n\nmutation Logout {\n logout\n}"];
-/**
- * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
- */
-export function graphql(source: "query GetFeeds {\n feeds {\n id\n url\n title\n fetchedAt\n isSubscribed\n unreadCount\n }\n}\n\nquery GetUnreadArticles($feedId: ID, $after: ID, $first: Int) {\n unreadArticles(feedId: $feedId, after: $after, first: $first) {\n articles {\n id\n feedId\n guid\n title\n url\n isRead\n feed {\n id\n title\n isSubscribed\n }\n }\n pageInfo {\n hasNextPage\n endCursor\n }\n }\n}\n\nquery GetReadArticles($feedId: ID, $after: ID, $first: Int) {\n readArticles(feedId: $feedId, after: $after, first: $first) {\n articles {\n id\n feedId\n guid\n title\n url\n isRead\n feed {\n id\n title\n isSubscribed\n }\n }\n pageInfo {\n hasNextPage\n endCursor\n }\n }\n}\n\nquery GetFeed($id: ID!) {\n feed(id: $id) {\n id\n url\n title\n fetchedAt\n isSubscribed\n articles {\n id\n guid\n title\n url\n isRead\n }\n }\n}\n\nquery GetArticle($id: ID!) {\n article(id: $id) {\n id\n feedId\n guid\n title\n url\n isRead\n feed {\n id\n title\n isSubscribed\n }\n }\n}\n\nquery GetCurrentUser {\n currentUser {\n id\n username\n }\n}"): (typeof documents)["query GetFeeds {\n feeds {\n id\n url\n title\n fetchedAt\n isSubscribed\n unreadCount\n }\n}\n\nquery GetUnreadArticles($feedId: ID, $after: ID, $first: Int) {\n unreadArticles(feedId: $feedId, after: $after, first: $first) {\n articles {\n id\n feedId\n guid\n title\n url\n isRead\n feed {\n id\n title\n isSubscribed\n }\n }\n pageInfo {\n hasNextPage\n endCursor\n }\n }\n}\n\nquery GetReadArticles($feedId: ID, $after: ID, $first: Int) {\n readArticles(feedId: $feedId, after: $after, first: $first) {\n articles {\n id\n feedId\n guid\n title\n url\n isRead\n feed {\n id\n title\n isSubscribed\n }\n }\n pageInfo {\n hasNextPage\n endCursor\n }\n }\n}\n\nquery GetFeed($id: ID!) {\n feed(id: $id) {\n id\n url\n title\n fetchedAt\n isSubscribed\n articles {\n id\n guid\n title\n url\n isRead\n }\n }\n}\n\nquery GetArticle($id: ID!) {\n article(id: $id) {\n id\n feedId\n guid\n title\n url\n isRead\n feed {\n id\n title\n isSubscribed\n }\n }\n}\n\nquery GetCurrentUser {\n currentUser {\n id\n username\n }\n}"];
-
-export function graphql(source: string) {
- return (documents as any)[source] ?? {};
-}
-
-export type DocumentType<TDocumentNode extends DocumentNode<any, any>> = TDocumentNode extends DocumentNode< infer TType, any> ? TType : never; \ No newline at end of file
diff --git a/frontend/src/graphql/generated/graphql.ts b/frontend/src/graphql/generated/graphql.ts
deleted file mode 100644
index 9d7c168..0000000
--- a/frontend/src/graphql/generated/graphql.ts
+++ /dev/null
@@ -1,304 +0,0 @@
-/* eslint-disable */
-import type { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';
-export type Maybe<T> = T | null;
-export type InputMaybe<T> = Maybe<T>;
-export type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };
-export type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };
-export type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };
-export type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };
-export type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };
-/** All built-in and custom scalars, mapped to their actual values */
-export type Scalars = {
- ID: { input: string; output: string; }
- String: { input: string; output: string; }
- Boolean: { input: boolean; output: boolean; }
- Int: { input: number; output: number; }
- Float: { input: number; output: number; }
- DateTime: { input: string; output: string; }
-};
-
-/** Represents an individual article/post from a feed */
-export type Article = {
- /** The feed this article belongs to */
- feed: Feed;
- /** ID of the feed this article belongs to */
- feedId: Scalars['ID']['output'];
- /** GUID from the RSS/Atom feed (unique identifier from feed) */
- guid: Scalars['String']['output'];
- /** Unique identifier for the article */
- id: Scalars['ID']['output'];
- /** Whether the article has been marked as read */
- isRead: Scalars['Boolean']['output'];
- /** Title of the article */
- title: Scalars['String']['output'];
- /** URL/link to the original article */
- url: Scalars['String']['output'];
-};
-
-/** A paginated list of articles */
-export type ArticleConnection = {
- /** The list of articles */
- articles: Array<Article>;
- /** Pagination information */
- pageInfo: PageInfo;
-};
-
-/** Authentication payload returned from login mutation */
-export type AuthPayload = {
- /** The authenticated user */
- user: User;
-};
-
-/** Represents a feed subscription in the system */
-export type Feed = {
- /** Articles belonging to this feed */
- articles: Array<Article>;
- /** Timestamp when the feed was last fetched */
- fetchedAt: Scalars['DateTime']['output'];
- /** Unique identifier for the feed */
- id: Scalars['ID']['output'];
- /** Whether the user is currently subscribed to this feed */
- isSubscribed: Scalars['Boolean']['output'];
- /** Title of the feed (extracted from feed metadata) */
- title: Scalars['String']['output'];
- /** Number of unread articles in this feed */
- unreadCount: Scalars['Int']['output'];
- /** URL of the RSS/Atom feed */
- url: Scalars['String']['output'];
-};
-
-/** Root mutation type for modifying data */
-export type Mutation = {
- /** Add a new feed subscription */
- addFeed: Feed;
- /** Login with username and password. Creates a session cookie. */
- login: AuthPayload;
- /** Logout the current user and destroy the session */
- logout: Scalars['Boolean']['output'];
- /** Mark an article as read */
- markArticleRead: Article;
- /** Mark an article as unread */
- markArticleUnread: Article;
- /** Mark all articles in a feed as read */
- markFeedRead: Feed;
- /** Mark all articles in a feed as unread */
- markFeedUnread: Feed;
- /** Unsubscribe from a feed (preserves feed and article data) */
- unsubscribeFeed: Scalars['Boolean']['output'];
-};
-
-
-/** Root mutation type for modifying data */
-export type MutationAddFeedArgs = {
- url: Scalars['String']['input'];
-};
-
-
-/** Root mutation type for modifying data */
-export type MutationLoginArgs = {
- password: Scalars['String']['input'];
- username: Scalars['String']['input'];
-};
-
-
-/** Root mutation type for modifying data */
-export type MutationMarkArticleReadArgs = {
- id: Scalars['ID']['input'];
-};
-
-
-/** Root mutation type for modifying data */
-export type MutationMarkArticleUnreadArgs = {
- id: Scalars['ID']['input'];
-};
-
-
-/** Root mutation type for modifying data */
-export type MutationMarkFeedReadArgs = {
- id: Scalars['ID']['input'];
-};
-
-
-/** Root mutation type for modifying data */
-export type MutationMarkFeedUnreadArgs = {
- id: Scalars['ID']['input'];
-};
-
-
-/** Root mutation type for modifying data */
-export type MutationUnsubscribeFeedArgs = {
- id: Scalars['ID']['input'];
-};
-
-/** Pagination information for cursor-based pagination */
-export type PageInfo = {
- /** Cursor of the last item in this page */
- endCursor?: Maybe<Scalars['ID']['output']>;
- /** Whether there are more items after the last item in this page */
- hasNextPage: Scalars['Boolean']['output'];
-};
-
-/** Root query type for reading data */
-export type Query = {
- /** Get a specific article by ID */
- article?: Maybe<Article>;
- /** Get the currently authenticated user */
- currentUser?: Maybe<User>;
- /** Get a specific feed by ID */
- feed?: Maybe<Feed>;
- /** Get all feeds with their metadata */
- feeds: Array<Feed>;
- /** Get read articles with optional feed filter and cursor-based pagination */
- readArticles: ArticleConnection;
- /** Get unread articles with optional feed filter and cursor-based pagination */
- unreadArticles: ArticleConnection;
-};
-
-
-/** Root query type for reading data */
-export type QueryArticleArgs = {
- id: Scalars['ID']['input'];
-};
-
-
-/** Root query type for reading data */
-export type QueryFeedArgs = {
- id: Scalars['ID']['input'];
-};
-
-
-/** Root query type for reading data */
-export type QueryReadArticlesArgs = {
- after?: InputMaybe<Scalars['ID']['input']>;
- feedId?: InputMaybe<Scalars['ID']['input']>;
- first?: InputMaybe<Scalars['Int']['input']>;
-};
-
-
-/** Root query type for reading data */
-export type QueryUnreadArticlesArgs = {
- after?: InputMaybe<Scalars['ID']['input']>;
- feedId?: InputMaybe<Scalars['ID']['input']>;
- first?: InputMaybe<Scalars['Int']['input']>;
-};
-
-/** Represents a user in the system */
-export type User = {
- /** Unique identifier for the user */
- id: Scalars['ID']['output'];
- /** Username of the user */
- username: Scalars['String']['output'];
-};
-
-export type AddFeedMutationVariables = Exact<{
- url: Scalars['String']['input'];
-}>;
-
-
-export type AddFeedMutation = { addFeed: { id: string, url: string, title: string, fetchedAt: string } };
-
-export type UnsubscribeFeedMutationVariables = Exact<{
- id: Scalars['ID']['input'];
-}>;
-
-
-export type UnsubscribeFeedMutation = { unsubscribeFeed: boolean };
-
-export type MarkArticleReadMutationVariables = Exact<{
- id: Scalars['ID']['input'];
-}>;
-
-
-export type MarkArticleReadMutation = { markArticleRead: { id: string, feedId: string, guid: string, title: string, url: string, isRead: boolean } };
-
-export type MarkArticleUnreadMutationVariables = Exact<{
- id: Scalars['ID']['input'];
-}>;
-
-
-export type MarkArticleUnreadMutation = { markArticleUnread: { id: string, feedId: string, guid: string, title: string, url: string, isRead: boolean } };
-
-export type MarkFeedReadMutationVariables = Exact<{
- id: Scalars['ID']['input'];
-}>;
-
-
-export type MarkFeedReadMutation = { markFeedRead: { id: string, url: string, title: string, fetchedAt: string } };
-
-export type MarkFeedUnreadMutationVariables = Exact<{
- id: Scalars['ID']['input'];
-}>;
-
-
-export type MarkFeedUnreadMutation = { markFeedUnread: { id: string, url: string, title: string, fetchedAt: string } };
-
-export type LoginMutationVariables = Exact<{
- username: Scalars['String']['input'];
- password: Scalars['String']['input'];
-}>;
-
-
-export type LoginMutation = { login: { user: { id: string, username: string } } };
-
-export type LogoutMutationVariables = Exact<{ [key: string]: never; }>;
-
-
-export type LogoutMutation = { logout: boolean };
-
-export type GetFeedsQueryVariables = Exact<{ [key: string]: never; }>;
-
-
-export type GetFeedsQuery = { feeds: Array<{ id: string, url: string, title: string, fetchedAt: string, isSubscribed: boolean, unreadCount: number }> };
-
-export type GetUnreadArticlesQueryVariables = Exact<{
- feedId?: InputMaybe<Scalars['ID']['input']>;
- after?: InputMaybe<Scalars['ID']['input']>;
- first?: InputMaybe<Scalars['Int']['input']>;
-}>;
-
-
-export type GetUnreadArticlesQuery = { unreadArticles: { articles: Array<{ id: string, feedId: string, guid: string, title: string, url: string, isRead: boolean, feed: { id: string, title: string, isSubscribed: boolean } }>, pageInfo: { hasNextPage: boolean, endCursor?: string | null } } };
-
-export type GetReadArticlesQueryVariables = Exact<{
- feedId?: InputMaybe<Scalars['ID']['input']>;
- after?: InputMaybe<Scalars['ID']['input']>;
- first?: InputMaybe<Scalars['Int']['input']>;
-}>;
-
-
-export type GetReadArticlesQuery = { readArticles: { articles: Array<{ id: string, feedId: string, guid: string, title: string, url: string, isRead: boolean, feed: { id: string, title: string, isSubscribed: boolean } }>, pageInfo: { hasNextPage: boolean, endCursor?: string | null } } };
-
-export type GetFeedQueryVariables = Exact<{
- id: Scalars['ID']['input'];
-}>;
-
-
-export type GetFeedQuery = { feed?: { id: string, url: string, title: string, fetchedAt: string, isSubscribed: boolean, articles: Array<{ id: string, guid: string, title: string, url: string, isRead: boolean }> } | null };
-
-export type GetArticleQueryVariables = Exact<{
- id: Scalars['ID']['input'];
-}>;
-
-
-export type GetArticleQuery = { article?: { id: string, feedId: string, guid: string, title: string, url: string, isRead: boolean, feed: { id: string, title: string, isSubscribed: boolean } } | null };
-
-export type GetCurrentUserQueryVariables = Exact<{ [key: string]: never; }>;
-
-
-export type GetCurrentUserQuery = { currentUser?: { id: string, username: string } | null };
-
-
-export const AddFeedDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"AddFeed"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"url"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"addFeed"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"url"},"value":{"kind":"Variable","name":{"kind":"Name","value":"url"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"url"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"fetchedAt"}}]}}]}}]} as unknown as DocumentNode<AddFeedMutation, AddFeedMutationVariables>;
-export const UnsubscribeFeedDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"UnsubscribeFeed"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"id"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"unsubscribeFeed"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"id"}}}]}]}}]} as unknown as DocumentNode<UnsubscribeFeedMutation, UnsubscribeFeedMutationVariables>;
-export const MarkArticleReadDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"MarkArticleRead"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"id"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"markArticleRead"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"id"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"feedId"}},{"kind":"Field","name":{"kind":"Name","value":"guid"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"url"}},{"kind":"Field","name":{"kind":"Name","value":"isRead"}}]}}]}}]} as unknown as DocumentNode<MarkArticleReadMutation, MarkArticleReadMutationVariables>;
-export const MarkArticleUnreadDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"MarkArticleUnread"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"id"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"markArticleUnread"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"id"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"feedId"}},{"kind":"Field","name":{"kind":"Name","value":"guid"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"url"}},{"kind":"Field","name":{"kind":"Name","value":"isRead"}}]}}]}}]} as unknown as DocumentNode<MarkArticleUnreadMutation, MarkArticleUnreadMutationVariables>;
-export const MarkFeedReadDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"MarkFeedRead"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"id"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"markFeedRead"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"id"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"url"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"fetchedAt"}}]}}]}}]} as unknown as DocumentNode<MarkFeedReadMutation, MarkFeedReadMutationVariables>;
-export const MarkFeedUnreadDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"MarkFeedUnread"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"id"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"markFeedUnread"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"id"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"url"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"fetchedAt"}}]}}]}}]} as unknown as DocumentNode<MarkFeedUnreadMutation, MarkFeedUnreadMutationVariables>;
-export const LoginDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"Login"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"username"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"password"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"login"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"username"},"value":{"kind":"Variable","name":{"kind":"Name","value":"username"}}},{"kind":"Argument","name":{"kind":"Name","value":"password"},"value":{"kind":"Variable","name":{"kind":"Name","value":"password"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"user"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"username"}}]}}]}}]}}]} as unknown as DocumentNode<LoginMutation, LoginMutationVariables>;
-export const LogoutDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"Logout"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"logout"}}]}}]} as unknown as DocumentNode<LogoutMutation, LogoutMutationVariables>;
-export const GetFeedsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetFeeds"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"feeds"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"url"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"fetchedAt"}},{"kind":"Field","name":{"kind":"Name","value":"isSubscribed"}},{"kind":"Field","name":{"kind":"Name","value":"unreadCount"}}]}}]}}]} as unknown as DocumentNode<GetFeedsQuery, GetFeedsQueryVariables>;
-export const GetUnreadArticlesDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetUnreadArticles"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"feedId"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"after"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"first"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"Int"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"unreadArticles"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"feedId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"feedId"}}},{"kind":"Argument","name":{"kind":"Name","value":"after"},"value":{"kind":"Variable","name":{"kind":"Name","value":"after"}}},{"kind":"Argument","name":{"kind":"Name","value":"first"},"value":{"kind":"Variable","name":{"kind":"Name","value":"first"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"articles"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"feedId"}},{"kind":"Field","name":{"kind":"Name","value":"guid"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"url"}},{"kind":"Field","name":{"kind":"Name","value":"isRead"}},{"kind":"Field","name":{"kind":"Name","value":"feed"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"isSubscribed"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"pageInfo"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"hasNextPage"}},{"kind":"Field","name":{"kind":"Name","value":"endCursor"}}]}}]}}]}}]} as unknown as DocumentNode<GetUnreadArticlesQuery, GetUnreadArticlesQueryVariables>;
-export const GetReadArticlesDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetReadArticles"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"feedId"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"after"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"first"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"Int"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"readArticles"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"feedId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"feedId"}}},{"kind":"Argument","name":{"kind":"Name","value":"after"},"value":{"kind":"Variable","name":{"kind":"Name","value":"after"}}},{"kind":"Argument","name":{"kind":"Name","value":"first"},"value":{"kind":"Variable","name":{"kind":"Name","value":"first"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"articles"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"feedId"}},{"kind":"Field","name":{"kind":"Name","value":"guid"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"url"}},{"kind":"Field","name":{"kind":"Name","value":"isRead"}},{"kind":"Field","name":{"kind":"Name","value":"feed"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"isSubscribed"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"pageInfo"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"hasNextPage"}},{"kind":"Field","name":{"kind":"Name","value":"endCursor"}}]}}]}}]}}]} as unknown as DocumentNode<GetReadArticlesQuery, GetReadArticlesQueryVariables>;
-export const GetFeedDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetFeed"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"id"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"feed"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"id"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"url"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"fetchedAt"}},{"kind":"Field","name":{"kind":"Name","value":"isSubscribed"}},{"kind":"Field","name":{"kind":"Name","value":"articles"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"guid"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"url"}},{"kind":"Field","name":{"kind":"Name","value":"isRead"}}]}}]}}]}}]} as unknown as DocumentNode<GetFeedQuery, GetFeedQueryVariables>;
-export const GetArticleDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetArticle"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"id"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"article"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"id"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"feedId"}},{"kind":"Field","name":{"kind":"Name","value":"guid"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"url"}},{"kind":"Field","name":{"kind":"Name","value":"isRead"}},{"kind":"Field","name":{"kind":"Name","value":"feed"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"isSubscribed"}}]}}]}}]}}]} as unknown as DocumentNode<GetArticleQuery, GetArticleQueryVariables>;
-export const GetCurrentUserDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetCurrentUser"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"currentUser"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"username"}}]}}]}}]} as unknown as DocumentNode<GetCurrentUserQuery, GetCurrentUserQueryVariables>; \ No newline at end of file
diff --git a/frontend/src/graphql/generated/index.ts b/frontend/src/graphql/generated/index.ts
deleted file mode 100644
index f515991..0000000
--- a/frontend/src/graphql/generated/index.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-export * from "./fragment-masking";
-export * from "./gql"; \ No newline at end of file
diff --git a/frontend/src/graphql/mutations.graphql b/frontend/src/graphql/mutations.graphql
deleted file mode 100644
index f919e66..0000000
--- a/frontend/src/graphql/mutations.graphql
+++ /dev/null
@@ -1,65 +0,0 @@
-mutation AddFeed($url: String!) {
- addFeed(url: $url) {
- id
- url
- title
- fetchedAt
- }
-}
-
-mutation UnsubscribeFeed($id: ID!) {
- unsubscribeFeed(id: $id)
-}
-
-mutation MarkArticleRead($id: ID!) {
- markArticleRead(id: $id) {
- id
- feedId
- guid
- title
- url
- isRead
- }
-}
-
-mutation MarkArticleUnread($id: ID!) {
- markArticleUnread(id: $id) {
- id
- feedId
- guid
- title
- url
- isRead
- }
-}
-
-mutation MarkFeedRead($id: ID!) {
- markFeedRead(id: $id) {
- id
- url
- title
- fetchedAt
- }
-}
-
-mutation MarkFeedUnread($id: ID!) {
- markFeedUnread(id: $id) {
- id
- url
- title
- fetchedAt
- }
-}
-
-mutation Login($username: String!, $password: String!) {
- login(username: $username, password: $password) {
- user {
- id
- username
- }
- }
-}
-
-mutation Logout {
- logout
-}
diff --git a/frontend/src/graphql/queries.graphql b/frontend/src/graphql/queries.graphql
deleted file mode 100644
index 0b0e25c..0000000
--- a/frontend/src/graphql/queries.graphql
+++ /dev/null
@@ -1,94 +0,0 @@
-query GetFeeds {
- feeds {
- id
- url
- title
- fetchedAt
- isSubscribed
- unreadCount
- }
-}
-
-query GetUnreadArticles($feedId: ID, $after: ID, $first: Int) {
- unreadArticles(feedId: $feedId, after: $after, first: $first) {
- articles {
- id
- feedId
- guid
- title
- url
- isRead
- feed {
- id
- title
- isSubscribed
- }
- }
- pageInfo {
- hasNextPage
- endCursor
- }
- }
-}
-
-query GetReadArticles($feedId: ID, $after: ID, $first: Int) {
- readArticles(feedId: $feedId, after: $after, first: $first) {
- articles {
- id
- feedId
- guid
- title
- url
- isRead
- feed {
- id
- title
- isSubscribed
- }
- }
- pageInfo {
- hasNextPage
- endCursor
- }
- }
-}
-
-query GetFeed($id: ID!) {
- feed(id: $id) {
- id
- url
- title
- fetchedAt
- isSubscribed
- articles {
- id
- guid
- title
- url
- isRead
- }
- }
-}
-
-query GetArticle($id: ID!) {
- article(id: $id) {
- id
- feedId
- guid
- title
- url
- isRead
- feed {
- id
- title
- isSubscribed
- }
- }
-}
-
-query GetCurrentUser {
- currentUser {
- id
- username
- }
-}
diff --git a/frontend/src/graphql/schema.graphql b/frontend/src/graphql/schema.graphql
deleted file mode 120000
index 5771f01..0000000
--- a/frontend/src/graphql/schema.graphql
+++ /dev/null
@@ -1 +0,0 @@
-../../../graphql/schema.graphql \ No newline at end of file
diff --git a/frontend/src/hooks/usePaginatedArticles.ts b/frontend/src/hooks/usePaginatedArticles.ts
index 56098d7..5ddf888 100644
--- a/frontend/src/hooks/usePaginatedArticles.ts
+++ b/frontend/src/hooks/usePaginatedArticles.ts
@@ -1,17 +1,8 @@
import { useCallback, useEffect, useState } from "react";
-import { useClient } from "urql";
-import type {
- GetReadArticlesQuery,
- GetUnreadArticlesQuery,
-} from "../graphql/generated/graphql";
-import {
- GetReadArticlesDocument,
- GetUnreadArticlesDocument,
-} from "../graphql/generated/graphql";
+import type { components } from "../api/generated";
+import { api } from "../services/api-client";
-type ArticleType =
- | GetUnreadArticlesQuery["unreadArticles"]["articles"][number]
- | GetReadArticlesQuery["readArticles"]["articles"][number];
+export type ArticleType = components["schemas"]["Article"];
interface UsePaginatedArticlesOptions {
isReadView: boolean;
@@ -31,7 +22,6 @@ export function usePaginatedArticles({
isReadView,
feedId,
}: UsePaginatedArticlesOptions): UsePaginatedArticlesResult {
- const client = useClient();
const [articles, setArticles] = useState<ArticleType[]>([]);
const [hasNextPage, setHasNextPage] = useState(false);
const [endCursor, setEndCursor] = useState<string | null>(null);
@@ -41,49 +31,33 @@ export function usePaginatedArticles({
const fetchArticles = useCallback(
async (after: string | null, append: boolean) => {
- const variables: Record<string, unknown> = {};
- if (feedId) variables.feedId = feedId;
- if (after) variables.after = after;
+ const query: { feedId?: string; after?: string } = {};
+ if (feedId) query.feedId = feedId;
+ if (after) query.after = after;
- let connection: {
- articles: ArticleType[];
- pageInfo: { hasNextPage: boolean; endCursor?: string | null };
- } | null = null;
+ const endpoint = isReadView
+ ? "/api/articles/read"
+ : "/api/articles/unread";
- if (isReadView) {
- const result = await client
- .query(GetReadArticlesDocument, variables, {
- additionalTypenames: ["Article"],
- })
- .toPromise();
- if (result.error) {
- setError(new Error(result.error.message));
- return;
- }
- connection = result.data?.readArticles ?? null;
- } else {
- const result = await client
- .query(GetUnreadArticlesDocument, variables, {
- additionalTypenames: ["Article"],
- })
- .toPromise();
- if (result.error) {
- setError(new Error(result.error.message));
- return;
- }
- connection = result.data?.unreadArticles ?? null;
+ const { data } = await api.GET(endpoint, {
+ params: { query },
+ });
+
+ if (!data) {
+ setError(new Error("Failed to fetch articles"));
+ return;
}
- if (connection) {
+ if (data) {
setArticles((prev) =>
- append ? [...prev, ...connection.articles] : connection.articles,
+ append ? [...prev, ...data.articles] : data.articles,
);
- setHasNextPage(connection.pageInfo.hasNextPage);
- setEndCursor(connection.pageInfo.endCursor ?? null);
+ setHasNextPage(data.pageInfo.hasNextPage);
+ setEndCursor(data.pageInfo.endCursor ?? null);
setError(null);
}
},
- [client, isReadView, feedId],
+ [isReadView, feedId],
);
// Reset and fetch on feedId or view change
diff --git a/frontend/src/main.tsx b/frontend/src/main.tsx
index b96c76e..d1dd4d5 100644
--- a/frontend/src/main.tsx
+++ b/frontend/src/main.tsx
@@ -1,18 +1,14 @@
import { StrictMode } from "react";
import { createRoot } from "react-dom/client";
-import { Provider as UrqlProvider } from "urql";
import "./index.css";
import App from "./App.tsx";
import { AuthProvider } from "./contexts/AuthContext";
-import { client } from "./services/graphql-client";
// biome-ignore lint/style/noNonNullAssertion: root element is guaranteed to exist
createRoot(document.getElementById("root")!).render(
<StrictMode>
- <UrqlProvider value={client}>
- <AuthProvider>
- <App />
- </AuthProvider>
- </UrqlProvider>
+ <AuthProvider>
+ <App />
+ </AuthProvider>
</StrictMode>,
);
diff --git a/frontend/src/pages/Settings.tsx b/frontend/src/pages/Settings.tsx
index 9b1e04c..c179fab 100644
--- a/frontend/src/pages/Settings.tsx
+++ b/frontend/src/pages/Settings.tsx
@@ -1,31 +1,24 @@
-import { useQuery } from "urql";
+import { useCallback, useState } from "react";
import { AddFeedForm, FeedList } from "../components";
-import { GetFeedsDocument } from "../graphql/generated/graphql";
export function Settings() {
- const [, refetchFeeds] = useQuery({
- query: GetFeedsDocument,
- });
+ const [refreshKey, setRefreshKey] = useState(0);
- const handleFeedAdded = () => {
- refetchFeeds();
- };
-
- const handleFeedUnsubscribed = () => {
- refetchFeeds();
- };
+ const handleChange = useCallback(() => {
+ setRefreshKey((k) => k + 1);
+ }, []);
return (
<div className="mx-auto max-w-3xl space-y-10">
<section>
- <AddFeedForm onFeedAdded={handleFeedAdded} />
+ <AddFeedForm onFeedAdded={handleChange} />
</section>
<section>
<h2 className="mb-4 text-sm font-semibold uppercase tracking-wide text-stone-900">
Your Feeds
</h2>
- <FeedList onFeedUnsubscribed={handleFeedUnsubscribed} />
+ <FeedList key={refreshKey} onFeedUnsubscribed={handleChange} />
</section>
</div>
);
diff --git a/frontend/src/services/api-client.ts b/frontend/src/services/api-client.ts
new file mode 100644
index 0000000..c1ee475
--- /dev/null
+++ b/frontend/src/services/api-client.ts
@@ -0,0 +1,6 @@
+import createClient from "openapi-fetch";
+import type { paths } from "../api/generated";
+
+export const api = createClient<paths>({
+ credentials: "include",
+});
diff --git a/frontend/src/services/graphql-client.ts b/frontend/src/services/graphql-client.ts
deleted file mode 100644
index 4b2532a..0000000
--- a/frontend/src/services/graphql-client.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import { Client, cacheExchange, fetchExchange } from "urql";
-
-export const client = new Client({
- url: "/graphql",
- exchanges: [cacheExchange, fetchExchange],
- fetchOptions: {
- // Include cookies for session management
- credentials: "include",
- },
-});
diff --git a/graphql/schema.graphql b/graphql/schema.graphql
deleted file mode 100644
index 3f9eddb..0000000
--- a/graphql/schema.graphql
+++ /dev/null
@@ -1,216 +0,0 @@
-scalar DateTime
-
-"""
-Represents a feed subscription in the system
-"""
-type Feed {
- """
- Unique identifier for the feed
- """
- id: ID!
-
- """
- URL of the RSS/Atom feed
- """
- url: String!
-
- """
- Title of the feed (extracted from feed metadata)
- """
- title: String!
-
- """
- Timestamp when the feed was last fetched
- """
- fetchedAt: DateTime!
-
- """
- Whether the user is currently subscribed to this feed
- """
- isSubscribed: Boolean!
-
- """
- Number of unread articles in this feed
- """
- unreadCount: Int!
-
- """
- Articles belonging to this feed
- """
- articles: [Article!]!
-}
-
-"""
-Represents an individual article/post from a feed
-"""
-type Article {
- """
- Unique identifier for the article
- """
- id: ID!
-
- """
- ID of the feed this article belongs to
- """
- feedId: ID!
-
- """
- GUID from the RSS/Atom feed (unique identifier from feed)
- """
- guid: String!
-
- """
- Title of the article
- """
- title: String!
-
- """
- URL/link to the original article
- """
- url: String!
-
- """
- Whether the article has been marked as read
- """
- isRead: Boolean!
-
- """
- The feed this article belongs to
- """
- feed: Feed!
-}
-
-"""
-Represents a user in the system
-"""
-type User {
- """
- Unique identifier for the user
- """
- id: ID!
-
- """
- Username of the user
- """
- username: String!
-}
-
-"""
-Pagination information for cursor-based pagination
-"""
-type PageInfo {
- """
- Whether there are more items after the last item in this page
- """
- hasNextPage: Boolean!
-
- """
- Cursor of the last item in this page
- """
- endCursor: ID
-}
-
-"""
-A paginated list of articles
-"""
-type ArticleConnection {
- """
- The list of articles
- """
- articles: [Article!]!
-
- """
- Pagination information
- """
- pageInfo: PageInfo!
-}
-
-"""
-Authentication payload returned from login mutation
-"""
-type AuthPayload {
- """
- The authenticated user
- """
- user: User!
-}
-
-"""
-Root query type for reading data
-"""
-type Query {
- """
- Get all feeds with their metadata
- """
- feeds: [Feed!]!
-
- """
- Get unread articles with optional feed filter and cursor-based pagination
- """
- unreadArticles(feedId: ID, after: ID, first: Int): ArticleConnection!
-
- """
- Get read articles with optional feed filter and cursor-based pagination
- """
- readArticles(feedId: ID, after: ID, first: Int): ArticleConnection!
-
- """
- Get a specific feed by ID
- """
- feed(id: ID!): Feed
-
- """
- Get a specific article by ID
- """
- article(id: ID!): Article
-
- """
- Get the currently authenticated user
- """
- currentUser: User
-}
-
-"""
-Root mutation type for modifying data
-"""
-type Mutation {
- """
- Add a new feed subscription
- """
- addFeed(url: String!): Feed!
-
- """
- Unsubscribe from a feed (preserves feed and article data)
- """
- unsubscribeFeed(id: ID!): Boolean!
-
- """
- Mark an article as read
- """
- markArticleRead(id: ID!): Article!
-
- """
- Mark an article as unread
- """
- markArticleUnread(id: ID!): Article!
-
- """
- Mark all articles in a feed as read
- """
- markFeedRead(id: ID!): Feed!
-
- """
- Mark all articles in a feed as unread
- """
- markFeedUnread(id: ID!): Feed!
-
- """
- Login with username and password. Creates a session cookie.
- """
- login(username: String!, password: String!): AuthPayload!
-
- """
- Logout the current user and destroy the session
- """
- logout: Boolean!
-}
diff --git a/justfile b/justfile
index be1c9d4..a34f12f 100644
--- a/justfile
+++ b/justfile
@@ -18,5 +18,6 @@ check:
cd backend && just check
generate:
+ cd typespec && npm run generate
cd frontend && npm run generate
cd backend && just generate
diff --git a/openapi/openapi.yaml b/openapi/openapi.yaml
new file mode 100644
index 0000000..f8cb299
--- /dev/null
+++ b/openapi/openapi.yaml
@@ -0,0 +1,435 @@
+openapi: 3.0.0
+info:
+ title: Feedaka API
+ version: 0.0.0
+tags: []
+paths:
+ /api/articles/read:
+ get:
+ operationId: Articles_listReadArticles
+ parameters:
+ - name: feedId
+ in: query
+ required: false
+ schema:
+ type: string
+ explode: false
+ - name: after
+ in: query
+ required: false
+ schema:
+ type: string
+ explode: false
+ - name: first
+ in: query
+ required: false
+ schema:
+ type: integer
+ format: int32
+ explode: false
+ responses:
+ '200':
+ description: The request has succeeded.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ArticleConnection'
+ /api/articles/unread:
+ get:
+ operationId: Articles_listUnreadArticles
+ parameters:
+ - name: feedId
+ in: query
+ required: false
+ schema:
+ type: string
+ explode: false
+ - name: after
+ in: query
+ required: false
+ schema:
+ type: string
+ explode: false
+ - name: first
+ in: query
+ required: false
+ schema:
+ type: integer
+ format: int32
+ explode: false
+ responses:
+ '200':
+ description: The request has succeeded.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ArticleConnection'
+ /api/articles/{articleId}:
+ get:
+ operationId: Articles_getArticle
+ parameters:
+ - name: articleId
+ in: path
+ required: true
+ schema:
+ type: string
+ responses:
+ '200':
+ description: The request has succeeded.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Article'
+ '404':
+ description: The server cannot find the requested resource.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ErrorResponse'
+ /api/articles/{articleId}/read:
+ post:
+ operationId: Articles_markArticleRead
+ parameters:
+ - name: articleId
+ in: path
+ required: true
+ schema:
+ type: string
+ responses:
+ '200':
+ description: The request has succeeded.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Article'
+ '404':
+ description: The server cannot find the requested resource.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ErrorResponse'
+ /api/articles/{articleId}/unread:
+ post:
+ operationId: Articles_markArticleUnread
+ parameters:
+ - name: articleId
+ in: path
+ required: true
+ schema:
+ type: string
+ responses:
+ '200':
+ description: The request has succeeded.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Article'
+ '404':
+ description: The server cannot find the requested resource.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ErrorResponse'
+ /api/auth/login:
+ post:
+ operationId: Auth_login
+ parameters: []
+ responses:
+ '200':
+ description: The request has succeeded.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/LoginResponse'
+ '401':
+ description: Access is unauthorized.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ErrorResponse'
+ requestBody:
+ required: true
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/LoginRequest'
+ /api/auth/logout:
+ post:
+ operationId: Auth_logout
+ parameters: []
+ responses:
+ '204':
+ description: 'There is no content to send for this request, but the headers may be useful. '
+ '401':
+ description: Access is unauthorized.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ErrorResponse'
+ /api/auth/me:
+ get:
+ operationId: Auth_getCurrentUser
+ parameters: []
+ responses:
+ '200':
+ description: The request has succeeded.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/User'
+ '401':
+ description: Access is unauthorized.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ErrorResponse'
+ /api/feeds:
+ get:
+ operationId: Feeds_listFeeds
+ parameters: []
+ responses:
+ '200':
+ description: The request has succeeded.
+ content:
+ application/json:
+ schema:
+ type: array
+ items:
+ $ref: '#/components/schemas/Feed'
+ post:
+ operationId: Feeds_addFeed
+ parameters: []
+ responses:
+ '201':
+ description: The request has succeeded and a new resource has been created as a result.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Feed'
+ '400':
+ description: The server could not understand the request due to invalid syntax.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ErrorResponse'
+ requestBody:
+ required: true
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/AddFeedRequest'
+ /api/feeds/{feedId}:
+ get:
+ operationId: Feeds_getFeed
+ parameters:
+ - name: feedId
+ in: path
+ required: true
+ schema:
+ type: string
+ responses:
+ '200':
+ description: The request has succeeded.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Feed'
+ '404':
+ description: The server cannot find the requested resource.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ErrorResponse'
+ delete:
+ operationId: Feeds_unsubscribeFeed
+ parameters:
+ - name: feedId
+ in: path
+ required: true
+ schema:
+ type: string
+ responses:
+ '204':
+ description: 'There is no content to send for this request, but the headers may be useful. '
+ '404':
+ description: The server cannot find the requested resource.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ErrorResponse'
+ /api/feeds/{feedId}/read:
+ post:
+ operationId: Feeds_markFeedRead
+ parameters:
+ - name: feedId
+ in: path
+ required: true
+ schema:
+ type: string
+ responses:
+ '200':
+ description: The request has succeeded.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Feed'
+ '404':
+ description: The server cannot find the requested resource.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ErrorResponse'
+ /api/feeds/{feedId}/unread:
+ post:
+ operationId: Feeds_markFeedUnread
+ parameters:
+ - name: feedId
+ in: path
+ required: true
+ schema:
+ type: string
+ responses:
+ '200':
+ description: The request has succeeded.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Feed'
+ '404':
+ description: The server cannot find the requested resource.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ErrorResponse'
+components:
+ schemas:
+ AddFeedRequest:
+ type: object
+ required:
+ - url
+ properties:
+ url:
+ type: string
+ Article:
+ type: object
+ required:
+ - id
+ - feedId
+ - guid
+ - title
+ - url
+ - isRead
+ - feed
+ properties:
+ id:
+ type: string
+ feedId:
+ type: string
+ guid:
+ type: string
+ title:
+ type: string
+ url:
+ type: string
+ isRead:
+ type: boolean
+ feed:
+ $ref: '#/components/schemas/ArticleFeed'
+ ArticleConnection:
+ type: object
+ required:
+ - articles
+ - pageInfo
+ properties:
+ articles:
+ type: array
+ items:
+ $ref: '#/components/schemas/Article'
+ pageInfo:
+ $ref: '#/components/schemas/PageInfo'
+ ArticleFeed:
+ type: object
+ required:
+ - id
+ - url
+ - title
+ - isSubscribed
+ properties:
+ id:
+ type: string
+ url:
+ type: string
+ title:
+ type: string
+ isSubscribed:
+ type: boolean
+ ErrorResponse:
+ type: object
+ required:
+ - message
+ properties:
+ message:
+ type: string
+ Feed:
+ type: object
+ required:
+ - id
+ - url
+ - title
+ - fetchedAt
+ - isSubscribed
+ - unreadCount
+ properties:
+ id:
+ type: string
+ url:
+ type: string
+ title:
+ type: string
+ fetchedAt:
+ type: string
+ isSubscribed:
+ type: boolean
+ unreadCount:
+ type: integer
+ format: int32
+ LoginRequest:
+ type: object
+ required:
+ - username
+ - password
+ properties:
+ username:
+ type: string
+ password:
+ type: string
+ LoginResponse:
+ type: object
+ required:
+ - user
+ properties:
+ user:
+ $ref: '#/components/schemas/User'
+ PageInfo:
+ type: object
+ required:
+ - hasNextPage
+ properties:
+ hasNextPage:
+ type: boolean
+ endCursor:
+ type: string
+ User:
+ type: object
+ required:
+ - id
+ - username
+ properties:
+ id:
+ type: string
+ username:
+ type: string
+servers:
+ - url: http://localhost:8080
+ description: Development server
+ variables: {}
diff --git a/typespec/.gitignore b/typespec/.gitignore
new file mode 100644
index 0000000..2ccbe46
--- /dev/null
+++ b/typespec/.gitignore
@@ -0,0 +1 @@
+/node_modules/
diff --git a/typespec/main.tsp b/typespec/main.tsp
new file mode 100644
index 0000000..89ccd6a
--- /dev/null
+++ b/typespec/main.tsp
@@ -0,0 +1,185 @@
+import "@typespec/http";
+import "@typespec/openapi3";
+
+using TypeSpec.Http;
+
+@service(#{ title: "Feedaka API" })
+@server("http://localhost:8080", "Development server")
+namespace Feedaka;
+
+// ── Models ──────────────────────────────────────────────────────────
+
+model Feed {
+ id: string;
+ url: string;
+ title: string;
+ fetchedAt: string;
+ isSubscribed: boolean;
+ unreadCount: int32;
+}
+
+model Article {
+ id: string;
+ feedId: string;
+ guid: string;
+ title: string;
+ url: string;
+ isRead: boolean;
+ feed: ArticleFeed;
+}
+
+model ArticleFeed {
+ id: string;
+ url: string;
+ title: string;
+ isSubscribed: boolean;
+}
+
+model PageInfo {
+ hasNextPage: boolean;
+ endCursor?: string;
+}
+
+model ArticleConnection {
+ articles: Article[];
+ pageInfo: PageInfo;
+}
+
+model User {
+ id: string;
+ username: string;
+}
+
+model ErrorResponse {
+ message: string;
+}
+
+// ── Auth ────────────────────────────────────────────────────────────
+
+model LoginRequest {
+ username: string;
+ password: string;
+}
+
+model LoginResponse {
+ user: User;
+}
+
+@route("/api/auth")
+namespace Auth {
+ @post
+ @route("/login")
+ op login(@body body: LoginRequest): LoginResponse | {
+ @statusCode statusCode: 401;
+ @body body: ErrorResponse;
+ };
+
+ @post
+ @route("/logout")
+ op logout(): {
+ @statusCode statusCode: 204;
+ } | {
+ @statusCode statusCode: 401;
+ @body body: ErrorResponse;
+ };
+
+ @get
+ @route("/me")
+ op getCurrentUser(): User | {
+ @statusCode statusCode: 401;
+ @body body: ErrorResponse;
+ };
+}
+
+// ── Feeds ───────────────────────────────────────────────────────────
+
+model AddFeedRequest {
+ url: string;
+}
+
+@route("/api/feeds")
+namespace Feeds {
+ @get
+ op listFeeds(): Feed[];
+
+ @post
+ op addFeed(@body body: AddFeedRequest): {
+ @statusCode statusCode: 201;
+ @body body: Feed;
+ } | {
+ @statusCode statusCode: 400;
+ @body body: ErrorResponse;
+ };
+
+ @get
+ @route("/{feedId}")
+ op getFeed(@path feedId: string): Feed | {
+ @statusCode statusCode: 404;
+ @body body: ErrorResponse;
+ };
+
+ @delete
+ @route("/{feedId}")
+ op unsubscribeFeed(@path feedId: string): {
+ @statusCode statusCode: 204;
+ } | {
+ @statusCode statusCode: 404;
+ @body body: ErrorResponse;
+ };
+
+ @post
+ @route("/{feedId}/read")
+ op markFeedRead(@path feedId: string): Feed | {
+ @statusCode statusCode: 404;
+ @body body: ErrorResponse;
+ };
+
+ @post
+ @route("/{feedId}/unread")
+ op markFeedUnread(@path feedId: string): Feed | {
+ @statusCode statusCode: 404;
+ @body body: ErrorResponse;
+ };
+}
+
+// ── Articles ────────────────────────────────────────────────────────
+
+@route("/api/articles")
+namespace Articles {
+ @get
+ @route("/unread")
+ op listUnreadArticles(
+ @query feedId?: string,
+ @query after?: string,
+ @query first?: int32,
+ ): ArticleConnection;
+
+ @get
+ @route("/read")
+ op listReadArticles(
+ @query feedId?: string,
+ @query after?: string,
+ @query first?: int32,
+ ): ArticleConnection;
+
+ @get
+ @route("/{articleId}")
+ op getArticle(@path articleId: string): Article | {
+ @statusCode statusCode: 404;
+ @body body: ErrorResponse;
+ };
+
+ @post
+ @route("/{articleId}/read")
+ op markArticleRead(@path articleId: string): Article | {
+ @statusCode statusCode: 404;
+ @body body: ErrorResponse;
+ };
+
+ @post
+ @route("/{articleId}/unread")
+ op markArticleUnread(@path articleId: string): Article | {
+ @statusCode statusCode: 404;
+ @body body: ErrorResponse;
+ };
+}
diff --git a/typespec/package-lock.json b/typespec/package-lock.json
new file mode 100644
index 0000000..1671fae
--- /dev/null
+++ b/typespec/package-lock.json
@@ -0,0 +1,1421 @@
+{
+ "name": "feedaka-typespec",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "feedaka-typespec",
+ "dependencies": {
+ "@typespec/compiler": "^1.9.0",
+ "@typespec/http": "^1.9.0",
+ "@typespec/openapi3": "^1.9.0"
+ }
+ },
+ "node_modules/@babel/code-frame": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.28.6.tgz",
+ "integrity": "sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.28.5",
+ "js-tokens": "^4.0.0",
+ "picocolors": "^1.1.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.28.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz",
+ "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@inquirer/ansi": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-2.0.3.tgz",
+ "integrity": "sha512-g44zhR3NIKVs0zUesa4iMzExmZpLUdTLRMCStqX3GE5NT6VkPcxQGJ+uC8tDgBUC/vB1rUhUd55cOf++4NZcmw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0"
+ }
+ },
+ "node_modules/@inquirer/checkbox": {
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-5.0.4.tgz",
+ "integrity": "sha512-DrAMU3YBGMUAp6ArwTIp/25CNDtDbxk7UjIrrtM25JVVrlVYlVzHh5HR1BDFu9JMyUoZ4ZanzeaHqNDttf3gVg==",
+ "license": "MIT",
+ "dependencies": {
+ "@inquirer/ansi": "^2.0.3",
+ "@inquirer/core": "^11.1.1",
+ "@inquirer/figures": "^2.0.3",
+ "@inquirer/type": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0"
+ },
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@inquirer/confirm": {
+ "version": "6.0.4",
+ "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-6.0.4.tgz",
+ "integrity": "sha512-WdaPe7foUnoGYvXzH4jp4wH/3l+dBhZ3uwhKjXjwdrq5tEIFaANxj6zrGHxLdsIA0yKM0kFPVcEalOZXBB5ISA==",
+ "license": "MIT",
+ "dependencies": {
+ "@inquirer/core": "^11.1.1",
+ "@inquirer/type": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0"
+ },
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@inquirer/core": {
+ "version": "11.1.1",
+ "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-11.1.1.tgz",
+ "integrity": "sha512-hV9o15UxX46OyQAtaoMqAOxGR8RVl1aZtDx1jHbCtSJy1tBdTfKxLPKf7utsE4cRy4tcmCQ4+vdV+ca+oNxqNA==",
+ "license": "MIT",
+ "dependencies": {
+ "@inquirer/ansi": "^2.0.3",
+ "@inquirer/figures": "^2.0.3",
+ "@inquirer/type": "^4.0.3",
+ "cli-width": "^4.1.0",
+ "mute-stream": "^3.0.0",
+ "signal-exit": "^4.1.0",
+ "wrap-ansi": "^9.0.2"
+ },
+ "engines": {
+ "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0"
+ },
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@inquirer/editor": {
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-5.0.4.tgz",
+ "integrity": "sha512-QI3Jfqcv6UO2/VJaEFONH8Im1ll++Xn/AJTBn9Xf+qx2M+H8KZAdQ5sAe2vtYlo+mLW+d7JaMJB4qWtK4BG3pw==",
+ "license": "MIT",
+ "dependencies": {
+ "@inquirer/core": "^11.1.1",
+ "@inquirer/external-editor": "^2.0.3",
+ "@inquirer/type": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0"
+ },
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@inquirer/expand": {
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-5.0.4.tgz",
+ "integrity": "sha512-0I/16YwPPP0Co7a5MsomlZLpch48NzYfToyqYAOWtBmaXSB80RiNQ1J+0xx2eG+Wfxt0nHtpEWSRr6CzNVnOGg==",
+ "license": "MIT",
+ "dependencies": {
+ "@inquirer/core": "^11.1.1",
+ "@inquirer/type": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0"
+ },
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@inquirer/external-editor": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-2.0.3.tgz",
+ "integrity": "sha512-LgyI7Agbda74/cL5MvA88iDpvdXI2KuMBCGRkbCl2Dg1vzHeOgs+s0SDcXV7b+WZJrv2+ERpWSM65Fpi9VfY3w==",
+ "license": "MIT",
+ "dependencies": {
+ "chardet": "^2.1.1",
+ "iconv-lite": "^0.7.2"
+ },
+ "engines": {
+ "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0"
+ },
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@inquirer/figures": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-2.0.3.tgz",
+ "integrity": "sha512-y09iGt3JKoOCBQ3w4YrSJdokcD8ciSlMIWsD+auPu+OZpfxLuyz+gICAQ6GCBOmJJt4KEQGHuZSVff2jiNOy7g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0"
+ }
+ },
+ "node_modules/@inquirer/input": {
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-5.0.4.tgz",
+ "integrity": "sha512-4B3s3jvTREDFvXWit92Yc6jF1RJMDy2VpSqKtm4We2oVU65YOh2szY5/G14h4fHlyQdpUmazU5MPCFZPRJ0AOw==",
+ "license": "MIT",
+ "dependencies": {
+ "@inquirer/core": "^11.1.1",
+ "@inquirer/type": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0"
+ },
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@inquirer/number": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-4.0.4.tgz",
+ "integrity": "sha512-CmMp9LF5HwE+G/xWsC333TlCzYYbXMkcADkKzcawh49fg2a1ryLc7JL1NJYYt1lJ+8f4slikNjJM9TEL/AljYQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@inquirer/core": "^11.1.1",
+ "@inquirer/type": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0"
+ },
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@inquirer/password": {
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-5.0.4.tgz",
+ "integrity": "sha512-ZCEPyVYvHK4W4p2Gy6sTp9nqsdHQCfiPXIP9LbJVW4yCinnxL/dDDmPaEZVysGrj8vxVReRnpfS2fOeODe9zjg==",
+ "license": "MIT",
+ "dependencies": {
+ "@inquirer/ansi": "^2.0.3",
+ "@inquirer/core": "^11.1.1",
+ "@inquirer/type": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0"
+ },
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@inquirer/prompts": {
+ "version": "8.2.0",
+ "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-8.2.0.tgz",
+ "integrity": "sha512-rqTzOprAj55a27jctS3vhvDDJzYXsr33WXTjODgVOru21NvBo9yIgLIAf7SBdSV0WERVly3dR6TWyp7ZHkvKFA==",
+ "license": "MIT",
+ "dependencies": {
+ "@inquirer/checkbox": "^5.0.4",
+ "@inquirer/confirm": "^6.0.4",
+ "@inquirer/editor": "^5.0.4",
+ "@inquirer/expand": "^5.0.4",
+ "@inquirer/input": "^5.0.4",
+ "@inquirer/number": "^4.0.4",
+ "@inquirer/password": "^5.0.4",
+ "@inquirer/rawlist": "^5.2.0",
+ "@inquirer/search": "^4.1.0",
+ "@inquirer/select": "^5.0.4"
+ },
+ "engines": {
+ "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0"
+ },
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@inquirer/rawlist": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-5.2.0.tgz",
+ "integrity": "sha512-CciqGoOUMrFo6HxvOtU5uL8fkjCmzyeB6fG7O1vdVAZVSopUBYECOwevDBlqNLyyYmzpm2Gsn/7nLrpruy9RFg==",
+ "license": "MIT",
+ "dependencies": {
+ "@inquirer/core": "^11.1.1",
+ "@inquirer/type": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0"
+ },
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@inquirer/search": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-4.1.0.tgz",
+ "integrity": "sha512-EAzemfiP4IFvIuWnrHpgZs9lAhWDA0GM3l9F4t4mTQ22IFtzfrk8xbkMLcAN7gmVML9O/i+Hzu8yOUyAaL6BKA==",
+ "license": "MIT",
+ "dependencies": {
+ "@inquirer/core": "^11.1.1",
+ "@inquirer/figures": "^2.0.3",
+ "@inquirer/type": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0"
+ },
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@inquirer/select": {
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-5.0.4.tgz",
+ "integrity": "sha512-s8KoGpPYMEQ6WXc0dT9blX2NtIulMdLOO3LA1UKOiv7KFWzlJ6eLkEYTDBIi+JkyKXyn8t/CD6TinxGjyLt57g==",
+ "license": "MIT",
+ "dependencies": {
+ "@inquirer/ansi": "^2.0.3",
+ "@inquirer/core": "^11.1.1",
+ "@inquirer/figures": "^2.0.3",
+ "@inquirer/type": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0"
+ },
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@inquirer/type": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-4.0.3.tgz",
+ "integrity": "sha512-cKZN7qcXOpj1h+1eTTcGDVLaBIHNMT1Rz9JqJP5MnEJ0JhgVWllx7H/tahUp5YEK1qaByH2Itb8wLG/iScD5kw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0"
+ },
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@isaacs/fs-minipass": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz",
+ "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==",
+ "license": "ISC",
+ "dependencies": {
+ "minipass": "^7.0.4"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@nodelib/fs.scandir": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.stat": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.walk": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@scalar/helpers": {
+ "version": "0.2.11",
+ "resolved": "https://registry.npmjs.org/@scalar/helpers/-/helpers-0.2.11.tgz",
+ "integrity": "sha512-Y7DLt1bIZF9dvHzJwSJTcC1lpSr1Tbf4VBhHOCRIHu23Rr7/lhQnddRxFmPV1tZXwEQKz7F7yRrubwCfKPCucw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=20"
+ }
+ },
+ "node_modules/@scalar/json-magic": {
+ "version": "0.9.6",
+ "resolved": "https://registry.npmjs.org/@scalar/json-magic/-/json-magic-0.9.6.tgz",
+ "integrity": "sha512-2TKoqkAophHti1nH+rvQlR4lhD6X9tqQpuNeAE0cytHSX/yndkSOE0yA7cep5T9tFjGN4Km0gMnelvY3LgWs4A==",
+ "license": "MIT",
+ "dependencies": {
+ "@scalar/helpers": "0.2.11",
+ "yaml": "^2.8.0"
+ },
+ "engines": {
+ "node": ">=20"
+ }
+ },
+ "node_modules/@scalar/openapi-parser": {
+ "version": "0.24.9",
+ "resolved": "https://registry.npmjs.org/@scalar/openapi-parser/-/openapi-parser-0.24.9.tgz",
+ "integrity": "sha512-uqpwt6ZQJQu4c3CvMsJiXMUj32113yrclsDC31hlL33vEUS5JU9dCYfY27oLSCVoKl8R8KihlnEcbfRnH/O/GA==",
+ "license": "MIT",
+ "dependencies": {
+ "@scalar/helpers": "0.2.11",
+ "@scalar/json-magic": "0.11.0",
+ "@scalar/openapi-types": "0.5.3",
+ "@scalar/openapi-upgrader": "0.1.8",
+ "ajv": "^8.17.1",
+ "ajv-draft-04": "^1.0.0",
+ "ajv-formats": "^3.0.1",
+ "jsonpointer": "^5.0.1",
+ "leven": "^4.0.0",
+ "yaml": "^2.8.0"
+ },
+ "engines": {
+ "node": ">=20"
+ }
+ },
+ "node_modules/@scalar/openapi-parser/node_modules/@scalar/json-magic": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/@scalar/json-magic/-/json-magic-0.11.0.tgz",
+ "integrity": "sha512-1zBseDDEPkKlAVd9lT1HlK9Nefeh0YEE+pcmyDL3J5derIZn9UYXAFecdkeXMdjDtWDgcrkmWCrHhpoT7zVKdQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@scalar/helpers": "0.2.11",
+ "yaml": "^2.8.0"
+ },
+ "engines": {
+ "node": ">=20"
+ }
+ },
+ "node_modules/@scalar/openapi-types": {
+ "version": "0.5.3",
+ "resolved": "https://registry.npmjs.org/@scalar/openapi-types/-/openapi-types-0.5.3.tgz",
+ "integrity": "sha512-m4n/Su3K01d15dmdWO1LlqecdSPKuNjuokrJLdiQ485kW/hRHbXW1QP6tJL75myhw/XhX5YhYAR+jrwnGjXiMw==",
+ "license": "MIT",
+ "dependencies": {
+ "zod": "^4.1.11"
+ },
+ "engines": {
+ "node": ">=20"
+ }
+ },
+ "node_modules/@scalar/openapi-upgrader": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/@scalar/openapi-upgrader/-/openapi-upgrader-0.1.8.tgz",
+ "integrity": "sha512-2xuYLLs0fBadLIk4I1ObjMiCnOyLPEMPf24A1HtHQvhKGDnGlvT63F2rU2Xw8lxCjgHnzveMPnOJEbwIy64RCg==",
+ "license": "MIT",
+ "dependencies": {
+ "@scalar/openapi-types": "0.5.3"
+ },
+ "engines": {
+ "node": ">=20"
+ }
+ },
+ "node_modules/@sindresorhus/merge-streams": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz",
+ "integrity": "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@typespec/asset-emitter": {
+ "version": "0.79.0",
+ "resolved": "https://registry.npmjs.org/@typespec/asset-emitter/-/asset-emitter-0.79.0.tgz",
+ "integrity": "sha512-pNMtfSSwgmTQ2ex6bd1l6BUW2RLjSFnWQO5C5bNSleV62YEH5jMLn3THWDU9oUB0JoiBjgomV8cPqNRTJ+iV9w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=20.0.0"
+ },
+ "peerDependencies": {
+ "@typespec/compiler": "^1.9.0"
+ }
+ },
+ "node_modules/@typespec/compiler": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@typespec/compiler/-/compiler-1.9.0.tgz",
+ "integrity": "sha512-Rz9fFWQSTJSnhBfZvtA/bDIuO82fknYdtyMsL9lZNJE82rquC6JByHPFsnbGH1VXA0HhMj9L7Oqyp3f0m/BTOA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "~7.28.6",
+ "@inquirer/prompts": "^8.0.1",
+ "ajv": "~8.17.1",
+ "change-case": "~5.4.4",
+ "env-paths": "^3.0.0",
+ "globby": "~16.1.0",
+ "is-unicode-supported": "^2.1.0",
+ "mustache": "~4.2.0",
+ "picocolors": "~1.1.1",
+ "prettier": "~3.8.0",
+ "semver": "^7.7.1",
+ "tar": "^7.5.2",
+ "temporal-polyfill": "^0.3.0",
+ "vscode-languageserver": "~9.0.1",
+ "vscode-languageserver-textdocument": "~1.0.12",
+ "yaml": "~2.8.2",
+ "yargs": "~18.0.0"
+ },
+ "bin": {
+ "tsp": "cmd/tsp.js",
+ "tsp-server": "cmd/tsp-server.js"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ }
+ },
+ "node_modules/@typespec/http": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@typespec/http/-/http-1.9.0.tgz",
+ "integrity": "sha512-JzlZZsgCo71f2KhWbf4BLOz5e+dVLj7gJJ4kvXvrmuG9QHoT41VaGPpCQamYgpZLMz2LQbsOtw34AmpovhuJSw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=20.0.0"
+ },
+ "peerDependencies": {
+ "@typespec/compiler": "^1.9.0",
+ "@typespec/streams": "^0.79.0"
+ },
+ "peerDependenciesMeta": {
+ "@typespec/streams": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typespec/openapi": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@typespec/openapi/-/openapi-1.9.0.tgz",
+ "integrity": "sha512-5ieXCWRLcyFLv3IFk26ena/RW/NxvT5KiHaoNVFRd79J0XZjFcE0Od6Lxxqj4dWmCo3C8oKtOwFoQuie18G3lQ==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=20.0.0"
+ },
+ "peerDependencies": {
+ "@typespec/compiler": "^1.9.0",
+ "@typespec/http": "^1.9.0"
+ }
+ },
+ "node_modules/@typespec/openapi3": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@typespec/openapi3/-/openapi3-1.9.0.tgz",
+ "integrity": "sha512-htwhrGHQxuoNwAljeJE8CBt5yfKOv48T9Ugv91Y+4yNnlevJfDT29yrfD2mXYMujVOr3Kte1qilazClafkUIgg==",
+ "license": "MIT",
+ "dependencies": {
+ "@scalar/json-magic": "^0.9.1",
+ "@scalar/openapi-parser": "^0.24.1",
+ "@scalar/openapi-types": "^0.5.0",
+ "@typespec/asset-emitter": "^0.79.0",
+ "yaml": "~2.8.2"
+ },
+ "bin": {
+ "tsp-openapi3": "cmd/tsp-openapi3.js"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ },
+ "peerDependencies": {
+ "@typespec/compiler": "^1.9.0",
+ "@typespec/events": "^0.79.0",
+ "@typespec/http": "^1.9.0",
+ "@typespec/json-schema": "^1.9.0",
+ "@typespec/openapi": "^1.9.0",
+ "@typespec/sse": "^0.79.0",
+ "@typespec/streams": "^0.79.0",
+ "@typespec/versioning": "^0.79.0"
+ },
+ "peerDependenciesMeta": {
+ "@typespec/events": {
+ "optional": true
+ },
+ "@typespec/json-schema": {
+ "optional": true
+ },
+ "@typespec/sse": {
+ "optional": true
+ },
+ "@typespec/streams": {
+ "optional": true
+ },
+ "@typespec/versioning": {
+ "optional": true
+ },
+ "@typespec/xml": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/ajv": {
+ "version": "8.17.1",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
+ "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3",
+ "fast-uri": "^3.0.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/ajv-draft-04": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz",
+ "integrity": "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==",
+ "license": "MIT",
+ "peerDependencies": {
+ "ajv": "^8.5.0"
+ },
+ "peerDependenciesMeta": {
+ "ajv": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/ajv-formats": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz",
+ "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ajv": "^8.0.0"
+ },
+ "peerDependencies": {
+ "ajv": "^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "ajv": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "6.2.2",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz",
+ "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "6.2.3",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz",
+ "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
+ "license": "MIT",
+ "dependencies": {
+ "fill-range": "^7.1.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/change-case": {
+ "version": "5.4.4",
+ "resolved": "https://registry.npmjs.org/change-case/-/change-case-5.4.4.tgz",
+ "integrity": "sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==",
+ "license": "MIT"
+ },
+ "node_modules/chardet": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.1.tgz",
+ "integrity": "sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==",
+ "license": "MIT"
+ },
+ "node_modules/chownr": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz",
+ "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==",
+ "license": "BlueOak-1.0.0",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/cli-width": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz",
+ "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==",
+ "license": "ISC",
+ "engines": {
+ "node": ">= 12"
+ }
+ },
+ "node_modules/cliui": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz",
+ "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==",
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^7.2.0",
+ "strip-ansi": "^7.1.0",
+ "wrap-ansi": "^9.0.0"
+ },
+ "engines": {
+ "node": ">=20"
+ }
+ },
+ "node_modules/emoji-regex": {
+ "version": "10.6.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz",
+ "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==",
+ "license": "MIT"
+ },
+ "node_modules/env-paths": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-3.0.0.tgz",
+ "integrity": "sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==",
+ "license": "MIT",
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/escalade": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "license": "MIT"
+ },
+ "node_modules/fast-glob": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
+ "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.2",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.8"
+ },
+ "engines": {
+ "node": ">=8.6.0"
+ }
+ },
+ "node_modules/fast-uri": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz",
+ "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fastify"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/fastify"
+ }
+ ],
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/fastq": {
+ "version": "1.20.1",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz",
+ "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==",
+ "license": "ISC",
+ "dependencies": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
+ "license": "MIT",
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "license": "ISC",
+ "engines": {
+ "node": "6.* || 8.* || >= 10.*"
+ }
+ },
+ "node_modules/get-east-asian-width": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz",
+ "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/globby": {
+ "version": "16.1.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-16.1.0.tgz",
+ "integrity": "sha512-+A4Hq7m7Ze592k9gZRy4gJ27DrXRNnC1vPjxTt1qQxEY8RxagBkBxivkCwg7FxSTG0iLLEMaUx13oOr0R2/qcQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@sindresorhus/merge-streams": "^4.0.0",
+ "fast-glob": "^3.3.3",
+ "ignore": "^7.0.5",
+ "is-path-inside": "^4.0.0",
+ "slash": "^5.1.0",
+ "unicorn-magic": "^0.4.0"
+ },
+ "engines": {
+ "node": ">=20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/iconv-lite": {
+ "version": "0.7.2",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz",
+ "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==",
+ "license": "MIT",
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/ignore": {
+ "version": "7.0.5",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz",
+ "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "license": "MIT",
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/is-path-inside": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-4.0.0.tgz",
+ "integrity": "sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-unicode-supported": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz",
+ "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "license": "MIT"
+ },
+ "node_modules/json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "license": "MIT"
+ },
+ "node_modules/jsonpointer": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz",
+ "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/leven": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/leven/-/leven-4.1.0.tgz",
+ "integrity": "sha512-KZ9W9nWDT7rF7Dazg8xyLHGLrmpgq2nVNFUckhqdW3szVP6YhCpp/RAnpmVExA9JvrMynjwSLVrEj3AepHR6ew==",
+ "license": "MIT",
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/micromatch": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
+ "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
+ "license": "MIT",
+ "dependencies": {
+ "braces": "^3.0.3",
+ "picomatch": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/minipass": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
+ "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ }
+ },
+ "node_modules/minizlib": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz",
+ "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==",
+ "license": "MIT",
+ "dependencies": {
+ "minipass": "^7.1.2"
+ },
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/mustache": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz",
+ "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==",
+ "license": "MIT",
+ "bin": {
+ "mustache": "bin/mustache"
+ }
+ },
+ "node_modules/mute-stream": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-3.0.0.tgz",
+ "integrity": "sha512-dkEJPVvun4FryqBmZ5KhDo0K9iDXAwn08tMLDinNdRBNPcYEDiWYysLcc6k3mjTMlbP9KyylvRpd4wFtwrT9rw==",
+ "license": "ISC",
+ "engines": {
+ "node": "^20.17.0 || >=22.9.0"
+ }
+ },
+ "node_modules/picocolors": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+ "license": "ISC"
+ },
+ "node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/prettier": {
+ "version": "3.8.1",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.1.tgz",
+ "integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==",
+ "license": "MIT",
+ "bin": {
+ "prettier": "bin/prettier.cjs"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/prettier/prettier?sponsor=1"
+ }
+ },
+ "node_modules/queue-microtask": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/require-from-string": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
+ "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/reusify": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz",
+ "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==",
+ "license": "MIT",
+ "engines": {
+ "iojs": ">=1.0.0",
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/run-parallel": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "queue-microtask": "^1.2.2"
+ }
+ },
+ "node_modules/safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+ "license": "MIT"
+ },
+ "node_modules/semver": {
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
+ "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/signal-exit": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+ "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/slash": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz",
+ "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/string-width": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz",
+ "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==",
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^10.3.0",
+ "get-east-asian-width": "^1.0.0",
+ "strip-ansi": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/strip-ansi": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz",
+ "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
+ "node_modules/tar": {
+ "version": "7.5.7",
+ "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.7.tgz",
+ "integrity": "sha512-fov56fJiRuThVFXD6o6/Q354S7pnWMJIVlDBYijsTNx6jKSE4pvrDTs6lUnmGvNyfJwFQQwWy3owKz1ucIhveQ==",
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "@isaacs/fs-minipass": "^4.0.0",
+ "chownr": "^3.0.0",
+ "minipass": "^7.1.2",
+ "minizlib": "^3.1.0",
+ "yallist": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/temporal-polyfill": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/temporal-polyfill/-/temporal-polyfill-0.3.0.tgz",
+ "integrity": "sha512-qNsTkX9K8hi+FHDfHmf22e/OGuXmfBm9RqNismxBrnSmZVJKegQ+HYYXT+R7Ha8F/YSm2Y34vmzD4cxMu2u95g==",
+ "license": "MIT",
+ "dependencies": {
+ "temporal-spec": "0.3.0"
+ }
+ },
+ "node_modules/temporal-spec": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/temporal-spec/-/temporal-spec-0.3.0.tgz",
+ "integrity": "sha512-n+noVpIqz4hYgFSMOSiINNOUOMFtV5cZQNCmmszA6GiVFVRt3G7AqVyhXjhCSmowvQn+NsGn+jMDMKJYHd3bSQ==",
+ "license": "ISC"
+ },
+ "node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "license": "MIT",
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/unicorn-magic": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.4.0.tgz",
+ "integrity": "sha512-wH590V9VNgYH9g3lH9wWjTrUoKsjLF6sGLjhR4sH1LWpLmCOH0Zf7PukhDA8BiS7KHe4oPNkcTHqYkj7SOGUOw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/vscode-jsonrpc": {
+ "version": "8.2.0",
+ "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz",
+ "integrity": "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/vscode-languageserver": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-9.0.1.tgz",
+ "integrity": "sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==",
+ "license": "MIT",
+ "dependencies": {
+ "vscode-languageserver-protocol": "3.17.5"
+ },
+ "bin": {
+ "installServerIntoExtension": "bin/installServerIntoExtension"
+ }
+ },
+ "node_modules/vscode-languageserver-protocol": {
+ "version": "3.17.5",
+ "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz",
+ "integrity": "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==",
+ "license": "MIT",
+ "dependencies": {
+ "vscode-jsonrpc": "8.2.0",
+ "vscode-languageserver-types": "3.17.5"
+ }
+ },
+ "node_modules/vscode-languageserver-textdocument": {
+ "version": "1.0.12",
+ "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.12.tgz",
+ "integrity": "sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==",
+ "license": "MIT"
+ },
+ "node_modules/vscode-languageserver-types": {
+ "version": "3.17.5",
+ "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz",
+ "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==",
+ "license": "MIT"
+ },
+ "node_modules/wrap-ansi": {
+ "version": "9.0.2",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz",
+ "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^6.2.1",
+ "string-width": "^7.0.0",
+ "strip-ansi": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/y18n": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yallist": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz",
+ "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==",
+ "license": "BlueOak-1.0.0",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/yaml": {
+ "version": "2.8.2",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz",
+ "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==",
+ "license": "ISC",
+ "bin": {
+ "yaml": "bin.mjs"
+ },
+ "engines": {
+ "node": ">= 14.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/eemeli"
+ }
+ },
+ "node_modules/yargs": {
+ "version": "18.0.0",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz",
+ "integrity": "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==",
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^9.0.1",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "string-width": "^7.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^22.0.0"
+ },
+ "engines": {
+ "node": "^20.19.0 || ^22.12.0 || >=23"
+ }
+ },
+ "node_modules/yargs-parser": {
+ "version": "22.0.0",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz",
+ "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==",
+ "license": "ISC",
+ "engines": {
+ "node": "^20.19.0 || ^22.12.0 || >=23"
+ }
+ },
+ "node_modules/zod": {
+ "version": "4.3.6",
+ "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz",
+ "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/colinhacks"
+ }
+ }
+ }
+}
diff --git a/typespec/package.json b/typespec/package.json
new file mode 100644
index 0000000..75b3816
--- /dev/null
+++ b/typespec/package.json
@@ -0,0 +1,13 @@
+{
+ "name": "feedaka-typespec",
+ "private": true,
+ "type": "module",
+ "scripts": {
+ "generate": "tsp compile . --emit @typespec/openapi3"
+ },
+ "dependencies": {
+ "@typespec/compiler": "^1.9.0",
+ "@typespec/http": "^1.9.0",
+ "@typespec/openapi3": "^1.9.0"
+ }
+}
diff --git a/typespec/tspconfig.yaml b/typespec/tspconfig.yaml
new file mode 100644
index 0000000..8903035
--- /dev/null
+++ b/typespec/tspconfig.yaml
@@ -0,0 +1,4 @@
+options:
+ "@typespec/openapi3":
+ output-file: openapi.yaml
+ emitter-output-dir: "{project-root}/../openapi"