git.iko.soy/rowtype-yoga/purslint
on main help sign in
Rename tooling to purslint.

Update package names, CLIs, LSP sources, and editor extensions.

commit1be9c9773116454db7831821c4cebd6814acec4c authorMark <mark.eibes@gmail.com> dateThu 29 Jan 2026, 17:09 (8 months ago) parent4e72c8c
23 files changed+92−89
bin/purelint-lsp.js−2 bin/purelint.js−2 bin/purslint-cli/spago.yaml+2−2 bin/purslint-cli/src/Main.purs+15−15 bin/purslint-lsp.js+2 bin/purslint-lsp/spago.yaml+2−2 bin/purslint-lsp/src/LSP.purs+18−18 bin/purslint-lsp/src/LSP/Stdio.js+1−1 bin/purslint.js+2 lib/purslint/spago.yaml+1−1 lib/purslint/src/Purslint/Fix.purs+12−9 package.json+6−6 purelint-lsp−2 purslint-lsp+2 spago.lock+10−10 spago.yaml+2−2 test/Test/Main.purs+1−1 vscode-extension/out/extension.js+2−2 vscode-extension/src/extension.ts+2−2 zed-extension/Cargo.lock+3−3 zed-extension/Cargo.toml+1−1 zed-extension/extension.toml+3−3 zed-extension/src/lib.rs+5−5
bin/purelint-lsp.jsdeleted−2
@@ -1,2 +0,0 @@
1−#!/usr/bin/env node
2−import "../dist/purelint-lsp.js";
bin/purelint.jsdeleted−2
@@ -1,2 +0,0 @@
1−#!/usr/bin/env node
2−import "../dist/purelint.js";
bin/purslint-cli/spago.yaml+2−2
@@ -1,5 +1,5 @@
11package:
2− name: purelint-cli
2+ name: purslint-cli
33 dependencies:
44 - arrays
55 - console
@@ -9,7 +9,7 @@ package:
99 - maybe
1010 - newtype
1111 - prelude
12− - purelint
12+ - purslint
1313 - strings
1414 - node-buffer
1515 - node-fs
bin/purslint-cli/src/Main.purs+15−15
@@ -185,12 +185,12 @@ allRules =
185185 , whenNotRule
186186 ]
187187
188−-- | Load config from .purelintrc file
188+-- | Load config from .purslintrc file
189189loadConfig :: Effect _
190190loadConfig = do
191− hasConfig <- FS.exists ".purelintrc"
191+ hasConfig <- FS.exists ".purslintrc"
192192 if hasConfig then do
193− content <- FS.readTextFile ".purelintrc"
193+ content <- FS.readTextFile ".purslintrc"
194194 pure $ parseConfig content
195195 else
196196 pure defaultConfig
@@ -294,24 +294,24 @@ fixPath rules path = do
294294-- | Show usage
295295showUsage :: Effect Unit
296296showUsage = do
297− log "purelint - a linter for PureScript (70 rules)"
297+ log "purslint - a linter for PureScript (81 rules)"
298298 log ""
299− log "Usage: purelint [OPTIONS] [FILES/DIRECTORIES...]"
299+ log "Usage: purslint [OPTIONS] [FILES/DIRECTORIES...]"
300300 log ""
301301 log "Options:"
302302 log " --help Show this help"
303303 log " --fix Auto-fix issues (where possible)"
304− log " --init Create a sample .purelintrc"
304+ log " --init Create a sample .purslintrc"
305305 log " --list List all available rules"
306306 log ""
307307 log "Configuration:"
308− log " Create .purelintrc in your project root to disable rules."
308+ log " Create .purslintrc in your project root to disable rules."
309309 log " Add one rule name per line (lines starting with # are comments)."
310310 log ""
311311 log "Examples:"
312− log " purelint src/ Lint all .purs files in src/"
313− log " purelint --fix src/ Auto-fix issues in src/"
314− log " purelint src/Main.purs Lint a single file"
312+ log " purslint src/ Lint all .purs files in src/"
313+ log " purslint --fix src/ Auto-fix issues in src/"
314+ log " purslint src/Main.purs Lint a single file"
315315
316316-- | List all available rules
317317listRules :: Effect Unit
@@ -324,18 +324,18 @@ listRules = do
324324-- | Create sample config file
325325initConfig :: Effect Unit
326326initConfig = do
327− hasConfig <- FS.exists ".purelintrc"
327+ hasConfig <- FS.exists ".purslintrc"
328328 if hasConfig then
329− log ".purelintrc already exists"
329+ log ".purslintrc already exists"
330330 else do
331− let sampleConfig = """# purelint configuration
331+ let sampleConfig = """# purslint configuration
332332# Add rule names (one per line) to disable them
333333# Example:
334334# EtaReduce
335335# LetToWhere
336336"""
337− FS.writeTextFile ".purelintrc" sampleConfig
338− log "Created .purelintrc"
337+ FS.writeTextFile ".purslintrc" sampleConfig
338+ log "Created .purslintrc"
339339
340340main :: Effect Unit
341341main = do
bin/purslint-lsp.jsnew file+2
@@ -0,0 +1,2 @@
1+#!/usr/bin/env node
2+import "../dist/purslint-lsp.js";
bin/purslint-lsp/spago.yaml+2−2
@@ -1,5 +1,5 @@
11package:
2− name: purelint-lsp
2+ name: purslint-lsp
33 dependencies:
44 - arrays
55 - effect
@@ -8,5 +8,5 @@ package:
88 - maybe
99 - newtype
1010 - prelude
11− - purelint
11+ - purslint
1212 - unsafe-coerce
bin/purslint-lsp/src/LSP.purs+18−18
@@ -208,7 +208,7 @@ warningToDiagnostic (LintWarning w) =
208208 base =
209209 { range: range
210210 , severity: severityToLSP w.severity
211− , source: "purelint"
211+ , source: "purslint"
212212 , message: unwrap w.ruleId <> ": " <> unwrap w.message
213213 }
214214 in case w.suggestion of
@@ -216,7 +216,7 @@ warningToDiagnostic (LintWarning w) =
216216 Just (Suggestion sug) -> unsafeCoerce
217217 { range: range
218218 , severity: severityToLSP w.severity
219− , source: "purelint"
219+ , source: "purslint"
220220 , message: unwrap w.ruleId <> ": " <> unwrap w.message
221221 , data:
222222 { hasFix: true
@@ -273,7 +273,7 @@ mkInitializeResponse reqId =
273273 }
274274 }
275275 , serverInfo:
276− { name: "purelint-lsp"
276+ { name: "purslint-lsp"
277277 , version: "0.1.0"
278278 }
279279 }
@@ -334,32 +334,32 @@ foreign import hasKey :: String -> Foreign -> Boolean
334334foreign import getKey :: String -> Foreign -> Foreign
335335
336336-- | Parse settings to get disabled rules
337−-- | Expected format: { "purelint": { "disabledRules": ["RuleId1", "RuleId2"] } }
338−-- | Or: { "purelint.disabledRules": ["RuleId1", "RuleId2"] }
339−-- | Or: { "purelint.enabled": false } to disable all rules
337+-- | Expected format: { "purslint": { "disabledRules": ["RuleId1", "RuleId2"] } }
338+-- | Or: { "purslint.disabledRules": ["RuleId1", "RuleId2"] }
339+-- | Or: { "purslint.enabled": false } to disable all rules
340340parseSettings :: Foreign -> Config
341341parseSettings settings =
342− -- Try to get purelint.enabled first
343− case getFieldObj "purelint" settings of
344− Just purelintObj ->
342+ -- Try to get purslint.enabled first
343+ case getFieldObj "purslint" settings of
344+ Just purslintObj ->
345345 -- Check if all rules are disabled
346− case getFieldBool "enabled" purelintObj of
346+ case getFieldBool "enabled" purslintObj of
347347 Just false ->
348348 { disabledRules: map (\r -> r.ruleId) allRules } -- Disable all rules
349349 _ ->
350350 -- Get disabled rules list
351− case getFieldArr "disabledRules" purelintObj of
351+ case getFieldArr "disabledRules" purslintObj of
352352 Just arr ->
353353 { disabledRules: Array.mapMaybe parseRuleId arr }
354354 Nothing -> defaultConfig
355355 Nothing ->
356− -- Try flat format: purelint.disabledRules
357− case getFieldArr "purelint.disabledRules" settings of
356+ -- Try flat format: purslint.disabledRules
357+ case getFieldArr "purslint.disabledRules" settings of
358358 Just arr ->
359359 { disabledRules: Array.mapMaybe parseRuleId arr }
360360 Nothing ->
361− -- Try purelint.enabled
362− case getFieldBool "purelint.enabled" settings of
361+ -- Try purslint.enabled
362+ case getFieldBool "purslint.enabled" settings of
363363 Just false ->
364364 { disabledRules: map (\r -> r.ruleId) allRules }
365365 _ -> defaultConfig
@@ -616,7 +616,7 @@ mkDisableRuleAction ruleId diagnostic =
616616 , isPreferred: false
617617 , command:
618618 { title: "Disable rule " <> ruleId
619− , command: "purelint.disableRule"
619+ , command: "purslint.disableRule"
620620 , arguments: [ruleId]
621621 }
622622 }
@@ -644,7 +644,7 @@ mainLoop stateRef = do
644644
645645main :: Effect Unit
646646main = do
647− Stdio.logMessage "purelint-lsp starting..."
647+ Stdio.logMessage "purslint-lsp starting..."
648648 stateRef <- Ref.new { config: defaultConfig, documents: Map.empty }
649649 mainLoop stateRef
650− Stdio.logMessage "purelint-lsp exiting"
650+ Stdio.logMessage "purslint-lsp exiting"
bin/purslint-lsp/src/LSP/Stdio.js+1−1
@@ -74,7 +74,7 @@ export const writeMessage = (msg) => () => {
7474
7575// Log a message to stderr (for debugging)
7676export const logMessage = (msg) => () => {
77− process.stderr.write('[purelint-lsp] ' + msg + '\n');
77+ process.stderr.write('[purslint-lsp] ' + msg + '\n');
7878};
7979
8080// Parse JSON string to Foreign (returns Maybe Foreign)
bin/purslint.jsnew file+2
@@ -0,0 +1,2 @@
1+#!/usr/bin/env node
2+import "../dist/purslint.js";
lib/purslint/spago.yaml+1−1
@@ -1,5 +1,5 @@
11package:
2− name: purelint
2+ name: purslint
33 dependencies:
44 - arrays
55 - effect
lib/purslint/src/Purslint/Fix.purs+12−9
@@ -71,8 +71,9 @@ applyFix :: String -> LintWarning -> Maybe String
7171applyFix source (LintWarning w) = do
7272 Suggestion s <- w.suggestion
7373 let replacement = s.replacement # un ReplacementText
74− let { source: updatedSource, replacement: updatedReplacement, linesAdded } =
75− processImports source replacement s.requiredImports
74+ let
75+ { source: updatedSource, replacement: updatedReplacement, linesAdded } =
76+ processImports source replacement s.requiredImports
7677 let shiftedRange = shiftRange linesAdded w.range
7778 Just $ replaceRange updatedSource shiftedRange updatedReplacement
7879
@@ -101,13 +102,15 @@ applyAllFixes source (LintResult result) =
101102 else case w.suggestion of
102103 Nothing -> acc
103104 Just (Suggestion s) ->
104− let replacement = s.replacement # un ReplacementText
105− importResult = processImports acc.source replacement s.requiredImports
106− shiftedRange = shiftRange importResult.linesAdded w.range
107− updatedSource = replaceRange importResult.source shiftedRange importResult.replacement
108− in { source: updatedSource
109− , appliedRanges: Array.cons shiftedRange acc.appliedRanges
110− }
105+ let
106+ replacement = s.replacement # un ReplacementText
107+ importResult = processImports acc.source replacement s.requiredImports
108+ shiftedRange = shiftRange importResult.linesAdded w.range
109+ updatedSource = replaceRange importResult.source shiftedRange importResult.replacement
110+ in
111+ { source: updatedSource
112+ , appliedRanges: Array.cons shiftedRange acc.appliedRanges
113+ }
111114
112115 -- Check if two ranges overlap
113116 overlaps :: SourceRange -> SourceRange -> Boolean
package.json+6−6
@@ -4,15 +4,15 @@
44 "description": "A linter for PureScript",
55 "type": "module",
66 "bin": {
7− "purelint": "./bin/purelint.js",
8− "purelint-lsp": "./bin/purelint-lsp.js"
7+ "purslint": "./bin/purslint.js",
8+ "purslint-lsp": "./bin/purslint-lsp.js"
99 },
1010 "scripts": {
11− "build:cli": "spago build -p purelint-cli --output output-cli",
12− "build:lsp": "spago build -p purelint-lsp --output output-lsp",
11+ "build:cli": "spago build -p purslint-cli --output output-cli",
12+ "build:lsp": "spago build -p purslint-lsp --output output-lsp",
1313 "build": "npm run build:cli && npm run build:lsp",
14− "bundle:cli": "purs-backend-es bundle-app --corefn-dir output-cli --main Main --platform node --to dist/purelint.js --int-tags",
15− "bundle:lsp": "purs-backend-es bundle-app --corefn-dir output-lsp --main Main.LSP --platform node --to dist/purelint-lsp.js --int-tags",
14+ "bundle:cli": "purs-backend-es bundle-app --corefn-dir output-cli --main Main --platform node --to dist/purslint.js --int-tags",
15+ "bundle:lsp": "purs-backend-es bundle-app --corefn-dir output-lsp --main Main.LSP --platform node --to dist/purslint-lsp.js --int-tags",
1616 "bundle": "npm run bundle:cli && npm run bundle:lsp",
1717 "dist": "npm run build && npm run bundle",
1818 "test": "spago test",
purelint-lspdeleted−2
@@ -1,2 +0,0 @@
1−#!/bin/bash
2−exec node /Users/mark/Developer/purelint/dist/purelint-lsp.js "$@"
purslint-lspnew file+2
@@ -0,0 +1,2 @@
1+#!/bin/bash
2+exec node "$(cd "$(dirname "$0")" && pwd)/dist/purslint-lsp.js" "$@"
spago.lock+10−10
@@ -1,7 +1,7 @@
11{
22 "workspace": {
33 "packages": {
4− "purelint": {
4+ "purslint": {
55 "path": "lib/purslint",
66 "core": {
77 "dependencies": [
@@ -69,7 +69,7 @@
6969 "build_plan": []
7070 }
7171 },
72− "purelint-cli": {
72+ "purslint-cli": {
7373 "path": "bin/purslint-cli",
7474 "core": {
7575 "dependencies": [
@@ -84,7 +84,7 @@
8484 "node-fs",
8585 "node-process",
8686 "prelude",
87− "purelint",
87+ "purslint",
8888 "strings"
8989 ],
9090 "build_plan": [
@@ -137,7 +137,7 @@
137137 "posix-types",
138138 "prelude",
139139 "profunctor",
140− "purelint",
140+ "purslint",
141141 "refs",
142142 "safe-coerce",
143143 "st",
@@ -156,7 +156,7 @@
156156 "build_plan": []
157157 }
158158 },
159− "purelint-lsp": {
159+ "purslint-lsp": {
160160 "path": "bin/purslint-lsp",
161161 "core": {
162162 "dependencies": [
@@ -167,7 +167,7 @@
167167 "maybe",
168168 "newtype",
169169 "prelude",
170− "purelint",
170+ "purslint",
171171 "unsafe-coerce"
172172 ],
173173 "build_plan": [
@@ -204,7 +204,7 @@
204204 "partial",
205205 "prelude",
206206 "profunctor",
207− "purelint",
207+ "purslint",
208208 "refs",
209209 "safe-coerce",
210210 "st",
@@ -223,7 +223,7 @@
223223 "build_plan": []
224224 }
225225 },
226− "purelint-tests": {
226+ "purslint-tests": {
227227 "path": "./",
228228 "core": {
229229 "dependencies": [
@@ -234,7 +234,7 @@
234234 "maybe",
235235 "newtype",
236236 "prelude",
237− "purelint"
237+ "purslint"
238238 ],
239239 "build_plan": [
240240 "arrays",
@@ -270,7 +270,7 @@
270270 "partial",
271271 "prelude",
272272 "profunctor",
273− "purelint",
273+ "purslint",
274274 "refs",
275275 "safe-coerce",
276276 "st",
spago.yaml+2−2
@@ -4,7 +4,7 @@ workspace:
44 extraPackages: {}
55
66package:
7− name: purelint-tests
7+ name: purslint-tests
88 dependencies:
99 - console
1010 - effect
@@ -12,7 +12,7 @@ package:
1212 - maybe
1313 - newtype
1414 - prelude
15− - purelint
15+ - purslint
1616 - arrays
1717 test:
1818 main: Test.Main
test/Test/Main.purs+1−1
@@ -175,7 +175,7 @@ assertFixFormatted name rules source expectedFixed =
175175-- | Run all tests and report results
176176main :: Effect Unit
177177main = do
178− log "Running purelint tests...\n"
178+ log "Running purslint tests...\n"
179179
180180 let results = mapIdentityTests
181181 <> mapFusionTests
vscode-extension/out/extension.js+2−2
@@ -46,8 +46,8 @@ function activate(context) {
4646 // Get server path from config or use default
4747 let serverPath = config.get('serverPath', '');
4848 if (!serverPath) {
49− // Default to the purelint project location
50− serverPath = '/Users/mark/Developer/purelint/dist/purelint-lsp.js';
49+ // Default to the purslint project location
50+ serverPath = '/Users/mark/Developer/purslint/dist/purslint-lsp.js';
5151 }
5252 const serverOptions = {
5353 run: {
vscode-extension/src/extension.ts+2−2
@@ -19,8 +19,8 @@ export function activate(context: vscode.ExtensionContext) {
1919 // Get server path from config or use default
2020 let serverPath = config.get<string>('serverPath', '');
2121 if (!serverPath) {
22− // Default to the purelint project location
23− serverPath = '/Users/mark/Developer/purelint/dist/purelint-lsp.js';
22+ // Default to the purslint project location
23+ serverPath = '/Users/mark/Developer/purslint/dist/purslint-lsp.js';
2424 }
2525
2626 const serverOptions: ServerOptions = {
zed-extension/Cargo.lock+3−3
@@ -412,7 +412,7 @@ dependencies = [
412412]
413413
414414[[package]]
415−name = "purelint-zed"
415+name = "purslint-zed"
416416version = "0.0.1"
417417dependencies = [
418418 "zed_extension_api",
@@ -818,6 +818,6 @@ dependencies = [
818818
819819[[package]]
820820name = "zmij"
821−version = "1.0.16"
821+version = "1.0.17"
822822source = "registry+https://github.com/rust-lang/crates.io-index"
823−checksum = "dfcd145825aace48cff44a8844de64bf75feec3080e0aa5cdbde72961ae51a65"
823+checksum = "02aae0f83f69aafc94776e879363e9771d7ecbffe2c7fbb6c14c5e00dfe88439"
zed-extension/Cargo.toml+1−1
@@ -1,5 +1,5 @@
11[package]
2−name = "purelint-zed"
2+name = "purslint-zed"
33version = "0.0.1"
44edition = "2021"
55
zed-extension/extension.toml+3−3
@@ -1,5 +1,5 @@
1−id = "purelint"
2−name = "Purelint"
1+id = "purslint"
2+name = "Purslint"
33version = "0.0.1"
44schema_version = 1
55authors = ["Mark"]
@@ -9,5 +9,5 @@ description = "PureScript linter inspired by hlint"
99kind = "Rust"
1010version = "0.7.0"
1111
12−[language_servers.purelint]
12+[language_servers.purslint]
1313language = "PureScript"
zed-extension/src/lib.rs+5−5
@@ -1,10 +1,10 @@
11use zed_extension_api::{self as zed, Result};
22
3−struct PurelintExtension;
3+struct PurslintExtension;
44
5−impl zed::Extension for PurelintExtension {
5+impl zed::Extension for PurslintExtension {
66 fn new() -> Self {
7− PurelintExtension
7+ PurslintExtension
88 }
99
1010 fn language_server_command(
@@ -13,11 +13,11 @@ impl zed::Extension for PurelintExtension {
1313 _worktree: &zed::Worktree,
1414 ) -> Result<zed::Command> {
1515 Ok(zed::Command {
16− command: "/Users/mark/Developer/purelint/purelint-lsp".to_string(),
16+ command: "purslint-lsp".to_string(),
1717 args: vec![],
1818 env: Default::default(),
1919 })
2020 }
2121}
2222
23−zed::register_extension!(PurelintExtension);
23+zed::register_extension!(PurslintExtension);