+const { readFile, rm, writeFile } = require('fs/promises');
+
+const internals = {
+ strings: {
+ configurationNotFound: 'Remote configuration not set, consult help for more info.'
+ },
+ strategies: [
+ require('./remotes/git')
+ ]
+};
+
+module.exports = {
+ async add(remoteConfig, remote) {
+ await writeFile(remoteConfig, remote);
+ },
+
+ async remove(remoteConfig) {
+ await rm(remoteConfig, { force: true })
+ },
+
+ async syncUp(remoteConfig, blogDirectory) {
+ this._executeMethodOnStrategy(remoteConfig, 'syncUp', blogDirectory);
+ },
+
+ async syncDown(remoteConfig, blogDirectory) {
+ this._executeMethodOnStrategy(remoteConfig, 'syncDown', blogDirectory);
+ },
+
+ async _executeMethodOnStrategy(remoteConfig, method, blogDirectory) {
+ const remote = await this._ensureConfiguration(remoteConfig);
+
+ for (const strategy of internals.strategies) {
+ if (strategy.canHandle(remote)) {
+ await strategy[method](remote, blogDirectory);
+ }
+ }
+ },
+
+ async _ensureConfiguration(remoteConfig) {
+ try {
+ const configuration = await readFile(remoteConfig, { encoding: 'utf8' });
+ return configuration;
+ }
+ catch {
+ throw new Error(internals.strings.configurationNotFound);
+ }
+ }
+}