mirror of
https://github.com/FranP-code/countries.git
synced 2025-10-13 00:02:15 +00:00
Make the schema into a subgraph
This commit is contained in:
11
index.js
11
index.js
@@ -1,9 +1,12 @@
|
|||||||
import {ApolloServer} from 'apollo-server';
|
import {ApolloServer, gql} from 'apollo-server';
|
||||||
import {resolvers, typeDefs} from './schema.js';
|
import {buildSubgraphSchema} from '@apollo/subgraph';
|
||||||
|
import {readFileSync} from 'fs';
|
||||||
|
import {resolvers} from './resolvers.js';
|
||||||
|
|
||||||
|
const typeDefs = gql(readFileSync('./schema.graphql', 'utf-8'));
|
||||||
|
|
||||||
const server = new ApolloServer({
|
const server = new ApolloServer({
|
||||||
typeDefs,
|
schema: buildSubgraphSchema({typeDefs, resolvers}),
|
||||||
resolvers,
|
|
||||||
introspection: true,
|
introspection: true,
|
||||||
playground: true
|
playground: true
|
||||||
});
|
});
|
||||||
|
|||||||
40
package-lock.json
generated
40
package-lock.json
generated
@@ -5,9 +5,10 @@
|
|||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"@apollo/subgraph": "^0.3.1",
|
||||||
"apollo-server": "^2.25.3",
|
"apollo-server": "^2.25.3",
|
||||||
"countries-list": "^2.5.4",
|
"countries-list": "^2.5.4",
|
||||||
"graphql": "^14.6.0",
|
"graphql": "^15.8.0",
|
||||||
"provinces": "^1.11.0",
|
"provinces": "^1.11.0",
|
||||||
"sift": "^12.0.0"
|
"sift": "^12.0.0"
|
||||||
},
|
},
|
||||||
@@ -47,6 +48,17 @@
|
|||||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz",
|
"resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz",
|
||||||
"integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw=="
|
"integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw=="
|
||||||
},
|
},
|
||||||
|
"node_modules/@apollo/subgraph": {
|
||||||
|
"version": "0.3.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/@apollo/subgraph/-/subgraph-0.3.1.tgz",
|
||||||
|
"integrity": "sha512-MWqzfZEcvN86iwwgsgkFnkoBvv/wCdw/qyXjayuZ4wwQgVZ8NpFNbUxjRC0MwKNHwBU/ZH1oDHOnC8WbUuUMsg==",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=12.13.0 <17.0"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"graphql": "^15.8.0 || ^16.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/@apollographql/apollo-tools": {
|
"node_modules/@apollographql/apollo-tools": {
|
||||||
"version": "0.5.2",
|
"version": "0.5.2",
|
||||||
"resolved": "https://registry.npmjs.org/@apollographql/apollo-tools/-/apollo-tools-0.5.2.tgz",
|
"resolved": "https://registry.npmjs.org/@apollographql/apollo-tools/-/apollo-tools-0.5.2.tgz",
|
||||||
@@ -2901,14 +2913,11 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/graphql": {
|
"node_modules/graphql": {
|
||||||
"version": "14.6.0",
|
"version": "15.8.0",
|
||||||
"resolved": "https://registry.npmjs.org/graphql/-/graphql-14.6.0.tgz",
|
"resolved": "https://registry.npmjs.org/graphql/-/graphql-15.8.0.tgz",
|
||||||
"integrity": "sha512-VKzfvHEKybTKjQVpTFrA5yUq2S9ihcZvfJAtsDBBCuV6wauPu1xl/f9ehgVf0FcEJJs4vz6ysb/ZMkGigQZseg==",
|
"integrity": "sha512-5gghUc24tP9HRznNpV2+FIoq3xKkj5dTQqf4v0CpdPbFVwFkWoxOM+o+2OC9ZSvjEMTjfmG9QT+gcvggTwW1zw==",
|
||||||
"dependencies": {
|
|
||||||
"iterall": "^1.2.2"
|
|
||||||
},
|
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">= 6.x"
|
"node": ">= 10.x"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/graphql-extensions": {
|
"node_modules/graphql-extensions": {
|
||||||
@@ -5571,6 +5580,12 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"@apollo/subgraph": {
|
||||||
|
"version": "0.3.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/@apollo/subgraph/-/subgraph-0.3.1.tgz",
|
||||||
|
"integrity": "sha512-MWqzfZEcvN86iwwgsgkFnkoBvv/wCdw/qyXjayuZ4wwQgVZ8NpFNbUxjRC0MwKNHwBU/ZH1oDHOnC8WbUuUMsg==",
|
||||||
|
"requires": {}
|
||||||
|
},
|
||||||
"@apollographql/apollo-tools": {
|
"@apollographql/apollo-tools": {
|
||||||
"version": "0.5.2",
|
"version": "0.5.2",
|
||||||
"resolved": "https://registry.npmjs.org/@apollographql/apollo-tools/-/apollo-tools-0.5.2.tgz",
|
"resolved": "https://registry.npmjs.org/@apollographql/apollo-tools/-/apollo-tools-0.5.2.tgz",
|
||||||
@@ -7882,12 +7897,9 @@
|
|||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"graphql": {
|
"graphql": {
|
||||||
"version": "14.6.0",
|
"version": "15.8.0",
|
||||||
"resolved": "https://registry.npmjs.org/graphql/-/graphql-14.6.0.tgz",
|
"resolved": "https://registry.npmjs.org/graphql/-/graphql-15.8.0.tgz",
|
||||||
"integrity": "sha512-VKzfvHEKybTKjQVpTFrA5yUq2S9ihcZvfJAtsDBBCuV6wauPu1xl/f9ehgVf0FcEJJs4vz6ysb/ZMkGigQZseg==",
|
"integrity": "sha512-5gghUc24tP9HRznNpV2+FIoq3xKkj5dTQqf4v0CpdPbFVwFkWoxOM+o+2OC9ZSvjEMTjfmG9QT+gcvggTwW1zw=="
|
||||||
"requires": {
|
|
||||||
"iterall": "^1.2.2"
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
"graphql-extensions": {
|
"graphql-extensions": {
|
||||||
"version": "0.15.0",
|
"version": "0.15.0",
|
||||||
|
|||||||
@@ -9,9 +9,10 @@
|
|||||||
"extends": "@trevorblades"
|
"extends": "@trevorblades"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"@apollo/subgraph": "^0.3.1",
|
||||||
"apollo-server": "^2.25.3",
|
"apollo-server": "^2.25.3",
|
||||||
"countries-list": "^2.5.4",
|
"countries-list": "^2.5.4",
|
||||||
"graphql": "^14.6.0",
|
"graphql": "^15.8.0",
|
||||||
"provinces": "^1.11.0",
|
"provinces": "^1.11.0",
|
||||||
"sift": "^12.0.0"
|
"sift": "^12.0.0"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -1,74 +1,6 @@
|
|||||||
import countriesList from 'countries-list';
|
import countriesList from 'countries-list';
|
||||||
import provinces from 'provinces';
|
import provinces from 'provinces';
|
||||||
import sift from 'sift';
|
import sift from 'sift';
|
||||||
import {gql} from 'apollo-server';
|
|
||||||
|
|
||||||
export const typeDefs = gql`
|
|
||||||
type Continent {
|
|
||||||
code: ID!
|
|
||||||
name: String!
|
|
||||||
countries: [Country!]!
|
|
||||||
}
|
|
||||||
|
|
||||||
type Country {
|
|
||||||
code: ID!
|
|
||||||
name: String!
|
|
||||||
native: String!
|
|
||||||
phone: String!
|
|
||||||
continent: Continent!
|
|
||||||
capital: String
|
|
||||||
currency: String
|
|
||||||
languages: [Language!]!
|
|
||||||
emoji: String!
|
|
||||||
emojiU: String!
|
|
||||||
states: [State!]!
|
|
||||||
}
|
|
||||||
|
|
||||||
type State {
|
|
||||||
code: String
|
|
||||||
name: String!
|
|
||||||
country: Country!
|
|
||||||
}
|
|
||||||
|
|
||||||
type Language {
|
|
||||||
code: ID!
|
|
||||||
name: String
|
|
||||||
native: String
|
|
||||||
rtl: Boolean!
|
|
||||||
}
|
|
||||||
|
|
||||||
input StringQueryOperatorInput {
|
|
||||||
eq: String
|
|
||||||
ne: String
|
|
||||||
in: [String]
|
|
||||||
nin: [String]
|
|
||||||
regex: String
|
|
||||||
glob: String
|
|
||||||
}
|
|
||||||
|
|
||||||
input CountryFilterInput {
|
|
||||||
code: StringQueryOperatorInput
|
|
||||||
currency: StringQueryOperatorInput
|
|
||||||
continent: StringQueryOperatorInput
|
|
||||||
}
|
|
||||||
|
|
||||||
input ContinentFilterInput {
|
|
||||||
code: StringQueryOperatorInput
|
|
||||||
}
|
|
||||||
|
|
||||||
input LanguageFilterInput {
|
|
||||||
code: StringQueryOperatorInput
|
|
||||||
}
|
|
||||||
|
|
||||||
type Query {
|
|
||||||
continents(filter: ContinentFilterInput): [Continent!]!
|
|
||||||
continent(code: ID!): Continent
|
|
||||||
countries(filter: CountryFilterInput): [Country!]!
|
|
||||||
country(code: ID!): Country
|
|
||||||
languages(filter: LanguageFilterInput): [Language!]!
|
|
||||||
language(code: ID!): Language
|
|
||||||
}
|
|
||||||
`;
|
|
||||||
|
|
||||||
function filterToSift(filter = {}) {
|
function filterToSift(filter = {}) {
|
||||||
return sift(
|
return sift(
|
||||||
@@ -111,7 +43,8 @@ export const resolvers = {
|
|||||||
};
|
};
|
||||||
}),
|
}),
|
||||||
states: country =>
|
states: country =>
|
||||||
provinces.filter(province => province.country === country.code)
|
provinces.filter(province => province.country === country.code),
|
||||||
|
__resolveReference: country => countries[country.code]
|
||||||
},
|
},
|
||||||
State: {
|
State: {
|
||||||
code: state => state.short,
|
code: state => state.short,
|
||||||
@@ -124,10 +57,12 @@ export const resolvers = {
|
|||||||
.map(([code, country]) => ({
|
.map(([code, country]) => ({
|
||||||
...country,
|
...country,
|
||||||
code
|
code
|
||||||
}))
|
})),
|
||||||
|
__resolveReference: continent => continents[continent.code]
|
||||||
},
|
},
|
||||||
Language: {
|
Language: {
|
||||||
rtl: language => Boolean(language.rtl)
|
rtl: language => Boolean(language.rtl),
|
||||||
|
__resolveReference: language => languages[language.code]
|
||||||
},
|
},
|
||||||
Query: {
|
Query: {
|
||||||
continent(parent, {code}) {
|
continent(parent, {code}) {
|
||||||
64
schema.graphql
Normal file
64
schema.graphql
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
type Continent @key(fields: "code") {
|
||||||
|
code: ID!
|
||||||
|
name: String!
|
||||||
|
countries: [Country!]!
|
||||||
|
}
|
||||||
|
|
||||||
|
type Country @key(fields: "code") {
|
||||||
|
code: ID!
|
||||||
|
name: String!
|
||||||
|
native: String!
|
||||||
|
phone: String!
|
||||||
|
continent: Continent!
|
||||||
|
capital: String
|
||||||
|
currency: String
|
||||||
|
languages: [Language!]!
|
||||||
|
emoji: String!
|
||||||
|
emojiU: String!
|
||||||
|
states: [State!]!
|
||||||
|
}
|
||||||
|
|
||||||
|
type State {
|
||||||
|
code: String
|
||||||
|
name: String!
|
||||||
|
country: Country!
|
||||||
|
}
|
||||||
|
|
||||||
|
type Language @key(fields: "code") {
|
||||||
|
code: ID!
|
||||||
|
name: String
|
||||||
|
native: String
|
||||||
|
rtl: Boolean!
|
||||||
|
}
|
||||||
|
|
||||||
|
input StringQueryOperatorInput {
|
||||||
|
eq: String
|
||||||
|
ne: String
|
||||||
|
in: [String]
|
||||||
|
nin: [String]
|
||||||
|
regex: String
|
||||||
|
glob: String
|
||||||
|
}
|
||||||
|
|
||||||
|
input CountryFilterInput {
|
||||||
|
code: StringQueryOperatorInput
|
||||||
|
currency: StringQueryOperatorInput
|
||||||
|
continent: StringQueryOperatorInput
|
||||||
|
}
|
||||||
|
|
||||||
|
input ContinentFilterInput {
|
||||||
|
code: StringQueryOperatorInput
|
||||||
|
}
|
||||||
|
|
||||||
|
input LanguageFilterInput {
|
||||||
|
code: StringQueryOperatorInput
|
||||||
|
}
|
||||||
|
|
||||||
|
type Query {
|
||||||
|
continents(filter: ContinentFilterInput): [Continent!]!
|
||||||
|
continent(code: ID!): Continent
|
||||||
|
countries(filter: CountryFilterInput): [Country!]!
|
||||||
|
country(code: ID!): Country
|
||||||
|
languages(filter: LanguageFilterInput): [Language!]!
|
||||||
|
language(code: ID!): Language
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user