Configuración

Los archivos de configuración de meme.js, no son solo la herramienta que tenemos para customizar el comportamiento del compilador. También son una forma genial para poder darle grandes características a nuestro proyecto, estableciendo diferentes entornos, automatizando procesos, configurando mono repositorios, etc.

Los archivos meme.conf adoptan un enfoque Configuración en Cascada, donde las propiedades definidas en un archivo pueden ser sobreescritas o complementadas por otras configuraciones, permitiendo así un control granular y una fácil adaptación a distintos escenarios.

A continuación explicaré en detalle la estructura, propiedades y capacidades de los archivos de configuración de meme.js, brindando ejemplos y explicaciones prácticas para garantizar una implementación efectiva y ordenada en cualquier tipo de proyecto.

Nombre

Los archivos de configuración de meme.js, tienen la capacidad de cargarse en cascada por lo que es posible que tengamos varios archivos de configuración en nuestro proyecto, para mantener organizada toda la configuración.

Los archivos de configuración tienen que tener la extensión .meme.conf, salvo el archivo de configuración base que tendrá el nombre meme.conf, por ejemplo, algunos nombres válidos para archivos de configuración, son:

  • meme.conf, archivo de configuración base.
  • secure.meme.conf, archivo que podríamos usar para guardar las llaves y tokens que usaremos en nuestro proyecto.
  • production.meme.conf, podríamos usar este archivo para guardar nuestra configuración exclusiva para nuestro entorno de producción.

Formato

Los archivos de configuración, se escriben como un módulo de node.js, en el lenguaje JavaScript, por razones de arquitectura y diseño, se conserva el uso de CommonJS (debido a que los ES Modules aún no cubren por completo todas las funcionalidades de CommonJS). Y como cualquier modulo JS, puede contener cualquier código, funciones, etc. Siempre y cuando se exporte por defecto un objeto, el cual contendrá la configuración del proyecto, por ejemplo:
exports.module = {}

Lectura

Primero establezcamos que meme.js es un SDK independiente y flexible, tanto asi que funciona sin necesidad de ningún archivo. Sin embargo cuando meme.js no encuentre un archivo base de configuración, sólo leerá los archivos que se encuentren en la raíz. Si queremos que meme.js lea el proyecto con recursividad, tendremos que colocar un archivo base de configuración en la raíz. Por ejemplo, si tenemos el siguiente sistema de archivos:

Proyecto de ejemplo

folder

archivo_1.mh

archivo_2.mh

archivo_3.mh

archivo_4.mh

Como el compilador no encuentra un archivo de configuración base, solo leera y transpilara los archivos en la raíz en donde se ejecute (o dependiendo si le proporcionamos el parámetro -d), es decir, solo considerara archivo_3 y archivo_4, ignorando archivo_1 y archivo_2.

Si ahora agregamos un archivo de configuración base de la siguiente forma:

Proyecto de ejemplo

folder

archivo_1.mh

archivo_2.mh

archivo_3.mh

archivo_4.mh

meme.conf

Como el compilador encuentra un archivo base, ahora leerá nuestro directorio según las indicaciones en el archivo de configuración, por lo que en un principio y a menos que indiquemos lo contrario, leerá todo el directorio con recursividad. Es decir que en este caso el compilador leerá todos los archivos sin importar si están dentro de un directorio o no.

Cascada

Nuestro proyecto puede tener uno o más archivos de configuración y el compilador los lee en forma de cascada (algo similar a los estilos CSS), con lo cual un archivo puede reemplazar una o más propiedades de la configuración según se lo indiquemos al CLI. De esta forma obtenemos una innovadora y muy potente forma de configurar y mantener nuestros proyectos.

Jerarquía de reemplazo

Puede haber uno o muchos archivos de configuración en un proyecto, por ejemplo: Podemos poner la configuración base en un archivo versionado en git, y tener otro archivo de configuración, que contenga claves o tokens que no queremos versionar.

En este caso, el compilador establecerá en un inicio la configuración base con el archivo versionado, y posteriormente reemplazaría algunas de las propiedades de la configuración, con el archivo no versionado, que contiene los secretos.

De este modo, podremos ver como funciona la cascada, teniendo una configuración inicial y posteriormente, se van sobre escribiendo algunas de sus propiedades con otras, según haya más archivos o se ejecuten diferentes entornos.

En todo caso, el compilador presenta la siguiente jerarquía de reemplazo:

  1. Inicialmente se establecen las opciones por defecto del compilador.
  2. El próximo en reemplazar algunas o todas las propiedades de la configuración, es el archivo de configuración base que se llama meme.conf, y se encuentra alojado en la raíz de nuestro proyecto.
  3. El próximo en reemplazar la configuración, son los archivos adyacentes, por ejemplo: secret.meme.conf, build.meme.conf, etc.meme.conf. Puede haber tantos de estos archivos como se necesiten. Se ordenarán de forma alfabética y reemplazan la configuración uno de tras de otro.
  4. El próximo reemplazo, se hace con los archivos de configuración en directorios superiores (si los hay), hasta llegar al archivo que cuente con la propiedad root en true o en caso de que ya no existan archivos de configuración en directorios superiores.
  5. Los últimos en reemplazar la configuración son los entornos que se usen, según le indiquemos al CLI, mediante el parámetro -e.

Entornos

Los entornos, son secciones en los archivos de configuración, que reemplazan propiedades de la configuración, cuando se indica con el parámetro -e.

Un entorno se identifica por tener como clave de objeto un nombre entre corchetes (y como ya sabemos, por tener caracteres especiales en la clave de un objeto, esta se escribe entre comillas), y como valor tiene las propiedades que se reemplazaran.

Este nombre no debe de tener espacios y te aconsejo que no contengan caracteres especiales, para facilitar su escritura en la línea de comandos, por que este nombre será el que se escriba en la línea de comandos después del parámetro -e, por ejemplo:

module.exports = {
	app: {
		port: 8080
	},
	constants: {
		mi_variable: 'valor 1',
	},

	"[mi_entorno]": {
		app: {
			port: 80
		},
		constants: {
			mi_variable: 'otro valor'
		}
	}
};

En este ejemplo, podemos ver que tenemos una definición de puerto 8080 y una variable de entorno llamada: mi_variable que tendrá el valor de: valor 1, durante una ejecución normal.

Igualmente podemos ver en el archivo de configuración como se declara el entorno llamado: mi_entorno y que en dicho entorno, el puerto se definirá como 80 y el valor de mi_variable será otro valor.

De manera que cuando se inicie el proyecto con el comando
me -s
, el puerto será 8080 y mi_variable tendrá el valor de valor 1. Pero por el contrario, si el proyecto se inicia con el comando
me -s -e mi_entorno
, el puerto será 80 y mi_variable tendrá el valor de otro valor.

Con este ejemplo, podemos ver cómo reemplazar valores de la configuración. Porque no solo se pueden reemplazar variables de entorno, se pueden reemplazar tantas propiedades de la configuración como necesitemos, con el número de archivos y entornos que sean necesarios. Y esto es lo que meme.js establece como configuración en cascada.

Propiedades

Como podemos ver, la manipulación que podemos hacer del objeto de configuración (el cual se exportará), nos otorga mucha flexibilidad y potencia a la hora de establecer las propiedades y la forma en la que trabajará el compilador de meme.js.

A continuación, te describiré cada una de las propiedades que el compilador tiene mapeadas, junto con sus tipos, límites y los efectos que tienen sobre el compilador.

Propiedad name

  • Tipo: String
  • Límites: Solo se permite números, letras y los caracteres - y _.
  • Descripción: Nombre del proyecto, identifica al proyecto en la plataforma y el compilador, se pueden generar archivos a partir de este nombre.

Propiedad type

  • Tipo: String
  • Límites: Solo se permiten letras.
  • Descripción: Esta propiedad, sirve para crear la plantilla y aunque de momento, está por definirse, tendrá comportamientos especiales en el compilador, por ejemplo: Si se elige el tipo sitio, el compilador hará pre render por defecto (a menos que se indique lo contrario con otras propiedades).

Propiedad author

  • Tipo: String
  • Límites: (no hay límite alguno).
  • Descripción: (no tiene efecto alguno en el compilador).

Propiedad version

  • Tipo: String
  • Límites: Solo se permite números, letras y caracteres . y -.
  • Descripción: Indica la versión general del proyecto, y esta versión se refleja en la plataforma y de igual manera servirá para el consumo en nuestro proyecto si se requiere.

Propiedad description

  • Tipo: String
  • Límites: (no hay límite alguno).
  • Descripción: (no tiene efecto alguno en el compilador).

Propiedad render

Esta propiedad es un objeto que contendrá otras propiedades inherentes a la forma de renderizado de nuestro proyecto.

Propiedad css_auto_unit

  • Tipo: String
  • Límites: (no hay límite alguno).
  • Por defecto: px
  • Descripción: Tipo de reemplazo de unidad por defecto. Debido a que el lenguaje memeCSS, tiene la posibilidad de poner unidades por defecto en las propiedades numéricas, esta propiedad indica la unidad automática que tendrán estas propiedades, por ejemplo, cuando escribamos algún estilo cómo:
    width: 123
    , Si esta propiedad está establecida en px, el resultado de la compilación será:
    width: 123px;
    , Si esta propiedad está establecida en auto-viewport-width (de momento el único valor especial), el resultado de la compilación será:
    width: calc( ( 1234 * 100vw ) / var(--xs) );
    , Lo cual nos apoyara al maquetado exacto de nuestro proyecto.

Propiedad pre_render

  • Tipo: Boolean
  • Límites: Solo se permite valores Truthy o Falsy, por ejemplo true o false.
  • Por defecto: false
  • Descripción: Esta propiedad indica de forma general si los archivos memeHTML (*.mh), se renderizaran después de la compilación, entregando archivos HTML con todo el contenido necesario para una carga acelerada y por este metodo lograr una gran optimización seo y de accesibilidad.

Propiedad log

Esta propiedad es un objeto que contiene las propiedades que le indican al compilador si mostrará todas las líneas de log a detalle o las omitirá para ahorrar en rendimiento y espacio de almacenamiento.

Propiedad request

  • Tipo: Boolean
  • Límites: Solo se permite valores Truthy o Falsy, por ejemplo true o false.
  • Por defecto: false
  • Descripción: Activa el pintado de una línea en el log, en cada petición que se realice al servidor.

Propiedad response

  • Tipo: Boolean
  • Límites: Solo se permite valores Truthy o Falsy, por ejemplo true o false.
  • Por defecto: false
  • Descripción: Activa el pintado de una línea en el log, en cada respuesta del servidor.

Propiedad repositories

Esta propiedad es un arreglo que indica los repositorios en los que se buscarán los componentes que meme.js no encuentre de forma local.

Esta propiedad, contendrá una lista de strings con las url’s de librerías, componentes.js y componentes.mj.

Mediante esta característica de meme.js, podemos usar cualquier componente de internet en el que confiemos, ya sea que esté en un repositorio git cloud x, o un simple servidor de archivos estáticos, y de igual forma, nosotros solo necesitaremos disponibilizar nuestros componentes, para poder compartirlos con quien necesitemos.

De aquí se derivan cientos de configuraciones que imaginemos. Podremos tener componentes públicos, precompilados, privados, venta de componentes y librerías, etc.

Propiedad constants

Esta propiedad es un objeto que contendrá las constantes de compilación, que podremos usar a lo largo del proyecto.

Estas pueden verse como variables de entorno, ya que igualmente pueden ser reemplazadas mediante la jerarquía de configuración.

Estas constantes están disponibles en todos los archivos compilados en el proyecto y serán reemplazadas por los valores primitivos que contengan en la configuración, con lo que podremos meter, valores booleanos, cadenas, números, nulos, indefinidos, etc.

Para poder usar una constante, basta con poner en cualquier lugar el nombre de la constante entre dobles corchetes, por ejemplo:

module.exports = {
	constants: {
		debug: true
	}
}
class mi_componente {
	mi_funcion() {
		if ( [[debug]] ) {
			console.log( "estoy en debug" );
		}
	}
}

De igual forma, podemos establecer valores por defecto en caso de que no exista la constante en ese entorno o configuración, por ejemplo:

class mi_componente {
	mi_funcion() {
		if ( [[debug]] ) {
			console.log( "estoy en debug", [[no_existe||"mi valor por defecto"]] );
		}
	}
}

Igualmente te recuerdo, que aunque las constantes pueden funcionar como una variable de entorno, tienen muchas mas posibilidades, por que una constante puede ser igual a un objeto, arreglo, función o cualquier clase de valor JS.

Un ejemplo de esta potencia, serían las constantes predefinidas:

  • crt: esta es una constante de tipo string que contiene el crt del certificado general que meme.js usa para las conexiones https en desarrollo, un ejemplo de uso de esta variable sería:
    console.log( ‘mi crt:,[[crt]])
    , por favor, presta especial atención en como colocamos la constante entre comillas, por que meme.js hace un remplazo limpio del valor, es decir, remplaza [[crt]], por -----BEGIN CERTIFICATE..., por lo que sera como escribir el certificado directamente en el codigo, y si no esta entre comillas no será un string, solo sera un montón de caracteres.
  • key: esta es una constante de tipo string que contiene el key del certificado general que meme.js usa para las conexiones https en desarrollo, un ejemplo de uso de esta variable sería:
    console.log( ‘mi key:,[[key]])
    .
  • config: esta constante es la configuración general del proyecto, por lo que contendrá el objeto exportado y procesado de los archivos de configuración y podremos usarlo de la siguiente forma:
    console.log( ‘mi nombre de proyecto es:, [[config]].name )
    , por favor presta atención que al hacer un remplazo limpio de la constante config, es como si se pusiera el objeto de configuración en el codigo, por eso se usa como un objeto.
  • meme_space: esta constante es un objeto de tipo ParsePath, que contendrá toda la información referente al directorio del SDK.
  • work_space: esta constante es un objeto de tipo ParsePath, que contendrá toda la información referente al directorio de nuestro proyecto.
  • version_package: esta constante es una cadena que nos informará de la versión actual de nuestro proyecto.
  • APP: esta constante es una cadena que contiene la url base de nuestro proyecto y del servidor de la aplicación.
  • API: esta constante es una cadena que contiene la url base de nuestro servidor de api’s y funciones remotas.
  • RES: esta constante es una cadena que contiene la url de nuestro servidor de recursos.
  • debug: esta constante es un valor boleano que nos indica si el proyecto esta en versión de ejecución o construcción.

Propiedad commands

Esta propiedad es un objeto que contendrá una lista de comandos que podremos ejecutar desde la línea de comandos cuando lo necesitemos. La clave de este objeto, es el comando que ejecutaremos posteriormente a la función de commands del CLI y el valor contendrá un grupo de comandos a ejecutar, por ejemplo:

module.exports = {
	commands: {
		mis_comandos_1: {...},
		mis_comandos_2: {...}
	}
}
Si nosotros escribimos el comando:
me -c mis_comandos_1
, se ejecutará, el grupo de comandos que se especifica en el valor de mis_comandos_1.

Grupo de comandos

Este es un objeto que describe cómo se ejecutará una serie de comandos, en la línea de comandos. Las propiedades de este objeto son:

  • name (string)(opcional): Es un nombre descriptivo del grupo de comandos. Si escribimos este nombre, aparecerá cuando ejecutemos el comando
    me -c
    .
  • description (string)(opcional): Esta propiedad es una descripción más larga y detallada del grupo de comandos. Si rellenamos esta propiedad, aparecerá cuando ejecutemos el comando
    me -c
    .
  • commands (array[object]): Esta propiedad contiene un grupo de comandos que se ejecutarán en la línea de comandos.

A continuación se ejemplifica cómo quedaría este objeto, hasta el nivel descrito:

module.exports = {
	commands: {
		mis_comandos_1: {
			name: "mi nombre 1",
			description: "mi descripción larga 1",
			commands: [...]
		},
		mis_comandos_2: {
			name: "mi nombre 2",
			description: "mi descripción larga 2",
			commands: [...]
		}
	}
}

Comando

Por último, este objeto representa un comando de la línea de comandos. Las propiedades de un comando son:

  • command (string): El comando que se ejecutará en la consola, por ejemplo
    node
    .
  • args (array[string]): En este arreglo indicaremos los argumentos que tiene el comando, por ejemplo:
    ["./mi_dri/mi_script.js"]
  • is_async (true/false): Con esta propiedad, indicamos si la ejecución de los comandos posteriores tienen que esperar a que termine este comando o pueden continuar aun sin haber terminado la ejecución de este comando (por defecto, todos los comandos se ejecutan de manera síncrona, también hay que considerar que un comando asíncrono no pintara ninguna línea en la consola).
  • options (object): en este objeto podemos meter otras propiedades para modificar el comportamiento del comando, si quieres saber más de las propiedades que puedes usar, visita: child_proces

De esta forma, podremos ver que el ejemplo de comandos quedaría de la siguiente forma:

module.exports = {
	commands: {
		mis_comandos_1: {
			name: "mi nombre 1",
			description: "mi descripción larga 1",
			commands: [
				{ command:"me", args:["build", "-e", "prod"] },
				{ command:"node", args:["./utils/versionador.js"] },
				{ command:"node", args:["./utils/editor.js"] }
			]
		},
		mis_comandos_2: {
			name: "mi nombre 2",
			description: "mi descripción larga 2",
			commands: [
				{ command:"me", args:["-c", "mis_comandos_1"] },
				{ command:"firebase", args:["deploy"] },
				{ command:"me", args:["stop", "-all"] }
			]
		}
	}
}

Opciones de servidores

meme.js ocupa múltiples procesos independientes para servir nuestro contenido, los procesos principales son:

  • app: Se encarga de servir los archivos correspondientes a la aplicación front, es decir las páginas y componentes que componen nuestro proyecto, igualmente en esta instancia se ejecutan los scripts de servidor.
  • api: Se encarga de servir la parte back de nuestro proyecto, es decir, es quien se encarga de servir las funciones remotas, emitir los eventos de servidor y emular los servicios edge.
  • res: Es un servidor corriente de recursos estáticos, y se encarga principalmente de servir recursos como imágenes o archivos auxiliares.

Propiedad app, api, res

Ya conociendo brevemente sobre la arquitectura de meme.js y los servicios que tiene, con estas propiedades, podemos describir el comportamiento que tendrán dichos servicios. El objeto es el mismo para cualquiera de los servicios, por lo que solo bastará con describir las propiedades que tiene este objeto y podremos usar esa propiedad en cualquiera de los 3 servicios.

Las propiedades del objeto son:

Propiedadss build

  • Tipo: String
  • Límites: Solo se aceptan rutas de directorios que pueden ser o ya son válidos.
  • Descripción: Con esta propiedad le indicamos al compilador, la carpeta (exista o no), en donde queremos que coloque todos los archivos de nuestro proyecto, cuando decidamos construirlo con el comando build.
Si no se especifica, por defecto es:
`${[[work_space]].path}/build`
; Siendo
[[work_space]].path
el path del directorio de nuestro proyecto y build, la carpeta, dentro de nuestro directorio en la que se depositaran los archivos.

Propiedad sources

  • Tipo: String o Array[String]
  • Límites: Solo se aceptan rutas de directorios que son válidas.
  • Descripción: Con esta propiedad le indicamos al compilador, las carpetas en la que se encuentran los archivos que queremos compilar o poner a disposición.

Esta propiedad puede recibir solo un directorio o un arreglo con múltiples directorios.

Si no se especifica esta propiedad, por defecto será
[[work_space]].path
, el cual es la dirección de la carpeta de nuestro directorio.

Propiedad ignore

  • Tipo: Array[RegExp]
  • Limites: Solo acepta un arreglo de expresiones regulares.
  • Descripción: Con esta propiedad le indicamos al compilador de meme.js, los archivos y/o carpetas que queremos que sean ignorados, todo nombre de archivo y/o carpeta que coincida con alguna de las expresiones regulares que aparezcan en esta propiedad, será ignorado.

Si esta propiedad no se especifica, tendrá un valor por defecto, diferente para cada servicio.

  • para app, este valor será:
    [
    	/build/i,
    	/node_modules/i,
    	/package\.json$/i,
    	/package-lock\.json$/i,
    	/meme\.conf$/i,
    	/meme\.cache$/i,
    	/\.git/i,
    	/\.vscode$/i,
    	/\.ds_stores$/i,
    	/\.editorconfig$/i,
    ]
  • para api, el valor será:
    [
    	/build/i,
    	/node_modules/i,
    	/package\.json$/i,
    	/package-lock\.json$/i,
    	/meme\.conf$/i,
    	/meme\.cache$/i,
    	/\.git/i,
    	/\.vscode$/i,
    	/\.ds_stores$/i,
    	/\.editorconfig$/i,
    ]
  • para res, el valor será:
    [
    	/Icon/,
    	/build/i,
    	/node_modules/i,
    	/package\.json$/i,
    	/package-lock\.json$/i,
    	/meme\.conf$/i,
    	/meme\.cache$/i,
    	/\.git/i,
    	/\.vscode$/i,
    	/\.ds_store$/i,
    	/\.editorconfig$/i,
    	/\.m(c|h|j)$/i,
    ]

Propiedad filter

  • Tipo: Array[RegExp]
  • Limites: Solo acepta un arreglo de expresiones regulares.
  • Descripción: Con esta propiedad le indicamos al compilador, solo los archivos y/o carpetas que queremos que sean compilados, todo nombre de archivo y/o carpeta que coincida con alguna de las expresiones regulares de esta propiedad, será tomado en cuenta por el compilador.

Si esta propiedad no se especifica, tendrá un valor por defecto, diferente para cada servicio.

  • Para app, tendrá el valor de:
    [
    	/\.m(j|h|c)$|\.(js|css|htm(l?))$/i
    ]
  • Para api, tendrá el valor de:
    [
    	/\.mj$/i
    ]
  • Para res, tendrá el valor de:
    []

Propiedad start

  • Tipo: Boolean
  • Límites: Solo se permite valores Truthy o Falsy, por ejemplo true o false.
  • Descripción: Con esta propiedad indicaremos si queremos que el servicio se inicie o por el contrario, no se ejecute este proceso y el servicio no esté disponible.

Si no se especifica esta propiedad, por defecto es true.

Propiedad protocol

  • Tipo: String
  • Límites: Solo se permite las cadenas https y http.
  • Descripción: Con esta propiedad le indicaremos el protocolo que usará el servicio, este puede ser http o https (el protocolo https va sobre http2).

Si no se especifica esta propiedad, por defecto es http.

Propiedad host

  • Tipo: String
  • Límites: Solo se permite cadenas que representaran un dominio o dirección ip válida.
  • Descripción: Con esta propiedad le indicaremos el dominio que tendrá nuestro servidor durante la ejecución, por ejemplo: 0.0.0.0 o localhost.

Si no se especifica esta propiedad, por defecto es 0.0.0.0.

Propiedad port

  • Tipo: Int
  • Límites: Solo se permiten números enteros.
  • Descripción: Con esta propiedad le indicaremos el puerto que tendrá nuestro servidor durante la ejecución, por ejemplo: 8000.

Si no se especifica esta propiedad, por defecto es 0, lo cual significa que se levantara en un puerto disponible cualquiera.

Propiedades crt y key

  • Tipo: String
  • Límites: (no hay límite alguno)
  • Descripción: Con esta propiedad, podemos indicarle al servicio si cargará un archivo Security Certificate, para agregar los certificados de nuestro dominio, en caso de que contemos con ellos y hallamos elegido el protocolo https.

Se puede agregar, tanto una dirección de la localización de nuestros certificados, como también el texto directamente.

Si no se especifica, carga unos certificados autogenerados que servirán solo para pruebas en tiempo de desarrollo.

Propiedad watch

  • Tipo: Boolean
  • Límites: Solo se permite valores Truthy o Falsy, por ejemplo true o false.
  • Descripción: Con esta propiedad le indicaremos al compilador, si debe monitorear los cambios que haya en los archivos de las carpetas públicas. De este modo cuando ocurra un cambio en los directorios mencionados, meme.js actuará en consecuencia.

Si esta propiedad no se especifica, el valor por defecto será true.

Propiedad tasks

  • Tipo: Array[task]
  • Limites: Solo acepta un arreglo de tareas.
  • Descripción: Esta propiedad es un arreglo que puede contener diversas tareas que se ejecutan en momentos determinados por nosotros. Esto con el fin de que podamos extender la funcionalidad del compilador y tengamos posibilidad de tener proyectos mas especializados.

Tarea

Una tarea es un objeto que nos ayudará a indicarle al compilador, una función y el momento en el que nosotros necesitamos ejecutar esa función.

Este objeto tiene la siguiente estructura:

{
	script:()=>{
		console.log('hola mundo')
	},
	moment:['load']
}

otro ejemplo sería:

{
	script: MiFuncion,
	moment: ['load', 'watch', 'build']
}

En donde la propiedad script, es una referencia a la función que queremos que se ejecute en x momento. y la propiedad moment, es un arreglo que indica los momentos en la que se ejecutara dicha función. Los momentos que tenemos disponibles por ahora son:

  • start: la función se ejecuta justo cuando se ejecuta el proceso,
  • load: la función se ejecuta justo después de que se han compilado por primera vez todos los archivos necesarios.
  • watch: la función se ejecuta después de que un archivo fue re-compilado a causa de algún cambio.
  • build: la función se ejecuta después de que se han terminado de compilar todos los archivos.

Configuración por defecto

A continuación se escribe un ejemplo completo de un archivo de configuración, que contiene la configuración por defecto de meme.js:

module.exports = {
	name       : 'lib',
	type       : 'spa',
	author     : '',
	version    : '0.0.1',
	description: '',

	render: {
		css_auto_unit: 'px',
		pre_render   : false,
	},

	log: {
		request : false,
		response: false,
	},

	constants: {
		APP  : '',
		API  : '',
		RES  : '',
		debug: true,
	},

	commands    : {},
	repositories: [],

	driver: {
		host: '0.0.0.0',
		port: 49123,
	},

	one: {
		protocol: 'http',
		host    : '0.0.0.0',
		port    : 0,
	},

	app: {
		protocol: 'http',
		host    : '0.0.0.0',
		port    : 0,
		crt     : `[[crt]]`,
		key     : `[[key]]`,
		build   : `${[[work_space]].path}/build`,
		sources : [[work_space]].path,
		filter  : [/\.m(j|h|c)$|\.(js|css|htm(l?))$/i],
		start   : true,
		watch   : true,
		tasks   : [],
		ignore  : [
			/build/i,
			/node_modules/i,
			/package\.json$/i,
			/package-lock\.json$/i,
			/meme\.conf$/i,
			/meme\.cache$/i,
			/\.git/i,
			/\.vscode$/i,
			/\.ds_stores$/i,
			/\.editorconfig$/i,
		],
	},

	api: {
		protocol: 'http',
		host    : '0.0.0.0',
		port    : 0,
		crt     : `[[crt]]`,
		key     : `[[key]]`,
		build   : `${[[work_space]].path}/build`,
		sources : [[work_space]].path,
		filter  : [/.mj$/i],
		start   : true,
		watch   : true,
		tasks   : [],
		ignore  : [
			/build/i,
			/node_modules/i,
			/package\.json$/i,
			/package-lock\.json$/i,
			/meme\.conf$/i,
			/meme\.cache$/i,
			/\.git/i,
			/\.vscode$/i,
			/\.ds_stores$/i,
			/\.editorconfig$/i,
		],
	},

	res: {
		protocol: 'http',
		host    : '0.0.0.0',
		port    : 0,
		crt     : `[[crt]]`,
		key     : `[[key]]`,
		build   : `${[[work_space]].path}/build`,
		sources : [[work_space]].path,
		start   : true,
		watch   : true,
		tasks   : [],
		ignore  : [
			/Icon/,
			/build/i,
			/node_modules/i,
			/package\.json$/i,
			/package-lock\.json$/i,
			/meme\.conf$/i,
			/meme\.cache$/i,
			/\.git/i,
			/\.vscode$/i,
			/\.ds_store$/i,
			/\.editorconfig$/i,
			/\.m(c|h|j)$/i,
		],
	},

	"[build]": {
		constants: { debug:false },
	},

	"[prod]": {
		packaging: { add_maps:false },
		constants: { APP:'.', API:'.', RES:'.', debug:false },
	},
};