Print Svelte AST nodes as a string.
A.k.a. parse
in reverse.
This is what you need to create codemods - e.g. for migration between Svelte versions syntaxes.
https://xeho91.github.io/svelte-ast-print
This package depends on:
esrap
for printing ESTree specification-compliant AST nodeszimmerframe
for walking on the AST nodes
Warning
TypeScript isn't supported, yet.
See & subscribe to progress on issue #86 - Add support for TypeScript.
Important
It ignores any previous formatting.
The current focus is to be able to write codemods as soon as possible - because right now, there are no alternatives.
If you need to format modified and stringified Svelte AST, use available formatters for Svelte:
- Biome -
β οΈ has partial support - Prettier with
prettier-plugin-svelte
See Formatting section for examples.
Note
This package is in beta stage.
See Roadmap
-
Use the package manager of your choice to install this package:
npm
npm install svelte-ast-print
yarn
yarn add svelte-ast-print
pnpm
pnpm add svelte-ast-print
bun
bun add svelte-ast-print
-
Incorporate it into your project, for example using Node.js and with the Svelte
parse
method:import fs from "node:fs"; import { print } from "svelte-ast-print"; import { parse } from "svelte/compiler"; const originalSvelteCode = fs.readFileSync("src/App.svelte", "utf-8"); let svelteAST = parse(originalSvelteCode, { modern: true }); // π For now, only modern is supported. // By default is 'false'. // Is it planned to be 'true' from Svelte v6+ // ... // Do some modifications on this AST... // e.g. transform `<slot />` to `{@render children()}` // ... const output = print(svelteAST); // AST is now a stringified code output! π fs.writeFileSync("src/App.svelte", output, { encoding: " utf-8" });
Important
When using parse
from svelte
, please remember about passing modern: true
to options (second argument).
This option is only available starting svelte@5
Example:
import { parse } from "svelte/compiler";
parse(code, { modern: true });
// π Don't forget about this
You can omit it from Svelte v6
- source.
Until the package will support formatting feature option... below are the current and simplified workaround examples on how to get printed output formatted to your needs.
Two dependencies are required:
Follow prettier-plugin-svelte
Setup guide
on how to configure Prettier for Svelte.
import { format } from "prettier";
import { parse } from "svelte/compiler";
import { print } from "svelte-ast-print";
let code = "..." // π Raw Svelte code
let ast = parse(code, { modern: true });
// π Don't forget about this, you can omit in Svelte v6
// .. work with AST - transformations, etc. ...
const output = print(ast);
const formatted = await format(output {
// Two ways to provide options:
// 1. provide file path to prettier config
filepath: "path/to/your/prettier/config/file",
// or..
// 2. See `prettier-plugin-svelte` Setup guide for more info
parser: "svelte",
plugins: ["svelte-plugin-prettier"]
});
... and Node.js API.
import fs from "node:fs";
import childProcess from "node:child_process";
import { parse } from "svelte/compiler";
import { print } from "svelte-ast-print";
const code = fs.readFileSync("./Button.svelte", "utf-8");
let ast = parse(code, { modern: true });
// π Don't forget about this, you can omit in Svelte v6
// .. work with AST - transformations, etc. ...
const output = print(ast);
fs.writeFileSync("./Button.svelte", output, "utf-8");
childProcess.spawnSync("prettier", ["./Button.svelte", "--write"], {
stdio: "inherit",
encoding: "utf-8",
});
Warning
This sub-section is incomplete. Feel free to contribute!
Take a look at contributing guide.
This project follows the all-contributors specification. Contributions of any kind are welcome!
π to these people:
Mateusz Kadlubowski π» π§ π π |
Manuel π |
Jeppe Reinhold π» |
If you don't have time, but you need this project to work, or resolve an existing issue, consider sponsorship.
Mateusz "xeho91" Kadlubowski
This project is licensed under the MIT License.