Javascript - Crear código dinámico exportable

Hola, cualquier ayuda o enlace a preguntas similares es muy apreciada, ya que he investigado un poco, pero no estoy seguro de cuál es el camino más correcto aquí.

Realmente no sé cómo explicar exactamente lo que quiero, así que dibujé esta imagen que podría ayudar a explicar un poco:

ingrese la descripción de la imagen aquí

Actualmente tengo todo escrito en 1 archivo y me gustaría hacerlo más modular para que otros puedan codificar sus propias 'estrategias' usando objetos del sistema, etc.

El objetivo principal aquí es que puedo cambiar todo el código del sistema en un solo lugar porque tengo muchas estrategias y si quiero actualizar el código del sistema para agregar más resultados, etc. necesito cambiarlo en muchos archivos.

Una buena comparación que puedo ver con esto es el testcafe del módulo npm. Una vez descargado, cómo lo usa en su código es similar:

import testcafe

test(testName, => { all the code you want to run is here and you have many 
objects and functions provided from testcafe you can use})

Supongo que para lograr esto, tal vez necesito clases globales, tal vez una clase llamada estrategia y dentro de ella están todos los objetos, funciones, bucle for, resultados de registro, etc.

Cosas que me preocupan:

  1. cómo integrar los globales definidos por el usuario en la estrategia
  2. cómo hacer que cuando el usuario escriba allí IDE no obtenga errores rojos para los globales que definieron y las funciones y objetos que existen fuera del código del sistema.

Todo esto es de un nivel bastante alto, no estoy buscando el código exacto para escribir para resolverlo todo (por supuesto, sería bueno :)) sino más bien buscando sugerencias, ideas y caminos que debería investigar. ¡Cualquier ayuda es muy apreciada!

Answer

No exporte algo del archivo de usuario que el archivo del sistema importaría. Haga uso de la inversión de dependencia y solo haga que el código de usuario dependa del código del sistema. Dado que el código de usuario es el punto de entrada de la aplicación, eso es fácil.

En el archivo de código del sistema, exporte una función que tome la estrategia como parámetro y ejecute el ciclo principal. No es necesario "importar" nada.

// system.js
import … from 'environment';

/* declarations */
export function utility() { … }

/* the loop */
export function run(strategy) {
  let … // more declarations
  for (…) {
    …
    step = strategy(newValues)
    …
  }
  console.log(results);
}
// userFile.js
import { utility, run } from 'system';

let … // globals
run((…) => {
  … // use globals, loop arguments and imported utilities
});