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

8 messages · Page 1 of 1 (latest)

limber apex
#

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,
};
}
`;
}

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);

I dont want to allow Deno.Command, so was wondering if another way.

Thank you.

scarlet lodge
#

nope unfortunately there are issues on the deno repo about adding such functions (exposing deno cli to scripts) but it never gained any traction

limber apex
#

Okay thank you!

limber apex
#

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;
limber apex
#

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

A modern runtime for JavaScript and TypeScript. Contribute to denoland/deno development by creating an account on GitHub.

Deno Blog

An easier way to build Rust for Deno and the Web.

scarlet lodge
#

Deno uses dprint internally which uses wasm plugins to format

#

Turns out the author already expose deno wasm wrapper