leigna
leignaโ€ข14mo ago

Anyway to use deno fmt within a script itself without having to call deno again?

I am working on a code generator and I'd like to run a string through deno fmt before I save to file. I've seen how to do it by calling deno to format the file, but wondering if I could do this within the script itself? See this function here:
export function generateTSContent({
schema,
compressedSchema,
propertyMappingTable,
enumMappingTables,
compressedInterfaceName,
originalTSInterface,
compressedTSInterface,
}: {
schema: any;
compressedSchema: any;
propertyMappingTable: KeyValue;
enumMappingTables: { [key: string]: KeyValue };
interfaceName: string;
compressedInterfaceName: string;
originalTSInterface: string;
compressedTSInterface: string;
}): string {
return `import Ajv from "https://esm.sh/ajv@8.12.0";
import addFormats from "https://esm.sh/ajv-formats@2.1.1";
${originalTSInterface}
${compressedTSInterface}
export const schemaString = ${JSON.stringify(schema)};
export const schemaCompressedString = ${JSON.stringify(compressedSchema)};
export const propertyMappingTable = ${JSON.stringify(propertyMappingTable)};
export const enumMappingTables = ${JSON.stringify(enumMappingTables)};
const ajv = new Ajv({ allErrors: true });
addFormats(ajv);
const validate = ajv.compile(schemaCompressedString);
export function validateData(data: ${compressedInterfaceName}): { valid: boolean; errors: any } {
const valid = validate(data);
return {
valid,
errors: validate.errors,
};
}
`;
}
export function generateTSContent({
schema,
compressedSchema,
propertyMappingTable,
enumMappingTables,
compressedInterfaceName,
originalTSInterface,
compressedTSInterface,
}: {
schema: any;
compressedSchema: any;
propertyMappingTable: KeyValue;
enumMappingTables: { [key: string]: KeyValue };
interfaceName: string;
compressedInterfaceName: string;
originalTSInterface: string;
compressedTSInterface: string;
}): string {
return `import Ajv from "https://esm.sh/ajv@8.12.0";
import addFormats from "https://esm.sh/ajv-formats@2.1.1";
${originalTSInterface}
${compressedTSInterface}
export const schemaString = ${JSON.stringify(schema)};
export const schemaCompressedString = ${JSON.stringify(compressedSchema)};
export const propertyMappingTable = ${JSON.stringify(propertyMappingTable)};
export const enumMappingTables = ${JSON.stringify(enumMappingTables)};
const ajv = new Ajv({ allErrors: true });
addFormats(ajv);
const validate = ajv.compile(schemaCompressedString);
export function validateData(data: ${compressedInterfaceName}): { valid: boolean; errors: any } {
const valid = validate(data);
return {
valid,
errors: validate.errors,
};
}
`;
}
I'd like this string passed through deno fmt before saving, within the deno Script itself. I then process that string content like this:
const tempFilePath = "./temp.ts";
await Deno.writeTextFile(tempFilePath, tsContent);
const command = new Deno.Command("deno", {
args: ["fmt", tempFilePath],
});
const child = command.spawn();
await child.status;
const formattedTsContent = await Deno.readTextFile(tempFilePath);
await Deno.remove(tempFilePath);
const tempFilePath = "./temp.ts";
await Deno.writeTextFile(tempFilePath, tsContent);
const command = new Deno.Command("deno", {
args: ["fmt", tempFilePath],
});
const child = command.spawn();
await child.status;
const formattedTsContent = await Deno.readTextFile(tempFilePath);
await Deno.remove(tempFilePath);
I dont want to allow Deno.Command, so was wondering if another way. Thank you.
6 Replies
Mrcool ๐Ÿ‡ต๐Ÿ‡ธ
nope unfortunately there are issues on the deno repo about adding such functions (exposing deno cli to scripts) but it never gained any traction
leigna
leignaOPโ€ข14mo ago
Okay thank you! This was the workaround i ended up with, no temp file and just fmt the whole directory
// After the loop has finished processing all schema files, format them all at once
const command = new Deno.Command("deno", {
args: ["fmt", "./schemas"],
});
const child = command.spawn();
await child.status;
// After the loop has finished processing all schema files, format them all at once
const command = new Deno.Command("deno", {
args: ["fmt", "./schemas"],
});
const child = command.spawn();
await child.status;
leigna
leignaOPโ€ข14mo ago
Im really not too familiar with this stuff I find Deno great for prototyping ideas as its brilliant but not too familiar with internals etc, but does my logic sound correct on this? Here is the rust code for fmt: https://github.com/denoland/deno/blob/main/cli/tools/fmt.rs I found this blog: https://deno.com/blog/wasmbuild maybe i could just try this with the deno cli code i will have a look
GitHub
deno/cli/tools/fmt.rs at main ยท denoland/deno
A modern runtime for JavaScript and TypeScript. Contribute to denoland/deno development by creating an account on GitHub.
Deno Blog
wasmbuild - Using Rust in Deno and Web Apps
An easier way to build Rust for Deno and the Web.
Mrcool ๐Ÿ‡ต๐Ÿ‡ธ
Deno uses dprint internally which uses wasm plugins to format Turns out the author already expose deno wasm wrapper
Mrcool ๐Ÿ‡ต๐Ÿ‡ธ
GitHub
GitHub - dprint/js-formatter: JS formatter for dprint Wasm plugins.
JS formatter for dprint Wasm plugins. Contribute to dprint/js-formatter development by creating an account on GitHub.
leigna
leignaOPโ€ข14mo ago
great thank you I will have a look at that! ๐Ÿ˜„