this repo has no description
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

don't open terminal if not running

+58 -67
+10
changelog.md
··· 5 5 The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), 6 6 and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). 7 7 8 + ## [Unreleased](https://github.com/patrik-csak/mac-terminal/compare/v4.0.0...HEAD) 9 + 10 + ### Changed 11 + 12 + - **BREAKING**: `setTerminalProfile()` only tries to update Terminal windows if Terminal is running 13 + 14 + ### Fixed 15 + 16 + - `getTerminalProfiles()` and `setTerminalDefaultProfile()` now work without opening Terminal 17 + 8 18 ## [4.0.0](https://github.com/patrik-csak/mac-terminal/compare/v3.0.0...v4.0.0) – 2025-09-19 9 19 10 20 ### Added
+23 -44
index.js
··· 1 + import os from 'node:os'; 1 2 import alphaSort from 'alpha-sort'; 3 + import bplist from 'bplist-parser'; 4 + import {$} from 'execa'; 2 5 import ow from 'ow'; 3 6 import psList from 'ps-list'; 4 7 import {runAppleScript} from 'run-applescript'; ··· 7 10 * @returns {Promise<string[]>} - List of installed Terminal.app profiles 8 11 */ 9 12 export async function getTerminalProfiles() { 10 - const result = await runAppleScript(`set text item delimiters to linefeed 11 - tell application "Terminal" 12 - return (name of every settings set) as string 13 - end tell`); 13 + const terminalPlistPath = `${os.homedir()}/Library/Preferences/com.apple.Terminal.plist`; 14 + const terminalPreferences = await bplist.parseFile(terminalPlistPath); 14 15 15 - return result 16 - .split('\n') 17 - .sort(alphaSort({caseInsensitive: true, natural: true})); 16 + return Object.keys(terminalPreferences[0]['Window Settings']).sort( 17 + alphaSort({caseInsensitive: true, natural: true}), 18 + ); 18 19 } 19 20 20 21 /** ··· 37 38 * @return {Promise<void>} 38 39 */ 39 40 export async function setTerminalProfile({profile, setDefault}) { 40 - const terminalProfiles = await getTerminalProfiles(); 41 - 42 - ow(profile, ow.string.oneOf(terminalProfiles)); 43 - ow(setDefault, ow.optional.boolean); 41 + ow(profile, ow.string.oneOf(await getTerminalProfiles())); 44 42 45 - let appleScript = getSetTerminalWindowsProfileAppleScript(profile); 43 + if (await isTerminalRunning()) { 44 + await runAppleScript(`tell application "Terminal" 45 + set current settings of tabs of windows to settings set "${profile}" 46 + end tell`); 47 + } 46 48 47 49 if (setDefault) { 48 - appleScript += '\n' + getSetTerminalDefaultProfileAppleScript(profile); 50 + await setTerminalDefaultProfile(profile); 49 51 } 50 - 51 - await runAppleScript(appleScript); 52 52 } 53 53 54 54 /** ··· 58 58 * @return {Promise<void>} 59 59 */ 60 60 export async function setTerminalDefaultProfile(profile) { 61 - const terminalProfiles = await getTerminalProfiles(); 61 + ow(profile, ow.string.oneOf(await getTerminalProfiles())); 62 62 63 - ow(profile, ow.string.oneOf(terminalProfiles)); 64 - 65 - const appleScript = getSetTerminalDefaultProfileAppleScript(profile); 66 - 67 - await runAppleScript(appleScript); 68 - } 69 - 70 - /** 71 - * Get the AppleScript to set the profile for all open Terminal.app windows 72 - * 73 - * @param {string} profile 74 - * @returns {string} 75 - */ 76 - function getSetTerminalWindowsProfileAppleScript(profile) { 77 - return `tell application "Terminal" 78 - set current settings of tabs of windows to settings set "${profile}" 79 - end tell`; 80 - } 81 - 82 - /** 83 - * Get the AppleScript to set the default profile for new Terminal.app windows 84 - * 85 - * @param {string} profile 86 - * @returns {string} 87 - */ 88 - function getSetTerminalDefaultProfileAppleScript(profile) { 89 - return `tell application "Terminal" 63 + if (await isTerminalRunning()) { 64 + await runAppleScript(`tell application "Terminal" 90 65 set default settings to settings set "${profile}" 91 - end tell`; 66 + end tell`); 67 + } else { 68 + await $`defaults write com.apple.Terminal Default\ Window\ Settings -string ${profile}`; 69 + await $`defaults write com.apple.Terminal Startup\ Window\ Settings -string ${profile}`; 70 + } 92 71 }
+23 -23
package-lock.json
··· 13 13 ], 14 14 "dependencies": { 15 15 "alpha-sort": "^5.0.0", 16 + "bplist-parser": "^0.3.2", 17 + "execa": "^9.6.0", 16 18 "ow": "^3.0.0", 17 19 "ps-list": "^8.1.1", 18 20 "run-applescript": "^7.0.0" ··· 390 392 "version": "0.4.1", 391 393 "resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz", 392 394 "integrity": "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==", 393 - "dev": true, 394 395 "license": "MIT" 395 396 }, 396 397 "node_modules/@sindresorhus/is": { ··· 1309 1310 "baseline-browser-mapping": "dist/cli.js" 1310 1311 } 1311 1312 }, 1313 + "node_modules/big-integer": { 1314 + "version": "1.6.52", 1315 + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", 1316 + "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", 1317 + "license": "Unlicense", 1318 + "engines": { 1319 + "node": ">=0.6" 1320 + } 1321 + }, 1322 + "node_modules/bplist-parser": { 1323 + "version": "0.3.2", 1324 + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.2.tgz", 1325 + "integrity": "sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ==", 1326 + "license": "MIT", 1327 + "dependencies": { 1328 + "big-integer": "1.6.x" 1329 + }, 1330 + "engines": { 1331 + "node": ">= 5.10.0" 1332 + } 1333 + }, 1312 1334 "node_modules/brace-expansion": { 1313 1335 "version": "1.1.12", 1314 1336 "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", ··· 1641 1663 "version": "7.0.6", 1642 1664 "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", 1643 1665 "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", 1644 - "dev": true, 1645 1666 "license": "MIT", 1646 1667 "dependencies": { 1647 1668 "path-key": "^3.1.0", ··· 2967 2988 "version": "9.6.0", 2968 2989 "resolved": "https://registry.npmjs.org/execa/-/execa-9.6.0.tgz", 2969 2990 "integrity": "sha512-jpWzZ1ZhwUmeWRhS7Qv3mhpOhLfwI+uAX4e5fOcXqwMR7EcJ0pj2kV1CVzHVMX/LphnKWD3LObjZCoJ71lKpHw==", 2970 - "dev": true, 2971 2991 "license": "MIT", 2972 2992 "dependencies": { 2973 2993 "@sindresorhus/merge-streams": "^4.0.0", ··· 2994 3014 "version": "4.0.0", 2995 3015 "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz", 2996 3016 "integrity": "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==", 2997 - "dev": true, 2998 3017 "license": "MIT", 2999 3018 "engines": { 3000 3019 "node": ">=18" ··· 3102 3121 "version": "6.1.0", 3103 3122 "resolved": "https://registry.npmjs.org/figures/-/figures-6.1.0.tgz", 3104 3123 "integrity": "sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==", 3105 - "dev": true, 3106 3124 "license": "MIT", 3107 3125 "dependencies": { 3108 3126 "is-unicode-supported": "^2.0.0" ··· 3118 3136 "version": "2.1.0", 3119 3137 "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", 3120 3138 "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", 3121 - "dev": true, 3122 3139 "license": "MIT", 3123 3140 "engines": { 3124 3141 "node": ">=18" ··· 3385 3402 "version": "9.0.1", 3386 3403 "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz", 3387 3404 "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==", 3388 - "dev": true, 3389 3405 "license": "MIT", 3390 3406 "dependencies": { 3391 3407 "@sec-ant/readable-stream": "^0.4.1", ··· 3645 3661 "version": "8.0.1", 3646 3662 "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-8.0.1.tgz", 3647 3663 "integrity": "sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==", 3648 - "dev": true, 3649 3664 "license": "Apache-2.0", 3650 3665 "engines": { 3651 3666 "node": ">=18.18.0" ··· 4119 4134 "version": "4.1.0", 4120 4135 "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", 4121 4136 "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", 4122 - "dev": true, 4123 4137 "license": "MIT", 4124 4138 "engines": { 4125 4139 "node": ">=12" ··· 4194 4208 "version": "4.0.1", 4195 4209 "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz", 4196 4210 "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==", 4197 - "dev": true, 4198 4211 "license": "MIT", 4199 4212 "engines": { 4200 4213 "node": ">=18" ··· 4340 4353 "version": "2.0.0", 4341 4354 "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 4342 4355 "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 4343 - "dev": true, 4344 4356 "license": "ISC" 4345 4357 }, 4346 4358 "node_modules/iterator.prototype": { ··· 4718 4730 "version": "6.0.0", 4719 4731 "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-6.0.0.tgz", 4720 4732 "integrity": "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==", 4721 - "dev": true, 4722 4733 "license": "MIT", 4723 4734 "dependencies": { 4724 4735 "path-key": "^4.0.0", ··· 4735 4746 "version": "4.0.0", 4736 4747 "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", 4737 4748 "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", 4738 - "dev": true, 4739 4749 "license": "MIT", 4740 4750 "engines": { 4741 4751 "node": ">=12" ··· 5036 5046 "version": "4.0.0", 5037 5047 "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-4.0.0.tgz", 5038 5048 "integrity": "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==", 5039 - "dev": true, 5040 5049 "license": "MIT", 5041 5050 "engines": { 5042 5051 "node": ">=18" ··· 5059 5068 "version": "3.1.1", 5060 5069 "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 5061 5070 "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 5062 - "dev": true, 5063 5071 "license": "MIT", 5064 5072 "engines": { 5065 5073 "node": ">=8" ··· 5197 5205 "version": "9.3.0", 5198 5206 "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-9.3.0.tgz", 5199 5207 "integrity": "sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==", 5200 - "dev": true, 5201 5208 "license": "MIT", 5202 5209 "dependencies": { 5203 5210 "parse-ms": "^4.0.0" ··· 5582 5589 "version": "2.0.0", 5583 5590 "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 5584 5591 "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 5585 - "dev": true, 5586 5592 "license": "MIT", 5587 5593 "dependencies": { 5588 5594 "shebang-regex": "^3.0.0" ··· 5595 5601 "version": "3.0.0", 5596 5602 "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 5597 5603 "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 5598 - "dev": true, 5599 5604 "license": "MIT", 5600 5605 "engines": { 5601 5606 "node": ">=8" ··· 5681 5686 "version": "4.1.0", 5682 5687 "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", 5683 5688 "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", 5684 - "dev": true, 5685 5689 "license": "ISC", 5686 5690 "engines": { 5687 5691 "node": ">=14" ··· 5892 5896 "version": "4.0.0", 5893 5897 "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-4.0.0.tgz", 5894 5898 "integrity": "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==", 5895 - "dev": true, 5896 5899 "license": "MIT", 5897 5900 "engines": { 5898 5901 "node": ">=18" ··· 6271 6274 "version": "0.3.0", 6272 6275 "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", 6273 6276 "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", 6274 - "dev": true, 6275 6277 "license": "MIT", 6276 6278 "engines": { 6277 6279 "node": ">=18" ··· 6360 6362 "version": "2.0.2", 6361 6363 "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 6362 6364 "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 6363 - "dev": true, 6364 6365 "license": "ISC", 6365 6366 "dependencies": { 6366 6367 "isexe": "^2.0.0" ··· 6576 6577 "version": "2.1.2", 6577 6578 "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.1.2.tgz", 6578 6579 "integrity": "sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==", 6579 - "dev": true, 6580 6580 "license": "MIT", 6581 6581 "engines": { 6582 6582 "node": ">=18"
+2
package.json
··· 17 17 }, 18 18 "dependencies": { 19 19 "alpha-sort": "^5.0.0", 20 + "bplist-parser": "^0.3.2", 21 + "execa": "^9.6.0", 20 22 "ow": "^3.0.0", 21 23 "ps-list": "^8.1.1", 22 24 "run-applescript": "^7.0.0"