chatdesk-ui/postgrest_v12.2.8/nix/hsie
hailin ba89b18bce first commit, based chatbot-ui and self hosted supabase. 2025-05-18 22:23:26 +08:00
..
Main.hs first commit, based chatbot-ui and self hosted supabase. 2025-05-18 22:23:26 +08:00
README.md first commit, based chatbot-ui and self hosted supabase. 2025-05-18 22:23:26 +08:00
default.nix first commit, based chatbot-ui and self hosted supabase. 2025-05-18 22:23:26 +08:00

README.md

hsie - Swiss army knife for HaSkell Imports and Exports

This tool parses Haskell source code to analyse the imports and exports in a project. It's available in PostgREST's nix-shell by default.

Dumping imports

Given source code in the directories src and main, for example, you can run:

hsie dump-imports src main

This dumps all imports of the modules in the given directory to a CSV file, printed on stdout.

To dump to a JSON file (e.g., to further process with jq), add the --json flag:

hsie dump-imports --json src main

Graphing imports

The tool can generate graphviz graphs of module and symbol imports by printing a file to stdout that can directly be rendered with dot:

hsie graph-modules src main | dot -Tpng -o modules.png

The command graph-modules prints a graph of which modules insert which other modules. graph-symbols shows which symbols are imported from which modules.

Checking imports

To check whether modules are imported under consistent aliases in your project, run:

hsie check-aliases main src

This will exit with a non-zero exit code if any inconsistent aliases are found.

The following command checks whether any modules are imported as wildcards, i.e. not qualified and without specifying symbols.

hsie check-wildcards main src

To whitelist certain modules to be imported as wildcards, use --ok:

hsie check-wildcards main src --ok Protolude --ok Test.Module

Current limitations

This tool uses the GHC parser to parse Haskell source code. Language extensions required to parse each file are detected based on the {-# LANGUAGE ... #-} pragmas. If they are not available (e.g., as they are listed as default extensions in the .cabal file), parses may fail. We can fix this by using an extended set of non-conflicting extensions by default, as hlint does for example.