If you can't be bothered manually removing Native Instruments files on your MacOS machine, save this script!
It's based on the information from this knowledgebase article:
How to Uninstall Native Instruments Software from a Mac Computer
| <?php | |
| namespace App; | |
| use Symfony\Component\Console\Command\Command; | |
| use Symfony\Component\Console\Formatter\OutputFormatterStyle; | |
| use Symfony\Component\Console\Input\InputArgument; | |
| use Symfony\Component\Console\Input\InputInterface; | |
| use Symfony\Component\Console\Input\InputOption; | |
| use Symfony\Component\Console\Output\OutputInterface; | 
If you can't be bothered manually removing Native Instruments files on your MacOS machine, save this script!
It's based on the information from this knowledgebase article:
How to Uninstall Native Instruments Software from a Mac Computer
| #!/usr/bin/env node | |
| const { execSync } = require('child_process'); | |
| /** | |
| * I wrote this script so I don't have to keep checking for product availability | |
| * on a site that doesn't have a wish list feature. | |
| * | |
| * Just setup a daily cron that calls {checkFoundSoundProducts} function with a | |
| * set of product ids and log output if there are any available. | |
| * | 
| /** | |
| * Check for obvious cases, then check for | |
| * factors up to square root of {n}. | |
| * | |
| * @param {number} n | |
| * | |
| * @return {boolean} | |
| */ | |
| const isPrime = (n) => { | |
| if (n < 1 || n !== Number.parseInt(n, 10)) { | 
| var copyToClipboard = function copyToClipboard(str) { | |
| var el = document.createElement('textarea'); | |
| el.value = str; | |
| el.setAttribute('readonly', ''); | |
| el.style.position = 'absolute'; | |
| el.style.left = '-9999px'; | |
| document.body.appendChild(el); | |
| var selected = document.getSelection().rangeCount > 0 ? document.getSelection().getRangeAt(0) : false; | |
| el.select(); | |
| document.execCommand('copy'); | 
| const copyToClipboard = (() => { | |
| const el = document.createElement('textarea'); | |
| /* Setup our textarea and add to DOM */ | |
| el.setAttribute('readonly', ''); | |
| el.style.display = 'none'; | |
| el.style.position = 'absolute'; | |
| el.style.left = '-9999px'; | |
| document.body.appendChild(el); | |
| /* Return our copy function */ | |
| return (str) => { | 
| /** Set sessionStorage {key} value to {val}. */ | |
| const set = (key, val) => sessionStorage.setItem(key, val); | |
| /** Get {key} from sessionStorage. */ | |
| const get = key => sessionStorage.getItem(key); | |
| /** Remove all {keys} from sessionStorage. */ | |
| const remove = (...keys) => keys | |
| .forEach((key) => sessionStorage.removeItem(key)); | 
| constructor() { | |
| if (!this.search && this.page <= (minPage || 1)) { | |
| this.start(); | |
| return; | |
| } | |
| this.continue(); | |
| } | 
| start() { | |
| this.reset(); | |
| this.search = prompt('Enter a title to search for:'); | |
| if (!!this.search) { | |
| this.goTo(this.lastPage); | |
| } | |
| } | 
| checkForMatches() { | |
| return [...document.querySelectorAll('.bucket-item.track')] | |
| .filter((el) => this.elementMatches(el)); | |
| } |