Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I find out all the methods on a JXA object?

I'm trying to list all the methods of a JXA object. I've tried several methods that work with JavaScript in the browser, but none have worked:

>> Object.getOwnPropertyNames(Application('Finder').selection()[0]);
=> ["__private__"]
>>
>> JSON.stringify(Application('Finder').selection()[0])
=> undefined
>>
>> console.dir(Application('Finder').selection()[0])
!! Error on line 1: TypeError: console.dir is not a function. (In 'console.dir(Application('Finder').selection()[0])', 'console.dir' is undefined)
>>
>> for(var m in Application('Finder').selection()[0]) { console.log(m); }
=> undefined
>>
>> console.log(Application('Finder').selection()[0])
2017-01-27 16:51:16.331 osascript[18617:633276] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFStringappendString:]: nil argument'
*** First throw call stack:
(
        0   CoreFoundation                      0x00007fff77feb0db __exceptionPreprocess + 171
        1   libobjc.A.dylib                     0x00007fff8cc7da2a objc_exception_throw + 48
        2   CoreFoundation                      0x00007fff780689c5 +[NSException raise:format:] + 197
####### SNIPPED FOR BREVITY ########
        45  Foundation                          0x00007fff799944ea -[NSRunLoop(NSRunLoop) run] + 76
        46  osascript                           0x000000010d4e0485 osascript + 9349
        47  libdyld.dylib                       0x00007fff8d55f255 start + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
/Users/example/Tools/my-tools/osascript: line 24: 18617 Abort trap: 6           reattach-to-user-namespace /usr/bin/osascript "$@"

How can I get a list of all the methods that JXA object has?

like image 308
stiemannkj1 Avatar asked Jan 27 '17 22:01

stiemannkj1


2 Answers

You can obtain a list of an object's properties (which have corresponding methods), by using the object's properties() method:

>> Application('Finder').selection()[0].properties()
=> {
"class":"documentFile",
"name":"gist.sh",
"index":12,
"displayedName":"gist.sh",
"nameExtension":"sh",
"extensionHidden":false,
"container":Application("Finder").startupDisk.folders.byName("Users").folders.byName("example").folders.byName("Tools").folders.byName("my-tools"),
"disk":Application("Finder").startupDisk,
"position":{
    "x":-1, 
    "y":-1
},
"desktopPosition":null,
"bounds":{
    "x":-33,
    "y":-33,
    "width":64,
    "height":64
},
"kind":"shell script",
"labelIndex":0,
"locked":false,
"description":null,
"comment":"",
"size":804,
"physicalSize":4096,
"creationDate":Thu Jan 19 2017 13:47:43 GMT-0500 (EST),
"modificationDate":Thu Jan 19 2017 13:47:43 GMT-0500 (EST),
"icon":null,
"url":"file:///Users/example/Tools/my-tools/gist.sh",
"owner":"example",
"group":"(unknown)",
"ownerPrivileges":"read write",
"groupPrivileges":"read only",
"everyonesPrivileges":"read only",
"fileType":null,
"creatorType":null,
"stationery":false,
"productVersion":"",
"version":""
}

Any of these properties can be called as a method to retrieve the value:

>> Application('Finder').selection()[0].owner()
=> "example"
>> Application('Finder').selection()[0].displayedName()
=> "gist.sh"

Note that this list does not include all methods. Also the properties() method cannot be called on all objects.

like image 134
stiemannkj1 Avatar answered Nov 18 '22 22:11

stiemannkj1


  1. The Apple Event Object Model (a "scriptable app" interface) is an abstract relational graph, not an OO DOM. It doesn't have "methods", it has RPC + simple first-class relational queries.

  2. The AEOM is not introspectable in current apps. This is one of a number of shortcomings, many of which can be traced back to the whole thing being a quick-and-dirty first cut at a very large and ambitious problem, which was promptly scuppered by idiot Apple management disbanding the team right after v1.1 shipped, driving its designers to quit. The best you can do is read the app's dictionary by choosing File > Open Dictionary in Script Editor. Still grossly inadequate, but the best you'll get (especially now that Apple looks set to wind down the whole thing in the next few years).

  3. JXA is a bag o'balls. Just saying.

like image 37
foo Avatar answered Nov 18 '22 22:11

foo