New Case Study:See how Anthropic automated 95% of dependency reviews with Socket.Learn More
Socket
Sign inDemoInstall
Socket

rethinkdb-elasticsearch-stream

Package Overview
Dependencies
Maintainers
15
Versions
10
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

rethinkdb-elasticsearch-stream - npm Package Compare versions

Comparing version 2.1.0 to 2.2.0

70

build/backfill-table.js

@@ -1,2 +0,2 @@

'use strict';
"use strict";

@@ -6,17 +6,10 @@ Object.defineProperty(exports, "__esModule", {

});
exports.default = void 0;
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; };
var _through = require("through2");
var _through = require('through2');
var _saveDocument = _interopRequireDefault(require("./save-document"));
var _saveDocument = require('./save-document');
var _saveDocument2 = _interopRequireDefault(_saveDocument);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }
/**

@@ -29,36 +22,37 @@ * Fill an Elasticsearch type with the contents of a RethinkDB table

*/
function backfillTable(r, _ref) {
let { db, esType, table } = _ref,
properties = _objectWithoutProperties(_ref, ['db', 'esType', 'table']);
function backfillTable(r, {
db,
esType,
table,
...properties
}) {
return new Promise((resolve, reject) => {
const dataStream = r.db(db).table(table).toStream();
dataStream.pipe((0, _through.obj)(async (chunk, enc, cb) => {
try {
await (0, _saveDocument.default)({
db,
document: chunk,
table: esType || table,
...properties
});
} catch (e) {
const {
request,
response
} = e;
dataStream.pipe((0, _through.obj)((() => {
var _ref2 = _asyncToGenerator(function* (chunk, enc, cb) {
try {
yield (0, _saveDocument2.default)(_extends({
db,
document: chunk,
table: esType || table
}, properties));
} catch (e) {
const { request, response } = e;
if (request && response && request.path) {
console.log(`ES error for ${request.path} [${response.status}]`);
} else {
console.log('ES error', e);
}
if (request && response && request.path) {
console.log(`ES error for ${request.path} [${response.status}]`);
} else {
console.log('ES error', e);
}
}
cb();
});
return function (_x, _x2, _x3) {
return _ref2.apply(this, arguments);
};
})())).on('error', reject).on('finish', resolve);
cb();
})).on('error', reject).on('finish', resolve);
});
}
exports.default = backfillTable;
var _default = backfillTable;
exports.default = _default;

@@ -1,2 +0,2 @@

'use strict';
"use strict";

@@ -6,6 +6,6 @@ Object.defineProperty(exports, "__esModule", {

});
exports.default = {
exports.default = void 0;
var _default = {
// If the Elasticsearch instance should be populated with existing RethinkDB data
backfill: true,
// Connection details for an Elasticsearch instance

@@ -16,3 +16,2 @@ elasticsearch: {

},
// Connection details for the RethinkDB instance to be copied

@@ -24,8 +23,7 @@ // See [rethinkdbdash](https://github.com/neumino/rethinkdbdash) for all possible options.

},
// Tables to duplicate and watch for changes
tables: [],
// If the Elasticsearch instance should be updated when RethinkDB emits a changefeed event
watch: true
};
};
exports.default = _default;

@@ -6,2 +6,4 @@ "use strict";

});
exports.default = void 0;
function delay(ms) {

@@ -11,2 +13,3 @@ return new Promise(resolve => setTimeout(resolve, ms));

exports.default = delay;
var _default = delay;
exports.default = _default;

@@ -1,2 +0,2 @@

'use strict';
"use strict";

@@ -6,2 +6,4 @@ Object.defineProperty(exports, "__esModule", {

});
exports.default = void 0;
/**

@@ -13,3 +15,7 @@ * Utility to get the path Elasticsearch should work with

*/
function elasticsearchPath({ db = '', id = '', table = '' } = {}) {
function elasticsearchPath({
db = '',
id = '',
table = ''
} = {}) {
// If `db` or `table` are not strings, that's probably a mistake

@@ -28,4 +34,5 @@ if (typeof db !== 'string') {

return '/';
}
// Given table but no db is probably incorrect
} // Given table but no db is probably incorrect
throw new Error('Table provided but not database.');

@@ -45,2 +52,3 @@ }

exports.default = elasticsearchPath;
var _default = elasticsearchPath;
exports.default = _default;

@@ -1,2 +0,2 @@

'use strict';
"use strict";

@@ -6,52 +6,39 @@ Object.defineProperty(exports, "__esModule", {

});
exports.default = void 0;
var _tableExists = _interopRequireDefault(require("./table-exists"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
const getTableExists = async (r, {
db,
table
}) => ({
exists: await (0, _tableExists.default)({
db,
r,
table
}),
name: `${db}:${table}`
});
/**
* Make sure table options are in the correct format
*/
let ensureTables = (() => {
var _ref2 = _asyncToGenerator(function* (r, tables) {
if (!Array.isArray(tables)) {
throw new TypeError('`tables` must be an array of objects.');
}
const existingTables = yield Promise.all(tables.map(function (table) {
return getTableExists(r, table);
}));
const missingTables = existingTables.filter(function (table) {
return !table.exists;
});
async function ensureTables(r, tables) {
if (!Array.isArray(tables)) {
throw new TypeError('`tables` must be an array of objects.');
}
if (missingTables.length !== 0) {
const missingTableNames = missingTables.map(function (t) {
return t.name;
}).join(', ');
throw new Error(`Table(s) ${missingTableNames} could not be found.`);
}
});
const existingTables = await Promise.all(tables.map(table => getTableExists(r, table)));
const missingTables = existingTables.filter(table => !table.exists);
return function ensureTables(_x3, _x4) {
return _ref2.apply(this, arguments);
};
})();
if (missingTables.length !== 0) {
const missingTableNames = missingTables.map(t => t.name).join(', ');
throw new Error(`Table(s) ${missingTableNames} could not be found.`);
}
}
var _tableExists = require('./table-exists');
var _tableExists2 = _interopRequireDefault(_tableExists);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
const getTableExists = (() => {
var _ref = _asyncToGenerator(function* (r, { db, table }) {
return {
exists: yield (0, _tableExists2.default)({ db, r, table }),
name: `${db}:${table}`
};
});
return function getTableExists(_x, _x2) {
return _ref.apply(this, arguments);
};
})();exports.default = ensureTables;
var _default = ensureTables;
exports.default = _default;

@@ -1,2 +0,2 @@

'use strict';
"use strict";

@@ -6,119 +6,80 @@ Object.defineProperty(exports, "__esModule", {

});
exports._delete = undefined;
exports._delete = exports.default = void 0;
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; };
var _axios = _interopRequireDefault(require("axios"));
let init = (() => {
var _ref = _asyncToGenerator(function* (extraOptions) {
const options = _extends({}, _defaultOptions2.default, extraOptions);
var _rethinkdbdash = _interopRequireDefault(require("rethinkdbdash"));
elasticsearchBaseUrl = (0, _urlString2.default)(options.elasticsearch);
r = (0, _rethinkdbdash2.default)(options.rethinkdb);
var _backfillTable = _interopRequireDefault(require("./backfill-table"));
// If an error is thrown, try to cleanup connection pool before throwing error to handler
try {
yield ensureConnections(options.elasticsearch);
yield (0, _ensureTables2.default)(r, options.tables);
} catch (e) {
yield cleanup();
throw e;
}
var _defaultOptions = _interopRequireDefault(require("./defaultOptions"));
if (options.watch) {
options.tables.forEach(function (tableDetails) {
return (0, _watchTable2.default)(r, _extends({ baseURL: elasticsearchBaseUrl }, tableDetails));
});
}
var _ensureTables = _interopRequireDefault(require("./ensure-tables"));
if (options.backfill) {
const backfillPromises = options.tables.map(function (tableDetails) {
return (0, _backfillTable2.default)(r, _extends({
baseURL: elasticsearchBaseUrl
}, tableDetails));
});
var _urlString = _interopRequireDefault(require("./url-string"));
yield Promise.all(backfillPromises);
}
var _watchTable = _interopRequireDefault(require("./watch-table"));
// If nothing is to be done, cleanup connections and exit
if (!options.watch) {
cleanup();
}
});
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
return function init(_x) {
return _ref.apply(this, arguments);
};
})();
// The base URL for the Elasticsearch server
let elasticsearchBaseUrl; // A handle to the RethinkDB driver instance
let cleanup = (() => {
var _ref2 = _asyncToGenerator(function* () {
return r.getPoolMaster().drain();
});
let r;
return function cleanup() {
return _ref2.apply(this, arguments);
async function init(extraOptions) {
const options = { ..._defaultOptions.default,
...extraOptions
};
})();
elasticsearchBaseUrl = (0, _urlString.default)(options.elasticsearch);
r = (0, _rethinkdbdash.default)(options.rethinkdb); // If an error is thrown, try to cleanup connection pool before throwing error to handler
/**
* Make sure a connection can be made to the services needed.
*/
try {
await ensureConnections(options.elasticsearch);
await (0, _ensureTables.default)(r, options.tables);
} catch (e) {
await cleanup();
throw e;
}
if (options.watch) {
options.tables.forEach(tableDetails => (0, _watchTable.default)(r, {
baseURL: elasticsearchBaseUrl,
...tableDetails
}));
}
let ensureConnections = (() => {
var _ref3 = _asyncToGenerator(function* () {
// `rethinkdbdash` hanldes RethinkDB's connection pools, so we're ignoring that for now
const elasticsearchResponse = yield _axios2.default.get(elasticsearchBaseUrl);
const elasticsearchHealthy = typeof elasticsearchResponse.data.cluster_uuid === 'string';
if (options.backfill) {
const backfillPromises = options.tables.map(tableDetails => (0, _backfillTable.default)(r, {
baseURL: elasticsearchBaseUrl,
...tableDetails
}));
await Promise.all(backfillPromises);
} // If nothing is to be done, cleanup connections and exit
if (!elasticsearchHealthy) {
throw new Error('Could not connect to Elasticsearch server');
}
});
return function ensureConnections() {
return _ref3.apply(this, arguments);
};
})();
if (!options.watch) {
cleanup();
}
}
var _axios = require('axios');
async function cleanup() {
return r.getPoolMaster().drain();
}
/**
* Make sure a connection can be made to the services needed.
*/
var _axios2 = _interopRequireDefault(_axios);
var _rethinkdbdash = require('rethinkdbdash');
async function ensureConnections() {
// `rethinkdbdash` hanldes RethinkDB's connection pools, so we're ignoring that for now
const elasticsearchResponse = await _axios.default.get(elasticsearchBaseUrl);
const elasticsearchHealthy = typeof elasticsearchResponse.data.cluster_uuid === 'string';
var _rethinkdbdash2 = _interopRequireDefault(_rethinkdbdash);
if (!elasticsearchHealthy) {
throw new Error('Could not connect to Elasticsearch server');
}
}
var _backfillTable = require('./backfill-table');
var _backfillTable2 = _interopRequireDefault(_backfillTable);
var _defaultOptions = require('./defaultOptions');
var _defaultOptions2 = _interopRequireDefault(_defaultOptions);
var _ensureTables = require('./ensure-tables');
var _ensureTables2 = _interopRequireDefault(_ensureTables);
var _urlString = require('./url-string');
var _urlString2 = _interopRequireDefault(_urlString);
var _watchTable = require('./watch-table');
var _watchTable2 = _interopRequireDefault(_watchTable);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
// The base URL for the Elasticsearch server
let elasticsearchBaseUrl;
// A handle to the RethinkDB driver instance
let r;
exports.default = init;
var _default = init;
/**

@@ -129,2 +90,6 @@ * This can be imported and used in a transform to indicate that the document

const _delete = exports._delete = Symbol('delete');
exports.default = _default;
const _delete = Symbol('delete');
exports._delete = _delete;

@@ -1,2 +0,2 @@

'use strict';
"use strict";

@@ -6,5 +6,12 @@ Object.defineProperty(exports, "__esModule", {

});
exports.default = void 0;
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; };
var _axios = _interopRequireDefault(require("axios"));
var _elasticsearchPath = _interopRequireDefault(require("./elasticsearch-path"));
var _ = require(".");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/**

@@ -18,60 +25,46 @@ * Replicate a document in Elasticsearch

*/
let saveDocument = (() => {
var _ref = _asyncToGenerator(function* ({
baseURL,
db,
deleteTransform,
document,
esType,
idKey,
oldDocument,
table,
transform
}) {
let documentToSave;
async function saveDocument({
baseURL,
db,
deleteTransform,
document,
esType,
idKey,
oldDocument,
table,
transform
}) {
let documentToSave; // document will be null if the doc was deleted in Rethink
// document will be null if the doc was deleted in Rethink
if (document === null) {
documentToSave = deleteTransform != null ? yield deleteTransform({ db, document, oldDocument, table })
// if a deleteTransform isn't provided, the default behavior is to just
// delete the document from elastic search
: _extends({}, oldDocument, {
_delete: _._delete
});
} else {
documentToSave = transform != null ? yield transform({ db, document, oldDocument, table }) : document;
}
if (document === null) {
documentToSave = deleteTransform != null ? await deleteTransform({
db,
document,
oldDocument,
table
}) // if a deleteTransform isn't provided, the default behavior is to just
// delete the document from elastic search
: { ...oldDocument,
_delete: _._delete
};
} else {
documentToSave = transform != null ? await transform({
db,
document,
oldDocument,
table
}) : document;
}
if (Array.isArray(documentToSave)) {
return Promise.all(documentToSave.map(function (d) {
return pushDocument(baseURL, db, d, idKey, esType || table);
}));
}
return pushDocument(baseURL, db, documentToSave, idKey, esType || table);
});
if (Array.isArray(documentToSave)) {
return Promise.all(documentToSave.map(d => pushDocument(baseURL, db, d, idKey, esType || table)));
}
return function saveDocument(_x) {
return _ref.apply(this, arguments);
};
})();
return pushDocument(baseURL, db, documentToSave, idKey, esType || table);
}
var _axios = require('axios');
var _axios2 = _interopRequireDefault(_axios);
var _elasticsearchPath = require('./elasticsearch-path');
var _elasticsearchPath2 = _interopRequireDefault(_elasticsearchPath);
var _ = require('.');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
function pushDocument(baseURL, db, doc, idKey, table) {
if (doc == null) return;
if (Object.keys(doc).length === 0) return;
const path = (0, _elasticsearchPath2.default)({
const path = (0, _elasticsearchPath.default)({
db,

@@ -83,12 +76,19 @@ id: idKey ? doc[idKey] : null,

if (doc._delete === _._delete) {
return _axios2.default.delete(path, { baseURL });
return _axios.default.delete(path, {
baseURL
});
}
if (idKey) {
return _axios2.default.put(path, doc, { baseURL });
return _axios.default.put(path, doc, {
baseURL
});
}
return _axios2.default.post(path, doc, { baseURL });
return _axios.default.post(path, doc, {
baseURL
});
}
exports.default = saveDocument;
var _default = saveDocument;
exports.default = _default;

@@ -6,2 +6,3 @@ "use strict";

});
exports.default = void 0;

@@ -14,20 +15,17 @@ /**

*/
let tableExists = (() => {
var _ref = _asyncToGenerator(function* ({ r, db, table }) {
const hasDB = yield r.dbList().contains(db);
async function tableExists({
r,
db,
table
}) {
const hasDB = await r.dbList().contains(db);
if (hasDB) {
return r.db(db).tableList().contains(table);
}
if (hasDB) {
return r.db(db).tableList().contains(table);
}
return false;
});
return false;
}
return function tableExists(_x) {
return _ref.apply(this, arguments);
};
})();
function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
exports.default = tableExists;
var _default = tableExists;
exports.default = _default;

@@ -1,2 +0,2 @@

'use strict';
"use strict";

@@ -6,9 +6,16 @@ Object.defineProperty(exports, "__esModule", {

});
exports.default = void 0;
/**
* Utility to create a URL string from an object representing parts of a URL
*/
function urlString({ host = '127.0.0.1', port, protocol = 'http' }) {
function urlString({
host = '127.0.0.1',
port,
protocol = 'http'
}) {
return `${protocol}://${host}:${port}`;
}
exports.default = urlString;
var _default = urlString;
exports.default = _default;

@@ -1,2 +0,2 @@

'use strict';
"use strict";

@@ -6,17 +6,10 @@ Object.defineProperty(exports, "__esModule", {

});
exports.default = void 0;
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; };
var _rethinkdbChangefeedReconnect = _interopRequireDefault(require("rethinkdb-changefeed-reconnect"));
var _rethinkdbChangefeedReconnect = require('rethinkdb-changefeed-reconnect');
var _saveDocument = _interopRequireDefault(require("./save-document"));
var _rethinkdbChangefeedReconnect2 = _interopRequireDefault(_rethinkdbChangefeedReconnect);
var _saveDocument = require('./save-document');
var _saveDocument2 = _interopRequireDefault(_saveDocument);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }
/**

@@ -28,9 +21,24 @@ * Stream changes from a RethinkDB table into Elasticsearch

*/
function watchTable(r, _ref) {
let { db, table } = _ref,
properties = _objectWithoutProperties(_ref, ['db', 'table']);
(0, _rethinkdbChangefeedReconnect2.default)(() => r.db(db).table(table).changes(), ({ new_val: document, old_val: oldDocument }) => (0, _saveDocument2.default)(_extends({ db, document, oldDocument, table }, properties)), err => console.error(err.stack), { attemptDelay: 60000, maxAttempts: Infinity, silent: true });
function watchTable(r, {
db,
table,
...properties
}) {
(0, _rethinkdbChangefeedReconnect.default)(() => r.db(db).table(table).changes(), ({
new_val: document,
old_val: oldDocument
}) => (0, _saveDocument.default)({
db,
document,
oldDocument,
table,
...properties
}), err => console.error(err.stack), {
attemptDelay: 60000,
maxAttempts: Infinity,
silent: true
});
}
exports.default = watchTable;
var _default = watchTable;
exports.default = _default;
{
"name": "rethinkdb-elasticsearch-stream",
"version": "2.1.0",
"version": "2.2.0",
"main": "build/index.js",

@@ -9,5 +9,7 @@ "repository": "https://github.com/gsandf/rethinkdb-elasticsearch-stream",

"ava": {
"babel": "inherit",
"require": [
"babel-register"
"@babel/register"
],
"sources": [
"src/**/*.test.js"
]

@@ -18,3 +20,3 @@ },

[
"env",
"@babel/preset-env",
{

@@ -25,4 +27,31 @@ "targets": {

}
]
],
"plugins": [
"@babel/plugin-syntax-dynamic-import",
"@babel/plugin-syntax-import-meta",
"@babel/plugin-proposal-class-properties",
"@babel/plugin-proposal-json-strings",
[
"@babel/plugin-proposal-decorators",
{
"legacy": true
}
],
"stage-0"
"@babel/plugin-proposal-function-sent",
"@babel/plugin-proposal-export-namespace-from",
"@babel/plugin-proposal-numeric-separator",
"@babel/plugin-proposal-throw-expressions",
"@babel/plugin-proposal-export-default-from",
"@babel/plugin-proposal-logical-assignment-operators",
"@babel/plugin-proposal-optional-chaining",
[
"@babel/plugin-proposal-pipeline-operator",
{
"proposal": "minimal"
}
],
"@babel/plugin-proposal-nullish-coalescing-operator",
"@babel/plugin-proposal-do-expressions",
"@babel/plugin-proposal-function-bind"
]

@@ -34,3 +63,3 @@ },

"scripts": {
"build": "babel src --out-dir build --ignore *.test.js,test-helpers",
"build": "babel src --out-dir build --ignore src/*.test.js,src/test-helpers",
"container": "docker-compose run app",

@@ -43,24 +72,41 @@ "coverage": "nyc ava",

"start": "node .",
"test": "ava src/**/*.test.js",
"test:container": "docker-compose build && docker-compose run app yarn test -- -v; docker-compose down"
"test": "ava",
"test:container": "docker-compose build && docker-compose run app yarn test -v; docker-compose down"
},
"devDependencies": {
"ava": "^0.24.0",
"babel-cli": "^6.26.0",
"babel-preset-env": "^1.6.0",
"babel-preset-stage-0": "^6.24.1",
"eslint": "^4.5.0",
"eslint-config-gsandf": "^1.0.0",
"nock": "^9.2.3",
"nyc": "^11.1.0",
"p-retry": "^1.0.0",
"prettier-eslint-cli": "^4.2.1"
"@babel/cli": "^7.0.0",
"@babel/core": "^7.0.0",
"@babel/plugin-proposal-class-properties": "^7.0.0",
"@babel/plugin-proposal-decorators": "^7.0.0",
"@babel/plugin-proposal-do-expressions": "^7.0.0",
"@babel/plugin-proposal-export-default-from": "^7.0.0",
"@babel/plugin-proposal-export-namespace-from": "^7.0.0",
"@babel/plugin-proposal-function-bind": "^7.0.0",
"@babel/plugin-proposal-function-sent": "^7.0.0",
"@babel/plugin-proposal-json-strings": "^7.0.0",
"@babel/plugin-proposal-logical-assignment-operators": "^7.0.0",
"@babel/plugin-proposal-nullish-coalescing-operator": "^7.0.0",
"@babel/plugin-proposal-numeric-separator": "^7.0.0",
"@babel/plugin-proposal-optional-chaining": "^7.0.0",
"@babel/plugin-proposal-pipeline-operator": "^7.0.0",
"@babel/plugin-proposal-throw-expressions": "^7.0.0",
"@babel/plugin-syntax-dynamic-import": "^7.0.0",
"@babel/plugin-syntax-import-meta": "^7.0.0",
"@babel/preset-env": "^7.0.0",
"@babel/register": "^7.4.4",
"ava": "^2.2.0",
"eslint": "^6.0.1",
"eslint-config-gsandf": "^1.0.1",
"nock": "^10.0.6",
"nyc": "^14.1.1",
"p-retry": "^4.1.0",
"prettier-eslint-cli": "^5.0.0"
},
"dependencies": {
"axios": "^0.17.0",
"axios": "^0.19.0",
"rethinkdb": "^2.3.3",
"rethinkdb-changefeed-reconnect": "^0.3.2",
"rethinkdbdash": "^2.3.31",
"through2": "^2.0.3"
"through2": "^3.0.1"
}
}
SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc