73 lines
2.7 KiB
JavaScript
73 lines
2.7 KiB
JavaScript
import http from 'node:http';
|
|
|
|
const originalCreateServer = http.createServer.bind(http);
|
|
const originalWriteHead = http.ServerResponse.prototype.writeHead;
|
|
const originalEnd = http.ServerResponse.prototype.end;
|
|
|
|
const layoutPatch = `<style id="layout-v3">
|
|
.card{padding:20px}
|
|
.add{grid-template-columns:minmax(0,1fr) 132px 92px;align-items:stretch;gap:10px}
|
|
.add input,.add select,.add button{height:46px}
|
|
.task{grid-template-columns:40px minmax(0,1fr) 82px;gap:10px 12px;align-items:start;padding:16px 0}
|
|
.task>form:first-child{margin-top:2px}
|
|
.task>form:first-child button{width:40px;height:40px;padding:0}
|
|
.inline-edit{grid-template-columns:minmax(0,1fr) 126px 72px;gap:8px;align-items:center}
|
|
.inline-edit input,.inline-edit select,.inline-edit button{height:44px}
|
|
.actions{align-self:start;justify-content:flex-end}
|
|
.actions button{height:44px;min-width:76px}
|
|
.priority{margin-top:8px}
|
|
@media(max-width:700px){
|
|
.wrap{padding:24px 14px}
|
|
.card{padding:14px}
|
|
.add{grid-template-columns:minmax(0,1fr) 120px}
|
|
.add button{grid-column:1/-1}
|
|
.task{grid-template-columns:40px minmax(0,1fr)}
|
|
.actions{grid-column:2;justify-content:flex-start}
|
|
.inline-edit{grid-template-columns:minmax(0,1fr) 110px}
|
|
.inline-edit button{grid-column:1/-1;width:max-content}
|
|
}
|
|
@media(max-width:480px){
|
|
.add{grid-template-columns:1fr}
|
|
.add select,.add button{grid-column:auto}
|
|
.inline-edit{grid-template-columns:1fr}
|
|
.inline-edit button{grid-column:auto;width:100%}
|
|
.actions{grid-column:1/-1;margin-left:52px}
|
|
}
|
|
</style>`;
|
|
|
|
http.createServer = function (...args) {
|
|
const listenerIndex = args.findIndex(value => typeof value === 'function');
|
|
if (listenerIndex >= 0) {
|
|
const listener = args[listenerIndex];
|
|
args[listenerIndex] = (req, res) => {
|
|
const pathname = String(req.url || '').split('?')[0];
|
|
if (pathname === '/favicon.ico') {
|
|
res.writeHead(204, { 'cache-control': 'public, max-age=86400' });
|
|
return res.end();
|
|
}
|
|
return listener(req, res);
|
|
};
|
|
}
|
|
return originalCreateServer(...args);
|
|
};
|
|
|
|
http.ServerResponse.prototype.writeHead = function (statusCode, ...args) {
|
|
if (statusCode === 400 && String(this.req?.url || '').startsWith('/callback')) {
|
|
this.setHeader('Location', '/login');
|
|
statusCode = 302;
|
|
}
|
|
return originalWriteHead.call(this, statusCode, ...args);
|
|
};
|
|
|
|
http.ServerResponse.prototype.end = function (chunk, encoding, callback) {
|
|
if (typeof chunk === 'string') {
|
|
chunk = chunk.replaceAll('Arrowstack Tasks', 'i love you tasks');
|
|
if (chunk.includes('</head>')) {
|
|
chunk = chunk.replace('</head>', `${layoutPatch}</head>`);
|
|
}
|
|
}
|
|
return originalEnd.call(this, chunk, encoding, callback);
|
|
};
|
|
|
|
await import('./server.js');
|