xonecode 0.28.0 → 0.29.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/dist/agent/dispositivos/recargaEnAparato.js +46 -5
- package/dist/agent/dispositivos/recargaEnAparato.js.map +1 -1
- package/dist/core/recargaEnCaliente.js +16 -8
- package/dist/core/recargaEnCaliente.js.map +1 -1
- package/package.json +1 -1
- package/skills/xone-hotswap/SKILL.md +3 -2
- package/skills/xone-hotswap/references/comandos.md +17 -1
- package/skills/xone-hotswap/scripts/xone-recargar-android +36 -3
|
@@ -15,9 +15,10 @@
|
|
|
15
15
|
* reintento de un minuto de `lanzarYComprobar` es para un framework que ARRANCA, no para uno que
|
|
16
16
|
* no está.
|
|
17
17
|
* - **`result:true` no es «aplicado»**: lo que se afirma es que la app CONTESTA su árbol después.
|
|
18
|
-
* - **
|
|
19
|
-
* app viva la TUMBA (medido), y
|
|
20
|
-
* «no está».
|
|
18
|
+
* - **Lo que solo se lee al cargar la app (CSS, `app.ini`, `app.xml`) RELANZA la app**, por
|
|
19
|
+
* `lanzarYComprobar`: un `launchApplication` suelto sobre una app viva la TUMBA (medido), y
|
|
20
|
+
* `lanzarYComprobar` solo reenvía detrás de una lectura que dice «no está». Se probó todo lo del
|
|
21
|
+
* canal para hacerlo sin relanzar y nada cambia el estilo (ver `docs/DECISIONES.md`).
|
|
21
22
|
*/
|
|
22
23
|
import { execFile } from "node:child_process";
|
|
23
24
|
import { existsSync } from "node:fs";
|
|
@@ -53,8 +54,48 @@ export async function recargarEnAparato(peticion, deps = {}) {
|
|
|
53
54
|
});
|
|
54
55
|
if (subida.result !== true)
|
|
55
56
|
return { estado: "fallo", clase, motivo: `uploadFile: ${decirDe(subida)}` };
|
|
56
|
-
if (clase === "
|
|
57
|
-
|
|
57
|
+
if (clase === "css") {
|
|
58
|
+
// Un CSS se recarga en caliente, sin relanzar. Dos caminos, los dos MEDIDOS en el emulador:
|
|
59
|
+
// - el comando `loadCssFile` del canal (framework 5.0.5.7dev en adelante): sustituye la hoja en
|
|
60
|
+
// su sitio de la cascada y relayouta solo;
|
|
61
|
+
// - en un framework anterior, que contesta `Unknown command`, las funciones de XOne por
|
|
62
|
+
// `runScript` (`appData.unloadCssFile` + `loadCssFile`) y un `refresh`, sin el cual no se ve.
|
|
63
|
+
// Lo que NO funciona, también medido: `setCssAttribute`, `relayout`, `refresh` o
|
|
64
|
+
// `loadCollection` solos. Si nada aplica (un nombre que no encaja), se cae a relanzar.
|
|
65
|
+
const nombre = peticion.ruta.replace(/^\/+/, "");
|
|
66
|
+
const tabla = codificacionParaElAparato(peticion.bytes);
|
|
67
|
+
const nativo = await pedir("loadCssFile", { fileName: nombre, encoding: tabla });
|
|
68
|
+
let recargado = nativo.result === true;
|
|
69
|
+
if (!recargado && /Unknown command/i.test(decirDe(nativo))) {
|
|
70
|
+
const script = `appData.unloadCssFile(${JSON.stringify(nombre)}); appData.loadCssFile(${JSON.stringify(nombre)}, ${JSON.stringify(tabla)}); return "ok";`;
|
|
71
|
+
const porScript = await pedir("runScript", {
|
|
72
|
+
scriptLanguage: "javascript",
|
|
73
|
+
scriptText: Buffer.from(script, "utf8").toString("base64"),
|
|
74
|
+
});
|
|
75
|
+
if (porScript.result === true) {
|
|
76
|
+
await pedir("refresh");
|
|
77
|
+
recargado = true;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
if (recargado) {
|
|
81
|
+
const despues = await pedir("getAllElements", { format: "xone" });
|
|
82
|
+
if (estaViva(despues))
|
|
83
|
+
return { estado: "aplicada", clase };
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
if (clase === "relanzar" || clase === "css") {
|
|
87
|
+
// `app.ini`, `app.xml` y los mappings solo se leen al CARGAR la app; y un CSS cuyo script falló.
|
|
88
|
+
// Se relanza, por el camino que no tumba una app viva.
|
|
89
|
+
cliente.cerrar();
|
|
90
|
+
cliente = undefined;
|
|
91
|
+
const arranque = await lanzarYComprobar(peticion.app, {
|
|
92
|
+
destino: destinoDe(peticion.puerto),
|
|
93
|
+
...(deps.abrirSocket === undefined ? {} : { abrirSocket: deps.abrirSocket }),
|
|
94
|
+
});
|
|
95
|
+
return arranque.viva
|
|
96
|
+
? { estado: "relanzada", clase }
|
|
97
|
+
: { estado: "fallo", clase, motivo: `se relanzó y no volvió: ${arranque.motivo ?? "sin motivo"}` };
|
|
98
|
+
}
|
|
58
99
|
// 2. Aplicar. Una colección va a memoria en UTF-8 con su prólogo diciéndolo (medido: con los
|
|
59
100
|
// bytes Latin-1 cada tilde salía doble); un include se lee del DISCO, en la tabla de sus bytes.
|
|
60
101
|
const aplicado = clase === "coleccion"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recargaEnAparato.js","sourceRoot":"","sources":["../../../src/agent/dispositivos/recargaEnAparato.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"recargaEnAparato.js","sourceRoot":"","sources":["../../../src/agent/dispositivos/recargaEnAparato.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,14 +9,16 @@
|
|
|
9
9
|
* en memoria, y por eso se sube también a disco — sin eso,
|
|
10
10
|
* relanzar la app la devuelve a la versión anterior.
|
|
11
11
|
* JavaScript (`.js`) → `uploadFile` + `loadIncludeFile` con `compile: true`.
|
|
12
|
-
* CSS
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
12
|
+
* CSS (`.css`) → `uploadFile` + `runScript` con `appData.unloadCssFile` y
|
|
13
|
+
* `appData.loadCssFile` + `refresh` (idea suya, medido: el
|
|
14
|
+
* color cambia sin relanzar). Si el script falla, se relanza.
|
|
15
|
+
* `.ini`, `app.xml`, un `.xne` sin colección (mappings)
|
|
16
|
+
* → `uploadFile` y se RELANZA la app, que es lo único que los
|
|
17
|
+
* relee.
|
|
16
18
|
* todo lo demás (iconos, `bd/`, `files/`) → no se recarga: lo lleva el despliegue entero.
|
|
17
19
|
*
|
|
18
|
-
* **Relanzar
|
|
19
|
-
*
|
|
20
|
+
* **Relanzar SÍ se hace solo** (lo pidió así: lo guardado tiene que verse): el precio, que la app
|
|
21
|
+
* vuelve a su pantalla de inicio, lo dice la frase.
|
|
20
22
|
*/
|
|
21
23
|
import { decodificarComoTexto, esUtf8Valido, tablaDeLosBytes } from "./codificacion.js";
|
|
22
24
|
/** Las extensiones que el aparato sabe tomar sueltas. Las mismas del script. */
|
|
@@ -43,6 +45,8 @@ export function claseDeRecarga(ruta, bytes) {
|
|
|
43
45
|
return "no-aplica";
|
|
44
46
|
if (ext === ".js")
|
|
45
47
|
return "js";
|
|
48
|
+
if (ext === ".css")
|
|
49
|
+
return "css";
|
|
46
50
|
if (ext === ".xne") {
|
|
47
51
|
let cabeza = "";
|
|
48
52
|
for (const b of bytes)
|
|
@@ -88,11 +92,15 @@ export function textoDeRecarga(r) {
|
|
|
88
92
|
case "aplicada":
|
|
89
93
|
return r.clase === "js"
|
|
90
94
|
? "Aparato: JavaScript recargado; la app sigue viva"
|
|
91
|
-
:
|
|
95
|
+
: r.clase === "css"
|
|
96
|
+
? "Aparato: estilos recargados en caliente; la app sigue viva"
|
|
97
|
+
: "Aparato: pantalla recargada en caliente; la app sigue viva";
|
|
92
98
|
case "relanzar":
|
|
93
99
|
return "Aparato: subido; para verlo hay que relanzar la app";
|
|
94
100
|
case "relanzada":
|
|
95
|
-
return "
|
|
101
|
+
return r.clase === "relanzar" || r.clase === "css"
|
|
102
|
+
? "Aparato: cambios aplicados relanzando la app (vuelve a su pantalla de inicio)"
|
|
103
|
+
: "Aparato: app relanzada y viva";
|
|
96
104
|
case "sin-app":
|
|
97
105
|
// El motivo, si se sabe: «no hay aparato elegido» y «no está en la medida» no se arreglan
|
|
98
106
|
// en el mismo sitio que «la app no corre».
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recargaEnCaliente.js","sourceRoot":"","sources":["../../src/core/recargaEnCaliente.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"recargaEnCaliente.js","sourceRoot":"","sources":["../../src/core/recargaEnCaliente.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -107,7 +107,8 @@ xone-desplegar-android --app MiApp --serie emulator-5554
|
|
|
107
107
|
# «cambié un botón / una función / un color»: NO despliegues entero. Compara el proyecto con el
|
|
108
108
|
# aparato, sube SOLO lo que difiere y lo aplica por la vía más barata (1-2 s si es una colección):
|
|
109
109
|
# colección (.xne) → recarga en caliente JavaScript (.js) → recarga del include
|
|
110
|
-
# CSS
|
|
110
|
+
# CSS (.css) → recarga en caliente (loadCssFile; en frameworks viejos, por runScript)
|
|
111
|
+
# app.xml, app.ini, mappings → relanza la app (unos 6 s)
|
|
111
112
|
# Necesita la app YA desplegada. Lo que no sabe aplicar (iconos, bd) lo dice y manda a desplegar.
|
|
112
113
|
xone-recargar-android
|
|
113
114
|
xone-recargar-android MenuPrincipal.xne functions.js # solo esos, sin comparar
|
|
@@ -246,7 +247,7 @@ Detalle de despliegue, relanzado y endpoints de fichero: [conexión y despliegue
|
|
|
246
247
|
| Tocar (`click`, `tap`, `doubleTap`, `longPress`, `openSelector`, `fill`, `clear`, `scroll`, `pressKey`) | sí | **sí**, con desviaciones (abajo) |
|
|
247
248
|
| Ciclo de app (`launchApplication`, `exitApplication`, `directdownload`) | sí | `launchApplication` y `directdownload` sí; `exitApplication` no |
|
|
248
249
|
| Atributos y colecciones (`setAttribute`, `deleteAttribute`, `loadCollection`) | sí | sí |
|
|
249
|
-
| CSS, `replaceProperty`, `refresh`, `relayout`, `loadIncludeFile` | sí | **no** |
|
|
250
|
+
| CSS (`setCssAttribute`, `loadCssFile`/`unloadCssFile`), `replaceProperty`, `refresh`, `relayout`, `loadIncludeFile` | sí | **no** |
|
|
250
251
|
| Ficheros (`/file_upload`, `/file_download`, `uploadFile`, `getFileChecksum`) | sí | **no** (`listappfiles` sí) |
|
|
251
252
|
| Scripts y SQL (`runScript`, `runSql`, `getDatabaseTableNames`, `queryDatabaseTable`) | sí | **no** |
|
|
252
253
|
| Logs (`getLog`, `*DeviceLogging`, `setLog*`) | sí | **no** |
|
|
@@ -81,6 +81,7 @@ por los dos canales.
|
|
|
81
81
|
| `deleteAttribute` | sí | sí | **solo WS** |
|
|
82
82
|
| `replaceProperty` | sí | — | — |
|
|
83
83
|
| `setCssAttribute` / `deleteCssAttribute` | sí | — | — |
|
|
84
|
+
| `loadCssFile` / `unloadCssFile` (desde 5.0.5.7dev) | sí | — | — |
|
|
84
85
|
| `refresh` / `relayout` | sí | — | — |
|
|
85
86
|
| `status` / `state` | sí | sí | **solo WS** |
|
|
86
87
|
| `uploadFile` | sí | — | — |
|
|
@@ -542,7 +543,8 @@ Carga o recarga una colección XML en caliente. **Entrada:** `xmlNode` (XML en *
|
|
|
542
543
|
|---|---|---|
|
|
543
544
|
| Colección `.xne` | `loadCollection` con el fichero entero en Base64 y `encoding=UTF-8` | Se repinta en ~2 s, **solo en memoria**: al relanzar la app vuelve la versión de disco. Para que persista, subir también el fichero con `uploadFile`. |
|
|
544
545
|
| JavaScript | `uploadFile` y luego `loadIncludeFile` con `compile=true` | Se aplica al instante. Solo subirlo, o `loadCollection`, **no** lo recarga. |
|
|
545
|
-
| CSS | `uploadFile` y luego `
|
|
546
|
+
| CSS (5.0.5.7dev en adelante) | `uploadFile` y luego `loadCssFile` con `fileName` | Se aplica al instante (medido: ~50 ms), **sin relanzar ni `refresh`**: sustituye la hoja en su sitio de la cascada y relayouta. |
|
|
547
|
+
| CSS (antes de 5.0.5.7dev, donde `loadCssFile` es `Unknown command`) | `uploadFile`, `runScript` con `appData.unloadCssFile(n); appData.loadCssFile(n, enc); return "ok";` y luego `refresh` | Se aplica sin relanzar. **Sin el `refresh` no se ve**: el cambio entra en el siguiente pintado. `setCssAttribute`, `relayout`, `refresh` y `loadCollection` solos contestan `result:true` y el color **no cambia**; `loadIncludeFile` no admite css (`Unknown script language css`). |
|
|
546
548
|
|
|
547
549
|
`uploadFile`: `destinationPath` cuelga del directorio de datos del framework, no del de la app.
|
|
548
550
|
La app vive en `app_<nombre en minúsculas>/`, así que hay que dar `app_holamundo/functions.js`; con
|
|
@@ -567,6 +569,20 @@ relayout o refresh según el atributo. **(iOS)** también es legado: solo WebSoc
|
|
|
567
569
|
### `setCssAttribute` / `deleteCssAttribute` — solo Android
|
|
568
570
|
`fileName`, `className`, `attributeName` (+ `attributeValue` en el set).
|
|
569
571
|
|
|
572
|
+
### `loadCssFile` / `unloadCssFile` — solo Android, desde 5.0.5.7dev
|
|
573
|
+
`loadCssFile`: `fileName` (sí), `encoding` (no, `UTF-8`), `conditions` (no, vacío = siempre),
|
|
574
|
+
`strictMode` (no, `false`). Carga una hoja que **ya está en el dispositivo** (súbela antes con
|
|
575
|
+
`uploadFile`), como un `<style>` del `<app>`, y relayouta las ventanas visibles. Si ya estaba cargada
|
|
576
|
+
con las mismas `conditions`, la **sustituye** en su sitio: así se aplica una hoja recién subida, sin
|
|
577
|
+
`unloadCssFile` antes. `unloadCssFile`: `fileName` (sí); quita la hoja y relayouta; una que no está
|
|
578
|
+
cargada responde éxito.
|
|
579
|
+
|
|
580
|
+
**Medido (5.0.5.7dev, emulador):** `uploadFile` + `loadCssFile fileName=default-colors.css` cambia el
|
|
581
|
+
color de un botón en ~50 ms, sin relanzar. Un nombre que no existe: `result:false` con
|
|
582
|
+
`FileNotFoundException`. Sin app cargada contestan `App is not running` en `status`. En 5.0.5.5dev el
|
|
583
|
+
comando no existe (`Unknown command: loadCssFile`): ahí, las funciones de XOne por `runScript` + `refresh`
|
|
584
|
+
(tabla de arriba).
|
|
585
|
+
|
|
570
586
|
### `refresh` / `relayout` — solo Android
|
|
571
587
|
En iOS las ramas existen en el dispatcher pero están **vacías**: no hacen nada.
|
|
572
588
|
|
|
@@ -13,9 +13,13 @@
|
|
|
13
13
|
* devuelve a la versión anterior.
|
|
14
14
|
* JavaScript (.js) → `loadIncludeFile` con compile=true. Subir el fichero NO basta,
|
|
15
15
|
* y `loadCollection` tampoco lo recarga.
|
|
16
|
-
* CSS
|
|
17
|
-
*
|
|
18
|
-
*
|
|
16
|
+
* CSS (.css) → el comando `loadCssFile` (framework 5.0.5.7dev en adelante): la
|
|
17
|
+
* sustituye y relayouta solo. En uno anterior, que contesta
|
|
18
|
+
* `Unknown command`, `runScript` con `appData.unloadCssFile` +
|
|
19
|
+
* `appData.loadCssFile` y un `refresh`. Medidos los dos: el color
|
|
20
|
+
* cambia SIN relanzar. Lo que no sirve, también medido:
|
|
21
|
+
* `setCssAttribute`, `relayout`, `refresh` o `loadCollection` solos.
|
|
22
|
+
* .ini, app.xml, mappings → relanzar la app (`launchApplication`): solo se leen al cargarla.
|
|
19
23
|
*
|
|
20
24
|
* **`result:true` es «aceptado», no «aplicado».** Lo que dice si funcionó es el árbol de
|
|
21
25
|
* controles, y por eso el script lo pide al acabar. Un atributo que XOne no conoce tampoco da
|
|
@@ -202,6 +206,7 @@ if (cambiados.length === 0) {
|
|
|
202
206
|
function clase(rel) {
|
|
203
207
|
const ext = extname(rel).toLowerCase();
|
|
204
208
|
if (ext === ".js") return "js";
|
|
209
|
+
if (ext === ".css") return "css";
|
|
205
210
|
if (ext === ".xne") return /<coll[\s>]/.test(readFileSync(rel, "latin1")) ? "coleccion" : "relanzar";
|
|
206
211
|
return "relanzar";
|
|
207
212
|
}
|
|
@@ -248,6 +253,7 @@ for (const rel of cambiados) {
|
|
|
248
253
|
const clases = new Map(subidos.map((f) => [f, clase(f)]));
|
|
249
254
|
const hayQueRelanzar = [...clases.values()].includes("relanzar");
|
|
250
255
|
const fallos = [];
|
|
256
|
+
let necesitaRefresh = false;
|
|
251
257
|
|
|
252
258
|
if (hayQueRelanzar) {
|
|
253
259
|
const r = mandar("launchApplication", { appName: app });
|
|
@@ -263,12 +269,39 @@ if (hayQueRelanzar) {
|
|
|
263
269
|
const r = mandar("loadCollection", { xmlNode: xmlEnUtf8(readFileSync(f)).toString("base64"), encoding: "UTF-8" });
|
|
264
270
|
if (r.result !== true) fallos.push(`${f}: loadCollection ${r.exceptionMessage ?? r.status ?? "sin motivo"}`);
|
|
265
271
|
else console.log(` ${f} → colección recargada en caliente`);
|
|
272
|
+
} else if (c === "css") {
|
|
273
|
+
// La codificación de SUS bytes: `loadCssFile` asume UTF-8 si no se le dice.
|
|
274
|
+
let tabla = "UTF-8";
|
|
275
|
+
try {
|
|
276
|
+
new TextDecoder("utf-8", { fatal: true }).decode(readFileSync(f));
|
|
277
|
+
} catch {
|
|
278
|
+
tabla = "windows-1252";
|
|
279
|
+
}
|
|
280
|
+
const nativo = mandar("loadCssFile", { fileName: f, encoding: tabla });
|
|
281
|
+
if (nativo.result === true) {
|
|
282
|
+
console.log(` ${f} → estilos recargados en caliente`);
|
|
283
|
+
} else if (/Unknown command/i.test(String(nativo.exceptionMessage ?? nativo.status ?? ""))) {
|
|
284
|
+
// Framework anterior a 5.0.5.7dev: las mismas funciones de XOne, por `runScript`, y un
|
|
285
|
+
// `refresh` (abajo) para que se pinte.
|
|
286
|
+
const script = `appData.unloadCssFile(${JSON.stringify(f)}); appData.loadCssFile(${JSON.stringify(f)}, ${JSON.stringify(tabla)}); return "ok";`;
|
|
287
|
+
const r = mandar("runScript", { scriptLanguage: "javascript", scriptText: Buffer.from(script, "utf8").toString("base64") });
|
|
288
|
+
if (r.result !== true) fallos.push(`${f}: loadCssFile ${r.exceptionMessage ?? r.status ?? "sin motivo"}`);
|
|
289
|
+
else {
|
|
290
|
+
necesitaRefresh = true;
|
|
291
|
+
console.log(` ${f} → estilos recargados en caliente (por runScript)`);
|
|
292
|
+
}
|
|
293
|
+
} else {
|
|
294
|
+
fallos.push(`${f}: loadCssFile ${nativo.exceptionMessage ?? nativo.status ?? "sin motivo"}`);
|
|
295
|
+
}
|
|
266
296
|
} else {
|
|
267
297
|
const r = mandar("loadIncludeFile", { file: f, language: "javascript", encoding: "UTF-8", compile: true });
|
|
268
298
|
if (r.result !== true) fallos.push(`${f}: loadIncludeFile ${r.exceptionMessage ?? r.status ?? "sin motivo"}`);
|
|
269
299
|
else console.log(` ${f} → JavaScript recargado`);
|
|
270
300
|
}
|
|
271
301
|
}
|
|
302
|
+
// Por `runScript` los estilos se ven en el SIGUIENTE pintado: sin este `refresh`, no cambia nada
|
|
303
|
+
// (medido). El comando `loadCssFile` relayouta él solo.
|
|
304
|
+
if (necesitaRefresh) mandar("refresh");
|
|
272
305
|
dormir(1);
|
|
273
306
|
}
|
|
274
307
|
|