atom-nuclide
Version:
A unified developer experience for web and mobile development, built as a suite of features on top of Atom to provide hackability and the support of an active community.
128 lines (100 loc) • 5.08 kB
JavaScript
Object.defineProperty(exports, '__esModule', {
value: true
});
/*
* Copyright (c) 2015-present, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the license found in the LICENSE file in
* the root directory of this source tree.
*/
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
exports.registerExecutorEpic = registerExecutorEpic;
exports.executeEpic = executeEpic;
exports.registerRecordProviderEpic = registerRecordProviderEpic;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
var _commonsNodeEvent2;
function _commonsNodeEvent() {
return _commonsNodeEvent2 = require('../../../commons-node/event');
}
var _Actions2;
function _Actions() {
return _Actions2 = _interopRequireWildcard(require('./Actions'));
}
var _getCurrentExecutorId2;
function _getCurrentExecutorId() {
return _getCurrentExecutorId2 = _interopRequireDefault(require('../getCurrentExecutorId'));
}
var _assert2;
function _assert() {
return _assert2 = _interopRequireDefault(require('assert'));
}
var _rxjsBundlesRxUmdMinJs2;
function _rxjsBundlesRxUmdMinJs() {
return _rxjsBundlesRxUmdMinJs2 = require('rxjs/bundles/Rx.umd.min.js');
}
/**
* Register a record provider for every executor.
*/
function registerExecutorEpic(actions, store) {
return actions.ofType((_Actions2 || _Actions()).REGISTER_EXECUTOR).map(function (action) {
(0, (_assert2 || _assert()).default)(action.type === (_Actions2 || _Actions()).REGISTER_EXECUTOR);
var executor = action.payload.executor;
return (_Actions2 || _Actions()).registerRecordProvider({
id: executor.id,
records: executor.output.map(function (message) {
return _extends({}, message, {
kind: 'response',
sourceId: executor.id,
scopeName: null });
})
});
});
}
/**
* Execute the provided code using the current executor.
*/
// The output won't be in the language's grammar.
function executeEpic(actions, store) {
return actions.ofType((_Actions2 || _Actions()).EXECUTE).flatMap(function (action) {
(0, (_assert2 || _assert()).default)(action.type === (_Actions2 || _Actions()).EXECUTE);
var code = action.payload.code;
var currentExecutorId = (0, (_getCurrentExecutorId2 || _getCurrentExecutorId()).default)(store.getState());
(0, (_assert2 || _assert()).default)(currentExecutorId);
var executor = store.getState().executors.get(currentExecutorId);
(0, (_assert2 || _assert()).default)(executor != null);
// TODO: Is this the best way to do this? Might want to go through nuclide-executors and have
// that register output sources?
return (_rxjsBundlesRxUmdMinJs2 || _rxjsBundlesRxUmdMinJs()).Observable.of((_Actions2 || _Actions()).recordReceived({
sourceId: currentExecutorId,
kind: 'request',
level: 'log',
text: code,
scopeName: executor.scopeName
}))
// Execute the code as a side-effect.
.finally(function () {
executor.send(code);
});
});
}
function registerRecordProviderEpic(actions, store) {
return actions.ofType((_Actions2 || _Actions()).REGISTER_RECORD_PROVIDER).flatMap(function (action) {
(0, (_assert2 || _assert()).default)(action.type === (_Actions2 || _Actions()).REGISTER_RECORD_PROVIDER);
var recordProvider = action.payload.recordProvider;
// Transform the messages into actions and merge them into the action stream.
// TODO: Add enabling/disabling of registered source and only subscribe when enabled. That
// way, we won't trigger cold observer side-effects when we don't need the results.
var messageActions = recordProvider.records.map((_Actions2 || _Actions()).recordReceived);
// TODO: Can this be delayed until sometime after registration?
var statusActions = recordProvider.observeStatus == null ? (_rxjsBundlesRxUmdMinJs2 || _rxjsBundlesRxUmdMinJs()).Observable.empty() : (0, (_commonsNodeEvent2 || _commonsNodeEvent()).observableFromSubscribeFunction)(recordProvider.observeStatus).map(function (status) {
return (_Actions2 || _Actions()).updateStatus(recordProvider.id, status);
});
var unregisteredEvents = actions.ofType((_Actions2 || _Actions()).REMOVE_SOURCE).filter(function (a) {
(0, (_assert2 || _assert()).default)(a.type === (_Actions2 || _Actions()).REMOVE_SOURCE);
return a.payload.sourceId === recordProvider.id;
});
return (_rxjsBundlesRxUmdMinJs2 || _rxjsBundlesRxUmdMinJs()).Observable.merge(messageActions, statusActions).takeUntil(unregisteredEvents);
});
}