Awesome
<div align="center">Star Wars API
GraphQL API similar to swapi.dev
</div>Table of Contents
Description
This API was inspired by swapi.dev, however we noticed that getting nested data to present on Discord was really slow because of the way that API worked. So we decided to take the data provided on the API, and make it into a GraphQL api.
Features
- Fully generated client-side TypeScript typings published to
- npm as
@skyra/star-wars-api
- GitHub Package Registry as
@skyra-project/star-wars-api
- npm as
- Docker images of the API for private hosting published to
- Dockerhub as
skyrabot/star-wars-api
- GitHub Package Registry as
ghcr.io/skyrabot/star-wars-api:latest
- Dockerhub as
- Provides information about various assets in Star Wars
- Films
- People
- Planets
- Spaceships
- Species
- Vehicles
Installation
Note: This is only needed if you are writing TypeScript, or if you're using a GraphQL schema validator. If you're using neither of these, you do not need to install this package. The package does NOT include the actual API, ONLY type information.
You can use the following command to install this package, or replace npm install
with your package manager of choice.
npm install -D @skyra/star-wars-api
API Documentation
For the full documentation of the deployed version please see the GraphQL Playground on the API.
Usage
These examples are written as based on TypeScript. For JavaScript simply change out the imports to require
syntax and remove any type information.
Using Fetch
import type { Query } from '@skyra/star-wars-api';
interface StarWarsGraphqlApiResponse<K extends keyof Omit<Query, '__typename'>> {
data: Record<K, Omit<Query[K], '__typename'>>;
}
fetch('https://swapi.skyra.pw/', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
query: `
{
getPerson(person: lukeskywalker) {
name
birthYear
eyeColors
gender
}
}
`
})
})
.then((res) => res.json() as Promise<StarWarsGraphqlApiResponse<'getPerson'>>)
.then((json) => console.log(json.data));
Using Apollo Boost
import type { Query, QueryGetPersonFuzzyArgs } from '@skyra/star-wars-api';
import ApolloClient from 'apollo-boost';
import fetch from 'cross-fetch';
import gql from 'graphql-tag';
type StarWarsGraphqlApiResponse<K extends keyof Omit<Query, '__typename'>> = Record<K, Omit<Query[K], '__typename'>>;
const getPersonFuzzy = gql`
query getPerson($person: String!) {
getFuzzyPerson(person: $person, take: 10) {
name
birthYear
eyeColors
gender
}
}
`;
const apolloClient = new ApolloClient({
uri: 'https://swapi.skyra.pw/',
fetch
});
const {
data: { getPersonFuzzy: peopleData }
} = await apolloClient.query<StarWarsGraphqlApiResponse<'getPersonFuzzy'>, QueryGetPersonFuzzyArgs>({
query: getPersonFuzzy,
variables: { person: 'luke' }
});
console.log(peopleData);
Using Apollo Client React
// ApolloClient setup
import { ApolloClient } from 'apollo-client';
import { InMemoryCache } from 'apollo-cache-inmemory';
import { HttpLink } from 'apollo-link-http';
// Instantiate required constructor fields
const cache = new InMemoryCache();
const link = new HttpLink({
uri: 'https://swapi.skyra.pw/'
});
export const client = new ApolloClient({
// Provide required constructor fields
cache: cache,
link: link,
// Provide some optional constructor fields
name: 'graphql-star-wars-api-client',
version: '1.0',
queryDeduplication: false,
defaultOptions: {
watchQuery: {
fetchPolicy: 'cache-and-network'
}
}
});
// Component
import React from 'react';
import gql from 'graphql-tag';
import { useQuery } from '@apollo/react-hooks';
import type { Query } from '@skyra/star-wars-api';
import { client } from './ApolloClient';
interface StarWarsGraphqlApiResponse<K extends keyof Omit<Query, '__typename'>> {
data: Record<K, Omit<Query[K], '__typename'>>;
}
const GET_PERSON_DATA = gql`
{
getPerson(person: lukeskywalker) {
name
birthYear
eyeColors
gender
}
}
`;
export const StarWarsPerson: React.FC = () => {
const { loading, error, data } = useQuery<StarWarsGraphqlApiResponse<'getPerson'>>(GET_PERSON_DATA, {
client: client
});
if (loading) return 'Loading...';
if (error) return `Error! ${error.message}`;
return <div> Insert how you want to display the data here </div>;
};
Meta
License
Copyright © 2021, Skyra Project. Released under the MIT License.
Buy us some doughnuts
Skyra Project is open source and always will be, even if we don't get donations. That said, we know there are amazing people who may still want to donate just to show their appreciation. Thanks you very much in advance!
We accept donations through Patreon, BitCoin, Ethereum, and Litecoin. You can use the buttons below to donate through your method of choice.
Donate With | QR | Address |
---|---|---|
Patreon | Click Here | |
PayPal | Click Here | |
BitCoin | 3JNzCHMTFtxYFWBnVtDM9Tt34zFbKvdwco | |
Ethereum | 0xcB5EDB76Bc9E389514F905D9680589004C00190c | |
Litecoin | MNVT1keYGMfGp7vWmcYjCS8ntU8LNvjnqM |
Contributors ✨
Thanks goes to these wonderful people (emoji key):
<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section --> <!-- prettier-ignore-start --> <!-- markdownlint-disable --> <table> <tr> <td align="center"><a href="https://favware.tech/"><img src="https://avatars3.githubusercontent.com/u/4019718?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Jeroen Claassens</b></sub></a><br /><a href="https://github.com/skyra-project/star-wars-api/issues?q=author%3AFavna" title="Bug reports">🐛</a> <a href="https://github.com/skyra-project/star-wars-api/commits?author=Favna" title="Code">💻</a> <a href="#design-Favna" title="Design">🎨</a> <a href="#example-Favna" title="Examples">💡</a> <a href="#ideas-Favna" title="Ideas, Planning, & Feedback">🤔</a> <a href="#infra-Favna" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="#maintenance-Favna" title="Maintenance">🚧</a> <a href="#platform-Favna" title="Packaging/porting to new platform">📦</a> <a href="#projectManagement-Favna" title="Project Management">📆</a> <a href="https://github.com/skyra-project/star-wars-api/pulls?q=is%3Apr+reviewed-by%3AFavna" title="Reviewed Pull Requests">👀</a> <a href="#question-Favna" title="Answering Questions">💬</a> <a href="#security-Favna" title="Security">🛡️</a> <a href="https://github.com/skyra-project/star-wars-api/commits?author=Favna" title="Tests">⚠️</a> <a href="#userTesting-Favna" title="User Testing">📓</a></td> <td align="center"><a href="https://github.com/apps/dependabot"><img src="https://avatars.githubusercontent.com/in/29110?v=4?s=100" width="100px;" alt=""/><br /><sub><b>dependabot[bot]</b></sub></a><br /><a href="#maintenance-dependabot[bot]" title="Maintenance">🚧</a></td> <td align="center"><a href="https://github.com/apps/github-actions"><img src="https://avatars.githubusercontent.com/in/15368?v=4?s=100" width="100px;" alt=""/><br /><sub><b>github-actions[bot]</b></sub></a><br /><a href="#maintenance-github-actions[bot]" title="Maintenance">🚧</a></td> <td align="center"><a href="https://github.com/thehairy"><img src="https://avatars.githubusercontent.com/u/71461991?v=4?s=100" width="100px;" alt=""/><br /><sub><b>thehairy</b></sub></a><br /><a href="https://github.com/skyra-project/star-wars-api/commits?author=thehairy" title="Code">💻</a> <a href="https://github.com/skyra-project/star-wars-api/issues?q=author%3Athehairy" title="Bug reports">🐛</a></td> </tr> </table> <!-- markdownlint-restore --> <!-- prettier-ignore-end --> <!-- ALL-CONTRIBUTORS-LIST:END -->This project follows the all-contributors specification. Contributions of any kind welcome!
<!-- LINK DUMP -->