bewcloud/lib/utils/misc.ts

65 lines
1.8 KiB
TypeScript
Raw Normal View History

import { serveFile } from '@std/http/file-server';
import { transpile } from 'deno/emit';
import sass from 'sass';
async function transpileTs(content: string, specifier: URL) {
const urlStr = specifier.toString();
const result = await transpile(specifier, {
load(specifier: string) {
if (specifier !== urlStr) {
return Promise.resolve({ kind: 'module', specifier, content: '' });
}
return Promise.resolve({ kind: 'module', specifier, content });
},
});
return result.get(urlStr) || '';
}
export async function serveFileWithTs(request: Request, filePath: string, extraHeaders?: ResponseInit['headers']) {
const response = await serveFile(request, filePath);
if (response.status !== 200) {
return response;
}
const tsCode = await response.text();
const jsCode = await transpileTs(tsCode, new URL('file:///src.ts'));
const { headers } = response;
headers.set('content-type', 'application/javascript; charset=utf-8');
headers.delete('content-length');
return new Response(jsCode, {
status: response.status,
statusText: response.statusText,
headers,
...(extraHeaders || {}),
});
}
function transpileSass(content: string) {
const compiler = sass(content);
return compiler.to_string('compressed') as string;
}
export async function serveFileWithSass(request: Request, filePath: string, extraHeaders?: ResponseInit['headers']) {
const response = await serveFile(request, filePath);
if (response.status !== 200) {
return response;
}
const sassCode = await response.text();
const cssCode = transpileSass(sassCode);
const { headers } = response;
headers.set('content-type', 'text/css; charset=utf-8');
headers.delete('content-length');
return new Response(cssCode, {
status: response.status,
statusText: response.statusText,
headers,
...(extraHeaders || {}),
});
}