@compossibru/compossibru v1.1.1
@compossibru/compossibru
compossibru helps you to build a composite UI easily.
How does it work?
compossibru is a wrapper around next.js.
How to install and configure?
Install it:
npm install @compossibru/compossibruAdd widgets:
npm install @compossibru/widget-twitter-widgetsAdd scripts in your package.json:
{
"scripts": {
"start": "npx compossibru start",
"build": "npx compossibru build"
}
}Add configuration to your .compossibrurc file:
Version: 1
Routes:
Home:
Route: /
Layout: layouts/main.ejs
Containers:
left:
- "@compossibru/widget-twitter-widgets":
type: Timeline
options:
dataSource:
sourceType: profile
screenName: npmjs
options:
username: npmjs
height: 400
middle:
- "@compossibru/widget-twitter-widgets":
type: Timeline
options:
dataSource:
sourceType: profile
screenName: github
options:
username: github
height: 400
right:
- "@compossibru/widget-twitter-widgets":
type: Timeline
options:
dataSource:
sourceType: profile
screenName: internetofshit
options:
username: internetofshit
height: 400Add custom layouts to your layouts folder (e.g. main.ejs):
<div>
<div>
<%- left %>
</div>
<div>
<%- middle %>
</div>
<div>
<%- right %>
</div>
</div>The final project structure looks as following:
.
├── layouts
│ ├── main.ejs
├── .compossibrurc
├── package.jsonCongrats. You are done. compossibru is configured!
To start:
npm startEnter http://localhost:3000
How to write a widget?
A widget can be written with different libraries (e.g. React, Vue, jQuery, etc.).
Important here is that the entrypoint needs to be a function where widgetId and widgetContext is passed to.
See the following example implementations using different libraries:
Example: React
import React from 'react';
import ReactDOM from 'react-dom';
export default (widgetId, widgetContext) => {
ReactDOM.render(
<div>{JSON.stringify(widgetContext)}</div>,
document.getElementById(widgetId)
);
}Example: Vue
import Vue from 'vue';
export default (widgetId, widgetContext) => {
new Vue({
render: h => h('div', JSON.stringify(widgetContext))
}).$mount(`#${widgetId}`)
};Example: jQuery
import $ from 'jquery';
export default (widgetId, widgetContext) => {
$(document).ready(() => {
$(`#${widgetId}`).html(`<div>${JSON.stringify(widgetContext)}</div>`);
});
};What is a widget context?
Beside the basic widget configuration (which widget should be used in which container), it is possible to pass extended configurations to each widget and that's called widget context.
See the following example configurations and the corresponding widget context:
Configuration
[...]
Containers:
main:
- my-awesome-widget
- my-second-awesome-widget:
someKey: someValue
- my-third-awesome-widget:
someObjectKey:
someArrayKey:
- someArrayElement1
- someArrayElement2Widget context for my-awesome-widget
{}Widget context for my-second-awesome-widget
{
"someKey": "someValue"
}Widget context for my-third-awesome-widget
{
"someObjectKey": {
"someArrayKey": [
"someArrayElement1",
"someArrayElement2"
]
}
}Which features are still left?
- create CI/CD (possibly GitHub Actions)
- create
initCLI command to auto-generate configuration - improve path handling in
bin/cli.js - change configuration to be case insensitive
- add pub/sub support
- add plugin support
- add
i18nplugin - add
authplugin - add
loggerplugin