mdfind
Version:
Node interface for using Spotlight on Mac (via mdfind)
128 lines (106 loc) • 3.93 kB
JavaScript
;
Object.defineProperty(exports, '__esModule', {
value: true
});
exports['default'] = mdfind;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
var _lodash = require('lodash');
var _lodash2 = _interopRequireDefault(_lodash);
var _child_process = require('child_process');
var _eventStream = require('event-stream');
function extractData(attrs, line) {
var splitLine = [line];
var _iteratorNormalCompletion = true;
var _didIteratorError = false;
var _iteratorError = undefined;
try {
for (var _iterator = attrs[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
var attr = _step.value;
var lastBit = splitLine[splitLine.length - 1];
var searchFor = ' ' + attr + ' = ';
var thisIndex = lastBit.indexOf(searchFor);
if (thisIndex === -1) {
console.log('Something went wrong with Spotlight Source - line: ' + line + ' - attr: ' + attr);
return {};
}
var endIndex = thisIndex + searchFor.length;
splitLine.splice(splitLine.length - 1, 1, lastBit.substring(0, thisIndex), lastBit.substring(endIndex));
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally {
try {
if (!_iteratorNormalCompletion && _iterator['return']) {
_iterator['return']();
}
} finally {
if (_didIteratorError) {
throw _iteratorError;
}
}
}
var adjustedLine = splitLine.map(getItem);
var keys = ['kMDItemPath'].concat(attrs);
var result = _lodash2['default'].zipObject(keys, adjustedLine);
this.emit('data', result);
}
function getItem(item) {
if (item === '(null)') {
return null;
} else if (_lodash2['default'].startsWith(item, '(\n "') && _lodash2['default'].endsWith(item, '"\n)')) {
var actual = item.slice(7, -3);
var lines = actual.split('",\n "');
return lines;
} else {
return item;
}
}
function filterEmpty(data, done) {
if (data === '') {
done();
} else {
done(null, data);
}
}
function mdfind() {
var _ref = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];
var query = _ref.query;
var _ref$attributes = _ref.attributes;
var attributes = _ref$attributes === undefined ? [] : _ref$attributes;
var _ref$names = _ref.names;
var names = _ref$names === undefined ? [] : _ref$names;
var _ref$directories = _ref.directories;
var directories = _ref$directories === undefined ? [] : _ref$directories;
var _ref$live = _ref.live;
var live = _ref$live === undefined ? false : _ref$live;
var _ref$interpret = _ref.interpret;
var interpret = _ref$interpret === undefined ? false : _ref$interpret;
var limit = _ref.limit;
var dirArgs = makeArgs(directories, '-onlyin');
var nameArgs = makeArgs(names, '-name');
var attrArgs = makeArgs(attributes, '-attr');
var interpretArgs = interpret ? ['-interpret'] : [];
var queryArgs = query ? [query] : [];
var args = ['-0'].concat(dirArgs, nameArgs, attrArgs, interpretArgs, live ? ['-live', '-reprint'] : [], queryArgs);
var child = (0, _child_process.spawn)('mdfind', args);
var jsonify = _lodash2['default'].partial(extractData, attributes);
var times = 0;
return {
output: child.stdout.pipe((0, _eventStream.split)('\0')).pipe((0, _eventStream.map)(filterEmpty)).pipe((0, _eventStream.through)(function (data) {
times++;
if (limit && times === limit) child.kill();
if (limit && times > limit) return;
this.queue(data);
})).pipe((0, _eventStream.through)(jsonify)),
terminate: function terminate() {
return child.kill();
}
};
}
function makeArgs(array, argName) {
return _lodash2['default'].chain(array).map(function (item) {
return [argName, item];
}).flatten().value();
}
module.exports = exports['default'];