UNPKG

@jacobx1/of-sdk

Version:

Node interface for interacting with Omnifocus

82 lines 2.63 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.omniFunc = exports.stringifyCall = exports.execOmniJsRaw = void 0; const child_process_1 = require("child_process"); function osa(fn) { const code = ` ObjC.import('stdlib') var fn = (${fn.toString()}) var args = JSON.parse($.getenv('OSA_ARGS')) var out = fn.apply(null, args) JSON.stringify(out) `; const osafn = function (...args) { return new Promise((resolve, reject) => { const child = child_process_1.execFile('/usr/bin/osascript', ['-l', 'JavaScript'], { env: { OSA_ARGS: JSON.stringify(args), }, maxBuffer: 1024 * 1000, }, (err, stdout, stderr) => { if (err) { return reject(err); } if (stderr) { console.log(stderr); } if (!stdout) { resolve(undefined); } try { resolve(JSON.parse(stdout.toString())); } catch (e) { reject(e); } }); child.stdin.write(code); child.stdin.end(); }); }; return osafn; } exports.execOmniJsRaw = osa((scpt) => { const omnifocus = Application('Omnifocus'); return omnifocus.evaluateJavascript(scpt); }); const stringifyMapper = (item) => { if (typeof item === 'function') { return item.toString(); } if (Array.isArray(item)) { return `[${item.map(stringifyMapper).join(', ')}]`; } if (typeof item === 'object' && item != null) { const valuesConcated = Object.entries(item) .map(([key, val]) => ({ key, val: stringifyMapper(val), })) .map((item) => `${item.key}: ${item.val}`) .join(', '); return `{${valuesConcated}}`; } return JSON.stringify(item); }; exports.stringifyCall = (code, ...args) => { function scpt(code, ...scriptArgs) { return code.call(this, ...scriptArgs); } const argList = [code, ...args] .map(stringifyMapper) .map((val) => `(${val})`) .join(', '); return `${scpt}; scpt.call(this, ${argList});`; }; exports.omniFunc = (code, deps) => { return (...args) => { const rawCodeString = exports.stringifyCall(code, deps, ...Array.from(args)); return exports.execOmniJsRaw(rawCodeString); }; }; //# sourceMappingURL=osa.js.map