Add multiple macOS FMA (#37060)
This pull request adds support for several new macOS applications to the maintained apps catalog. It introduces metadata, installation, and uninstallation scripts for each app, and updates the main `apps.json` output to include these new entries. The changes are grouped into new app additions and corresponding installer/uninstaller script implementations. **New macOS app additions:** * Added metadata and catalog entries for the following applications: Egnyte, Elgato Control Center, Elgato Stream Deck, ExpressVPN, Fork, Front, Ghostty, GIMP, and Hyper. Each app now has a dedicated input JSON file and an entry in `apps.json` with platform, identifier, and description. [[1]](diffhunk://#diff-23ba1125ec0779e89bd0e70b112583b332e841bc14a4920419e0c116f6718aecR1-R8) [[2]](diffhunk://#diff-c0489d22fc52f53b7a44c4fb6b16c25eb8e22d53772c62bad36c3a874138cc65R1-R8) [[3]](diffhunk://#diff-96bdb6025cdcaefdb9c689401cfd102ed248ce0360a178da5e208b570967d459R1-R8) [[4]](diffhunk://#diff-a5441bc7fd33cb26cc4bc787bfec51f8a0384f7270cd7e97958c3a814e71fa7cR1-R8) [[5]](diffhunk://#diff-82a6115c15a63073e97e105400f396f3b6a6181e787dde23c5b038c1018c4b9eR1-R8) [[6]](diffhunk://#diff-ddee5c0aabd18f5cbdb8d3cab2a9f069e895401e9dd5f94db2b06af940f286f8R1-R8) [[7]](diffhunk://#diff-f11cb1fa827924b89af074a0ec08aae96f962abf08133df45a8d326f22ff467bR1-R8) [[8]](diffhunk://#diff-a481e356326319c0bd932ece074bdd533294a19a333da5dbfc0c081b4052fa1dR1-R8) [[9]](diffhunk://#diff-ffe0600fd34e997bde34d076822e13354866d9dbc6c6fd43865b4a70f0a479a0R1-R8) [[10]](diffhunk://#diff-4c1446cfc02c6bb0bda874481e333c65b84e184fcea52f656b49a6489f73c9c2R515-R549) [[11]](diffhunk://#diff-4c1446cfc02c6bb0bda874481e333c65b84e184fcea52f656b49a6489f73c9c2R578-R605) [[12]](diffhunk://#diff-4c1446cfc02c6bb0bda874481e333c65b84e184fcea52f656b49a6489f73c9c2R683-R689) **Installer and uninstaller script implementations:** * For each new app, added output JSON files containing version info, installer URLs, SHA256 hashes, and install/uninstall scripts. These scripts handle application installation and cleanup, including quitting running apps and removing associated files and directories. [[1]](diffhunk://#diff-458d8f6eb15663b336e76a6964ca22f83e940b0bef4474391d46a1698cd3dcb4R1-R21) [[2]](diffhunk://#diff-5f9bd670a42a11fb7ab0bf3575557a938a96d8652497c14e2e8f60369f735bf8R1-R21) [[3]](diffhunk://#diff-c31491a17eb8dff09d145de13e703188c032a446a8e74060505024c239db208fR1-R21) These updates expand the catalog’s coverage and ensure proper lifecycle management for each newly supported app.
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"name": "Egnyte",
|
||||
"unique_identifier": "com.egnyte.DesktopApp",
|
||||
"token": "egnyte",
|
||||
"installer_format": "dmg",
|
||||
"slug": "egnyte/darwin",
|
||||
"default_categories": ["Productivity"]
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"name": "Elgato Control Center",
|
||||
"unique_identifier": "com.corsair.ControlCenter",
|
||||
"token": "elgato-control-center",
|
||||
"installer_format": "zip",
|
||||
"slug": "elgato-control-center/darwin",
|
||||
"default_categories": ["Productivity"]
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"name": "Elgato Stream Deck",
|
||||
"unique_identifier": "com.elgato.StreamDeck",
|
||||
"token": "elgato-stream-deck",
|
||||
"installer_format": "pkg",
|
||||
"slug": "elgato-stream-deck/darwin",
|
||||
"default_categories": ["Productivity"]
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"name": "ExpressVPN",
|
||||
"unique_identifier": "com.expressvpn.ExpressVPN",
|
||||
"token": "expressvpn",
|
||||
"installer_format": "pkg",
|
||||
"slug": "expressvpn/darwin",
|
||||
"default_categories": ["Productivity"]
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"name": "Fork",
|
||||
"unique_identifier": "com.DanPristupov.Fork",
|
||||
"token": "fork",
|
||||
"installer_format": "dmg",
|
||||
"slug": "fork/darwin",
|
||||
"default_categories": ["Developer tools"]
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"name": "Front",
|
||||
"unique_identifier": "com.frontapp.Front",
|
||||
"token": "front",
|
||||
"installer_format": "zip",
|
||||
"slug": "front/darwin",
|
||||
"default_categories": ["Communication"]
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"name": "Ghostty",
|
||||
"unique_identifier": "com.mitchellh.ghostty",
|
||||
"token": "ghostty",
|
||||
"installer_format": "dmg",
|
||||
"slug": "ghostty/darwin",
|
||||
"default_categories": ["Productivity"]
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"name": "GIMP",
|
||||
"unique_identifier": "org.gimp.gimp-3.0",
|
||||
"token": "gimp",
|
||||
"installer_format": "dmg",
|
||||
"slug": "gimp/darwin",
|
||||
"default_categories": ["Productivity"]
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"name": "Hyper",
|
||||
"unique_identifier": "co.zeit.hyper",
|
||||
"token": "hyper",
|
||||
"installer_format": "zip",
|
||||
"slug": "hyper/darwin",
|
||||
"default_categories": ["Productivity"]
|
||||
}
|
||||
@@ -512,6 +512,27 @@
|
||||
"unique_identifier": "epp.package.committers",
|
||||
"description": "Eclipse IDE is an Eclipse integrated development environment for Java."
|
||||
},
|
||||
{
|
||||
"name": "Egnyte",
|
||||
"slug": "egnyte/darwin",
|
||||
"platform": "darwin",
|
||||
"unique_identifier": "com.egnyte.DesktopApp",
|
||||
"description": "Egnyte is a client for the Egnyte cloud storage service."
|
||||
},
|
||||
{
|
||||
"name": "Elgato Control Center",
|
||||
"slug": "elgato-control-center/darwin",
|
||||
"platform": "darwin",
|
||||
"unique_identifier": "com.corsair.ControlCenter",
|
||||
"description": "Elgate Control Center is an app to control your Elgato key lights."
|
||||
},
|
||||
{
|
||||
"name": "Elgato Stream Deck",
|
||||
"slug": "elgato-stream-deck/darwin",
|
||||
"platform": "darwin",
|
||||
"unique_identifier": "com.elgato.StreamDeck",
|
||||
"description": "Elgateo Stream Deck is an app to assign keys, and then decorate and label them, on a Stream Deck."
|
||||
},
|
||||
{
|
||||
"name": "Evernote",
|
||||
"slug": "evernote/darwin",
|
||||
@@ -519,6 +540,13 @@
|
||||
"unique_identifier": "com.evernote.Evernote",
|
||||
"description": "Evernote is an app for note taking, organising, task lists, and archiving."
|
||||
},
|
||||
{
|
||||
"name": "ExpressVPN",
|
||||
"slug": "expressvpn/darwin",
|
||||
"platform": "darwin",
|
||||
"unique_identifier": "com.expressvpn.ExpressVPN",
|
||||
"description": "ExpressVPN is a VPN client for secure internet access and private browsing."
|
||||
},
|
||||
{
|
||||
"name": "Figma",
|
||||
"slug": "figma/darwin",
|
||||
@@ -547,6 +575,34 @@
|
||||
"unique_identifier": "Mozilla Firefox (x64 en-US)",
|
||||
"description": "Firefox is a powerful, open-source web browser built for speed, privacy, and customization."
|
||||
},
|
||||
{
|
||||
"name": "Fork",
|
||||
"slug": "fork/darwin",
|
||||
"platform": "darwin",
|
||||
"unique_identifier": "com.DanPristupov.Fork",
|
||||
"description": "Fork is a git client."
|
||||
},
|
||||
{
|
||||
"name": "Front",
|
||||
"slug": "front/darwin",
|
||||
"platform": "darwin",
|
||||
"unique_identifier": "com.frontapp.Front",
|
||||
"description": "Front is a customer communication platform."
|
||||
},
|
||||
{
|
||||
"name": "Ghostty",
|
||||
"slug": "ghostty/darwin",
|
||||
"platform": "darwin",
|
||||
"unique_identifier": "com.mitchellh.ghostty",
|
||||
"description": "Ghostty is a terminal emulator that uses platform-native UI and GPU acceleration."
|
||||
},
|
||||
{
|
||||
"name": "GIMP",
|
||||
"slug": "gimp/darwin",
|
||||
"platform": "darwin",
|
||||
"unique_identifier": "org.gimp.gimp-3.0",
|
||||
"description": "GIMP is a free and open-source image editor."
|
||||
},
|
||||
{
|
||||
"name": "GitHub Desktop",
|
||||
"slug": "github-desktop/windows",
|
||||
@@ -624,6 +680,13 @@
|
||||
"unique_identifier": "com.granola.app",
|
||||
"description": "Granola is an AI-powered notepad for meetings."
|
||||
},
|
||||
{
|
||||
"name": "Hyper",
|
||||
"slug": "hyper/darwin",
|
||||
"platform": "darwin",
|
||||
"unique_identifier": "co.zeit.hyper",
|
||||
"description": "Hyper is a terminal built on web technologies."
|
||||
},
|
||||
{
|
||||
"name": "iMazing Profile Editor",
|
||||
"slug": "imazing-profile-editor/darwin",
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"versions": [
|
||||
{
|
||||
"version": "1.12.1",
|
||||
"queries": {
|
||||
"exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.egnyte.DesktopApp';"
|
||||
},
|
||||
"installer_url": "https://egnyte-cdn.egnyte.com/desktopapp/mac/en-us/1.12.1/Egnyte_1.12.1_2304.dmg",
|
||||
"install_script_ref": "808a634e",
|
||||
"uninstall_script_ref": "14159466",
|
||||
"sha256": "a46e13d4ea42580c440369a4f738a799191e9244f100470d8feec2345a5b93e0",
|
||||
"default_categories": [
|
||||
"Productivity"
|
||||
]
|
||||
}
|
||||
],
|
||||
"refs": {
|
||||
"14159466": "#!/bin/sh\n\n# variables\nAPPDIR=\"/Applications/\"\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\ntrash() {\n local logged_in_user=\"$1\"\n local target_file=\"$2\"\n local timestamp=\"$(date +%Y-%m-%d-%s)\"\n local rand=\"$(jot -r 1 0 99999)\"\n\n # replace ~ with /Users/$logged_in_user\n if [[ \"$target_file\" == ~* ]]; then\n target_file=\"/Users/$logged_in_user${target_file:1}\"\n fi\n\n local trash=\"/Users/$logged_in_user/.Trash\"\n local file_name=\"$(basename \"${target_file}\")\"\n\n if [[ -e \"$target_file\" ]]; then\n echo \"removing $target_file.\"\n mv -f \"$target_file\" \"$trash/${file_name}_${timestamp}_${rand}\"\n else\n echo \"$target_file doesn't exist.\"\n fi\n}\n\nsudo rm -rf \"$APPDIR/Egnyte.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Scripts/com.egnyte.DesktopApp'\ntrash $LOGGED_IN_USER '~/Library/Application Scripts/com.egnyte.DesktopApp.FileProvider'\ntrash $LOGGED_IN_USER '~/Library/Application Scripts/com.egnyte.DesktopApp.FinderHelper'\ntrash $LOGGED_IN_USER '~/Library/Application Scripts/com.egnyte.DesktopApp.FinderHelper.FinderSync'\ntrash $LOGGED_IN_USER '~/Library/Application Scripts/FELUD555VC.group.com.egnyte.DesktopApp'\ntrash $LOGGED_IN_USER '~/Library/Application Support/com.apple.sharedfilelist/com.apple.LSSharedFileList.ApplicationRecentDocuments/com.egnyte.desktopapp.sfl*'\ntrash $LOGGED_IN_USER '~/Library/Application Support/FileProvider/com.egnyte.DesktopApp.FileProvider'\ntrash $LOGGED_IN_USER '~/Library/Caches/SentryCrash/EgnyteLaunchHelper'\ntrash $LOGGED_IN_USER '~/Library/Caches/SentryCrash/EgnyteUpgradeChecker'\ntrash $LOGGED_IN_USER '~/Library/CloudStorage/Egnyte-*'\ntrash $LOGGED_IN_USER '~/Library/Containers/com.egnyte.DesktopApp'\ntrash $LOGGED_IN_USER '~/Library/Containers/com.egnyte.DesktopApp.FileProvider'\ntrash $LOGGED_IN_USER '~/Library/Containers/com.egnyte.DesktopApp.FinderHelper'\ntrash $LOGGED_IN_USER '~/Library/Containers/com.egnyte.DesktopApp.FinderHelper.FinderSync'\ntrash $LOGGED_IN_USER '~/Library/Group Containers/FELUD555VC.group.com.egnyte.DesktopApp'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.apple.FileProvider/com.egnyte.DesktopApp.FileProvider'\n",
|
||||
"808a634e": "#!/bin/sh\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath $INSTALLER_PATH)\")\n# functions\n\nquit_application() {\n local bundle_id=\"$1\"\n local timeout_duration=10\n\n # check if the application is running\n if ! osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ $EUID -eq 0 && \"$console_user\" == \"root\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\n# extract contents\nMOUNT_POINT=$(mktemp -d /tmp/dmg_mount_XXXXXX)\nhdiutil attach -plist -nobrowse -readonly -mountpoint \"$MOUNT_POINT\" \"$INSTALLER_PATH\"\nsudo cp -R \"$MOUNT_POINT\"/* \"$TMPDIR\"\nhdiutil detach \"$MOUNT_POINT\"\n# copy to the applications folder\nquit_application 'com.egnyte.DesktopApp'\nif [ -d \"$APPDIR/Egnyte.app\" ]; then\n\tsudo mv \"$APPDIR/Egnyte.app\" \"$TMPDIR/Egnyte.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Egnyte.app\" \"$APPDIR\"\n"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"versions": [
|
||||
{
|
||||
"version": "1.8.2",
|
||||
"queries": {
|
||||
"exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.corsair.ControlCenter';"
|
||||
},
|
||||
"installer_url": "https://edge.elgato.com/egc/macos/eccm/1.8.2/ElgatoControlCenter-1.8.2.20643.zip",
|
||||
"install_script_ref": "e49ffe80",
|
||||
"uninstall_script_ref": "f6271677",
|
||||
"sha256": "c84270f56f4adacd1c47058cc5a3824b0911886f3519c21b4f54c4ebf9dce869",
|
||||
"default_categories": [
|
||||
"Productivity"
|
||||
]
|
||||
}
|
||||
],
|
||||
"refs": {
|
||||
"e49ffe80": "#!/bin/sh\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath $INSTALLER_PATH)\")\n# functions\n\nquit_application() {\n local bundle_id=\"$1\"\n local timeout_duration=10\n\n # check if the application is running\n if ! osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ $EUID -eq 0 && \"$console_user\" == \"root\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\n# extract contents\nunzip \"$INSTALLER_PATH\" -d \"$TMPDIR\"\n# copy to the applications folder\nquit_application 'com.corsair.ControlCenter'\nif [ -d \"$APPDIR/Elgato Control Center.app\" ]; then\n\tsudo mv \"$APPDIR/Elgato Control Center.app\" \"$TMPDIR/Elgato Control Center.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Elgato Control Center.app\" \"$APPDIR\"\n",
|
||||
"f6271677": "#!/bin/sh\n\n# variables\nAPPDIR=\"/Applications/\"\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\nquit_application() {\n local bundle_id=\"$1\"\n local timeout_duration=10\n\n # check if the application is running\n if ! osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ $EUID -eq 0 && \"$console_user\" == \"root\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\ntrash() {\n local logged_in_user=\"$1\"\n local target_file=\"$2\"\n local timestamp=\"$(date +%Y-%m-%d-%s)\"\n local rand=\"$(jot -r 1 0 99999)\"\n\n # replace ~ with /Users/$logged_in_user\n if [[ \"$target_file\" == ~* ]]; then\n target_file=\"/Users/$logged_in_user${target_file:1}\"\n fi\n\n local trash=\"/Users/$logged_in_user/.Trash\"\n local file_name=\"$(basename \"${target_file}\")\"\n\n if [[ -e \"$target_file\" ]]; then\n echo \"removing $target_file.\"\n mv -f \"$target_file\" \"$trash/${file_name}_${timestamp}_${rand}\"\n else\n echo \"$target_file doesn't exist.\"\n fi\n}\n\nquit_application 'com.corsair.ControlCenter'\nsudo rm -rf \"$APPDIR/Elgato Control Center.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Scripts/com.corsair.ControlCenterLauncher'\ntrash $LOGGED_IN_USER '~/Library/Application Support/com.corsair.ControlCenter'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.corsair.ControlCenter'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.plausiblelabs.crashreporter.data/com.corsair.ControlCenter'\ntrash $LOGGED_IN_USER '~/Library/Containers/com.corsair.ControlCenterLauncher'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.corsair.ControlCenter.plist'\n"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"versions": [
|
||||
{
|
||||
"version": "2.60.4",
|
||||
"queries": {
|
||||
"exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.DanPristupov.Fork';"
|
||||
},
|
||||
"installer_url": "https://cdn.fork.dev/mac/Fork-2.60.4.dmg",
|
||||
"install_script_ref": "e6e8997c",
|
||||
"uninstall_script_ref": "92b40975",
|
||||
"sha256": "5dbf9cfdef2d89de3251d6b2669ca77138e15be170a5ab7f43e76cfc9062ff5f",
|
||||
"default_categories": [
|
||||
"Developer tools"
|
||||
]
|
||||
}
|
||||
],
|
||||
"refs": {
|
||||
"92b40975": "#!/bin/sh\n\n# variables\nAPPDIR=\"/Applications/\"\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\ntrash() {\n local logged_in_user=\"$1\"\n local target_file=\"$2\"\n local timestamp=\"$(date +%Y-%m-%d-%s)\"\n local rand=\"$(jot -r 1 0 99999)\"\n\n # replace ~ with /Users/$logged_in_user\n if [[ \"$target_file\" == ~* ]]; then\n target_file=\"/Users/$logged_in_user${target_file:1}\"\n fi\n\n local trash=\"/Users/$logged_in_user/.Trash\"\n local file_name=\"$(basename \"${target_file}\")\"\n\n if [[ -e \"$target_file\" ]]; then\n echo \"removing $target_file.\"\n mv -f \"$target_file\" \"$trash/${file_name}_${timestamp}_${rand}\"\n else\n echo \"$target_file doesn't exist.\"\n fi\n}\n\nsudo rm -rf \"$APPDIR/Fork.app\"\nsudo rm -rf 'fork'\ntrash $LOGGED_IN_USER '~/Library/Application Support/com.apple.sharedfilelist/com.apple.LSSharedFileList.ApplicationRecentDocuments/com.danpristupov.fork.sfl*'\ntrash $LOGGED_IN_USER '~/Library/Application Support/com.DanPristupov.Fork'\ntrash $LOGGED_IN_USER '~/Library/Application Support/Fork'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.DanPristupov.Fork'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.plausiblelabs.crashreporter.data/com.DanPristupov.Fork'\ntrash $LOGGED_IN_USER '~/Library/Cookies/com.DanPristupov.Fork.binarycookies'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/com.DanPristupov.Fork'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/com.DanPristupov.Fork.binarycookies'\ntrash $LOGGED_IN_USER '~/Library/Logs/Fork.log'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.DanPristupov.Fork.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.DanPristupov.Fork.savedState'\ntrash $LOGGED_IN_USER '~/Library/WebKit/com.DanPristupov.Fork'\n",
|
||||
"e6e8997c": "#!/bin/sh\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath $INSTALLER_PATH)\")\n# functions\n\nquit_application() {\n local bundle_id=\"$1\"\n local timeout_duration=10\n\n # check if the application is running\n if ! osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ $EUID -eq 0 && \"$console_user\" == \"root\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\n# extract contents\nMOUNT_POINT=$(mktemp -d /tmp/dmg_mount_XXXXXX)\nhdiutil attach -plist -nobrowse -readonly -mountpoint \"$MOUNT_POINT\" \"$INSTALLER_PATH\"\nsudo cp -R \"$MOUNT_POINT\"/* \"$TMPDIR\"\nhdiutil detach \"$MOUNT_POINT\"\n# copy to the applications folder\nquit_application 'com.DanPristupov.Fork'\nif [ -d \"$APPDIR/Fork.app\" ]; then\n\tsudo mv \"$APPDIR/Fork.app\" \"$TMPDIR/Fork.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Fork.app\" \"$APPDIR\"\nmkdir -p .\n/bin/ln -h -f -s -- \"$APPDIR/Fork.app/Contents/Resources/fork_cli\" \"fork\"\n"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"versions": [
|
||||
{
|
||||
"version": "3.67.6",
|
||||
"queries": {
|
||||
"exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.frontapp.Front';"
|
||||
},
|
||||
"installer_url": "https://dl.frontapp.com/desktop/builds/3.67.6/Front-3.67.6-arm64.zip",
|
||||
"install_script_ref": "9cfdb848",
|
||||
"uninstall_script_ref": "b3154f7f",
|
||||
"sha256": "f97adced8553e769d42c6f975f52f59bcd41cebd308fe601a58d3f1e1ae21129",
|
||||
"default_categories": [
|
||||
"Communication"
|
||||
]
|
||||
}
|
||||
],
|
||||
"refs": {
|
||||
"9cfdb848": "#!/bin/sh\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath $INSTALLER_PATH)\")\n# functions\n\nquit_application() {\n local bundle_id=\"$1\"\n local timeout_duration=10\n\n # check if the application is running\n if ! osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ $EUID -eq 0 && \"$console_user\" == \"root\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\n# extract contents\nunzip \"$INSTALLER_PATH\" -d \"$TMPDIR\"\n# copy to the applications folder\nquit_application 'com.frontapp.Front'\nif [ -d \"$APPDIR/Front.app\" ]; then\n\tsudo mv \"$APPDIR/Front.app\" \"$TMPDIR/Front.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Front.app\" \"$APPDIR\"\n",
|
||||
"b3154f7f": "#!/bin/sh\n\n# variables\nAPPDIR=\"/Applications/\"\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\ntrash() {\n local logged_in_user=\"$1\"\n local target_file=\"$2\"\n local timestamp=\"$(date +%Y-%m-%d-%s)\"\n local rand=\"$(jot -r 1 0 99999)\"\n\n # replace ~ with /Users/$logged_in_user\n if [[ \"$target_file\" == ~* ]]; then\n target_file=\"/Users/$logged_in_user${target_file:1}\"\n fi\n\n local trash=\"/Users/$logged_in_user/.Trash\"\n local file_name=\"$(basename \"${target_file}\")\"\n\n if [[ -e \"$target_file\" ]]; then\n echo \"removing $target_file.\"\n mv -f \"$target_file\" \"$trash/${file_name}_${timestamp}_${rand}\"\n else\n echo \"$target_file doesn't exist.\"\n fi\n}\n\nsudo rm -rf \"$APPDIR/Front.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Support/Front'\ntrash $LOGGED_IN_USER '~/Library/FrontBoard'\ntrash $LOGGED_IN_USER '~/Library/Logs/Front'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.frontapp.Front.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.frontapp.Front.savedState'\n"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"versions": [
|
||||
{
|
||||
"version": "1.2.3",
|
||||
"queries": {
|
||||
"exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.mitchellh.ghostty';"
|
||||
},
|
||||
"installer_url": "https://release.files.ghostty.org/1.2.3/Ghostty.dmg",
|
||||
"install_script_ref": "8af82cab",
|
||||
"uninstall_script_ref": "cf87f8a0",
|
||||
"sha256": "f35ee91f116e28027ab9f8def45098c7575b44b407ff883a2dcd2985c483206b",
|
||||
"default_categories": [
|
||||
"Productivity"
|
||||
]
|
||||
}
|
||||
],
|
||||
"refs": {
|
||||
"8af82cab": "#!/bin/sh\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath $INSTALLER_PATH)\")\n# functions\n\nquit_application() {\n local bundle_id=\"$1\"\n local timeout_duration=10\n\n # check if the application is running\n if ! osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ $EUID -eq 0 && \"$console_user\" == \"root\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\n# extract contents\nMOUNT_POINT=$(mktemp -d /tmp/dmg_mount_XXXXXX)\nhdiutil attach -plist -nobrowse -readonly -mountpoint \"$MOUNT_POINT\" \"$INSTALLER_PATH\"\nsudo cp -R \"$MOUNT_POINT\"/* \"$TMPDIR\"\nhdiutil detach \"$MOUNT_POINT\"\n# copy to the applications folder\nquit_application 'com.mitchellh.ghostty'\nif [ -d \"$APPDIR/Ghostty.app\" ]; then\n\tsudo mv \"$APPDIR/Ghostty.app\" \"$TMPDIR/Ghostty.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Ghostty.app\" \"$APPDIR\"\n",
|
||||
"cf87f8a0": "#!/bin/sh\n\n# variables\nAPPDIR=\"/Applications/\"\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\ntrash() {\n local logged_in_user=\"$1\"\n local target_file=\"$2\"\n local timestamp=\"$(date +%Y-%m-%d-%s)\"\n local rand=\"$(jot -r 1 0 99999)\"\n\n # replace ~ with /Users/$logged_in_user\n if [[ \"$target_file\" == ~* ]]; then\n target_file=\"/Users/$logged_in_user${target_file:1}\"\n fi\n\n local trash=\"/Users/$logged_in_user/.Trash\"\n local file_name=\"$(basename \"${target_file}\")\"\n\n if [[ -e \"$target_file\" ]]; then\n echo \"removing $target_file.\"\n mv -f \"$target_file\" \"$trash/${file_name}_${timestamp}_${rand}\"\n else\n echo \"$target_file doesn't exist.\"\n fi\n}\n\nsudo rm -rf \"$APPDIR/Ghostty.app\"\ntrash $LOGGED_IN_USER '~/.config/ghostty/'\ntrash $LOGGED_IN_USER '~/Library/Application Support/com.mitchellh.ghostty'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.mitchellh.ghostty'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/com.mitchellh.ghostty'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.mitchellh.ghostty.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.mitchellh.ghostty.savedState'\ntrash $LOGGED_IN_USER '~/Library/WebKit/com.mitchellh.ghostty'\n"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"versions": [
|
||||
{
|
||||
"version": "3.0.6",
|
||||
"queries": {
|
||||
"exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'org.gimp.gimp-3.0';"
|
||||
},
|
||||
"installer_url": "https://download.gimp.org/gimp/v3.0/macos/gimp-3.0.6-arm64.dmg",
|
||||
"install_script_ref": "6f15971b",
|
||||
"uninstall_script_ref": "2cdb3a30",
|
||||
"sha256": "6f4e7f8ed7ebfa80dcb6e0c05f9b1d6bd3d5a991e99abc2f3391cf37bfd97d70",
|
||||
"default_categories": [
|
||||
"Productivity"
|
||||
]
|
||||
}
|
||||
],
|
||||
"refs": {
|
||||
"2cdb3a30": "#!/bin/sh\n\n# variables\nAPPDIR=\"/Applications/\"\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\ntrash() {\n local logged_in_user=\"$1\"\n local target_file=\"$2\"\n local timestamp=\"$(date +%Y-%m-%d-%s)\"\n local rand=\"$(jot -r 1 0 99999)\"\n\n # replace ~ with /Users/$logged_in_user\n if [[ \"$target_file\" == ~* ]]; then\n target_file=\"/Users/$logged_in_user${target_file:1}\"\n fi\n\n local trash=\"/Users/$logged_in_user/.Trash\"\n local file_name=\"$(basename \"${target_file}\")\"\n\n if [[ -e \"$target_file\" ]]; then\n echo \"removing $target_file.\"\n mv -f \"$target_file\" \"$trash/${file_name}_${timestamp}_${rand}\"\n else\n echo \"$target_file doesn't exist.\"\n fi\n}\n\nsudo rm -rf \"$APPDIR/GIMP.app\"\nsudo rm -rf 'gimp'\ntrash $LOGGED_IN_USER '~/Library/Application Support/Gimp'\ntrash $LOGGED_IN_USER '~/Library/Preferences/org.gimp.gimp-3.0.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/org.gimp.gimp-3.0.savedState'\n",
|
||||
"6f15971b": "#!/bin/sh\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath $INSTALLER_PATH)\")\n# functions\n\nquit_application() {\n local bundle_id=\"$1\"\n local timeout_duration=10\n\n # check if the application is running\n if ! osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ $EUID -eq 0 && \"$console_user\" == \"root\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\n# extract contents\nMOUNT_POINT=$(mktemp -d /tmp/dmg_mount_XXXXXX)\nhdiutil attach -plist -nobrowse -readonly -mountpoint \"$MOUNT_POINT\" \"$INSTALLER_PATH\"\nsudo cp -R \"$MOUNT_POINT\"/* \"$TMPDIR\"\nhdiutil detach \"$MOUNT_POINT\"\n# copy to the applications folder\nquit_application 'org.gimp.gimp-3.0'\nif [ -d \"$APPDIR/GIMP.app\" ]; then\n\tsudo mv \"$APPDIR/GIMP.app\" \"$TMPDIR/GIMP.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/GIMP.app\" \"$APPDIR\"\n"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"versions": [
|
||||
{
|
||||
"version": "3.4.1",
|
||||
"queries": {
|
||||
"exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'co.zeit.hyper';"
|
||||
},
|
||||
"installer_url": "https://github.com/vercel/hyper/releases/download/v3.4.1/Hyper-3.4.1-mac-arm64.zip",
|
||||
"install_script_ref": "c2e48c1b",
|
||||
"uninstall_script_ref": "524382b3",
|
||||
"sha256": "7d2440fdd93fde4101e603fe2de46732b54292a868ad17dbcb55288e6f8430a8",
|
||||
"default_categories": [
|
||||
"Productivity"
|
||||
]
|
||||
}
|
||||
],
|
||||
"refs": {
|
||||
"524382b3": "#!/bin/sh\n\n# variables\nAPPDIR=\"/Applications/\"\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\ntrash() {\n local logged_in_user=\"$1\"\n local target_file=\"$2\"\n local timestamp=\"$(date +%Y-%m-%d-%s)\"\n local rand=\"$(jot -r 1 0 99999)\"\n\n # replace ~ with /Users/$logged_in_user\n if [[ \"$target_file\" == ~* ]]; then\n target_file=\"/Users/$logged_in_user${target_file:1}\"\n fi\n\n local trash=\"/Users/$logged_in_user/.Trash\"\n local file_name=\"$(basename \"${target_file}\")\"\n\n if [[ -e \"$target_file\" ]]; then\n echo \"removing $target_file.\"\n mv -f \"$target_file\" \"$trash/${file_name}_${timestamp}_${rand}\"\n else\n echo \"$target_file doesn't exist.\"\n fi\n}\n\nsudo rm -rf \"$APPDIR/Hyper.app\"\ntrash $LOGGED_IN_USER '~/.hyper.js'\ntrash $LOGGED_IN_USER '~/.hyper_plugins'\ntrash $LOGGED_IN_USER '~/Library/Application Support/com.apple.sharedfilelist/com.apple.LSSharedFileList.ApplicationRecentDocuments/co.zeit.hyper.sfl*'\ntrash $LOGGED_IN_USER '~/Library/Application Support/Hyper'\ntrash $LOGGED_IN_USER '~/Library/Caches/co.zeit.hyper'\ntrash $LOGGED_IN_USER '~/Library/Caches/co.zeit.hyper.ShipIt'\ntrash $LOGGED_IN_USER '~/Library/Cookies/co.zeit.hyper.binarycookies'\ntrash $LOGGED_IN_USER '~/Library/Logs/Hyper'\ntrash $LOGGED_IN_USER '~/Library/Preferences/ByHost/co.zeit.hyper.ShipIt.*.plist'\ntrash $LOGGED_IN_USER '~/Library/Preferences/co.zeit.hyper.helper.plist'\ntrash $LOGGED_IN_USER '~/Library/Preferences/co.zeit.hyper.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/co.zeit.hyper.savedState'\n",
|
||||
"c2e48c1b": "#!/bin/sh\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath $INSTALLER_PATH)\")\n# functions\n\nquit_application() {\n local bundle_id=\"$1\"\n local timeout_duration=10\n\n # check if the application is running\n if ! osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ $EUID -eq 0 && \"$console_user\" == \"root\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\n# extract contents\nunzip \"$INSTALLER_PATH\" -d \"$TMPDIR\"\n# copy to the applications folder\nquit_application 'co.zeit.hyper'\nif [ -d \"$APPDIR/Hyper.app\" ]; then\n\tsudo mv \"$APPDIR/Hyper.app\" \"$TMPDIR/Hyper.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Hyper.app\" \"$APPDIR\"\n"
|
||||
}
|
||||
}
|
||||
@@ -67,13 +67,21 @@ import Drawio from "./DrawIo";
|
||||
import Dropbox from "./Dropbox";
|
||||
import Eclipse from "./Eclipse";
|
||||
import Edge from "./Edge";
|
||||
import Egnyte from "./Egnyte";
|
||||
import EightXEightWork from "./8X8Work";
|
||||
import ElgatoControlCenter from "./ElgatoControlCenter";
|
||||
import ElgatoStreamDeck from "./ElgatoStreamDeck";
|
||||
import Evernote from "./Evernote";
|
||||
import Excel from "./Excel";
|
||||
import ExpressVpn from "./ExpressVpn";
|
||||
import Extension from "./Extension";
|
||||
import Falcon from "./Falcon";
|
||||
import Figma from "./Figma";
|
||||
import Firefox from "./Firefox";
|
||||
import Fork from "./Fork";
|
||||
import Front from "./Front";
|
||||
import Ghostty from "./Ghostty";
|
||||
import Gimp from "./Gimp";
|
||||
import GitHubDesktop from "./GitHubDesktop";
|
||||
import GitKraken from "./GitKraken";
|
||||
import GoLand from "./GoLand";
|
||||
@@ -81,6 +89,7 @@ import GoogleDrive from "./GoogleDrive";
|
||||
import GpgKeychain from "./GpgKeychain";
|
||||
import GrammarlyDesktop from "./GrammarlyDesktop";
|
||||
import Granola from "./Granola";
|
||||
import Hyper from "./Hyper";
|
||||
import IMazingProfileEditor from "./IMazingProfileEditor";
|
||||
import ITerm from "./ITerm";
|
||||
import Insomnia from "./Insomnia";
|
||||
@@ -244,11 +253,19 @@ export const SOFTWARE_NAME_TO_ICON_MAP = {
|
||||
"draw.io": Drawio,
|
||||
dropbox: Dropbox,
|
||||
eclipse: Eclipse,
|
||||
egnyte: Egnyte,
|
||||
"elgato control center": ElgatoControlCenter,
|
||||
evernote: Evernote,
|
||||
expressvpn: ExpressVpn,
|
||||
falcon: Falcon,
|
||||
figma: Figma,
|
||||
firefox: Firefox,
|
||||
fork: Fork,
|
||||
front: Front,
|
||||
ghostty: Ghostty,
|
||||
gimp: Gimp,
|
||||
"gpg keychain": GpgKeychain,
|
||||
hyper: Hyper,
|
||||
keepassxc: KeePassXc,
|
||||
libreoffice: LibreOffice,
|
||||
"microsoft autoupdate": MicrosoftAutoUpdate,
|
||||
@@ -319,6 +336,7 @@ export const SOFTWARE_NAME_TO_ICON_MAP = {
|
||||
snagit: Snagit,
|
||||
sourcetree: Sourcetree,
|
||||
spotify: Spotify,
|
||||
"stream deck": ElgatoStreamDeck,
|
||||
"sublime text": SublimeText,
|
||||
tableau: TableauDesktop,
|
||||
tableplus: TablePlus,
|
||||
|
||||
|
After Width: | Height: | Size: 6.0 KiB |
|
After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 13 KiB |
|
After Width: | Height: | Size: 3.8 KiB |
|
After Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 5.1 KiB |
|
After Width: | Height: | Size: 19 KiB |
|
After Width: | Height: | Size: 8.9 KiB |
|
After Width: | Height: | Size: 6.9 KiB |