Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/vicary/fresh_graphql
GraphQL server for Deno Fresh
https://github.com/vicary/fresh_graphql
Last synced: 3 months ago
JSON representation
GraphQL server for Deno Fresh
- Host: GitHub
- URL: https://github.com/vicary/fresh_graphql
- Owner: vicary
- Created: 2022-10-10T14:52:11.000Z (about 2 years ago)
- Default Branch: main
- Last Pushed: 2024-04-13T04:43:39.000Z (9 months ago)
- Last Synced: 2024-04-13T18:05:32.908Z (9 months ago)
- Language: TypeScript
- Size: 74.2 KB
- Stars: 5
- Watchers: 3
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# fresh-graphql
A simple GraphQL server for Deno Fresh.
## Live Demo
1. [`graphql-yoga`](https://fresh-graphql-yoga.deno.dev)
1. `apollo-server` (soon™)## Why `fresh-graphql`?
1. You want file based routing.
1. You want GraphQL.
1. You have a [Deno Fresh](https://fresh.deno.dev) project.
1. `deno deploy` does not support dynamic imports.## Installation
```bash
# Create a Fresh project
> deno run -A -r https://fresh.deno.dev# Add fresh-graphql to your project
> deno run -A jsr:@vicary/fresh-graphql
```### Manual Installation
You may also patch the files manually if you have modified `dev.ts` or
`deno.json` for an existing Fresh project.#### dev.ts
```diff
-#!/usr/bin/env -S deno run -A --watch=static/,routes/
+#!/usr/bin/env -S deno run -A --watch=static/,routes/,graphql/import "https://deno.land/x/dotenv/load.ts";
import dev from "$fresh/dev.ts";
+import { dev as graphql } from "@vicary/fresh-graphql";+await graphql(import.meta.url);
await dev(import.meta.url, "./main.ts");
```#### deno.json
```diff
"tasks": {
- "start": "deno run -A --watch=static/,routes/ dev.ts",
+ "start": "deno run -A --watch=static/,routes/,graphql/ dev.ts",
}
```## Usage
1. Run `deno task start`
1. Visit `http://localhost:8000/graphql` for an GraphiQL interface.### Entrypoint
Our CLI will generate a default GraphQL endpoint for you, you may also do it
manually by copying the contents below:```ts
// routes/graphql.tsimport { createHandler } from "@vicary/fresh-graphql";
import manifest from "../graphql.gen.ts";export const handler = createHandler(manifest);
```### Queries and Mutations
This is a GraphQL version of the joke API when you create a new Fresh project.
```ts
// graphql/Query/joke.tsexport const schema = /* GraphQL */ `
extend type Query {
joke: String!
}
`;// Jokes courtesy of https://punsandoneliners.com/randomness/programmer-jokes/
const JOKES = [
"Why do Java developers often wear glasses? They can't C#.",
"A SQL query walks into a bar, goes up to two tables and says “can I join you?”",
"Wasn't hard to crack Forrest Gump's password. 1forrest1.",
"I love pressing the F5 key. It's refreshing.",
"Called IT support and a chap from Australia came to fix my network connection. I asked “Do you come from a LAN down under?”",
"There are 10 types of people in the world. Those who understand binary and those who don't.",
"Why are assembly programmers often wet? They work below C level.",
"My favourite computer based band is the Black IPs.",
"What programme do you use to predict the music tastes of former US presidential candidates? An Al Gore Rhythm.",
"An SEO expert walked into a bar, pub, inn, tavern, hostelry, public house.",
];export const resolver = () => JOKES[Math.floor(Math.random() * JOKES.length)];
```Schema level types, `Query`, `Mutation` and `Subscription`, will be
automatically created when such a corresponding extension statement is found.Resolver object will be wrapped according to the directory structure, i.e.
`{ Query: { joke: resolver } }`. To override this behavior, export an object
instead.```ts
export const resolver = {
Query: {
foo: () => "bar";
}
};
```### Subscriptions
```ts
// graphql/Subscription/countdown.tsexport const schema = /* GraphQL */ `
extend type Subscription {
countdown(from: Int = 0): Int!
}
`;export const resolver = async function* (_, { from }) {
while (from-- > 0) {
await new Promise((resolve) => setTimeout(resolve, 1000));
yield { countdown: from };
}
};
```### Directives
Supported, documentations coming.
If you need it now, you may read our source code.
### Side notes
1. `graphql-yoga` is chosen for it's simplicity, you may use any GraphQL servers
compatible with `@graphql-tools/schema`.
1. `graphql.gen.ts` This is the manifest file generated whenever you make
changes to source codes in the `graphql` directory.## Sponsorship
If you think I did a good job or want to see a feature happening,
[a coffee would do](https://buymeacoffee.com/vicary).