Starter publico de Flitware para que terceros construyan plugins externos con una base real de:
Cloudscapeflux-proxy- herencia de tema e idioma desde la aplicacion principal
- mocks locales con
CRUD,filter,sort,expandy paginacion - build productivo en un solo archivo
dist/index.html - host local de desarrollo con
iframe
El dominio de ejemplo de este starter es un sistema de gestion de tareas. La idea no es que publiques este plugin tal cual, sino que lo uses como punto de partida para tu propio plugin.
Este starter incluye una guia dedicada para agentes en:
AGENTS.md
Ese archivo resume:
- arquitectura
- runtime
flux-proxy- mocks
- reglas para editar sin romper el starter
- flujo recomendado de validacion
Este starter también incluye una guía de contribución en:
CONTRIBUTING.md
Úsala como referencia para:
- flujo de trabajo recomendado
- validaciones mínimas
- expectativas de calidad
- cambios sensibles en runtime, mocks o build
- Permitir desarrollo local sin depender de la app principal real.
- Simular colecciones estilo flitware para probar relaciones y
expand. - Mantener una arquitectura cercana a la que se ejecuta dentro de Flitware.
- Entregar un bundle productivo simple de publicar.
- Servir como referencia para plugins que usen colecciones internas o backends propios.
React 19TypeScriptCloudscapeflux-proxyesbuildlive-serverNode test runner
npm run dev
npm run build:dev
npm run build
npm test
npm run test:coverageQue hace cada script:
npm run dev: recompila en watch mode y levanta el host local enhttp://localhost:5500.npm run build:dev: genera el entorno de desarrollo dentro de.dev.npm run build: genera el artefacto productivo unico endist/index.html.npm test: ejecuta la suite unitaria.npm run test:coverage: ejecuta la suite con cobertura.
npm installnpm run devAbre:
http://localhost:5500npm run buildResultado:
dist/index.htmlEl modo desarrollo crea dos capas:
- un
host local - el
plugin realrenderizado dentro de uniframe
El host emula lo esencial de Flitware:
window.__PLUGIN_CONFIG__- sincronizacion de
theme - sincronizacion de
language pluginVersion- puente
flux-proxy - mocks persistidos en
localStorage
flowchart LR
A[Developer Browser] --> B[Dev Host .dev/index.html]
B --> C[iframe plugin-frame.html]
C --> D[React Plugin]
B <--> E[flux-proxy Parent Bridge]
D <--> F[flux-proxy Child Client]
E <--> G[Mock Database]
G <--> H[localStorage]
sequenceDiagram
participant Dev as Developer
participant Host as Dev Host
participant Frame as iframe
participant Plugin as Plugin Runtime
participant Mock as Mock Engine
Dev->>Host: Abre localhost:5500
Host->>Frame: Carga plugin-frame.html
Host->>Frame: Inyecta __PLUGIN_DEV_CONFIG__
Frame->>Plugin: Boot de React
Plugin->>Plugin: Lee __PLUGIN_CONFIG__
Plugin->>Plugin: Aplica theme, idioma y tokens Cloudscape
Plugin->>Host: Solicitudes flux-proxy
Host->>Mock: CRUD / filter / sort / expand
Mock-->>Host: Respuesta mock
Host-->>Plugin: Respuesta flux-proxy
sequenceDiagram
participant Host as Dev Host
participant Plugin as Plugin Runtime
Host->>Plugin: postMessage flitware:runtime-sync
Note over Host,Plugin: theme, language, cloudscapeTheme
Plugin->>Plugin: applyMode/applyDensity
Plugin->>Plugin: applyTheme de Cloudscape
Plugin->>Plugin: actualiza clases awsui-light-mode/awsui-dark-mode
app/
api/
plugin-client.ts
components/
plugin-date-field.tsx
relation-autosuggest.tsx
resource-table.tsx
runtime/
plugin-runtime.tsx
screens/
task-dashboard.tsx
utils/
date.ts
filter.ts
use-debounced-value.ts
dev/
flitware-theme.ts
host.ts
mock-engine.ts
task-dev-data.ts
scripts/
run-tests.mjs
tests/
*.test.ts
build.js
dev-build.js
watch.js
plugin.config.jsonResponsabilidades principales:
app/api/plugin-client.ts: cliente del plugin para hablar con el host usandoflux-proxy.app/runtime/plugin-runtime.tsx: lee configuracion inicial, escucha sync porpostMessagey aplica el tema.app/screens/task-dashboard.tsx: ejemplo real de UI productiva usando tabla, filtros, wizard y relaciones.dev/host.ts: host local que emula la app principal.dev/mock-engine.ts: motor mock con soporte de consultas y relaciones.dev/task-dev-data.ts: dataset y adaptadores mock del dominio de tareas.build.js: build de produccion en un solo archivo.dev-build.js: build del entorno local.
Colecciones mock incluidas:
idcreatedupdatednamedescription
idcreatedupdatednameusernameemailphone
idcreatedupdatedtitledescriptionstart_dateend_datestatus-> relacion contask_statusassignee-> relacion conusers
El mock engine vive en dev/mock-engine.ts y soporta:
getListgetByIdcreateupdatedeleteresetfiltersortexpand- paginacion
- persistencia en
localStorage
- operadores
=,!=,~ - combinadores
&&,|| - parentesis
- filtros sobre relaciones
expandanidado comogroup.memberssortmultiple como-created,title
Ejemplos:
status = "task_status_done"
assignee.username ~ "juan" || assignee.username ~ "JUAN"
(status != "task_status_done") && (assignee.email ~ "flitware")
expand=status,assignee
sort=-created,titleLos mocks se persisten en localStorage usando una storageKey del proyecto. Esto permite:
- recargar la pagina sin perder cambios mock
- probar
create,editydelete - resetear el estado con el boton
Reset mocksdel host
El plugin no habla directamente con flitware ni con la app host. Habla con flux-proxy, y el host responde.
flowchart LR
A[Plugin UI] --> B[usePluginApi]
B --> C[FluxProxy.childClient]
C --> D[postMessage]
D --> E[FluxProxy.parentClient]
E --> F[Data source]
F --> G[Mock engine o backend real]
app/api/plugin-client.ts expone helpers como:
listgetOnecreateupdate
Todos envian mensajes a traves de FluxProxy.childClient.
dev/host.ts recibe los mensajes con FluxProxy.parentClient y los resuelve usando:
createTaskMockEnvironment()resolvePluginProxyMessage(...)
- lista paginada
- lectura por
id
createupdatedelete
Este starter ya viene listo para heredar configuracion visual desde Flitware.
window.__PLUGIN_CONFIG__ = {
theme: "light" | "dark",
language: "es" | "en",
cloudscapeTheme: Theme,
fluxProxy: {
targetOrigin: string
},
plugin: {
installedPluginId: string,
pluginId: string,
version: string
}
}app/runtime/plugin-runtime.tsx:
- lee
window.__PLUGIN_CONFIG__ - aplica
applyMode - aplica
applyDensity - aplica el tema de Cloudscape con
applyTheme - sincroniza clases
awsui-light-modeyawsui-dark-mode - escucha
flitware:runtime-sync
Esto permite que el plugin se vea coherente tanto en:
- desarrollo local
- iframe dentro de Flitware
El dashboard de ejemplo ya demuestra un plugin de nivel productivo:
- tarjetas KPI
- tabla paginada
- acciones por icono
- filtros por estado y usuario
- busqueda
- wizard para crear y editar
DatePicker- autosuggest remoto para relaciones
- review final del formulario
La meta es que puedas tomar esta pantalla, cambiar el dominio y conservar la infraestructura.
build.js genera un solo archivo:
dist/index.htmlEse archivo ya contiene:
- HTML
- CSS inline
- JavaScript inline
Ademas:
- preserva comentarios legales requeridos por Cloudscape
- embebe assets necesarios
- evita multiples archivos para despliegue
dev-build.js genera:
.dev/index.html.dev/plugin-frame.html.dev/assets/plugin.js.dev/assets/plugin.css.dev/assets/host.js
El watch.js recompila y solo arranca el servidor la primera vez.
La suite cubre:
- utilidades de fechas
- utilidades de filtros
- motor mock
- adaptador de datos mock
- contrato de mensajes del bridge
Archivos relevantes:
tests/date.test.tstests/filter.test.tstests/mock-engine.test.tstests/task-dev-data.test.ts
- Cambia el dataset mock en
dev/task-dev-data.ts. - Cambia la UI principal en
app/screens/task-dashboard.tsx. - Reutiliza
usePluginApi()para hablar con el host real. - Mantén relaciones,
expand, filtros y paginacion compatibles con tu backend.
Tienes dos opciones:
- dejar
flux-proxypara que el host siga siendo intermediario - reemplazar
usePluginApi()por tu propio cliente HTTP
Si eliges backend propio, intenta conservar:
PluginRuntimeProvider- integracion de tema
- estructura de
ResourceTable - host local para demos y QA
- Copia este starter a un directorio nuevo.
- Renombra
plugin.config.json. - Sustituye las colecciones mock por las de tu dominio.
- Reemplaza
task-dashboard.tsxpor tu pantalla principal. - Ajusta tests para tu dominio.
- Valida
npm run dev,npm run buildynpm test.
En Flitware el host real:
- carga tu
index.html - inyecta
window.__PLUGIN_CONFIG__ - expone el bridge de
flux-proxy - sincroniza
theme,languageypluginVersion
Por eso es importante que este starter conserve:
- contrato de runtime
- contrato de
flux-proxy - compatibilidad con Cloudscape
app/api/plugin-client.tsfuerzarequestKey: nullpara evitar la auto-cancelacion de flitware durante filtros y busquedas concurrentes..plugin-depsse usa como cache local de dependencias de Cloudscape para builds estables del starter.- El host local esta pensado para desarrollo, no para produccion.
npm run devfuncionanpm run buildgeneradist/index.htmlnpm testpasa- el plugin funciona en light y dark mode
- las traducciones basicas estan resueltas
- los mocks representan tu dominio real
- la comunicacion con el host esta validada
MIT


