forked from cullenjett/quickbase-cli
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathqb-deploy.js
More file actions
125 lines (100 loc) · 3.01 KB
/
qb-deploy.js
File metadata and controls
125 lines (100 loc) · 3.01 KB
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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
#!/usr/bin/env node
// TODO:
// confirm files w/user before uploading?
const fs = require('fs');
const path = require('path');
const program = require('commander');
const watch = require('chokidar').watch;
const util = require('util');
const ApiClient = require('../lib/api');
const { getFiles } = require('../lib/get-files');
const readFile = util.promisify(fs.readFile);
const stat = util.promisify(fs.stat);
program
.option('-w, --watch', 'deploy files on change')
.option(
'-x --replace',
'replace css and js file paths inside html file with their QuickBase url'
)
.parse(process.argv);
const sourceArg = program.args[0] || '.';
const configPath = require('../lib/find-config')(sourceArg);
const config = require(configPath);
const api = new ApiClient(config);
qbDeploy(sourceArg);
if (program.watch) {
console.log(`Watching for file changes in ${sourceArg}`);
watch(sourceArg, {}).on('change', fileName => {
console.log(`\nChange detected in ${fileName}`);
program.replace
? qbDeploy(sourceArg)
: qbDeploy(fileName);
});
}
async function qbDeploy(source) {
console.log('Uploading files to QuickBase...');
try {
await api.authenticateIfNeeded();
} catch(e) {
console.error(e);
return;
}
const stats = await fs.statSync(source);
const isFile = stats.isFile();
if (isFile) {
return uploadToQuickbase(source)
.then(res =>
console.log(`Successfully uploaded to QuickBase:\n=> ${source}`)
)
.catch(err => console.error(err));
}
if (!isFile) {
getFiles(source).then(files => {
const uploadPromises = program.replace
? files.map(file => replaceUrlsAndUpload(file, files))
: files.map(file => uploadToQuickbase(file));
return Promise.all(uploadPromises)
.then(res =>
console.log(
`Successfully uploaded to QuickBase:\n=> ${files.join('\n=> ')}`
)
)
.catch(err => console.error(err));
});
}
}
function uploadToQuickbase(file, fileContents) {
let fileName = path.basename(file);
let codePageName;
if (!fileContents) {
fileContents = fs.readFileSync(file, 'utf-8');
}
if (config.appName) {
codePageName = `${config.appName}-${fileName}`;
} else {
codePageName = fileName;
}
return api.uploadPage(codePageName, fileContents);
}
async function replaceUrlsAndUpload(file, allFiles) {
let fileContents = await readFile(file, 'utf-8');
allFiles.forEach(assetFile => {
if (file !== assetFile) {
const fileName = path.basename(assetFile);
const regex = new RegExp(`("|')[^"]*${fileName}("|')`, 'g');
fileContents = fileContents.replace(
regex,
generateCustomPageUrl(path.basename(assetFile))
);
}
});
return uploadToQuickbase(file, fileContents);
}
function generateCustomPageUrl(fileName) {
const suffix = config.appName
? `${config.appName}-${fileName}`
: `${fileName}`;
return `"https://${config.realm}.quickbase.com/db/${
config.dbid
}?a=dbpage&pagename=${suffix}"`;
}