supabase-cli/internal/utils/denos/extract.ts

48 lines
1.5 KiB
TypeScript

import * as path from "https://deno.land/std@0.127.0/path/mod.ts";
import { readAll } from "https://deno.land/std@0.162.0/streams/conversion.ts";
import { Parser } from "https://deno.land/x/eszip@v0.30.0/mod.ts";
async function write(p: string, content: string) {
await Deno.mkdir(path.dirname(p), { recursive: true });
await Deno.writeTextFile(p, content);
}
async function loadEszip(bytes: Uint8Array) {
const parser = await Parser.createInstance();
const specifiers = await parser.parseBytes(bytes);
await parser.load();
return { parser, specifiers };
}
async function extractEszip(
destPath: string,
entrypointUrl: string,
parser: Parser,
specifiers: string[],
) {
const entrypointPath = path.fromFileUrl(entrypointUrl);
const basePath = path.dirname(entrypointPath);
for (const specifier of specifiers) {
// skip remote dependencies
if (!specifier.startsWith("file:")) {
continue;
}
console.error(specifier);
const module = await parser.getModuleSource(specifier);
const absPath = path.fromFileUrl(specifier);
const relPath = path.relative(basePath, absPath);
const dest = path.join(destPath, relPath);
console.info(path.resolve(dest));
await write(dest, module);
}
}
async function extractSource(destPath: string, entrypointUrl: string) {
const buf = await readAll(Deno.stdin);
const { parser, specifiers } = await loadEszip(buf);
await extractEszip(destPath, entrypointUrl, parser, specifiers);
}
extractSource(...Deno.args);