Skip to content

Repository files navigation

code style: prettiercode style: prettierCI

What is Refract-CMS?

Refract-CMS is an open source, code first, self-hosted headless CMS using React, Express & MongoDB.

How is it different from other CMS's?

Unlike most other CMS systems, the schema is defined in JavaScript/TypeScript, and we do not force developers to use elaborate GUI's.

Developers can live entirely in their chosen code editor, while content editors can utilize a blazing fast React based single-page-app, to manage content.

This approach has some advantages:

  • It allows teams to properly code-review schema changes using their current git workflows.
  • Your schema's can be copy/pasted between projects, or distributed using your organizations private NPM registry etc.
  • Your schema can be deployed to multiple environments without requiring you to do duplicate work in a GUI or database imports, You just deploy the code and start editing.
  • Clean database, Refract-CMS only creates one mongo collection per schema, as it doesn't have to store schema information in there.

Quick start

Bootstrap

npx @refract-cms/create --dir myapp

Develop locally

cd ./myapp
npm run dev

Create a schema

Create a ts file inside directory: ./src/config/schemas, e.g. product-schema.ts

import{composeSchema,createTextEditor,createBooleanEditor}from'@refract-cms/core';exportconstProductSchema=composeSchema({options: {alias: 'product',displayName: 'Product',instanceDisplayProps: (product)=>({primaryText: product.title,}),},properties: {title: {type: String,displayName: 'Title',editorComponent: createTextEditor(),},active: {type: Boolean,displayName: 'Active',editorComponent: createBooleanEditor(),},},});

Add new schema to config

Edit file ./src/config/index.ts

import{buildConfig}from'@refract-cms/core';import{ProductSchema}from'./schemas/product-schema';exportconstconfig=buildConfig({schema: [ProductSchema,// The rest of the schemas],});

GraphQL

The CMS exposes a GraphQL endpoint, with rich filtering that you can use to query data for your frontend apps.

Customization

Property editors for each property on the entity model are added to the schema in code, allowing you to choose between some of the in-built editors (TextBox, Select, Image) or to write your own using React.

Editor component

Write component

This is just a standard React component, you can do whatever you want in here including async calls to API's. You receive the current value & a setValue function as props.

The props are typed based on what the target type for this editor is e.g. PropertyEditorProps<string> or PropertyEditorProps<Date>.

To apply styles is to utilize JSS useStyles hook from material-ui.

importReactfrom'react';import{PropertyEditorProps}from'@refract-cms/core';import{makeStyles}from'@material-ui/core';constuseStyles=makeStyles((theme)=>({paragraph: {color: theme.palette.primary.main,marginBottom: theme.spacing(),},}));exportfunctionCustomTextEditor(props: PropertyEditorProps<string>){constclasses=useStyles(props);const{ value, setValue }=props;return(<div><pclassName={classes.paragraph}>This is an example of a basic custom editor component</p><inputvalue={value}onChange={(e)=>setValue(e.target.value)}/></div>);}

Add custom editor to schema

Add a reference to the custom editor component for the desired property in your schema:

myProperty: {type: String,displayName: 'My Property',editorComponent: CustomTextEditor,},

Running in production

An Refract-CMS app is a standard NodeJS app that can be run anywhere that supports NodeJS or docker.

E.g

  • Digital Ocean
  • Azure
  • AWS
  • Kubernetes

Environment variables

The .env file is for local development. When deploying to production we recommend ommitting the .env file from the deployment & using environment variables.

Ensure the following environment varibles are set in your production environment:

  • MONGO_URI
  • ADMIN_USERNAME
  • ADMIN_PASSWORD
  • JWT_SECRET

Build and run

npm run build
npm run start:prod

Contributing

yarn
yarn dev

About

Code-first Headless CMS using TypeScript/React/GraphQL

Topics

Resources

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
GitHub - refract-cms/refract-cms: Code-first Headless CMS using TypeScript/React/GraphQL · GitHub
Skip to content

Repository files navigation

code style: prettiercode style: prettierCI

What is Refract-CMS?

Refract-CMS is an open source, code first, self-hosted headless CMS using React, Express & MongoDB.

How is it different from other CMS's?

Unlike most other CMS systems, the schema is defined in JavaScript/TypeScript, and we do not force developers to use elaborate GUI's.

Developers can live entirely in their chosen code editor, while content editors can utilize a blazing fast React based single-page-app, to manage content.

This approach has some advantages:

  • It allows teams to properly code-review schema changes using their current git workflows.
  • Your schema's can be copy/pasted between projects, or distributed using your organizations private NPM registry etc.
  • Your schema can be deployed to multiple environments without requiring you to do duplicate work in a GUI or database imports, You just deploy the code and start editing.
  • Clean database, Refract-CMS only creates one mongo collection per schema, as it doesn't have to store schema information in there.

Quick start

Bootstrap

npx @refract-cms/create --dir myapp

Develop locally

cd ./myapp
npm run dev

Create a schema

Create a ts file inside directory: ./src/config/schemas, e.g. product-schema.ts

import{composeSchema,createTextEditor,createBooleanEditor}from'@refract-cms/core';exportconstProductSchema=composeSchema({options: {alias: 'product',displayName: 'Product',instanceDisplayProps: (product)=>({primaryText: product.title,}),},properties: {title: {type: String,displayName: 'Title',editorComponent: createTextEditor(),},active: {type: Boolean,displayName: 'Active',editorComponent: createBooleanEditor(),},},});

Add new schema to config

Edit file ./src/config/index.ts

import{buildConfig}from'@refract-cms/core';import{ProductSchema}from'./schemas/product-schema';exportconstconfig=buildConfig({schema: [ProductSchema,// The rest of the schemas],});

GraphQL

The CMS exposes a GraphQL endpoint, with rich filtering that you can use to query data for your frontend apps.

Customization

Property editors for each property on the entity model are added to the schema in code, allowing you to choose between some of the in-built editors (TextBox, Select, Image) or to write your own using React.

Editor component

Write component

This is just a standard React component, you can do whatever you want in here including async calls to API's. You receive the current value & a setValue function as props.

The props are typed based on what the target type for this editor is e.g. PropertyEditorProps<string> or PropertyEditorProps<Date>.

To apply styles is to utilize JSS useStyles hook from material-ui.

importReactfrom'react';import{PropertyEditorProps}from'@refract-cms/core';import{makeStyles}from'@material-ui/core';constuseStyles=makeStyles((theme)=>({paragraph: {color: theme.palette.primary.main,marginBottom: theme.spacing(),},}));exportfunctionCustomTextEditor(props: PropertyEditorProps<string>){constclasses=useStyles(props);const{ value, setValue }=props;return(<div><pclassName={classes.paragraph}>This is an example of a basic custom editor component</p><inputvalue={value}onChange={(e)=>setValue(e.target.value)}/></div>);}

Add custom editor to schema

Add a reference to the custom editor component for the desired property in your schema:

myProperty: {type: String,displayName: 'My Property',editorComponent: CustomTextEditor,},

Running in production

An Refract-CMS app is a standard NodeJS app that can be run anywhere that supports NodeJS or docker.

E.g

  • Digital Ocean
  • Azure
  • AWS
  • Kubernetes

Environment variables

The .env file is for local development. When deploying to production we recommend ommitting the .env file from the deployment & using environment variables.

Ensure the following environment varibles are set in your production environment:

  • MONGO_URI
  • ADMIN_USERNAME
  • ADMIN_PASSWORD
  • JWT_SECRET

Build and run

npm run build
npm run start:prod

Contributing

yarn
yarn dev

About

Code-first Headless CMS using TypeScript/React/GraphQL

Topics

Resources

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - refract-cms/refract-cms: Code-first Headless CMS using TypeScript/React/GraphQL · GitHub
Skip to content

Repository files navigation

code style: prettiercode style: prettierCI

What is Refract-CMS?

Refract-CMS is an open source, code first, self-hosted headless CMS using React, Express & MongoDB.

How is it different from other CMS's?

Unlike most other CMS systems, the schema is defined in JavaScript/TypeScript, and we do not force developers to use elaborate GUI's.

Developers can live entirely in their chosen code editor, while content editors can utilize a blazing fast React based single-page-app, to manage content.

This approach has some advantages:

  • It allows teams to properly code-review schema changes using their current git workflows.
  • Your schema's can be copy/pasted between projects, or distributed using your organizations private NPM registry etc.
  • Your schema can be deployed to multiple environments without requiring you to do duplicate work in a GUI or database imports, You just deploy the code and start editing.
  • Clean database, Refract-CMS only creates one mongo collection per schema, as it doesn't have to store schema information in there.

Quick start

Bootstrap

npx @refract-cms/create --dir myapp

Develop locally

cd ./myapp
npm run dev

Create a schema

Create a ts file inside directory: ./src/config/schemas, e.g. product-schema.ts

import{composeSchema,createTextEditor,createBooleanEditor}from'@refract-cms/core';exportconstProductSchema=composeSchema({options: {alias: 'product',displayName: 'Product',instanceDisplayProps: (product)=>({primaryText: product.title,}),},properties: {title: {type: String,displayName: 'Title',editorComponent: createTextEditor(),},active: {type: Boolean,displayName: 'Active',editorComponent: createBooleanEditor(),},},});

Add new schema to config

Edit file ./src/config/index.ts

import{buildConfig}from'@refract-cms/core';import{ProductSchema}from'./schemas/product-schema';exportconstconfig=buildConfig({schema: [ProductSchema,// The rest of the schemas],});

GraphQL

The CMS exposes a GraphQL endpoint, with rich filtering that you can use to query data for your frontend apps.

Customization

Property editors for each property on the entity model are added to the schema in code, allowing you to choose between some of the in-built editors (TextBox, Select, Image) or to write your own using React.

Editor component

Write component

This is just a standard React component, you can do whatever you want in here including async calls to API's. You receive the current value & a setValue function as props.

The props are typed based on what the target type for this editor is e.g. PropertyEditorProps<string> or PropertyEditorProps<Date>.

To apply styles is to utilize JSS useStyles hook from material-ui.

importReactfrom'react';import{PropertyEditorProps}from'@refract-cms/core';import{makeStyles}from'@material-ui/core';constuseStyles=makeStyles((theme)=>({paragraph: {color: theme.palette.primary.main,marginBottom: theme.spacing(),},}));exportfunctionCustomTextEditor(props: PropertyEditorProps<string>){constclasses=useStyles(props);const{ value, setValue }=props;return(<div><pclassName={classes.paragraph}>This is an example of a basic custom editor component</p><inputvalue={value}onChange={(e)=>setValue(e.target.value)}/></div>);}

Add custom editor to schema

Add a reference to the custom editor component for the desired property in your schema:

myProperty: {type: String,displayName: 'My Property',editorComponent: CustomTextEditor,},

Running in production

An Refract-CMS app is a standard NodeJS app that can be run anywhere that supports NodeJS or docker.

E.g

  • Digital Ocean
  • Azure
  • AWS
  • Kubernetes

Environment variables

The .env file is for local development. When deploying to production we recommend ommitting the .env file from the deployment & using environment variables.

Ensure the following environment varibles are set in your production environment:

  • MONGO_URI
  • ADMIN_USERNAME
  • ADMIN_PASSWORD
  • JWT_SECRET

Build and run

npm run build
npm run start:prod

Contributing

yarn
yarn dev

About

Code-first Headless CMS using TypeScript/React/GraphQL

Topics

Resources

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - refract-cms/refract-cms: Code-first Headless CMS using TypeScript/React/GraphQL · GitHub
Skip to content

Repository files navigation

code style: prettiercode style: prettierCI

What is Refract-CMS?

Refract-CMS is an open source, code first, self-hosted headless CMS using React, Express & MongoDB.

How is it different from other CMS's?

Unlike most other CMS systems, the schema is defined in JavaScript/TypeScript, and we do not force developers to use elaborate GUI's.

Developers can live entirely in their chosen code editor, while content editors can utilize a blazing fast React based single-page-app, to manage content.

This approach has some advantages:

  • It allows teams to properly code-review schema changes using their current git workflows.
  • Your schema's can be copy/pasted between projects, or distributed using your organizations private NPM registry etc.
  • Your schema can be deployed to multiple environments without requiring you to do duplicate work in a GUI or database imports, You just deploy the code and start editing.
  • Clean database, Refract-CMS only creates one mongo collection per schema, as it doesn't have to store schema information in there.

Quick start

Bootstrap

npx @refract-cms/create --dir myapp

Develop locally

cd ./myapp
npm run dev

Create a schema

Create a ts file inside directory: ./src/config/schemas, e.g. product-schema.ts

import{composeSchema,createTextEditor,createBooleanEditor}from'@refract-cms/core';exportconstProductSchema=composeSchema({options: {alias: 'product',displayName: 'Product',instanceDisplayProps: (product)=>({primaryText: product.title,}),},properties: {title: {type: String,displayName: 'Title',editorComponent: createTextEditor(),},active: {type: Boolean,displayName: 'Active',editorComponent: createBooleanEditor(),},},});

Add new schema to config

Edit file ./src/config/index.ts

import{buildConfig}from'@refract-cms/core';import{ProductSchema}from'./schemas/product-schema';exportconstconfig=buildConfig({schema: [ProductSchema,// The rest of the schemas],});

GraphQL

The CMS exposes a GraphQL endpoint, with rich filtering that you can use to query data for your frontend apps.

Customization

Property editors for each property on the entity model are added to the schema in code, allowing you to choose between some of the in-built editors (TextBox, Select, Image) or to write your own using React.

Editor component

Write component

This is just a standard React component, you can do whatever you want in here including async calls to API's. You receive the current value & a setValue function as props.

The props are typed based on what the target type for this editor is e.g. PropertyEditorProps<string> or PropertyEditorProps<Date>.

To apply styles is to utilize JSS useStyles hook from material-ui.

importReactfrom'react';import{PropertyEditorProps}from'@refract-cms/core';import{makeStyles}from'@material-ui/core';constuseStyles=makeStyles((theme)=>({paragraph: {color: theme.palette.primary.main,marginBottom: theme.spacing(),},}));exportfunctionCustomTextEditor(props: PropertyEditorProps<string>){constclasses=useStyles(props);const{ value, setValue }=props;return(<div><pclassName={classes.paragraph}>This is an example of a basic custom editor component</p><inputvalue={value}onChange={(e)=>setValue(e.target.value)}/></div>);}

Add custom editor to schema

Add a reference to the custom editor component for the desired property in your schema:

myProperty: {type: String,displayName: 'My Property',editorComponent: CustomTextEditor,},

Running in production

An Refract-CMS app is a standard NodeJS app that can be run anywhere that supports NodeJS or docker.

E.g

  • Digital Ocean
  • Azure
  • AWS
  • Kubernetes

Environment variables

The .env file is for local development. When deploying to production we recommend ommitting the .env file from the deployment & using environment variables.

Ensure the following environment varibles are set in your production environment:

  • MONGO_URI
  • ADMIN_USERNAME
  • ADMIN_PASSWORD
  • JWT_SECRET

Build and run

npm run build
npm run start:prod

Contributing

yarn
yarn dev

About

Code-first Headless CMS using TypeScript/React/GraphQL

Topics

Resources

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' GitHub - refract-cms/refract-cms: Code-first Headless CMS using TypeScript/React/GraphQL · GitHub
Skip to content

Repository files navigation

code style: prettiercode style: prettierCI

What is Refract-CMS?

Refract-CMS is an open source, code first, self-hosted headless CMS using React, Express & MongoDB.

How is it different from other CMS's?

Unlike most other CMS systems, the schema is defined in JavaScript/TypeScript, and we do not force developers to use elaborate GUI's.

Developers can live entirely in their chosen code editor, while content editors can utilize a blazing fast React based single-page-app, to manage content.

This approach has some advantages:

  • It allows teams to properly code-review schema changes using their current git workflows.
  • Your schema's can be copy/pasted between projects, or distributed using your organizations private NPM registry etc.
  • Your schema can be deployed to multiple environments without requiring you to do duplicate work in a GUI or database imports, You just deploy the code and start editing.
  • Clean database, Refract-CMS only creates one mongo collection per schema, as it doesn't have to store schema information in there.

Quick start

Bootstrap

npx @refract-cms/create --dir myapp

Develop locally

cd ./myapp
npm run dev

Create a schema

Create a ts file inside directory: ./src/config/schemas, e.g. product-schema.ts

import{composeSchema,createTextEditor,createBooleanEditor}from'@refract-cms/core';exportconstProductSchema=composeSchema({options: {alias: 'product',displayName: 'Product',instanceDisplayProps: (product)=>({primaryText: product.title,}),},properties: {title: {type: String,displayName: 'Title',editorComponent: createTextEditor(),},active: {type: Boolean,displayName: 'Active',editorComponent: createBooleanEditor(),},},});

Add new schema to config

Edit file ./src/config/index.ts

import{buildConfig}from'@refract-cms/core';import{ProductSchema}from'./schemas/product-schema';exportconstconfig=buildConfig({schema: [ProductSchema,// The rest of the schemas],});

GraphQL

The CMS exposes a GraphQL endpoint, with rich filtering that you can use to query data for your frontend apps.

Customization

Property editors for each property on the entity model are added to the schema in code, allowing you to choose between some of the in-built editors (TextBox, Select, Image) or to write your own using React.

Editor component

Write component

This is just a standard React component, you can do whatever you want in here including async calls to API's. You receive the current value & a setValue function as props.

The props are typed based on what the target type for this editor is e.g. PropertyEditorProps<string> or PropertyEditorProps<Date>.

To apply styles is to utilize JSS useStyles hook from material-ui.

importReactfrom'react';import{PropertyEditorProps}from'@refract-cms/core';import{makeStyles}from'@material-ui/core';constuseStyles=makeStyles((theme)=>({paragraph: {color: theme.palette.primary.main,marginBottom: theme.spacing(),},}));exportfunctionCustomTextEditor(props: PropertyEditorProps<string>){constclasses=useStyles(props);const{ value, setValue }=props;return(<div><pclassName={classes.paragraph}>This is an example of a basic custom editor component</p><inputvalue={value}onChange={(e)=>setValue(e.target.value)}/></div>);}

Add custom editor to schema

Add a reference to the custom editor component for the desired property in your schema:

myProperty: {type: String,displayName: 'My Property',editorComponent: CustomTextEditor,},

Running in production

An Refract-CMS app is a standard NodeJS app that can be run anywhere that supports NodeJS or docker.

E.g

  • Digital Ocean
  • Azure
  • AWS
  • Kubernetes

Environment variables

The .env file is for local development. When deploying to production we recommend ommitting the .env file from the deployment & using environment variables.

Ensure the following environment varibles are set in your production environment:

  • MONGO_URI
  • ADMIN_USERNAME
  • ADMIN_PASSWORD
  • JWT_SECRET

Build and run

npm run build
npm run start:prod

Contributing

yarn
yarn dev

About

Code-first Headless CMS using TypeScript/React/GraphQL

Topics

Resources

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - refract-cms/refract-cms: Code-first Headless CMS using TypeScript/React/GraphQL · GitHub
Skip to content

Repository files navigation

code style: prettiercode style: prettierCI

What is Refract-CMS?

Refract-CMS is an open source, code first, self-hosted headless CMS using React, Express & MongoDB.

How is it different from other CMS's?

Unlike most other CMS systems, the schema is defined in JavaScript/TypeScript, and we do not force developers to use elaborate GUI's.

Developers can live entirely in their chosen code editor, while content editors can utilize a blazing fast React based single-page-app, to manage content.

This approach has some advantages:

  • It allows teams to properly code-review schema changes using their current git workflows.
  • Your schema's can be copy/pasted between projects, or distributed using your organizations private NPM registry etc.
  • Your schema can be deployed to multiple environments without requiring you to do duplicate work in a GUI or database imports, You just deploy the code and start editing.
  • Clean database, Refract-CMS only creates one mongo collection per schema, as it doesn't have to store schema information in there.

Quick start

Bootstrap

npx @refract-cms/create --dir myapp

Develop locally

cd ./myapp
npm run dev

Create a schema

Create a ts file inside directory: ./src/config/schemas, e.g. product-schema.ts

import{composeSchema,createTextEditor,createBooleanEditor}from'@refract-cms/core';exportconstProductSchema=composeSchema({options: {alias: 'product',displayName: 'Product',instanceDisplayProps: (product)=>({primaryText: product.title,}),},properties: {title: {type: String,displayName: 'Title',editorComponent: createTextEditor(),},active: {type: Boolean,displayName: 'Active',editorComponent: createBooleanEditor(),},},});

Add new schema to config

Edit file ./src/config/index.ts

import{buildConfig}from'@refract-cms/core';import{ProductSchema}from'./schemas/product-schema';exportconstconfig=buildConfig({schema: [ProductSchema,// The rest of the schemas],});

GraphQL

The CMS exposes a GraphQL endpoint, with rich filtering that you can use to query data for your frontend apps.

Customization

Property editors for each property on the entity model are added to the schema in code, allowing you to choose between some of the in-built editors (TextBox, Select, Image) or to write your own using React.

Editor component

Write component

This is just a standard React component, you can do whatever you want in here including async calls to API's. You receive the current value & a setValue function as props.

The props are typed based on what the target type for this editor is e.g. PropertyEditorProps<string> or PropertyEditorProps<Date>.

To apply styles is to utilize JSS useStyles hook from material-ui.

importReactfrom'react';import{PropertyEditorProps}from'@refract-cms/core';import{makeStyles}from'@material-ui/core';constuseStyles=makeStyles((theme)=>({paragraph: {color: theme.palette.primary.main,marginBottom: theme.spacing(),},}));exportfunctionCustomTextEditor(props: PropertyEditorProps<string>){constclasses=useStyles(props);const{ value, setValue }=props;return(<div><pclassName={classes.paragraph}>This is an example of a basic custom editor component</p><inputvalue={value}onChange={(e)=>setValue(e.target.value)}/></div>);}

Add custom editor to schema

Add a reference to the custom editor component for the desired property in your schema:

myProperty: {type: String,displayName: 'My Property',editorComponent: CustomTextEditor,},

Running in production

An Refract-CMS app is a standard NodeJS app that can be run anywhere that supports NodeJS or docker.

E.g

  • Digital Ocean
  • Azure
  • AWS
  • Kubernetes

Environment variables

The .env file is for local development. When deploying to production we recommend ommitting the .env file from the deployment & using environment variables.

Ensure the following environment varibles are set in your production environment:

  • MONGO_URI
  • ADMIN_USERNAME
  • ADMIN_PASSWORD
  • JWT_SECRET

Build and run

npm run build
npm run start:prod

Contributing

yarn
yarn dev

About

Code-first Headless CMS using TypeScript/React/GraphQL

Topics

Resources

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); })(); GitHub - refract-cms/refract-cms: Code-first Headless CMS using TypeScript/React/GraphQL · GitHub
Skip to content

Repository files navigation

code style: prettiercode style: prettierCI

What is Refract-CMS?

Refract-CMS is an open source, code first, self-hosted headless CMS using React, Express & MongoDB.

How is it different from other CMS's?

Unlike most other CMS systems, the schema is defined in JavaScript/TypeScript, and we do not force developers to use elaborate GUI's.

Developers can live entirely in their chosen code editor, while content editors can utilize a blazing fast React based single-page-app, to manage content.

This approach has some advantages:

  • It allows teams to properly code-review schema changes using their current git workflows.
  • Your schema's can be copy/pasted between projects, or distributed using your organizations private NPM registry etc.
  • Your schema can be deployed to multiple environments without requiring you to do duplicate work in a GUI or database imports, You just deploy the code and start editing.
  • Clean database, Refract-CMS only creates one mongo collection per schema, as it doesn't have to store schema information in there.

Quick start

Bootstrap

npx @refract-cms/create --dir myapp

Develop locally

cd ./myapp
npm run dev

Create a schema

Create a ts file inside directory: ./src/config/schemas, e.g. product-schema.ts

import{composeSchema,createTextEditor,createBooleanEditor}from'@refract-cms/core';exportconstProductSchema=composeSchema({options: {alias: 'product',displayName: 'Product',instanceDisplayProps: (product)=>({primaryText: product.title,}),},properties: {title: {type: String,displayName: 'Title',editorComponent: createTextEditor(),},active: {type: Boolean,displayName: 'Active',editorComponent: createBooleanEditor(),},},});

Add new schema to config

Edit file ./src/config/index.ts

import{buildConfig}from'@refract-cms/core';import{ProductSchema}from'./schemas/product-schema';exportconstconfig=buildConfig({schema: [ProductSchema,// The rest of the schemas],});

GraphQL

The CMS exposes a GraphQL endpoint, with rich filtering that you can use to query data for your frontend apps.

Customization

Property editors for each property on the entity model are added to the schema in code, allowing you to choose between some of the in-built editors (TextBox, Select, Image) or to write your own using React.

Editor component

Write component

This is just a standard React component, you can do whatever you want in here including async calls to API's. You receive the current value & a setValue function as props.

The props are typed based on what the target type for this editor is e.g. PropertyEditorProps<string> or PropertyEditorProps<Date>.

To apply styles is to utilize JSS useStyles hook from material-ui.

importReactfrom'react';import{PropertyEditorProps}from'@refract-cms/core';import{makeStyles}from'@material-ui/core';constuseStyles=makeStyles((theme)=>({paragraph: {color: theme.palette.primary.main,marginBottom: theme.spacing(),},}));exportfunctionCustomTextEditor(props: PropertyEditorProps<string>){constclasses=useStyles(props);const{ value, setValue }=props;return(<div><pclassName={classes.paragraph}>This is an example of a basic custom editor component</p><inputvalue={value}onChange={(e)=>setValue(e.target.value)}/></div>);}

Add custom editor to schema

Add a reference to the custom editor component for the desired property in your schema:

myProperty: {type: String,displayName: 'My Property',editorComponent: CustomTextEditor,},

Running in production

An Refract-CMS app is a standard NodeJS app that can be run anywhere that supports NodeJS or docker.

E.g

  • Digital Ocean
  • Azure
  • AWS
  • Kubernetes

Environment variables

The .env file is for local development. When deploying to production we recommend ommitting the .env file from the deployment & using environment variables.

Ensure the following environment varibles are set in your production environment:

  • MONGO_URI
  • ADMIN_USERNAME
  • ADMIN_PASSWORD
  • JWT_SECRET

Build and run

npm run build
npm run start:prod

Contributing

yarn
yarn dev

About

Code-first Headless CMS using TypeScript/React/GraphQL

Topics

Resources

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages