prettier-plugin-pdx-script weekly downloads statistics
By Myriad4Link · npm · Prettier plugins
Prettier plugin for formatting PDXScript (Paradox game script) files
prettier-plugin-pdx-script has 1 recorded weekly downloads on npm, a decrease of 88.9% over the past 30 days, ranking #2300 of 2,322 tracked listings.
About prettier-plugin-pdx-script
prettier-plugin-pdx-script
A Prettier plugin for formatting PDXScript (Paradox game script) files. Powered by tree-sitter-pdx_script.
Overview
PDXScript is the scripting language used in Paradox Interactive games such as Victoria 3, Hearts of Iron IV, Stellaris, Europa Universalis IV, and Crusader Kings III. These scripts are distributed as .txt files with nested key-value and block structures.
This plugin provides automatic, consistent formatting for PDXScript files using Prettier. It uses a tree-sitter WASM parser to reliably parse PDXScript, then applies opinionated formatting rules. The parser is compiled from tree-sitter-pdx_script, a tree-sitter grammar for Paradox script files.
Installation
npm install --save-dev prettier-plugin-pdx-script
Prettier will automatically discover the plugin. No additional configuration is needed.
Usage
# Format a single file
npx prettier --write path/to/file.txt
# Check formatting without writing
npx prettier --check path/to/file.txt
# Format all .txt files in a directory
npx prettier --write "path/to/scripts/**/*.txt"
Formatting Rules
| Rule | Before | After |
|---|---|---|
| Indentation | 4 spaces or mixed | Tabs (one per nesting level) |
| Empty blocks | my_decl = { } | my_decl = {} |
| Block values | key = { nested = val } | key = {<br> nested = val<br>} |
| Comments | # comment | # comment |
| Operators | Preserved as-is | =, >, < all supported |
Example
Input:
my_declaration={
key1= value1
key2 =value2
nested={
inner_key = "hello world"
}
# a comment
}
another_decl = { }
Output:
my_declaration = {
key1 = value1
key2 = value2
nested = {
inner_key = "hello world"
}
# a comment
}
another_decl = {}
Architecture
The plugin follows the standard Prettier plugin architecture with three components:
Input Text
│
▼
┌──────────────┐
│ Parser │ tree-sitter WASM parser + AST conversion
│ (index.ts) │ Converts tree-sitter SyntaxNodes → plain objects
└──────┬───────┘
│
▼
┌──────────────┐
│ Printer │ Walks the AST, produces Prettier Doc output
│(printer.ts) │ Handles each node type with specific formatting rules
└──────┬───────┘
│
▼
Formatted Text
Key Design Decisions
-
Tree-to-plain-object conversion: Tree-sitter nodes use JavaScript getters (e.g.,
node.childrenis computed), but Prettier'spath.map/path.calltraverse node properties directly. TheconvertTree()function inindex.tsconverts the tree-sitter AST to plain objects that Prettier can navigate. -
Tab indentation: Paradox script files conventionally use tab indentation, which is preserved in this plugin.
-
Operator preservation: The
=,>, and<operators in key-value pairs are preserved from the source. They are anonymous tokens in tree-sitter (not innamedChildren) and are found by iteratingnode.children.
CJS / ESM Dual Support
This package ships both ESM and CJS entry points:
{
"main": "./dist/index.cjs",
"module": "./dist/index.js",
"exports": {
".": {
"import": "./dist/index.js",
"require": "./dist/index.cjs"
},
"./dist/tree-sitter/tree-sitter-pdx_script.wasm": "./dist/tree-sitter/tree-sitter-pdx_script.wasm",
"./package.json": "./package.json"
}
}
ESM consumers use import, CJS consumers use require() — no dynamic await import() needed.
The grammar WASM is also accessible via require.resolve("prettier-plugin-pdx-script/dist/tree-sitter/tree-sitter-pdx_script.wasm") for use with setGrammarBinary().
API
setGrammarBinary(loader)
Override the grammar WASM binary loader. Use this when bundling the plugin (e.g. in a VS Code extension) where the WASM file cannot be loaded from the plugin's package directory.
import { setGrammarBinary } from "prettier-plugin-pdx-script";
// Load from a bundled Uint8Array
setGrammarBinary(() => myWasmBinary);
getGrammarBinary()
Get the current grammar binary loader function. Useful for wrapping the default loader or testing.
setLocateFile(fn)
Override the locateFile callback used to locate web-tree-sitter's own runtime WASM (tree-sitter.wasm). This is passed directly to web-tree-sitter's Parser.init({ locateFile }).
Use this when bundling the plugin and the default resolution (relative to scriptDir) does not point to the correct location.
import { setLocateFile } from "prettier-plugin-pdx-script";
setLocateFile((fileName, _scriptDir) => {
return path.join(__dirname, "wasm", fileName);
});
Important: setLocateFile() must be called before any parse() invocation (same constraint as setGrammarBinary()).
getLocateFile()
Get the current locateFile callback. Useful for wrapping the default resolver or testing.
Bundling
When bundling this plugin (e.g. in a VS Code extension or webpack/esbuild build), the default WASM loading may fail. There are two WASM files to account for:…
Description from the npm listing.
- prettier
- prettier-plugin
- pdxscript
- paradox
- hoi4
- tree-sitter
- formatter
README badge
Show your rank in a README or on your website. The badge updates automatically.
Charts
Images: 30d · 1y · all time · 1600×900 dark
Adoption over time
7/30/90-day growth
Ranking history
Listing placement
Listing placement
Filled points are observed values; hollow points come from Internet Archive snapshots of the listing page. Dashed segments span periods with no observations — values between points are not interpolated.
Each band is one page of 20. Weekly downloads on a linear scale. Placement is projected from weekly downloads, so it can differ from the marketplace's own sort order. Hover a dot to see the listing.
Recent observations
Full history (543)Similar npm Prettier plugins plugins
All 20 prettier-plugin-pdx-script alternativesData source
Weekly downloads (trailing 7 complete days) come from the official npm downloads API. Downloads include CI and mirrors and are not equivalent to installs or users. npm publishes no ratings.
Listing: https://www.npmjs.com/package/prettier-plugin-pdx-script. First seen Oct 16, 2026; last successful collection Oct 20, 2026. See the methodology.