@react-slate/core
Version:
Write interactive CLI apps with React
106 lines • 5.41 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __asyncValues = (this && this.__asyncValues) || function (o) {
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
var m = o[Symbol.asyncIterator], i;
return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const react_1 = __importDefault(require("react"));
const terminal_kit_1 = require("terminal-kit");
const renderToString_1 = __importDefault(require("./renderToString"));
const getCursorLocation = () => terminal_kit_1.terminal.getCursorLocation();
const RenderStaticContext = react_1.default.createContext({
renderStatic: () => {
throw new Error('renderStatic() can only be used when rendering with render() function');
},
});
function withRenderStatic(Component) {
function Wrapped(props) {
return (react_1.default.createElement(RenderStaticContext.Consumer, null, context => {
const newProps = Object.assign(Object.assign({}, props), { renderStatic: context.renderStatic });
return react_1.default.createElement(Component, Object.assign({}, newProps));
}));
}
Wrapped.name = `withRenderStatic(${Component.displayName ||
Component.name ||
'Unknown'})`;
return Wrapped;
}
exports.withRenderStatic = withRenderStatic;
function useRenderStatic() {
return react_1.default.useContext(RenderStaticContext).renderStatic;
}
exports.useRenderStatic = useRenderStatic;
function render(element) {
let dynamicContentFirstRender = true;
let dynamicContentSnapshot = '';
let dynamicContentTop = 0;
let dynamicContentBottom = 0;
function renderStatic(staticElement) {
const { snapshot: staticElementSnapshot } = renderToString_1.default(staticElement);
terminal_kit_1.terminal.moveTo(0, dynamicContentTop);
terminal_kit_1.terminal.eraseDisplayBelow();
terminal_kit_1.terminal(staticElementSnapshot);
terminal_kit_1.terminal(dynamicContentSnapshot);
if (dynamicContentBottom < terminal_kit_1.terminal.height) {
const staticContentHeight = (staticElementSnapshot || '').split('\n')
.length;
dynamicContentTop += staticContentHeight;
dynamicContentBottom += staticContentHeight;
}
}
(() => __awaiter(this, void 0, void 0, function* () {
var e_1, _a;
try {
for (var _b = __asyncValues(renderToString_1.default(react_1.default.createElement(RenderStaticContext.Provider, { value: { renderStatic } }, element), {
width: terminal_kit_1.terminal.width,
}).start()), _c; _c = yield _b.next(), !_c.done;) {
const snapshot = _c.value;
dynamicContentSnapshot = snapshot || '';
if (dynamicContentFirstRender) {
dynamicContentFirstRender = false;
terminal_kit_1.terminal(snapshot);
const { y } = yield getCursorLocation();
dynamicContentBottom = y;
}
else {
const dynamicConentHeight = (snapshot || '').split('\n').length;
dynamicContentTop = dynamicContentBottom - dynamicConentHeight + 1;
terminal_kit_1.terminal.moveTo(0, dynamicContentTop);
terminal_kit_1.terminal.eraseDisplayBelow();
terminal_kit_1.terminal(snapshot);
const { y } = yield getCursorLocation();
// eslint-disable-next-line require-atomic-updates
dynamicContentBottom = y;
}
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (_c && !_c.done && (_a = _b.return)) yield _a.call(_b);
}
finally { if (e_1) throw e_1.error; }
}
}))().catch(error => {
console.error(error);
terminal_kit_1.terminal.processExit(1);
});
return { renderStatic };
}
exports.default = render;
//# sourceMappingURL=render.js.map