Kentico GraphQL schema generator
GraphQL schema generator used to generate schema based on specified project.
This schema could be used when creating GraphQL endpoint from Kentico Cloud Delivery API REST endpoint.
This schema is primarily meant to be used in combination with the Official JavaScript SDK on the top of the Kentico Cloud REST API. If you are using REST API directly, you won't get all elements' properties set, because some of them are set by the JS SDK.
Showcase could be see on apollo express boilerplate.
Get started
Prerequisites
- Node installed
Installation
npm i kentico-cloud-graphql-schema-generator -g
Generating schema with NPM script
Provide a project ID of your project.
Write type definition to the standard output
kc-generate-gql-schema --projectId xxx
Generate file with definition exported as a constant fo file config.js
kc-generate-gql-schema --projectId xxx --createModule --outputFile "config.js"
Configuration
projectId
- represents the Kentico Cloud Project Id from which schema will be generatedsecureAccessKey
- Secure access key required to authenticate requests with enabled secure access in Kentico Cloud projectoutputFile
- specifies output file name (possible with the path), if not specified - output is written to standard outputcreateModule
- output is defined as a constant and exported as a module (see Example Output)
Development
- Clone the repository
- Run
npm install
to install all required dependencies - Run
npm run build
to build the solution
Run
Run node ./_commonjs/index.js --projectId xxx
Test
- Run
npm test
to run all tests
Run watch mode
- Run
npm run watch
to run the watch mode
Example output
Without module encapsulation (w/o `createModule`)
type SystemInfo {
id: String!
name: String!
codename: String!
language: String!
type: String!
lastModified: String!
}
interface ContentItem {
system: SystemInfo!
}
type MultipleChoiceElementOption {
name: String!
codename: String
}
type TaxonomyTerm {
name: String!
codename: String
}
type Asset {
name: String
type: String
size: Int
description: String
url: String,
}
type Link {
codename: String
itemID: String
urlSlug: String
type: String
}
type TextElement {
type: String!
name: String!
value: String
}
type NumberElement {
type: String!
name: String!
value: String
number: Int
}
type DateTimeElement {
type: String!
name: String!
value: String
datetime: String
}
type MultipleChoiceElement {
type: String!
name: String!
value: String
options: [MultipleChoiceElementOption]
}
type UrlSlugElement {
type: String!
name: String!
value: String
data: String
}
type TaxonomyElement {
type: String!
name: String!
value: String
taxonomyGroup: String
taxonomyTerms: [TaxonomyTerm]
}
type AssetElement {
type: String!
name: String!
value: String
assets: [Asset]
}
type RichTextElement {
type: String!
name: String!
value: String
linkedItemCodenames: [String]
links: [Link]
}
type AboutUsContentType implements ContentItem {
system: SystemInfo!
metadata__og_description: TextElement
metadata__meta_title: TextElement
metadata__og_title: TextElement
metadata__meta_description: TextElement
metadata__twitter_site: TextElement
url_pattern: UrlSlugElement
metadata__twitter_image: AssetElement
metadata__twitter_creator: TextElement
metadata__twitter_title: TextElement
metadata__twitter_description: TextElement
metadata__og_image: AssetElement
facts: [ContentItem]
}
With module encapsulation
const TYPE_DEFINITION = `type SystemInfo {
id: String!
name: String!
codename: String!
language: String!
type: String!
lastModified: String!
}
interface ContentItem {
system: SystemInfo!
}
type MultipleChoiceElementOption {
name: String!
codename: String
}
type TaxonomyTerm {
name: String!
codename: String
}
type Asset {
name: String
type: String
size: Int
description: String
url: String,
}
type Link {
codename: String
itemID: String
urlSlug: String
type: String
}
type TextElement {
type: String!
name: String!
value: String
}
type NumberElement {
type: String!
name: String!
value: String
number: Int
}
type DateTimeElement {
type: String!
name: String!
value: String
datetime: String
}
type MultipleChoiceElement {
type: String!
name: String!
value: String
options: [MultipleChoiceElementOption]
}
type UrlSlugElement {
type: String!
name: String!
value: String
data: String
}
type TaxonomyElement {
type: String!
name: String!
value: String
taxonomyGroup: String
taxonomyTerms: [TaxonomyTerm]
}
type AssetElement {
type: String!
name: String!
value: String
assets: [Asset]
}
type RichTextElement {
type: String!
name: String!
value: String
linkedItemCodenames: [String]
links: [Link]
}
type AboutUsContentType implements ContentItem {
system: SystemInfo!
metadata__og_description: TextElement
metadata__meta_title: TextElement
metadata__og_title: TextElement
metadata__meta_description: TextElement
metadata__twitter_site: TextElement
url_pattern: UrlSlugElement
metadata__twitter_image: AssetElement
metadata__twitter_creator: TextElement
metadata__twitter_title: TextElement
metadata__twitter_description: TextElement
metadata__og_image: AssetElement
facts: [ContentItem]
}`;
module.exports = {
TYPE_DEFINITION
}