smooth-code / smooth.js

Code driven CMS powered by GraphQL & React.
MIT License
26 stars 10 forks source link

Mocks specification #24

Closed gregberge closed 5 years ago

gregberge commented 5 years ago

Define seeds

Seeds will be defined in a folder seeds/data.

import { getSeedsFromFolder, getMediasFromFolder } from 'smooth/seeds'

// Seed list of data (common use-case)
export function getSeeds() {
  return [
    {
      name: 'dior',
      data: {
        title: 'dior',
        description: 'xxx'
      }
    }
  ]
}

// Generate seeds from a list of contents (data) in a folder
export function getSeeds({ /* articles, medias */ }) {
  return getSeedsFromFolder({
    node: glob => glob(`${__dirname}/contents`),
    webpack: () => require.context(`./contents`),
  })
}

// Generate seeds from a list of contents (binary) in a folder
export function getSeeds({  /* articles, medias */ }) {
  return getMediasFromFolder({
    node: glob => glob(`${__dirname}/contents`),
    webpack: () => require.context(`./contents`),
  })
}

List all seeds

import { generateSeeds } from 'smooth/seeds'
import medias from './data/medias'
import translations from './data/translations'
import articles from './data/articles'
import brands from './data/brands'
import footers from './data/footers'
import headers from './data/headers'
import jobOffers from './data/jobOffers'
import pictureCollection from './data/pictureCollection'
import retailOutlets from './data/retailOutlets'
import sales from './data/sales'
import pages from './data/pages'

export default generateSeeds([
  medias,
  translations,
  articles,
  brands,
  footers,
  headers,
  jobOffers,
  pictureCollection,
  retailOutlets,
  sales,
  pages,
])

Use mocks

import seeds from './seeds'

const mocks = seeds.getMocks()

// ...

Command to run mocks

smooth seed
gregberge commented 5 years ago
// Config method spec.
const createSeeds = ({ actions }) => {
  actions.createSeed({
    type: 'articles',
    createContents({ actions }) {
      const {
        createContent,
        createContentsFromFolder,
        createMediasFromFolder,
      } = actions
      createContent({ name: '...', data: {} })
      createContentsFromFolder({
        node: ({ glob }) => glob({ cwd: `${__dirname}/pages`, path: '*' }),
        webpack: () => require.context(`./pages`),
      })
      createMediasFromFolder({
        node: ({ glob }) => glob({ cwd: `${__dirname}/pages`, path: '*' }),
        webpack: () => require.context(`./pages`),
      })
    },
    onCreateBackendPayload({ content, payload, actions }) {
      const { createBackendPayload } = actions
      createBackendPayload(payload)
    },
    onCreateMock({ content, mock, actions }) {
      const { createMock } = actions
      createMock(mock)
    },
  })
}

// Simple application with one author and one article as seeds
const createSeeds = ({ actions: { createSeed } }) => {
  createSeed({
    type: 'authors',
    createContents({ actions: { createContent } }) {
      createContent({
        name: 'stefen',
        data: {
          firstName: 'Stefen',
          lastName: 'Alper',
        },
      })
    },
  })

  createSeed({
    type: 'articles',
    createContents({ seeds, actions: { createContent } }) {
      createContent({
        name: 'first-article',
        data: {
          author: seeds.authors.stefen,
          title: 'My first article',
          content: 'Text of my first article',
        },
      })
    },
  })
}

// Import mocks
import { getMock } from 'smooth/mocks'

const authors = getMock('authors')
salper commented 5 years ago
import { createOtherSeeds } from "./otherSeeds.js";

const createSeeds = ({ actions }) => {
  const {
    createContents,
    createMediaFromFolder,
    createContentsFromFolder
  } = actions

  createMediaFromFolder({
    onCreateBackendPayload({ content, payload, actions }) {
      const { createBackendPayload } = actions
      createBackendPayload(payload)
    },
    onCreateMock({ content, mock, actions }) {
      const { createMock } = actions
      createMock(mock)
    },
    node,
    webpack
  })

  createContentsFromFolder({ node, webpack })

  createContents({
    type: "articles",
    get({ actions: { createContent } }) {
      createContent({ name: "foo", data: {} })
    },
    onCreateBackendPayload({ content, payload, actions }) {
      const { createBackendPayload } = actions
      createBackendPayload(payload)
    },
    onCreateMock({ content, mock, actions }) {
      const { createMock } = actions
      createMock(mock)
    }
  })

  createOtherSeeds({ actions })
}