Librería JavaScript modular, encadenable y extensible para soluciones de alto rendimiento
DOM, eventos, AJAX, WebSockets, WebWorkers, rutas, componentes, ámbitos, extensiones y más
General.JS v2 es una librería JavaScript ligera, modular y sin dependencias externas. Refactorizada con el patrón Module Revealed, permite encadenamiento fluido, extensión dinámica, integración con Web Components y control total sobre el DOM, eventos, rutas, ámbitos y comunicación asincrónica.
-
🔧 Encapsulación segura con patrón Module Revealed
Lógica privada protegida, API pública revelada con control total. -
🔗 Encadenamiento fluido de métodos
Todos los métodos devuelvengenrlpara composición elegante:
genrl.log().setScope().ready() -
🧩 Ámbitos dinámicos con
setScope(nombre)ycreateScope()
Define entornos de aplicación únicos por instancia. -
🧠 Sistema de extensión modular con
fn.extend({...})
Permite registrar múltiples módulos (comocripto,ajaxapi,gdom) en una sola llamada. -
🧬 Integración profunda con
gdom(selector)
Acceso fluido a métodos DOM comoaddClass,removeClass,on,attr,html,appendTo, etc. -
🧱 Compatibilidad con CommonJS y entorno navegador
Exportación dual conmodule.exportsywindow.genrlpara uso universal. -
🧠 Alias global
gparagdom
Disponible comowindow.g(selector)para manipulación directa del DOM. -
🔐 Ejecución segura con
safeEval(fn)
Captura errores silenciosamente sin romper el flujo. -
🕒 Tiempos precisos con
now(),nowFloat(),timestamp()
Ideal para medición de rendimiento y trazabilidad. -
📦 Registro dinámico de Web Components
Soporte para plantillas externas,mount,unmount,setDefaults, yloadAll. -
🧠 Utilitarios robustos
Incluyeuuid(),sanitize,validate.email/url,base64_encode/decode,utf8_encode/decode,parseHTML,parseJSON,stringifyJSON. -
🔍 Observación reactiva con
watch(obj, path, callback)
Define propiedades reactivas y dispara eventos ante cambios profundos. -
🧪 Depuración integrada con
log,warn,info,error
Registro interno (_logStore) accesible para trazabilidad. -
🧩 Extensión de prototipos con
genrl.__proto__
Métodos comowatch_,unwatch_,ajax,isReady,getelem,getelems,empty.
| 🧩 Función | 📘 Descripción |
|---|---|
| Module Revealed | Encapsula funciones privadas y expone solo lo necesario. |
| Encadenamiento fluido | Todos los métodos retornan this o el módulo para llamadas encadenadas. |
| setScope(nombre) | Define el ámbito activo en el DOM (data-scope). |
| createScope() | Inicializa atributos id, name, data-scope, data-gapp en <html>. |
| safeEval(fn) | Ejecuta funciones de forma segura (sin eval() inseguro). |
| now() | Devuelve tiempo de ejecución como entero positivo. |
| uuid() / timestamp() | Genera identificadores únicos y marcas de tiempo ISO. |
| validate / sanitize | Validación de email, URL y sanitización de HTML, texto y JSON. |
| logEvent(), getLog(), clearLog() | Registro interno de eventos para depuración. |
| 🧩 Función | 📘 Descripción |
|---|---|
| register(tag, class) | Registra un Web Component personalizado. |
| addcomponent(tag, url, cb, opts) | Carga plantilla externa y la asocia al componente. |
| loadAll(manifest) | Carga múltiples componentes desde un manifiesto. |
| mount(tag, selector) | Inserta el componente en el DOM. |
| unmount(tag) | Elimina instancias del componente del DOM. |
| setDefaults(opts) | Define estilos y atributos comunes para todos los componentes. |
| isRegistered(tag) | Verifica si un componente ya fue registrado. |
| 🧩 Función | 📘 Descripción |
|---|---|
| get(url) | Realiza una petición GET. |
| getJSON(url) | Realiza una petición GET y parsea JSON. |
| post(url, data) | Envía datos por POST. |
| upload(url, FormData) | Sube archivos mediante POST asincrónico. |
| load(url) | Carga contenido externo en el DOM. |
| 🧩 Función | 📘 Descripción |
|---|---|
| setData(key, value) | Asocia un valor a un elemento DOM. |
| getData(key) | Recupera el valor asociado. |
| rmData(key) | Elimina el valor asociado. |
| bind(selector, model) | Enlaza datos a elementos DOM dinámicamente. |
| 🧩 Función | 📘 Descripción |
|---|---|
| animate(type, duration, cb) | Aplica animaciones con duración y callback. |
| smooth(target, opts) | Realiza scroll suave hacia un objetivo. |
| setAnimationDuration(el, speed) | Establece duración de animación con prefijo de navegador. |
| 🧩 Función | 📘 Descripción |
|---|---|
| base64_encode(str) | Codifica en base64. |
| base64_decode(str) | Decodifica base64. |
| utf8_encode(str) | Codifica UTF-8. |
| utf8_decode(str) | Decodifica UTF-8. |
| 🧩 Función | 📘 Descripción |
|---|---|
| connect(url) | Establece conexión WebSocket. |
| send(data) | Envía datos por WebSocket. |
| onMessage(cb) | Escucha mensajes entrantes. |
| 🧩 Función | 📘 Descripción |
|---|---|
| createWorker(script) | Crea un Web Worker. |
| postMessage(data) | Envía datos al worker. |
| onMessage(cb) | Escucha respuesta del worker. |
|
| 🧩 Función | 📘 Descripción |
|---|---|
| map(route).to(fn) | Asocia una ruta hash a una función. |
| listen() | Activa el sistema de rutas y escucha cambios. |
| navigate(url) | Navega programáticamente a una ruta. |
| getCurrent() | Obtiene la ruta actual. |
genrl.setScope("pedagogico");
genrl.safeEval(() => console.log("Ejecutando código seguro"));
genrl.now(); // → número entero positivo
genrl.extend("saludar", () => console.log("¡Hola Arturo!")).saludar();| 🧩 Método de extensión | 📘 Descripción |
|---|---|
genrl.extend(nombre, fn) |
Agrega una función pública directamente al objeto genrl. |
genrl.fn.extend(nombre, fn) |
Agrega una función privada o interna que puede ser invocada desde genrl.fn. |
g(selector).extend(nombre, fn) |
Agrega una función personalizada a un selector DOM específico. |
genrl.extend("saludar", function(nombre){
console.log("¡Hola " + nombre + "!");
return this;
});genrl.fn.extend("multiplicar", function(a, b){
return a * b;
});
// Invocación
let resultado = genrl.fn("multiplicar")(3, 4); // → 12g("#miBoton").extend("activar", function(){
this.addClass("activo");
console.log("Botón activado");
});
// Invocación
g("#miBoton").activar();| ✅ Ventaja | 📘 Descripción |
|---|---|
| Encadenamiento fluido | Las funciones extendidas pueden encadenarse con otras llamadas (genrl.fn1().fn2()). |
| Modularidad | Puedes agregar funciones específicas sin alterar el núcleo original. |
| Separación público/privado | genrl.extend() para funciones públicas, genrl.fn.extend() para internas. |
| Adaptación contextual | g(selector).extend() permite extender elementos DOM individualmente. |
| Seguridad | Las extensiones respetan el patrón Module Revealed y no exponen variables internas. |
| Reusabilidad | Las funciones extendidas pueden reutilizarse en múltiples contextos del sistema. |
| Integración pedagógica | Permite crear funciones adaptadas a fichas, sliders, rutas y ámbitos educativos. |
| Método | Descripción |
|---|---|
.extend(name, fn) |
Añade métodos directamente al núcleo de General. |
.use(plugin, options) |
Registra e inicializa un plugin externo con configuración opcional. |
.plugins() |
Devuelve un array con los nombres de los plugins registrados. |
| ✅ Ventaja | 📘 Descripción |
|---|---|
| Modularidad total | Permite agregar funcionalidades sin alterar el núcleo de General. |
| Registro seguro | Evita duplicaciones y colisiones mediante control de nombres únicos. |
| Inicialización flexible | Cada plugin puede recibir opciones personalizadas al momento de registrarse. |
| Encadenamiento fluido | Los métodos añadidos por plugins se integran al flujo encadenable de gdom. |
| Compatibilidad transversal | Los plugins pueden interactuar con animate, bind, routing, reactive. |
| Trazabilidad clara | .plugins() devuelve los nombres de todos los plugins activos. |
| Ideal para entornos pedagógicos | Permite crear extensiones visuales, estructurales y educativas. |
| Listo para producción | Soporta plugins visuales, de seguridad, AJAX, formularios y más. |
|
function shakePlugin(General, opts) {
General.shake = function (el, duration = 300) {
el.style.transform = 'translateX(0)';
animate.animate(-10, 10, duration / 2, 'easeOutQuad', val => {
el.style.transform = `translateX(${val}px)`;
}, () => {
animate.animate(10, 0, duration / 2, 'easeInQuad', val => {
el.style.transform = `translateX(${val}px)`;
});
});
};
}
genrl.use(shakePlugin);
genrl.shake(document.querySelector("#boton"), 400);npm i gnrl.jsgenrl.run(() => {
genrl
.createScope()
.setScope("editorial")
.theme("claro")
.log("Ámbito y tema establecidos");
});components
.setDefaults({
styles: `.ficha { border-left: 4px solid #c25; padding: 1em; }`,
attributes: { "data-tipo": "editorial" }
})
.loadAll([
{
tag: "mi-ficha",
templateURL: "ficha.html",
callback: (tpl) => {
const el = document.createElement("mi-ficha");
el.appendChild(tpl.content.cloneNode(true));
document.body.appendChild(el);
}
}
])
.mount("mi-ficha", "#contenedor")
.unmount("mi-ficha");components
.register("mi-ficha", class extends HTMLElement {
connectedCallback() {
// El contenido se insertará desde ficha.html
}
})
.addcomponent("mi-ficha", "ficha.html", (template) => {
const instance = document.createElement("mi-ficha");
instance.appendChild(template.content.cloneNode(true));
document.querySelector("#contenedor").appendChild(instance);
});genrl.run(() => {
components
.register("contador-js", class extends HTMLElement {
constructor() {
super();
this.valor = 0;
this.attachShadow({ mode: "open" });
}
connectedCallback() {
components.addcomponent("contador-js", "contador.html", (template) => {
this.shadowRoot.appendChild(template.content.cloneNode(true));
this.input = this.shadowRoot.getElementById("valor");
this.btnInc = this.shadowRoot.getElementById("incrementar");
this.btnDec = this.shadowRoot.getElementById("decrementar");
this.btnInc.onclick = () => this.incrementar();
this.btnDec.onclick = () => this.decrementar();
this.actualizar();
});
}
incrementar() {
this.valor++;
this.actualizar();
}
decrementar() {
this.valor--;
this.actualizar();
}
actualizar() {
this.input.value = this.valor;
}
});
});<contador-js></contador-js>