(path?: string)
| 45 | * @param path 省略するとカレントディレクトリを使用 |
| 46 | */ |
| 47 | export async function findProjectJSON(path?: string): Promise<{ path: string, data: ContestProject }> { |
| 48 | const readFilePromise = promisify(readFile); |
| 49 | let cwd = path !== undefined ? path : process.cwd(); |
| 50 | |
| 51 | const data: ContestProject = |
| 52 | await (async () => { |
| 53 | let data = null; |
| 54 | while (true) { |
| 55 | try { |
| 56 | let filepath = resolve(cwd, PROJECT_JSON_FILE_NAME); |
| 57 | data = JSON.parse(await readFilePromise(filepath, "utf8")); |
| 58 | return data; |
| 59 | } catch (e) { |
| 60 | if (e.code === "ENOENT") { |
| 61 | // ファイルが存在しないので上の階層を探す |
| 62 | const parent = resolve(cwd, ".."); |
| 63 | if (parent === cwd) { |
| 64 | throw new Error(`${PROJECT_JSON_FILE_NAME} not found.`); |
| 65 | } |
| 66 | cwd = parent; |
| 67 | } |
| 68 | else { |
| 69 | throw e; |
| 70 | } |
| 71 | } |
| 72 | } |
| 73 | })(); |
| 74 | const [valid, error] = await validateProjectJSON(data); |
| 75 | if (valid) return {path: cwd, data}; |
| 76 | else throw new Error(`failed to validate JSON: ${error!}`); |
| 77 | } |
| 78 | |
| 79 | /** |
| 80 | * プロジェクトファイルを探し、現在のディレクトリ構造からコンテストと問題を特定する |
no test coverage detected