f9db43a2e9
* Add key * Add: a second index uuid, push changes to sync controller * Add: sync.js * Add: tokenManager * Change: log entire body for http error * Add: token flow * Fix: minor * Fix: move cleanup to stop function * Add: syncNow * Update dependencies * Fix: handle 401 error * Add: handle 401 error * Fix: then -> catch * Add: sync options to options page * Update db-to-cloud * Change: make prefs.set return a promise * Add: disble selector if connected * Add: update selector state * Fix: return promise in prefs.set * Fix: manage complex state * Fix: handle prefs change * Change: manage sync status in background * Add: show current status in the UI * Add: schedule a faster sync when db changed * Update dependencies * Add: include progress in sync status * Add: more detail status * Show status text only * Bump dependencies * Change: show loaded and total * Fix: syncTarget is undefined * Add: google and onedrive * Fix: token is not reused * Bump dependencies * Don't use minified version since it is hard to debug * Fix: expire time is incorrect * Change: switch google to code flow * Bump dependencies * Change: only modify pref if the initialization success? * Don't stop the sync if the first sync is not triggered by the user * Add: implement refresh token * Change: switch microsoft to code flow * Add: subtract expire with a latency * Add: microsoft client secret * Add: display error message * Fix: fromPref is not used * Change: try to revoke the token when log out * Add: revoke dropbox token * Fix: Google only generates one refresh token for one user by default * Bump dependencies, fix onedrive list issue * Fix: arguments sent to sync.put is wrong * Fix: don't schedule a sync on db changed if not connected * Bump dependencies. Fix issue of switching drives * Bump db-to-cloud, fix switching drive issue * Fix: only auth user on 401 error, don't display login window without user interaction * Fix: don't call revoke() if token is undefined * Add: login button to generate the access token interactively * Fix: make addMissingProperties a local * Fix: store missing props in an object * Fix: sync.getStatus should be sync * LATENCY -> NETWORK_LATENCY * Fix: cache the token forever if there is no expire time e.g. dropbox * Add some comments * Fix: i18n * Fix: i18n sync status * fixup! Fix: i18n sync status * Fix: 'sync to cloud' is displayed twice
139 lines
3.5 KiB
JavaScript
139 lines
3.5 KiB
JavaScript
#!/usr/bin/env node
|
|
'use strict';
|
|
|
|
const fs = require('fs-extra');
|
|
const path = require('path');
|
|
|
|
const root = path.join(__dirname, '..');
|
|
|
|
const files = {
|
|
'codemirror': [
|
|
'*', // only update existing vendor files
|
|
'theme' // update all theme files
|
|
],
|
|
'dropbox': [
|
|
'dist/Dropbox-sdk.js → dropbox-sdk.js'
|
|
],
|
|
'jsonlint': [
|
|
'lib/jsonlint.js → jsonlint.js'
|
|
],
|
|
'less-bundle': [
|
|
'dist/less.min.js → less.min.js'
|
|
],
|
|
'lz-string-unsafe': [
|
|
'lz-string-unsafe.min.js'
|
|
],
|
|
'semver-bundle': [
|
|
'dist/semver.js → semver.js'
|
|
],
|
|
'stylelint-bundle': [
|
|
'stylelint-bundle.min.js'
|
|
],
|
|
'stylus-lang-bundle': [
|
|
'stylus.min.js'
|
|
],
|
|
'usercss-meta': [
|
|
'dist/usercss-meta.min.js → usercss-meta.min.js'
|
|
],
|
|
'zipjs-browserify': [
|
|
'vendor/deflate.js → deflate.js',
|
|
'vendor/inflate.js → inflate.js',
|
|
'vendor/z-worker.js → z-worker.js',
|
|
'vendor/zip.js → zip.js'
|
|
],
|
|
'db-to-cloud': [
|
|
'dist/db-to-cloud.min.js → db-to-cloud.min.js'
|
|
]
|
|
};
|
|
|
|
async function updateReadme(lib) {
|
|
const pkg = await fs.readJson(`${root}/node_modules/${lib}/package.json`);
|
|
const file = `${root}/vendor/${lib}/README.md`;
|
|
const txt = await fs.readFile(file, 'utf8');
|
|
return fs.writeFile(file, txt.replace(/\b([v@])[\d.]+[-\w]*\b/g, `$1${pkg.version}`));
|
|
}
|
|
|
|
function isFolder(fileOrFolder) {
|
|
const stat = fs.statSync(fileOrFolder);
|
|
return stat.isDirectory();
|
|
}
|
|
|
|
// Rename CodeMirror$1 -> CodeMirror for development purposes
|
|
function renameCodeMirrorVariable(filePath) {
|
|
const file = fs.readFileSync(filePath, 'utf8');
|
|
fs.writeFileSync(filePath, file.replace(/CodeMirror\$1/g, 'CodeMirror'));
|
|
}
|
|
|
|
function updateExisting(lib) {
|
|
const libRoot = `${root}/node_modules/`;
|
|
const vendorRoot = `${root}/vendor/`;
|
|
const folders = [lib];
|
|
|
|
const process = function () {
|
|
if (folders.length) {
|
|
const folder = folders.shift();
|
|
const folderRoot = `${vendorRoot}${folder}`;
|
|
const entries = fs.readdirSync(folderRoot);
|
|
entries.forEach(entry => {
|
|
if (entry !== 'README.md' && entry !== 'LICENSE') {
|
|
// Ignore README.md & LICENSE files
|
|
const entryPath = `${folderRoot}/${entry}`;
|
|
try {
|
|
if (fs.existsSync(entryPath)) {
|
|
if (isFolder(entryPath)) {
|
|
folders.push(`${folder}/${entry}`);
|
|
} else {
|
|
fs.copySync(`${libRoot}${folder}/${entry}`, entryPath);
|
|
// Remove $1 from "CodeMirror$1" in codemirror.js
|
|
if (entry === 'codemirror.js') {
|
|
renameCodeMirrorVariable(entryPath);
|
|
}
|
|
}
|
|
}
|
|
} catch (err) {
|
|
// Show error in case file exists in vendor, but not in node_modules
|
|
console.log('\x1b[36m%s\x1b[0m', `"${entryPath}" doesn't exist!`);
|
|
}
|
|
}
|
|
});
|
|
}
|
|
if (folders.length) {
|
|
process();
|
|
}
|
|
};
|
|
|
|
process();
|
|
}
|
|
|
|
async function copy(lib, folder) {
|
|
const [src, dest] = folder.split(/\s*→\s*/);
|
|
try {
|
|
if (folder === '*') {
|
|
updateExisting(lib);
|
|
} else {
|
|
await fs.copy(`${root}/node_modules/${lib}/${src}`, `${root}/vendor/${lib}/${dest || src}`);
|
|
}
|
|
} catch (err) {
|
|
exit(err);
|
|
}
|
|
}
|
|
|
|
function exit(err) {
|
|
if (err) {
|
|
console.error(err);
|
|
}
|
|
process.exit(err ? 1 : 0);
|
|
}
|
|
|
|
Object.keys(files).forEach(lib => {
|
|
updateReadme(lib);
|
|
files[lib].forEach(folder => {
|
|
if (folder === '*') {
|
|
updateExisting(lib);
|
|
} else {
|
|
copy(lib, folder);
|
|
}
|
|
});
|
|
console.log('\x1b[32m%s\x1b[0m', `${lib} files updated`);
|
|
});
|