@ardatan/relay-compiler
Version:
A compiler tool for building GraphQL-driven applications.
261 lines (205 loc) • 6.83 kB
JavaScript
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @emails oncall+relay
*
* @format
*/
// flowlint ambiguous-object-type:error
'use strict';
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _asyncToGenerator = require("@babel/runtime/helpers/asyncToGenerator");
var _createForOfIteratorHelper2 = _interopRequireDefault(require("@babel/runtime/helpers/createForOfIteratorHelper"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var fs = require('fs');
var invariant = require('invariant');
/**
* A filesystem wrapper that buffers file reads and writes until `commit()` is
* called.
*/
var BufferedFilesystem = /*#__PURE__*/function () {
function BufferedFilesystem() {
(0, _defineProperty2["default"])(this, "buffer", new Map());
(0, _defineProperty2["default"])(this, "committed", false);
}
var _proto = BufferedFilesystem.prototype;
_proto._assertNotComitted = function _assertNotComitted() {
!!this.committed ? process.env.NODE_ENV !== "production" ? invariant(false, 'BufferedFilesystem: no operations allowed after commit().') : invariant(false) : void 0;
};
_proto.commit = /*#__PURE__*/function () {
var _commit = _asyncToGenerator(function* (sourceControl) {
this._assertNotComitted();
this.committed = true;
var removed = [];
var added = [];
var _iterator = (0, _createForOfIteratorHelper2["default"])(this.buffer),
_step;
try {
for (_iterator.s(); !(_step = _iterator.n()).done;) {
var _step$value = _step.value,
path = _step$value[0],
data = _step$value[1];
if (data == null) {
removed.push(path);
fs.unlinkSync(path);
} else {
var fileExisits = fs.existsSync(path);
var currentData = fileExisits ? fs.readFileSync(path, 'utf8') : null;
if (currentData !== data) {
added.push(path);
fs.writeFileSync(path, data, 'utf8');
}
}
}
} catch (err) {
_iterator.e(err);
} finally {
_iterator.f();
}
if (sourceControl) {
yield sourceControl.addRemove(added, removed);
}
});
function commit(_x) {
return _commit.apply(this, arguments);
}
return commit;
}();
_proto.hasChanges = function hasChanges() {
this._assertNotComitted();
return this.buffer.size > 0;
};
_proto.getChangesSummary = function getChangesSummary() {
this._assertNotComitted();
var added = [];
var updated = [];
var removed = [];
var _iterator2 = (0, _createForOfIteratorHelper2["default"])(this.buffer),
_step2;
try {
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
var _step2$value = _step2.value,
path = _step2$value[0],
data = _step2$value[1];
if (data == null) {
removed.push(path);
} else {
if (!fs.existsSync(path)) {
added.push(path);
} else {
updated.push(path);
}
}
}
} catch (err) {
_iterator2.e(err);
} finally {
_iterator2.f();
}
return [added.length > 0 ? "Added:\n".concat(added.map(formatFilepath).join('')) : '', updated.length > 0 ? "Updated:\n".concat(updated.map(formatFilepath).join('')) : '', removed.length > 0 ? "Removed:\n".concat(removed.map(formatFilepath).join('')) : ''].filter(Boolean).join('\n');
};
_proto.getAddedRemovedFiles = function getAddedRemovedFiles() {
this._assertNotComitted();
var added = [];
var removed = [];
var _iterator3 = (0, _createForOfIteratorHelper2["default"])(this.buffer),
_step3;
try {
for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
var _step3$value = _step3.value,
path = _step3$value[0],
data = _step3$value[1];
if (data == null) {
removed.push(path);
} else {
if (!fs.existsSync(path)) {
added.push(path);
}
}
}
} catch (err) {
_iterator3.e(err);
} finally {
_iterator3.f();
}
return {
added: added,
removed: removed
};
};
_proto.existsSync = function existsSync(path) {
this._assertNotComitted();
return this.buffer.has(path) ? Boolean(this.buffer.get(path)) : fs.existsSync(path);
};
_proto.mkdirSync = function mkdirSync(path) {
this._assertNotComitted();
fs.mkdirSync(path);
};
_proto.readdirSync = function readdirSync(path) {
this._assertNotComitted();
throw new Error('BufferedFilesystem: readdirSync is not implemented.');
};
_proto.readFileSync = function readFileSync(path, encoding) {
this._assertNotComitted();
if (this.buffer.has(path)) {
var data = this.buffer.get(path);
!(data != null) ? process.env.NODE_ENV !== "production" ? invariant(false, 'BufferedFilesystem: trying to read deleted file.') : invariant(false) : void 0;
return data;
}
return fs.readFileSync(path, encoding);
};
_proto.statSync = function statSync(path) {
this._assertNotComitted();
return fs.statSync(path);
};
_proto.unlinkSync = function unlinkSync(path) {
this._assertNotComitted();
this.buffer.set(path, null);
};
_proto.writeFileSync = function writeFileSync(filename, data, encoding) {
this._assertNotComitted();
this.buffer.set(filename, data);
};
_proto.changedFilesToJSON = function changedFilesToJSON() {
this._assertNotComitted();
var changed = [];
var removed = [];
var _iterator4 = (0, _createForOfIteratorHelper2["default"])(this.buffer),
_step4;
try {
for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
var _step4$value = _step4.value,
path = _step4$value[0],
data = _step4$value[1];
if (data == null) {
removed.push({
path: path
});
} else {
changed.push({
path: path,
data: data
});
}
}
} catch (err) {
_iterator4.e(err);
} finally {
_iterator4.f();
}
return {
removed: removed,
changed: changed
};
};
return BufferedFilesystem;
}();
function formatFilepath(filepath) {
var startIndex = filepath.length - 80;
var prefix = startIndex > 0 ? "\t - ".concat(filepath.substr(0, 8), "...") : '\t - ';
return prefix + filepath.substr(startIndex, filepath.length) + '\n';
}
module.exports = BufferedFilesystem;