diff --git a/changelog.d/20251218_163750_rosswilsonblair_use_default_config_file.md b/changelog.d/20251218_163750_rosswilsonblair_use_default_config_file.md new file mode 100644 index 000000000..adf056b11 --- /dev/null +++ b/changelog.d/20251218_163750_rosswilsonblair_use_default_config_file.md @@ -0,0 +1,47 @@ + + + + +### Fixed + +- CLI and web validator now default to loading '.bids-validator-config.json'. Validator only attempts this if no other config file was passed in. + + + + + diff --git a/src/main.ts b/src/main.ts index fdcf0f42d..bb31b4059 100644 --- a/src/main.ts +++ b/src/main.ts @@ -4,7 +4,8 @@ import * as colors from '@std/fmt/colors' import { readFileTree } from './files/deno.ts' import { fileListToTree } from './files/browser.ts' import { FileIgnoreRules } from './files/ignore.ts' -import { resolve } from '@std/path' +import { join, resolve } from '@std/path' +import { exists } from "jsr:@std/fs/exists"; import { validate } from './validators/bids.ts' import { consoleFormat, resultToJSONStr } from './utils/output.ts' import { setupLogging } from './utils/logger.ts' @@ -28,7 +29,21 @@ export async function main(): Promise { : undefined const tree = await readFileTree(absolutePath, prune, options.preferredRemote) - const config = options.config ? JSON.parse(Deno.readTextFileSync(options.config)) as Config : {} + let config = {} + if (options.config) { + config = JSON.parse(Deno.readTextFileSync(options.config)) + } else { + const defaultConfig = join(absolutePath, '.bids-validator-config.json') + try { + await Deno.lstat(defaultConfig) + config = JSON.parse(Deno.readTextFileSync(defaultConfig)) + options.config = defaultConfig + } catch { + if (!(err instanceof Deno.errors.NotFound)) { + throw err; + } + } + } // Run the schema based validator const schemaResult = await validate(tree, options, config) diff --git a/web/src/App.tsx b/web/src/App.tsx index 4cf2e733c..8c54a1f26 100644 --- a/web/src/App.tsx +++ b/web/src/App.tsx @@ -1,6 +1,6 @@ import React, { useState } from "react" import "./App.css" -import { directoryOpen } from "https://esm.sh/browser-fs-access@0.35.0" +import { directoryOpen, fileOpen } from "https://esm.sh/browser-fs-access@0.35.0" import confetti from 'https://cdn.jsdelivr.net/npm/canvas-confetti@1.9.3/dist/confetti.module.mjs'; import { fileListToTree, validate, getVersion } from "../dist/validator/main.js" import type { ValidationResult } from "../../src/types/validation-result.ts" @@ -50,11 +50,19 @@ function App() { const [validation, setValidation] = useState() async function validateDir() { + const dirHandle = await directoryOpen({ recursive: true, }) + let config = {} + const configFile = dirHandle.find(file => file.name ==='.bids-validator-config.json') + if (configFile) { + config = configFile.text().then(text => JSON.parse(text)).catch((err) => { + alert(`Failed to load ".bids-validator-config.json". \n\nUsing empty configuration object:\n\n${err}`) + }) + } const fileTree = await fileListToTree(dirHandle) - setValidation(await validate(fileTree, {})) + setValidation(await validate(fileTree, config)) } const [version, setVersion] = useState()