Add support for refreshing component debug on ts build
This commit is contained in:
parent
c44047d21e
commit
f90e7702e4
8
package-lock.json
generated
8
package-lock.json
generated
@ -15,7 +15,7 @@
|
|||||||
"@koa/router": "^12.0.1",
|
"@koa/router": "^12.0.1",
|
||||||
"@playwright/test": "^1.36.1",
|
"@playwright/test": "^1.36.1",
|
||||||
"@sealcode/jdd": "^0.2.12",
|
"@sealcode/jdd": "^0.2.12",
|
||||||
"@sealcode/sealgen": "^0.11.7",
|
"@sealcode/sealgen": "^0.11.8",
|
||||||
"@sealcode/ts-predicates": "^0.4.3",
|
"@sealcode/ts-predicates": "^0.4.3",
|
||||||
"@types/kill-port": "^2.0.0",
|
"@types/kill-port": "^2.0.0",
|
||||||
"get-port": "^7.0.0",
|
"get-port": "^7.0.0",
|
||||||
@ -1304,9 +1304,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@sealcode/sealgen": {
|
"node_modules/@sealcode/sealgen": {
|
||||||
"version": "0.11.7",
|
"version": "0.11.8",
|
||||||
"resolved": "https://registry.npmjs.org/@sealcode/sealgen/-/sealgen-0.11.7.tgz",
|
"resolved": "https://registry.npmjs.org/@sealcode/sealgen/-/sealgen-0.11.8.tgz",
|
||||||
"integrity": "sha512-JpvVkBCaO2eNTvdRB3J6gs6enYCzMWByaDAj+KmLSifOUqcN1M4DQ5nzF6mAA8q0Aabwe7KDxSHb3b9rPMtYnw==",
|
"integrity": "sha512-vhEEOcYSlZo+uxSJgWMYp8mZ38Op2EGANRoeF7Dc8YxpyQCI43WUXyXWZM6UyR4/SOWJy1NQMdF+khguGNtlGg==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@koa/router": "^12.0.1",
|
"@koa/router": "^12.0.1",
|
||||||
"@sealcode/ts-predicates": "^0.4.3",
|
"@sealcode/ts-predicates": "^0.4.3",
|
||||||
|
@ -36,7 +36,7 @@
|
|||||||
"@koa/router": "^12.0.1",
|
"@koa/router": "^12.0.1",
|
||||||
"@playwright/test": "^1.36.1",
|
"@playwright/test": "^1.36.1",
|
||||||
"@sealcode/jdd": "^0.2.12",
|
"@sealcode/jdd": "^0.2.12",
|
||||||
"@sealcode/sealgen": "^0.11.7",
|
"@sealcode/sealgen": "^0.11.8",
|
||||||
"@sealcode/ts-predicates": "^0.4.3",
|
"@sealcode/ts-predicates": "^0.4.3",
|
||||||
"@types/kill-port": "^2.0.0",
|
"@types/kill-port": "^2.0.0",
|
||||||
"get-port": "^7.0.0",
|
"get-port": "^7.0.0",
|
||||||
|
@ -79,12 +79,68 @@ export default function html(
|
|||||||
"turbo:morph",
|
"turbo:morph",
|
||||||
cleanup_css
|
cleanup_css
|
||||||
);
|
);
|
||||||
const socket = new WebSocket("ws://localhost:60808");
|
|
||||||
socket.onmessage = () => {
|
const sleep = (time) =>
|
||||||
const new_link = make_new_link();
|
new Promise((resolve) => {
|
||||||
new_link.onload = cleanup_css;
|
setTimeout(resolve, time);
|
||||||
document.querySelector("head").appendChild(new_link);
|
});
|
||||||
};
|
|
||||||
|
let last_known_start_timestamp = 0;
|
||||||
|
|
||||||
|
async function wait_for_app_restart() {
|
||||||
|
while (true) {
|
||||||
|
const { started_at, status } = await fetch(
|
||||||
|
"/status.json"
|
||||||
|
)
|
||||||
|
.then((r) => r.json())
|
||||||
|
.catch(() => ({
|
||||||
|
started_at: last_known_start_timestamp,
|
||||||
|
}));
|
||||||
|
if (started_at !== last_known_start_timestamp) {
|
||||||
|
last_known_start_timestamp = started_at;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
await sleep(100);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
(async function () {
|
||||||
|
const { started_at, status } = await fetch(
|
||||||
|
"/status.json"
|
||||||
|
).then((r) => r.json());
|
||||||
|
last_known_start_timestamp = started_at;
|
||||||
|
const { port, watch } = await fetch(
|
||||||
|
"/dist/notifier.json"
|
||||||
|
).then((r) => r.json());
|
||||||
|
if (!watch) {
|
||||||
|
console.warning(
|
||||||
|
"Not running auto refresh on watch because the build process is not running in watch mode"
|
||||||
|
);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const socket = new WebSocket(\`ws://localhost:\${port}\`);
|
||||||
|
socket.onmessage = async (message) => {
|
||||||
|
if (message.data === "css") {
|
||||||
|
const new_link = make_new_link();
|
||||||
|
new_link.onload = cleanup_css;
|
||||||
|
document
|
||||||
|
.querySelector("head")
|
||||||
|
.appendChild(new_link);
|
||||||
|
}
|
||||||
|
if (message.data === "ts") {
|
||||||
|
document.documentElement.classList.add(
|
||||||
|
"restarting"
|
||||||
|
);
|
||||||
|
await wait_for_app_restart();
|
||||||
|
document.documentElement.dispatchEvent(
|
||||||
|
new Event("ts-rebuilt")
|
||||||
|
);
|
||||||
|
document.documentElement.classList.remove(
|
||||||
|
"restarting"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
})();
|
||||||
</script>`
|
</script>`
|
||||||
: ""}
|
: ""}
|
||||||
</body>
|
</body>
|
||||||
|
@ -18,6 +18,12 @@
|
|||||||
width: var(--resizable-column-width);
|
width: var(--resizable-column-width);
|
||||||
overflow-x: auto;
|
overflow-x: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
transition: transform 200ms, opacity 200ms;
|
||||||
|
&.restarting {
|
||||||
|
transform: scale(0.99);
|
||||||
|
opacity: 0.6;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.component-preview-parameters {
|
.component-preview-parameters {
|
||||||
@ -25,3 +31,9 @@
|
|||||||
background-color: #80808024;
|
background-color: #80808024;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.component-preview {
|
||||||
|
* {
|
||||||
|
transition: all 200ms;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -219,7 +219,7 @@ export default new (class ComponentsPage extends StatefulPage<State, typeof acti
|
|||||||
const component =
|
const component =
|
||||||
registry.get(state.component) || Object.values(all_components)[0];
|
registry.get(state.component) || Object.values(all_components)[0];
|
||||||
return (
|
return (
|
||||||
<div class="two-column">
|
<div class="two-column" id="component-debugger">
|
||||||
<div class="resizable">
|
<div class="resizable">
|
||||||
{/*The below button has to be here in order for it to be the default behavior */}
|
{/*The below button has to be here in order for it to be the default behavior */}
|
||||||
<input type="submit" value="Preview" />
|
<input type="submit" value="Preview" />
|
||||||
@ -282,7 +282,7 @@ export default new (class ComponentsPage extends StatefulPage<State, typeof acti
|
|||||||
})();
|
})();
|
||||||
</script>`
|
</script>`
|
||||||
}
|
}
|
||||||
<div>
|
<div class="component-preview">
|
||||||
<fieldset>
|
<fieldset>
|
||||||
<legend>Preview</legend>
|
<legend>Preview</legend>
|
||||||
{render(
|
{render(
|
||||||
@ -292,13 +292,17 @@ export default new (class ComponentsPage extends StatefulPage<State, typeof acti
|
|||||||
)}
|
)}
|
||||||
</fieldset>
|
</fieldset>
|
||||||
</div>
|
</div>
|
||||||
|
{
|
||||||
|
/* HTML */ `<script>
|
||||||
|
document.documentElement.addEventListener("ts-rebuilt", () => {
|
||||||
|
document
|
||||||
|
.querySelector("#component-debugger")
|
||||||
|
.closest("form")
|
||||||
|
.requestSubmit();
|
||||||
|
});
|
||||||
|
</script>`
|
||||||
|
}
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
// wrapInForm(state: State, content: Templatable): Templatable {
|
|
||||||
// return tempstream/* HTML */ `<turbo-frame id="components">
|
|
||||||
// ${super.wrapInForm(state, content)}
|
|
||||||
// </turbo-frame> `;
|
|
||||||
// }
|
|
||||||
})();
|
})();
|
||||||
|
@ -4,11 +4,16 @@ import { MainView } from "./common/main-view.js";
|
|||||||
import mountAutoRoutes from "./routes.js";
|
import mountAutoRoutes from "./routes.js";
|
||||||
|
|
||||||
export const mainRouter = (router: Router): void => {
|
export const mainRouter = (router: Router): void => {
|
||||||
|
const started_at = Date.now(); // necessary to detect aplication restarts
|
||||||
|
|
||||||
router.get("/", Middlewares.extractContext(), async (ctx) => {
|
router.get("/", Middlewares.extractContext(), async (ctx) => {
|
||||||
ctx.body = MainView(ctx);
|
ctx.body = MainView(ctx);
|
||||||
});
|
});
|
||||||
|
|
||||||
router.use(Middlewares.extractContext());
|
router.use(Middlewares.extractContext());
|
||||||
|
router.get("/status.json", Middlewares.extractContext(), async (ctx) => {
|
||||||
|
ctx.body = { status: ctx.$app.status, started_at };
|
||||||
|
});
|
||||||
|
|
||||||
mountAutoRoutes(router);
|
mountAutoRoutes(router);
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user