-
Notifications
You must be signed in to change notification settings - Fork 0
/
cli.ts
91 lines (69 loc) · 2.51 KB
/
cli.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
/**
* Program entry point. Takes a .yaml file or directory of .yaml files as a command line argument.
*/
import convert from './convert';
const pushToAirtable = require('./src/pushToAirtable');
const validate = require('./site-ingestion-schema/validator');
const { promises: fs } = require('fs');
const cliFormat = `
Format:
yarn start <yamlFieldMapPath> <email> <password>
If password is blank, will push to TEST Airtable base instead of Main.
`;
const missingEmail = new Error(`
You must include your email.` + cliFormat);
const missingFieldMap = new Error(`
Please specify an existing .yaml fieldMap file, or a directory of them.` + cliFormat);
(async () => {
let data = [];
const path = process.argv[2];
const email = process.argv[3];
const password = process.argv[4];
if (!path) throw missingFieldMap;
const pathType = await fs.stat(path);
if (!email) {
throw missingEmail;
}
if (pathType.isFile() && (path.endsWith('.yaml') || path.endsWith('.yml'))) {
console.log(`
Parsing file '${path}'...`);
data = await convert(path);
} else if (pathType.isDirectory()) {
console.log(`
Parsing directory '${path}'...`);
const dirContents = await fs.readdir(path);
const yamlFieldMaps = dirContents
.filter((file: string) => (file.endsWith('.yml') || file.endsWith('.yaml')));
if (!yamlFieldMaps.length) throw missingFieldMap;
for await (const yamlFile of yamlFieldMaps) {
for await (const object of await convert(`${path}/${yamlFile}`)) {
data.push(object);
}
}
} else {
throw missingFieldMap;
}
// Check if sites conform to schema
const checked = validate(data);
if (!checked.valid.length) {
throw new Error(`
No sites passed validation. Aborting.
`);
} else if (checked.invalid.length) {
console.error(`
${checked.invalid.length} sites did not pass validation and will not be included:`);
// eslint-disable-next-line no-undefined
console.error(`${JSON.stringify(checked.invalid, undefined, 4)}
(^^ ${checked.invalid.length} sites that did not pass validation ^^)`);
} else {
console.log(`
All sites passed validation.`);
}
console.log(`
Done converting ${checked.valid.length} records. Now connecting to Airtable API... (lets see if your password worked ;P)`);
// Attempt to push to Airtable
await pushToAirtable(checked.valid, email, password);
console.log(`
Upload complete.
`);
})();