]> git.wincent.com - wincent.git/blob - src/Fig/operations/file.ts
chore(fig): turn on more TypeScript checks
[wincent.git] / src / Fig / operations / file.ts
1 import {promises as fs} from 'fs';
2
3 import ErrorWithMetadata from '../../ErrorWithMetadata';
4 import expand from '../../expand';
5 import stat from '../../stat';
6 import Context from '../Context';
7
8 // TODO decide whether we want a separate "directory" operation
9 export default async function file({
10     force,
11     mode,
12     path,
13     src,
14     state,
15 }: {
16     path: string;
17     mode?: Mode;
18     src?: string;
19     state: 'directory' | 'file' | 'link' | 'touch';
20     force?: boolean;
21 }): Promise<void> {
22     if (state === 'directory') {
23         await directory(path);
24     }
25
26     // TODO: probably refactor this to use compare.ts
27     if (0) {
28         // In the meantime, silence unused parameter warnings.
29         console.log(force, mode, src);
30     }
31 }
32
33 async function directory(path: string) {
34     const target = expand(path);
35
36     const stats = await stat(target);
37
38     if (stats instanceof Error) {
39         throw stats;
40     } else if (stats === null) {
41         Context.informChanged(`directory ${path}`);
42         await fs.mkdir(target, {recursive: true});
43     } else if (stats.type === 'directory') {
44         // TODO: check ownership, perms etc
45         Context.informOk(`directory ${path}`);
46     } else {
47         // TODO: find out if ansible replaces regular file with dir or just errors?
48         throw new ErrorWithMetadata(
49             `${path} already exists but is not a directory`
50         );
51     }
52 }