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

2

9

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?

Blane answered 27/1, 2017 at 22:7 Comment(0)
B
16

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.

Blane answered 27/1, 2017 at 22:7 Comment(2)
You should be able to inspect the definitions of objects though with NSScriptSuiteRegistry and NSScriptClassDescription using the JXA-ObjC-BridgeLiturgics
Do you mind giving a quick code example to use those you've mentioned?Legerdemain
N
2
  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.

Noetic answered 29/1, 2017 at 17:37 Comment(2)
So you're saying don't bother learning JXA? I was really just hoping for a simple scripting interface to the Finder do to things like given a folder, find all the sub-folders, get specific files in the sub-folders and copy them to another folder. So far it seem ridiculously turgid and complex for what should be very simple tasks.Biscay
@Biscay JXA is still very powerful I would say, but not as powerful as 'scripting' in something like Swift/ObjC, if that could be called scripting at all... You should be able to inspect the definitions of objects though with NSScriptSuiteRegistry and NSScriptClassDescription using the JXA-ObjC-BridgeLiturgics

© 2022 - 2024 — McMap. All rights reserved.