UNPKG

mdfind

Version:

Node interface for using Spotlight on Mac (via mdfind)

128 lines (106 loc) 3.93 kB
'use strict'; 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'];