@davidbc01/telar 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +115 -0
- package/README.md +158 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +250 -0
- package/dist/cli.js.map +1 -0
- package/dist/errores.d.ts +16 -0
- package/dist/errores.d.ts.map +1 -0
- package/dist/errores.js +85 -0
- package/dist/errores.js.map +1 -0
- package/dist/generador.d.ts +28 -0
- package/dist/generador.d.ts.map +1 -0
- package/dist/generador.js +307 -0
- package/dist/generador.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +93 -0
- package/dist/index.js.map +1 -0
- package/dist/lexer.d.ts +22 -0
- package/dist/lexer.d.ts.map +1 -0
- package/dist/lexer.js +222 -0
- package/dist/lexer.js.map +1 -0
- package/dist/parser.d.ts +35 -0
- package/dist/parser.d.ts.map +1 -0
- package/dist/parser.js +441 -0
- package/dist/parser.js.map +1 -0
- package/dist/tipos.d.ts +183 -0
- package/dist/tipos.d.ts.map +1 -0
- package/dist/tipos.js +88 -0
- package/dist/tipos.js.map +1 -0
- package/examples/blog/app.telar +61 -0
- package/examples/tienda/app.telar +86 -0
- package/package.json +30 -0
package/dist/tipos.js
ADDED
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ---
|
|
3
|
+
// tipos.ts
|
|
4
|
+
// Define el vocabulario de todo el compilador de Telar.
|
|
5
|
+
// Aquí están los tokens, los nodos del árbol, y los errores.
|
|
6
|
+
// ---
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.TelarError = exports.TipoToken = void 0;
|
|
9
|
+
// --- TOKENS ---
|
|
10
|
+
// Un token es la unidad mínima de significado.
|
|
11
|
+
// El lexer convierte el texto crudo en una lista de tokens.
|
|
12
|
+
var TipoToken;
|
|
13
|
+
(function (TipoToken) {
|
|
14
|
+
// Palabras clave - estructura
|
|
15
|
+
TipoToken["Aplicacion"] = "aplicacion";
|
|
16
|
+
TipoToken["Pagina"] = "pagina";
|
|
17
|
+
TipoToken["Datos"] = "datos";
|
|
18
|
+
TipoToken["En"] = "en";
|
|
19
|
+
// Palabras clave - contenido
|
|
20
|
+
TipoToken["Titulo"] = "titulo";
|
|
21
|
+
TipoToken["Descripcion"] = "descripcion";
|
|
22
|
+
TipoToken["Mostrar"] = "mostrar";
|
|
23
|
+
TipoToken["Boton"] = "boton";
|
|
24
|
+
TipoToken["Campo"] = "campo";
|
|
25
|
+
// Palabras clave - lógica
|
|
26
|
+
TipoToken["Si"] = "si";
|
|
27
|
+
TipoToken["SiNo"] = "si_no";
|
|
28
|
+
TipoToken["El"] = "el";
|
|
29
|
+
TipoToken["La"] = "la";
|
|
30
|
+
TipoToken["Esta"] = "esta";
|
|
31
|
+
TipoToken["Es"] = "es";
|
|
32
|
+
TipoToken["Hay"] = "hay";
|
|
33
|
+
TipoToken["Falla"] = "falla";
|
|
34
|
+
TipoToken["Funciona"] = "funciona";
|
|
35
|
+
// Palabras clave - modificadores
|
|
36
|
+
TipoToken["Maximo"] = "maximo";
|
|
37
|
+
TipoToken["Ordenados"] = "ordenados";
|
|
38
|
+
TipoToken["Filtrados"] = "filtrados";
|
|
39
|
+
TipoToken["Por"] = "por";
|
|
40
|
+
TipoToken["Recientes"] = "recientes";
|
|
41
|
+
TipoToken["Para"] = "para";
|
|
42
|
+
TipoToken["Movil"] = "movil";
|
|
43
|
+
TipoToken["Cache"] = "cache";
|
|
44
|
+
TipoToken["Reintentar"] = "reintentar";
|
|
45
|
+
TipoToken["Minutos"] = "minutos";
|
|
46
|
+
TipoToken["Horas"] = "horas";
|
|
47
|
+
TipoToken["Segundos"] = "segundos";
|
|
48
|
+
TipoToken["Optimizar"] = "optimizar";
|
|
49
|
+
TipoToken["Ir"] = "ir";
|
|
50
|
+
TipoToken["Hacer"] = "hacer";
|
|
51
|
+
TipoToken["Tipo"] = "tipo";
|
|
52
|
+
TipoToken["Idioma"] = "idioma";
|
|
53
|
+
// Valores
|
|
54
|
+
TipoToken["Texto"] = "TEXTO";
|
|
55
|
+
TipoToken["Numero"] = "NUMERO";
|
|
56
|
+
TipoToken["Nombre"] = "NOMBRE";
|
|
57
|
+
TipoToken["Identificador"] = "IDENTIFICADOR";
|
|
58
|
+
// Puntuación
|
|
59
|
+
TipoToken["DosPuntos"] = ":";
|
|
60
|
+
TipoToken["Mayor"] = ">";
|
|
61
|
+
TipoToken["Igual"] = "=";
|
|
62
|
+
// Especiales
|
|
63
|
+
TipoToken["NuevaLinea"] = "NUEVA_LINEA";
|
|
64
|
+
TipoToken["Indentacion"] = "INDENTACION";
|
|
65
|
+
TipoToken["FinIndentacion"] = "FIN_INDENTACION";
|
|
66
|
+
TipoToken["FinArchivo"] = "FIN_ARCHIVO";
|
|
67
|
+
TipoToken["Desconocido"] = "DESCONOCIDO";
|
|
68
|
+
})(TipoToken || (exports.TipoToken = TipoToken = {}));
|
|
69
|
+
class TelarError extends Error {
|
|
70
|
+
constructor(error) {
|
|
71
|
+
super(error.mensaje);
|
|
72
|
+
this.linea = error.linea;
|
|
73
|
+
this.columna = error.columna;
|
|
74
|
+
this.sugerencia = error.sugerencia;
|
|
75
|
+
this.name = "TelarError";
|
|
76
|
+
}
|
|
77
|
+
// Formatea el error para mostrarlo en la terminal
|
|
78
|
+
formatear(nombreArchivo) {
|
|
79
|
+
const ubicacion = `${nombreArchivo}:${this.linea}:${this.columna}`;
|
|
80
|
+
let salida = `\n✗ ${ubicacion}: ${this.message}\n`;
|
|
81
|
+
if (this.sugerencia) {
|
|
82
|
+
salida += ` Sugerencia: ${this.sugerencia}\n`;
|
|
83
|
+
}
|
|
84
|
+
return salida;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
exports.TelarError = TelarError;
|
|
88
|
+
//# sourceMappingURL=tipos.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tipos.js","sourceRoot":"","sources":["../src/tipos.ts"],"names":[],"mappings":";AAAA,MAAM;AACN,WAAW;AACX,wDAAwD;AACxD,6DAA6D;AAC7D,MAAM;;;AAGN,iBAAiB;AACjB,+CAA+C;AAC/C,4DAA4D;AAE5D,IAAY,SA6DX;AA7DD,WAAY,SAAS;IACjB,8BAA8B;IAC9B,sCAAyB,CAAA;IACzB,8BAAiB,CAAA;IACjB,4BAAe,CAAA;IACf,sBAAS,CAAA;IAET,6BAA6B;IAC7B,8BAAiB,CAAA;IACjB,wCAA2B,CAAA;IAC3B,gCAAmB,CAAA;IACnB,4BAAe,CAAA;IACf,4BAAe,CAAA;IAEf,0BAA0B;IAC1B,sBAAS,CAAA;IACT,2BAAc,CAAA;IACd,sBAAS,CAAA;IACT,sBAAS,CAAA;IACT,0BAAa,CAAA;IACb,sBAAS,CAAA;IACT,wBAAW,CAAA;IACX,4BAAe,CAAA;IACf,kCAAqB,CAAA;IAErB,iCAAiC;IACjC,8BAAiB,CAAA;IACjB,oCAAuB,CAAA;IACvB,oCAAuB,CAAA;IACvB,wBAAW,CAAA;IACX,oCAAuB,CAAA;IACvB,0BAAa,CAAA;IACb,4BAAe,CAAA;IACf,4BAAe,CAAA;IACf,sCAAyB,CAAA;IACzB,gCAAmB,CAAA;IACnB,4BAAe,CAAA;IACf,kCAAqB,CAAA;IACrB,oCAAuB,CAAA;IACvB,sBAAS,CAAA;IACT,4BAAe,CAAA;IACf,0BAAa,CAAA;IACb,8BAAiB,CAAA;IAEjB,UAAU;IACV,4BAAe,CAAA;IACf,8BAAiB,CAAA;IACjB,8BAAiB,CAAA;IACjB,4CAA+B,CAAA;IAE/B,aAAa;IACb,4BAAe,CAAA;IACf,wBAAW,CAAA;IACX,wBAAW,CAAA;IAEX,aAAa;IACb,uCAA0B,CAAA;IAC1B,wCAA2B,CAAA;IAC3B,+CAAkC,CAAA;IAClC,uCAA0B,CAAA;IAC1B,wCAA2B,CAAA;AAC/B,CAAC,EA7DW,SAAS,yBAAT,SAAS,QA6DpB;AAyLD,MAAa,UAAW,SAAQ,KAAK;IAKjC,YAAY,KAAiB;QACzB,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;QACpB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAA;QACxB,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAA;QAC5B,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,UAAU,CAAA;QAClC,IAAI,CAAC,IAAI,GAAG,YAAY,CAAA;IAC5B,CAAC;IAED,kDAAkD;IAClD,SAAS,CAAC,aAAqB;QAC3B,MAAM,SAAS,GAAG,GAAG,aAAa,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,OAAO,EAAE,CAAA;QAClE,IAAI,MAAM,GAAG,QAAQ,SAAS,KAAK,IAAI,CAAC,OAAO,IAAI,CAAA;QACnD,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YAClB,MAAM,IAAI,kBAAkB,IAAI,CAAC,UAAU,IAAI,CAAA;QACnD,CAAC;QACD,OAAO,MAAM,CAAA;IACjB,CAAC;CACJ;AAtBD,gCAsBC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# Ejemplo: Blog personal
|
|
2
|
+
# Un blog sencillo con listado de artículos y página de detalle.
|
|
3
|
+
|
|
4
|
+
aplicación MiBlog
|
|
5
|
+
idioma español
|
|
6
|
+
|
|
7
|
+
datos Articulo
|
|
8
|
+
título: texto
|
|
9
|
+
contenido: texto
|
|
10
|
+
fecha: fecha
|
|
11
|
+
autor: texto
|
|
12
|
+
etiquetas: lista de texto
|
|
13
|
+
|
|
14
|
+
# Página principal
|
|
15
|
+
|
|
16
|
+
página inicio en "/"
|
|
17
|
+
título "Mi Blog"
|
|
18
|
+
descripción "Artículos sobre tecnología y diseño"
|
|
19
|
+
|
|
20
|
+
mostrar Articulo recientes
|
|
21
|
+
máximo 10
|
|
22
|
+
ordenados por fecha
|
|
23
|
+
si falla
|
|
24
|
+
mostrar "No se pudieron cargar los artículos."
|
|
25
|
+
|
|
26
|
+
optimizar para móvil
|
|
27
|
+
caché 30 minutos
|
|
28
|
+
|
|
29
|
+
# Detalle de artículo
|
|
30
|
+
|
|
31
|
+
página articulo en "/articulo/(id)"
|
|
32
|
+
título "(articulo.título)"
|
|
33
|
+
descripción "(articulo.contenido primeras 200 letras)"
|
|
34
|
+
|
|
35
|
+
mostrar articulo.título
|
|
36
|
+
mostrar articulo.fecha
|
|
37
|
+
mostrar articulo.autor
|
|
38
|
+
mostrar articulo.contenido
|
|
39
|
+
mostrar articulo.etiquetas
|
|
40
|
+
|
|
41
|
+
mostrar "Artículos relacionados"
|
|
42
|
+
filtrados por etiquetas = articulo.etiquetas
|
|
43
|
+
máximo 3
|
|
44
|
+
|
|
45
|
+
optimizar para móvil
|
|
46
|
+
caché 1 hora
|
|
47
|
+
|
|
48
|
+
# Página de contacto
|
|
49
|
+
|
|
50
|
+
página contacto en "/contacto"
|
|
51
|
+
título "Contacto"
|
|
52
|
+
|
|
53
|
+
campo "Tu nombre" tipo texto
|
|
54
|
+
campo "Tu correo" tipo email
|
|
55
|
+
campo "Mensaje" tipo área de texto
|
|
56
|
+
|
|
57
|
+
botón "Enviar" hacer enviarMensaje
|
|
58
|
+
si falla
|
|
59
|
+
mostrar "No se pudo enviar. Intenta de nuevo."
|
|
60
|
+
si funciona
|
|
61
|
+
mostrar "Mensaje enviado. Te respondo pronto."
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# Ejemplo: Tienda online
|
|
2
|
+
# Muestra una tienda con listado de productos, detalle y carrito.
|
|
3
|
+
|
|
4
|
+
aplicación MiTienda
|
|
5
|
+
idioma español
|
|
6
|
+
|
|
7
|
+
datos Producto
|
|
8
|
+
nombre: texto
|
|
9
|
+
precio: número
|
|
10
|
+
imagen: foto
|
|
11
|
+
descripción: texto
|
|
12
|
+
stock: número
|
|
13
|
+
|
|
14
|
+
datos Pedido
|
|
15
|
+
productos: lista de Producto
|
|
16
|
+
total: número
|
|
17
|
+
estado: texto
|
|
18
|
+
|
|
19
|
+
# Página de inicio
|
|
20
|
+
|
|
21
|
+
página inicio en "/"
|
|
22
|
+
título "Bienvenido a MiTienda"
|
|
23
|
+
descripción "Los mejores productos al mejor precio"
|
|
24
|
+
|
|
25
|
+
mostrar Producto recientes
|
|
26
|
+
máximo 8
|
|
27
|
+
ordenados por fecha
|
|
28
|
+
si falla
|
|
29
|
+
mostrar "No se pudieron cargar los productos."
|
|
30
|
+
reintentar en 10 segundos
|
|
31
|
+
|
|
32
|
+
si el usuario está conectado
|
|
33
|
+
mostrar "Hola, (usuario.nombre)"
|
|
34
|
+
botón "Mi cuenta" ir a cuenta
|
|
35
|
+
botón "Mi carrito" ir a carrito
|
|
36
|
+
si no
|
|
37
|
+
botón "Entrar" ir a login
|
|
38
|
+
botón "Registrarse" ir a registro
|
|
39
|
+
|
|
40
|
+
optimizar para móvil
|
|
41
|
+
caché 5 minutos
|
|
42
|
+
|
|
43
|
+
# Detalle de producto
|
|
44
|
+
|
|
45
|
+
página detalle en "/producto/(id)"
|
|
46
|
+
título "(producto.nombre)"
|
|
47
|
+
|
|
48
|
+
mostrar producto.imagen
|
|
49
|
+
mostrar producto.nombre
|
|
50
|
+
mostrar producto.precio
|
|
51
|
+
mostrar producto.descripción
|
|
52
|
+
|
|
53
|
+
si producto.stock > 0
|
|
54
|
+
botón "Añadir al carrito" hacer añadirAlCarrito
|
|
55
|
+
si no
|
|
56
|
+
mostrar "Sin stock — avísame cuando llegue"
|
|
57
|
+
botón "Avisarme" hacer suscribirStock
|
|
58
|
+
|
|
59
|
+
optimizar para móvil
|
|
60
|
+
|
|
61
|
+
# Carrito
|
|
62
|
+
|
|
63
|
+
página carrito en "/carrito"
|
|
64
|
+
título "Tu carrito"
|
|
65
|
+
|
|
66
|
+
si hay resultados
|
|
67
|
+
mostrar pedido.productos
|
|
68
|
+
mostrar "Total: (pedido.total) €"
|
|
69
|
+
botón "Finalizar compra" ir a pago
|
|
70
|
+
si no
|
|
71
|
+
mostrar "Tu carrito está vacío"
|
|
72
|
+
botón "Ver productos" ir a inicio
|
|
73
|
+
|
|
74
|
+
# Login
|
|
75
|
+
|
|
76
|
+
página login en "/entrar"
|
|
77
|
+
título "Entrar"
|
|
78
|
+
|
|
79
|
+
campo "Correo electrónico" tipo email
|
|
80
|
+
campo "Contraseña" tipo contraseña
|
|
81
|
+
|
|
82
|
+
botón "Entrar" hacer iniciarSesion
|
|
83
|
+
si falla
|
|
84
|
+
mostrar "Correo o contraseña incorrectos"
|
|
85
|
+
|
|
86
|
+
botón "¿Olvidaste tu contraseña?" ir a recuperarContraseña
|
package/package.json
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@davidbc01/telar",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Lenguaje de programación declarativo para la web, escrito en español",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"bin": {
|
|
7
|
+
"telar": "./dist/cli.js"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"dist/",
|
|
11
|
+
"examples/",
|
|
12
|
+
"README.md",
|
|
13
|
+
"LICENSE"
|
|
14
|
+
],
|
|
15
|
+
"scripts": {
|
|
16
|
+
"build": "tsc",
|
|
17
|
+
"dev": "ts-node src/cli.ts",
|
|
18
|
+
"test": "vitest",
|
|
19
|
+
"test:run": "vitest run",
|
|
20
|
+
"lint": "tsc --noEmit"
|
|
21
|
+
},
|
|
22
|
+
"keywords": ["programming-language", "spanish", "web", "declarative", "compiler"],
|
|
23
|
+
"license": "Apache-2.0",
|
|
24
|
+
"devDependencies": {
|
|
25
|
+
"@types/node": "^20.0.0",
|
|
26
|
+
"ts-node": "^10.9.0",
|
|
27
|
+
"typescript": "^5.0.0",
|
|
28
|
+
"vitest": "^1.0.0"
|
|
29
|
+
}
|
|
30
|
+
}
|