Apple Silicon for Devs M1?

Posted on

I don’t have any of the new Apple M1 silicon devices. This is on the cards, but first, I have to investigate this.

So, I write this in the unknown, as not many are talking about how this will be for developers.

It’s Just YouTubers doing video benchmarking. which will suite their workflows.

Firstly, Ionic/Angular and Node.

There are many questions, and answers are slowly creeping in.

The questions about running Homebrew…. Can be done? Yes… But, not everything is working as yet. But, see more here.

The other question remains about Ionic. Apparently it works fine for dev work and the localhost server for testing, but “A B” said in the comments said it didn’t build.

This is a pretty big thing, and a show stopping if it’s the case. So we shall see.

Apparently Docker has experimental facilities to run as well, but it’s only experimental, so do be aware of that.

There is also very limited virtualisation available too. So far, no VirtualBox.
Read more here on this stuff though.

Anyway, these are some initial thoughts. Still waiting for more information on all this.

Be careful of rogue FireFox Extensions

Posted on

Today I was working on a website application and I saw a strange thing happen with a date checking related library called moment.js where it was calling a website to get some usage statistics. Well, that’s what I thought was the case initially…

I have a few ad blockers installed in my browser, and so that was a good indication something wasn’t right, especially that traffic was flowing to when it was a locally hosted website.

This got me looking and digging through my own code a lot, until I loaded the same page in Chrome.

Strangely enough, it wasn’t there…

This was a good thing.

Eventually I was able to load the JS in a debug in Firefox and discover it was actually a FF Addon called “YouTube Downloader” version 4.5 to be exact.

Oddly enough there was no homepage associated with it as well.

I tried disabling it and re-enabling it and the problem went and returned. Bingo.

I haven’t been able to find it again since, and in my attempt to disable it, I actually ended up removing it.


This rogue Add-on posts content like the following:



And also other stuff like this too


Anyway, I just thought I’d post it as a warning and in case someone else has this problem.

ScottPlot is amazing – How to get settings.

Posted on Updated on

I’ve recently found ScottPlot, and it’s amazing.

Most things are straight forward, and there’s plenty of recipes to try out to get the graphs to do what you want.

However, sometimes things aren’t as easy as you’d think.

No, I may or may not have gone about this the right or original way as the author intended, but, this will work.

If you have multiple plots on your graph and you need to know which is which, or index order and you know what the label is, then this should help you out.

formsPlot1.plt.PlotVLine(label: "green", lineWidth: 3, x: position, draggable: true, dragLimitLower: 0, dragLimitUpper: Global.samples[filename_value]);
String plotname = "";

int plottablescount = formsPlot1.plt.GetSettings(false).plottables.Count; 
for (int i = 0; i < plottablescount; i++)
Console.WriteLine(formsPlot1.plt.GetSettings(false).plottables[i].ToString());      //  PlottableVLine (green) at X=516587
Console.WriteLine(formsPlot1.plt.GetSettings(false).plottables[i].GetLegendItems());//  ScottPlot.Config.LegendItem[]
Console.WriteLine(formsPlot1.plt.GetSettings(false).plottables[i].GetLimits());     //  x1=516587.000, x2=516587.000, y1=NaN, y2=NaN
Console.WriteLine(formsPlot1.plt.GetSettings(false).plottables[i].GetType());       //  ScottPlot.PlottableVLine
Console.WriteLine(formsPlot1.plt.GetSettings(false).plottables[i].GetHashCode());   //  2383799
var stringlabel = formsPlot1.plt.GetSettings(false).plottables[i].ToString();       //  PlottableVLine (green) at X=516587
Console.WriteLine(Regex.Match(stringlabel, @"\(([^)]*)\)").Groups[1].Value); // This will extract the name of the moveable plotline

plotname = Regex.Match(stringlabel, @"\(([^)]*)\)").Groups[1].Value;

if (plotname == "green")
    // do stuff


It loops through the plots you have and then searches for the label you have given your plot, in my case, the label is called green.

Link to the gist

PS. I don’t know how anyone can use this new WordPress content editor. It’s just awful.

Locking yourself out of your server – again

Posted on

Fortunately this is not something I do very often, but when I do, it’s usually good…

One of the things I like to do is have a document with lots of settings and commands I call my cheat sheet – for times that things don’t go to plan.

This time, I was trying to upload some files and I’d set up my server in such a way that I couldn’t upload files to the correct area, but when I did get them in, I had to manually copy them to the correct location afterwards – kind of a different isolating account, a little for extra security. However, as I hadn’t made any adjustments, I basically forgot how I was doing things, and so in the process, I thought that maybe I hadn’t allowed my home IP for SSH.

Well, that was my big mistake. I used Webmin to add the rule of my home IP. It cleared out everything and essentially I was locked out.

I was able to get back in through the server console, but I spent the next few hours trouble shooting what went wrong.

As mentioned, it’s always good to have these thing written down.

I could connect to the server via SSH, however, I was being rejected on connection.

Trying to connnect with this: ssh -p PORT -vvv USER@x.x.x.x

I would get the following, showing where it would suddenly close the connection.

debug3: send packet: type 50
debug2: we sent a password packet, wait for reply
debug3: receive packet: type 52
debug1: Authentication succeeded (password).
Authenticated to x.x.x.x ([x.x.x.x]:port).
debug1: channel 0: new [client-session]
debug3: ssh_session2_open: channel_new: 0
debug2: channel 0: send open
debug3: send packet: type 90
debug1: Requesting
debug3: send packet: type 80
debug1: Entering interactive session.
debug1: pledge: network
debug3: send packet: type 1
debug1: channel 0: free: client-session, nchannels 1
debug3: channel 0: status: The following connections are open:
#0 client-session (t3 nr0 i0/0 o0/0 e[write]/0 fd 4/5/6 sock -1 cc -1)
debug3: fd 1 is not O_NONBLOCK
Connection to x.x.x.x closed by remote host.
Connection to x.x.x.x closed.
Transferred: sent 2156, received 1788 bytes, in 0.0 seconds
Bytes per second: sent 62256.4, received 51630.0
debug1: Exit status -1 

So, what had happened?

Apart from ‘fixing’ the firewall rules, I had also given myself extra group permissions, and in this case – ‘Apache’. The Apache group seemed to make sense so I could eliminate that extra step of copying, however, in doing so, this is where my problem was.

The Apache account is not allowed to log in, and so my actual login account was inheriting that account’s credentials, and thus, being booted out immediately.

Anyway, I thought I’d let you know.

Adding more permissions don’t always give you more access.

Text to Speech WAV

Posted on Updated on

To make this work properly, you need to make sure you have the right speech pack installed:

The other thing, is to make sure the voices you want to use are enabled correctly.

On Windows 10 – and I have not tested this on anything else, so use it at your own risk!

You will need to run a PowerShell Script, as outlined here:

$sourcePath = 'HKLM:\software\Microsoft\Speech_OneCore\Voices\Tokens' #Where the OneCore voices live
$destinationPath = 'HKLM:\SOFTWARE\Microsoft\Speech\Voices\Tokens' #For 64-bit apps
$destinationPath2 = 'HKLM:\SOFTWARE\WOW6432Node\Microsoft\SPEECH\Voices\Tokens' #For 32-bit apps
cd $destinationPath
$listVoices = Get-ChildItem $sourcePath
foreach($voice in $listVoices)
$source = $voice.PSPath #Get the path of this voices key
copy -Path $source -Destination $destinationPath -Recurse
copy -Path $source -Destination $destinationPath2 -Recurse

Do NOT run this script more than once, because you will get double entries, and who knows if it will break things.

Basically, what it will do is read the voices you have listed as installed, and then copy some registry values to enable them in third party programs, as explained here:

If you don’t understand Power Shell, or Regedit, then don’t be running these scripts.


Sometimes, you may get security problems, so elevating the script may also be required.

This is what happens when the aforementioned happens.

However, when it does run, our registry entries look like this originally:

Then, they look like this:


Next steps are getting a program called Balabolka.

We are going to need the console version for this task.


If you don’t have the correct voice fix installed, you will not be able to use the correct voice you want.

I wanted to have James, but I couldn’t.


But after those fixes, James worked.

I’d also suggest that if you want to script this, it may be easier to use a config file.

-f c:\balabolka\script.txt
-w c:\balabolka\script.wav 
-n James
-s -1
-p -1
-v 95
-e 300
-d d:\Dict\rules.bxd

So, when you now run balcon.exe, you get a wave file with the text file the script.


You can listen to the weather script here without any fixes. This is the Microsoft James voice.

After fixing the paragraphs and changing the voice, this is the Microsoft Catherine voice.


It doesn’t sound great at first, but it’s workable. You can also hear where the end of the line is. This can probably fixed with automation, but it’s a bit of fun.

This is where the script came from:

If will not be the same as this one below, as it changes regularly, but as an example, you get the idea.

As a trial run, this is the script:

Australian Government Bureau of Meteorology
Northern Territory

Northern Territory Forecast
Issued at 5:00 am CST on Wednesday 17 June 2020
for the period until midnight CST Saturday 20 June 2020.

Warning Information
For latest warnings go to, subscribe to RSS feeds, call 1300 659
210* or listen for warnings on relevant TV and radio broadcasts.

Weather Situation
A high pressure system over southern Australia is moving east as the next
trough approaches from WA. While the easterly flow will persist over the Top
End for the next few days, winds in the south will tend northerly, resulting in
temperatures rising again in the south. The change will move through late on
Friday, dropping temperatures in the south to around average for this time of

Forecast for the rest of Wednesday 17 June
A slight chance of showers in the far northeast Arnhem District. Sunny
elsewhere. Light to moderate east to southeast winds, fresh at times during the
morning and early afternoon, particularly south of Elliot.

Fire Danger: 
High to Very High in the Tiwi, Daly, Gregory, Carpentaria and western Arnhem

Forecast for Thursday 18 June
A slight chance of morning showers in the far northeast Arnhem District. Sunny
elsewhere. Areas of morning frost across the Simpson District. A warmer day in
the south. Light to moderate east to southeast winds, tending northeast to
northwest in the southern Tanami, western Simpson and Lasseter Districts during
the afternoon.

Forecast for Friday 19 June
A slight chance of showers in the far eastern Arnhem District. Sunny elsewhere
before some cloud develops along the eastern border during the evening. Warmer
in the south. Light to moderate east to southeast winds, tending northeast to
northwest south of Barrow Creek ahead of a south to southwest change developing
over the Lasseter District later in the day.

Forecast for Saturday 20 June
A slight to medium chance of showers in the far eastern Arnhem District. Sunny
elsewhere after early morning cloud along the eastern border. Cooler south of
Barrow Creek. Light to moderate east to southeast winds, fresh and gusty during
the morning in the Lasseter and Simpson Districts.

The next routine forecast will be issued at 4:30 pm CST Wednesday.

* Calls to 1300 numbers cost around 27.5c inc GST, higher from mobiles or
public phones.

Copyright Commonwealth of Australia 2011, Bureau of Meteorology (ABN 92 637 533
532). Users of these web pages are deemed to have read and accepted the
conditions described in the Copyright, Disclaimer, and Privacy statements

As a side note, there is also Amazon Polly and Google’s Cloud Text-to-Speech.

VirtualBox Audio on 6.1 for MacOSX solved

Posted on

After upgrading to the latest version of VirtualBox for Mac, with a Windows 7 as the client, I have struggled to get audio working with a USB audio device.

I have a Presonus Studio192 device, and it’s a fantastic piece of kit, but in the current setup, VB doesn’t want to play nice.

I am running Mojave on a 4,1->5,1.

The way around this problem with the audio not working is quite simple.

Download VoiceMeeter Banana and a program called VBAN Receptor from the Apple App store, and you should be right to go.

It’s basically and IP Audio Codec where you can route streams of the audio to different IP addresses. Rather impressive.

Screen Shot 2020-06-16 at 22.12.50

Set up the outgoing streams to the computer it should go to.

Screen Shot 2020-06-16 at 22.13.19

This costs about $10 Australian.

Screen Shot 2020-06-16 at 22.13.34


Amazing what the internet can find

Posted on Updated on

I’ve recently got a vinyl cutter, and so have gone down the path of trying things out. I bought some software to use with it, and played with a few drivers and boom, it worked… until the other day.

Yesterday, I thought I’d swap things over to my laptop on High Sierra. Suddenly, the cutter didn’t work on the MacPro, or the MacBookPro laptop. So… what do you do?

Well, originally, (I think) I had used the drivers from here, as suggested from this site

This appears to be a very common driver for mac, which is needed to emulator a serial port via USB (even though my cutter is actually coming via a USB cable anyway).

So,  today after hunting around for a very long time and eventually establishing that the software was fine and the printer was fine, it pin-pointed it to a driver problem.

The rabbit hole went a long way down, to the point where I eventually entered the apple hardware id of my cutter, and stumbled across this post who had my exact numbers and the same problem, only it was outlined with even more detail:

The link at the bottom was the final key to the solution which pointed me to the following site with a driver!

It appears to be working on the laptop for the moment in High Sierra!

I have a HL-721 Vinyl Cutter, which I think is a Chinese generic brand, and it works in the software Sure Cuts a Lot as a GoldCut JK. “Plotter Generic”, with the model being HPGL.

This site also pointed to the suggestion of using a generic cutter too:

So, now the update for Mojave on the MacPro4,1->5,1.

I have a USB 3 Hub, with a mixture of USB 2 and 3 ports. It doesn’t want to work through the hub, using the various drivers – FTDI, ch340 etc.

But, it started working for me again, when I took it out of the hub, and ran directly in to a USB 2 port via an extension lead.

At the moment, I’ve got the FTDI driver active, and the GoldCut JK plotter set.

Strange. But, that’s computers for you!



Latest update: 20200620.

I did try and use those settings originally for the cutter, however, I found that the GoldCut settings weren’t right for me, and that while doing a test cut, there were directions given somehow, that made the cutter go on it’s own weird path.

I remembered that on the tablet I’d used a different setting. So, I changed the MacPro to the following, where it was successful!

My Cutter: Plotter Generic
Model: HPGL
Port: Auto (or the serial one) usbserial-320

Get MP3 ID3 Metadata from remote URLS

Posted on

Firstly, I didn’t create this, I’ve just making it easy to understand with a full example.

You can read more of it here, but only because of

To begin, download this library from here:

when you open the zip folder, you’ll see ‘getid3’. Save that folder in to your working folder.

Next, create a folder called “temp” in that working folder that the following script is going to be running from.

Basically, what it does is download the first 64k of the file, and then read the metadata from the file.

I enjoy a simple example. I hope this helps.



$url_media = ""



echo $a['tags']['id3v2']['album'][0] . "\n";  
echo $a['tags']['id3v2']['artist'][0] . "\n";  
echo $a['tags']['id3v2']['title'][0] . "\n";  
echo $a['tags']['id3v2']['year'][0] . "\n"; 
echo $a['tags']['id3v2']['year'][0] . "\n";  

echo "\n-----------------\n";


echo "-----------------\n";



function getfileinfo($remoteFile)


$uuid=uniqid("designaeon_", true);
$ch = curl_init($remoteFile);
//==============================Get Size==========================//
$contentLength = 'unknown';
$ch1 = curl_init($remoteFile);
curl_setopt($ch1, CURLOPT_NOBODY, true);
curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch1, CURLOPT_HEADER, true);
curl_setopt($ch1, CURLOPT_FOLLOWLOCATION, true); //not necessary unless the file redirects (like the PHP example we're using here)
$data = curl_exec($ch1);
if (preg_match('/Content-Length: (\d+)/', $data, $matches)) {
$contentLength = (int)$matches[1];
//==============================Get Size==========================//

if (!$fp = fopen($file, "wb")) {
echo 'Error opening temp file for binary writing';
return false;
} else if (!$urlp = fopen($url, "r")) {
echo 'Error opening URL for reading';
return false;
try {
$to_get = 65536; // 64 KB
$chunk_size = 4096; // Haven't bothered to tune this, maybe other values would work better??
$got = 0; $data = null;

// Grab the first 64 KB of the file
while(!feof($urlp) && $got < $to_get) { $data = $data . fgets($urlp, $chunk_size); $got += $chunk_size; } fwrite($fp, $data); // Grab the last 64 KB of the file, if we know how big it is. 
if ($size > 0) {
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RESUME_FROM, $size - $to_get);

// Now $fp should be the first and last 64KB of the file!!

catch (Exception $e) {
echo 'Error transfering file using fopen and cURL !!';
return false;

$getID3 = new getID3;
$ThisFileInfo = $getID3->analyze($filename);
return $ThisFileInfo;


RGB Lights for the MAC

Posted on Updated on

I have bought this for 3 bucks.

I’ll be combining the knowledge from this post:

And this video:


And will look at getting some RGB lights

And this

As well as some joiners.

This could be a bit of fun to brighten up my desk set up. 😀

I plan on putting these lights behind the screens, and under the desk glass to create ambient lighting, that I can change the colour of, using the computer. Should be pretty sweet.

Now to wait 2 months for them in the post…

It’s now the 28th of May, and all of the final bits have arrived. In this process, I’ve already lost the cable connectors, so I’ll look in to either getting new ones or ripping apart the office… But, testing will happen soon.

IONIC Build Errors with solutions

Posted on Updated on

Hi friends,

As I’m working on different apps, on multiple platforms and things, I thought I’d start a list of some of the errors I’d been getting, and how I solved them in IONIC.

Some of these solutions may help you. Most of these are for v3 of IONIC. Other settings vary.

I’m sure I’ll keep adding to this.

It’s a very messy file, but if Google brings you here, I hope it will help you.


Failed to install ‘cordova-sqlite-storage’: CordovaError: Using “requireCordovaModule” to load non-cordova module “q” is not supported.

Cordova error: Using “requireCordovaModule” to load non-cordova module “q” is not supported

simply add this
cordova plugin add cordova-android-support-gradle-release –variable ANDROID_SUPPORT_VERSION=27.+
and run/build again.

ERROR ITMS-90174: “Missing Provisioning Profile – Apps must contain a provisioning profile in a file named embedded.mobileprovision.”

> cordova build ios –release
CordovaError: Promise rejected with non-error: ‘ios-deploy was not found. Please download, build and install version 1.9.2 or greater from into your path, or do \’npm install -g ios-deploy\”
at cli.catch.err (/Users/stephenmonro/ionicApps/C4I International/node_modules/cordova/bin/cordova:29:15)
at process._tickCallback (internal/process/next_tick.js:68:7)
[ERROR] An error occurred while running subprocess cordova.

cordova build ios –release exited with exit code 1.

Re-running this command with the –verbose flag may provide more information.
Analyzing dependencies
Downloading dependencies
Generating Pods project
Integrating client project
Pod installation complete! There is 1 dependency from the Podfile and 1 total pod installed.
Updating spec repo `master`
$ /usr/bin/git -C /Users/stephenmonro/.cocoapods/repos/master fetch origin –progress
remote: Enumerating objects: 1441, done.
remote: Counting objects: 100% (1441/1441), done.
remote: Compressing objects: 100% (236/236), done.
remote: Total 2771 (delta 1275), reused 1191 (delta 1191), pack-reused 1330
Receiving objects: 100% (2771/2771), 320.66 KiB | 767.00 KiB/s, done.
Resolving deltas: 100% (1828/1828), completed with 553 local objects.
5bdc3da58dc..70702dce5ff master -> origin/master
$ /usr/bin/git -C /Users/stephenmonro/.cocoapods/repos/master rev-parse –abbrev-ref HEAD
$ /usr/bin/git -C /Users/stephenmonro/.cocoapods/repos/master reset –hard origin/master
HEAD is now at 70702dce5ff [Add] TidySplits 1.0.4
Updating spec repo `trunk`

CocoaPods 1.9.0.beta.3 is available.
To update use: `sudo gem install cocoapods –pre`
[!] This is a test version we’d love you to try.

For more information, see and the CHANGELOG for this version at

The file /Users/stephenmonro/ionicApps/C4I International/platforms/ios/Christians for Israel.xcworkspace does not exist.
Problem solved here: unplug the ipad, or the device.


I experience this error if my phone is connected to my computer (via cable) when I am running the build command.

Simply unplugging the cable solved the problem.


npm update

[app-scripts] fs.js:114
[app-scripts] throw err;
[app-scripts] ^
[app-scripts] Error: ENOENT: no such file or directory, scandir ‘/Users/stephenmonro/ionicApps/wpimportsqlite/node_modules/node-sass/vendor’
[app-scripts] at Object.readdirSync (fs.js:785:3)


node ./node_modules/node-sass/scripts/install.js


stephenmonro@SMMMacPro:~/ionicApps/wpimportsqlite$ ionic serve
> ionic-app-scripts serve –address localhost –port 8101 –livereload-port 35730 –dev-logger-port 53704 –nobrowser
[app-scripts] [23:24:14] ionic-app-scripts 3.2.4
[app-scripts] [23:24:14] watch started …
[app-scripts] [23:24:14] build dev started …
[app-scripts] [23:24:14] Proxy added:/wp-json =>
[app-scripts] [23:24:14] Proxy added:/resources/app/pdf =>
[app-scripts] [23:24:14] clean started …
[app-scripts] [23:24:14] clean finished in 2 ms
[app-scripts] [23:24:14] copy started …
[app-scripts] [23:24:14] deeplinks started …
[app-scripts] [23:24:15] deeplinks finished in 336 ms
[app-scripts] [23:24:15] transpile started …
[app-scripts] [23:24:22] typescript: node_modules/@types/node/events.d.ts, line: 21
[app-scripts] ‘=’ expected.
[app-scripts] L20: function on(emitter: EventEmitter, event: string): AsyncIterableIterator<any>;
[app-scripts] L21: const captureRejectionSymbol: unique symbol;
[app-scripts] ‘=’ expected.
[app-scripts] [23:24:22] typescript: node_modules/@types/node/events.d.ts, line: 32
[app-scripts] L32: const errorMonitor: unique symbol;
[app-scripts] [23:24:23] typescript: node_modules/@types/node/repl.d.ts, line: 361
[app-scripts] ‘=’ expected.
[app-scripts] L361: const REPL_MODE_SLOPPY: unique symbol;
[app-scripts] ‘=’ expected.
[app-scripts] [23:24:23] typescript: node_modules/@types/node/repl.d.ts, line: 367
[app-scripts] [23:24:23] typescript: node_modules/@types/node/util.d.ts, line: 26
[app-scripts] L367: const REPL_MODE_STRICT: unique symbol;
[app-scripts] ‘=’ expected.
[app-scripts] L25: let replDefaults: InspectOptions;
[app-scripts] L26: const custom: unique symbol;
[app-scripts] ‘=’ expected.
[app-scripts] L120: namespace promisify {
[app-scripts] L121: const custom: unique symbol;
[app-scripts] [23:24:23] typescript: node_modules/@types/node/util.d.ts, line: 121
[app-scripts] [23:24:23] typescript: node_modules/@types/node/events.d.ts, line: 21
[app-scripts] Cannot find name ‘unique’.
[app-scripts] L20: function on(emitter: EventEmitter, event: string): AsyncIterableIterator<any>;
[app-scripts] L21: const captureRejectionSymbol: unique symbol;
[app-scripts] [23:24:23] typescript: node_modules/@types/node/events.d.ts, line: 21
[app-scripts] Cannot find name ‘symbol’. Did you mean ‘Symbol’?
[app-scripts] L20: function on(emitter: EventEmitter, event: string): AsyncIterableIterator<any>;
[app-scripts] L21: const captureRejectionSymbol: unique symbol;
[app-scripts] Cannot find name ‘unique’.
[app-scripts] [23:24:23] typescript: node_modules/@types/node/events.d.ts, line: 32
[app-scripts] L32: const errorMonitor: unique symbol;
[app-scripts] [23:24:23] typescript: node_modules/@types/node/events.d.ts, line: 32
[app-scripts] Cannot find name ‘symbol’. Did you mean ‘Symbol’?
[app-scripts] L32: const errorMonitor: unique symbol;
[app-scripts] Cannot find name ‘unique’.
[app-scripts] [23:24:23] typescript: node_modules/@types/node/repl.d.ts, line: 361
[app-scripts] L361: const REPL_MODE_SLOPPY: unique symbol;
[app-scripts] Cannot find name ‘symbol’. Did you mean ‘Symbol’?
[app-scripts] [23:24:23] typescript: node_modules/@types/node/repl.d.ts, line: 361
[app-scripts] L361: const REPL_MODE_SLOPPY: unique symbol;
[app-scripts] Cannot find name ‘unique’.
[app-scripts] [23:24:23] typescript: node_modules/@types/node/repl.d.ts, line: 367
[app-scripts] [23:24:23] typescript: node_modules/@types/node/repl.d.ts, line: 367
[app-scripts] L367: const REPL_MODE_STRICT: unique symbol;
[app-scripts] Cannot find name ‘symbol’. Did you mean ‘Symbol’?
[app-scripts] L367: const REPL_MODE_STRICT: unique symbol;
[app-scripts] Cannot find name ‘unique’.
[app-scripts] L25: let replDefaults: InspectOptions;
[app-scripts] [23:24:23] typescript: node_modules/@types/node/util.d.ts, line: 26
[app-scripts] [23:24:23] typescript: node_modules/@types/node/util.d.ts, line: 26
[app-scripts] L26: const custom: unique symbol;
[app-scripts] Cannot find name ‘symbol’. Did you mean ‘isSymbol’?
[app-scripts] L25: let replDefaults: InspectOptions;
[app-scripts] L26: const custom: unique symbol;
[app-scripts] Cannot find name ‘unique’.
[app-scripts] L120: namespace promisify {
[app-scripts] L121: const custom: unique symbol;
[app-scripts] [23:24:23] typescript: node_modules/@types/node/util.d.ts, line: 121
[app-scripts] [23:24:23] typescript: node_modules/@types/node/util.d.ts, line: 121
[app-scripts] Cannot find name ‘symbol’.
[app-scripts] L120: namespace promisify {
[app-scripts] L121: const custom: unique symbol;

[INFO] Development server running!

Local: http://localhost:8101

Use Ctrl+C to quit this process

[INFO] Browser window opened to http://localhost:8101!

[app-scripts] [23:24:23] watch ready in 8.56 s
[app-scripts] [23:24:23] copy finished in 8.53 s

npm install typescript@2.7.2


[23:51:47] typescript error
Cannot find type definition file for ‘@types’.

[23:51:47] ionic-app-script task: “build”
[23:51:47] Error: Failed to transpile TypeScript
Error: Failed to transpile TypeScript
at errorCheckProgram (/Users/stephenmonro/ionicApps/wpimportsqlite/node_modules/@ionic/app-scripts/dist/aot/aot-compiler.js:119:39)
at Object.<anonymous> (/Users/stephenmonro/ionicApps/wpimportsqlite/node_modules/@ionic/app-scripts/dist/aot/aot-compiler.js:89:21)
at step (/Users/stephenmonro/ionicApps/wpimportsqlite/node_modules/@ionic/app-scripts/dist/aot/aot-compiler.js:32:23)
at (/Users/stephenmonro/ionicApps/wpimportsqlite/node_modules/@ionic/app-scripts/dist/aot/aot-compiler.js:13:53)
at fulfilled (/Users/stephenmonro/ionicApps/wpimportsqlite/node_modules/@ionic/app-scripts/dist/aot/aot-compiler.js:4:58)
[ERROR] An error occurred while running subprocess ionic-app-scripts.


What seems to fix it is to add
“types”: []
to the
tsconfig.json’s compilerOptions.