@jacobx1/of-sdk
Version:
Node interface for interacting with Omnifocus
82 lines • 2.63 kB
JavaScript
;
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