@onereach/content-builder

Convert data model between different channels (Slack, Microsoft Teams...)

Usage no npm install needed!

<script type="module">
  import onereachContentBuilder from 'https://cdn.skypack.dev/@onereach/content-builder';
</script>

README

🤖 This Transformer between differend data model channels

✅ Developing:

  • Slack
  • Microsoft Teams
  • Default (schema for content builder)

👉 Future channels: ...

How to use

npm i

Sample of code in ./user-test.js If you use ./user-test.js than just run:

npm run dev

Or, create local file and require from ./index.js next functions

import {
  transformSlackToMicrosoftTeams,
  transformMicrosoftTeamsToSlack
} from './index';

After that import json data. Fot example, slack model

const slackToMsTeamsData = require('./slack->msTeams.json');

And transform Slack model to Microsoft team:

const microsoftTeamsModel = transformSlackToMicrosoftTeams({ data: slackToMsTeamsData });
console.log(JSON.stringify(microsoftTeamsModel))

How to test

We use unit testing based on cases. Create new case, just run script, before run command look up in derictory ./test/cases and enter NUMBER_OF_CASE next after existing (change NUMBER_OF_CASE to Number of case)

sh scripts/createCase.sh NUMBER_OF_CASE

Than open ./test/cases/NUMBER_OF_CASE and add original data model to from.json file open ./test/cases/NUMBER_OF_CASE and add expected data model to to.json file

npm run test

How it works

Sample: Microsoft Teams and Slack

  • Microsoft Teams Adaptive Cards data model 👉 transform to default data model 👉 transform from default data model to Slack Block kit data model
  • Slack Block kit data model 👉 transform to default data model 👉 transform from default data model to Microsoft Teams Adaptive Cards data model

Structure

...



Default schema:

{
  itmes: [
    {
      itemType: type, // type of block or element
      children: [],  // array of atributes, children, items,
      attributes: {} // additional data (title, styles and so on),
      value: // anu value data
    }
  ]
}

Default types:

  • section
  itemType: 'section',
  children,
  attributes: {
    position // could be left of undefined
  }
  • text
{
  itemType: 'text',
  textType: type, // could be mrkdown, markdown, plain_text
  text
}
  • image
{
  itemType: 'image',
  url: image_url,
  alt: alt_text,
  attributes: {
    title,
    position // could be left of undefined
  }
}
  • divider
{
  itemType: 'divider'
}
  • actions
{
  itemType: 'actions',
  children
}
  • button
{
  itemType: 'button',
  value,
  url,
  text,
  attributes: {
    text,
    style     // color styling default, blue, red, green
  }
}
  • columnSet
{ 
  itemType: 'columnset',
  columnLength:  0, 
  children: [
    {
      numberOfColumn: Number // have to be cleared
    }
  ]
}
  • select
{ 
  itemType: 'select',
  id,
  placeholder: { type: 'plain_text', text: 'Select a date', emoji: true } || 'Just a string',
  options: [
    {
      label: item.text,
      value: item.value
    };
  ],
  isMultiSelect: false,
  attributes: {
    position
  }
}
  • datepicker
{
  itemType: 'datepicker',
  placeholder: { type: 'plain_text', text: 'Select a date', emoji: true } || 'Just a string',
  value: '1990-04-28',
  id: '123',
  attributes: { position: 'left' }
}
  • input
{
  itemType: 'input',
  input: {
    placeholder,
    isMultiline
  },
  label: text or text object
}
  • Error dev extra types:
{
  itemType: 'error',
  message: `Method for ${type} not found`
}