import type { ScanConfigSchema } from '@/scripts/op-config' import { getOpConfig, scanConfigSchema } from '@/scripts/op-config' import { resolve } from 'path' import { cwd } from 'process' import { DEFAULT_OP_CONFIG_FILE_NAME } from '@/constants' import { fromZodError } from 'zod-validation-error' export const DEFAULT_SCAN_CONFIG: ScanConfigSchema = { roots: ['backend', 'web'], exclude: [/node_modules/, /dist/], output: { level: 'all', }, patternFragment: { pre: '(?:[^\n]*)', placeholder: '(?:[^\n/]*)', post: '(?:[^\n]*)', }, checkIsPathLikeString: (value) => { const requiredChars = ['/'] const excludedChars = ['data:image/', ' ', ' ', '\n', ''] return ( value !== '/' && requiredChars.every((char) => value.includes(char)) && !excludedChars.some((char) => value.includes(char)) ) }, apis: [], } export const getScanConfig = async ( configPath: string = resolve(cwd(), DEFAULT_OP_CONFIG_FILE_NAME), ) => { const opConfig = await getOpConfig(configPath) const parsedConfig = await scanConfigSchema .deepPartial() .parseAsync(opConfig.scan || {}) .catch((error) => { const formatedZodError = fromZodError(error) throw new Error(`${formatedZodError.toString()} at ${configPath}`) }) const formatedConfig: ScanConfigSchema = { ...DEFAULT_SCAN_CONFIG, ...parsedConfig, output: { ...DEFAULT_SCAN_CONFIG.output, ...parsedConfig.output, }, patternFragment: { ...DEFAULT_SCAN_CONFIG.patternFragment, ...parsedConfig.patternFragment, }, } formatedConfig.roots = formatedConfig.roots.map((root) => resolve(cwd(), root)) return formatedConfig }