diff --git a/Makefile b/Makefile
index b65b6ff2..12f4b406 100644
--- a/Makefile
+++ b/Makefile
@@ -23,18 +23,19 @@ all:
$(TSC)
npm run mkdoc
-dist:
+distro:
rm -fr $(TMP) && mkdir -p $(TMP)
git archive HEAD | tar x -C $(TMP)
cp -rp gen $(TMP)
- rm -r $(TMP)/doc $(TMP)/meta $(TMP)/scripts $(TMP)/test* $(TMP)/tools $(TMP)/.[a-z]* $(TMP)/ts*.json
+ rm -r $(TMP)/doc $(TMP)/scripts $(TMP)/test* $(TMP)/tools $(TMP)/.[a-z]* $(TMP)/ts*.json # $(TMP)/meta
rm -f $(TMP)/javatari && mkdir -p $(TMP)/javatari && cp javatari.js/release/javatari/* $(TMP)/javatari/
tar cf - `cat electron.html | egrep "^<(script|link)" | egrep -o '"([^"]+).(js|css)"' | cut -d '"' -f2` | tar x -C $(TMP)
-%.dist:
- ./node_modules/.bin/electron-packager $(TMP) --icon meta/icons/8bitworkshop-icon-1024.icns --out ./release --overwrite --platform $*
-
-package: dist darwin.dist win32.dist linux.dist
+desktop: distro
+ pushd $(TMP) && npm i && popd $(TMP)
+ mkdir -p $(TMP)/resources
+ ./node_modules/.bin/electron-builder -mlw --project $(TMP) # --prepackaged $(TMP)
+ mv $(TMP)/dist/*.* ./release/
meta/electron.diff: index.html electron.html
-diff -u index.html electron.html > $@
@@ -53,11 +54,11 @@ astrolibre.b64.txt: astrolibre.rom
VERSION := $(shell git tag -l --points-at HEAD)
-syncdev: dist
+syncdev: distro
cp config.js $(TMP)
aws --profile pzp s3 sync --follow-symlinks $(TMP)/ s3://8bitworkshop.com/dev
-syncprod: dist
+syncprod: distro
@[ "${VERSION}" ] || ( echo ">> No version set at HEAD, tag it first"; exit 1 )
echo Version: $(VERSION)
cp config.js $(TMP)
diff --git a/electron-preload.js b/electron-preload.js
index bfd6a435..bea4f282 100644
--- a/electron-preload.js
+++ b/electron-preload.js
@@ -1,7 +1,22 @@
+"use strict";
+
// preload.js for Electron app
const { ipcRenderer } = require('electron');
const fs = require('fs');
-const modpath = require('path');
+const _path = require('path');
+const chokidar = require('chokidar');
+
+const homeDirectory = require('os').homedir();
+const wsroot = _path.join(homeDirectory, '8bitworkshop');
+
+function getLocalDir() {
+ const _ui = window.ui_1 || window.ui || window; // TODO: module naming
+ var dir = _ui.repo_id || _ui.platform_id || 'default';
+ return _path.join(wsroot, dir);
+}
+function getLocalFilePath(path) {
+ return _path.join(getLocalDir(), path);
+}
function isProbablyBinary(path, data) {
var score = 0;
@@ -33,37 +48,84 @@ function isProbablyBinary(path, data) {
return score > 0;
}
+// this is before startUI is called
process.once('loaded', () => {
- // workspace root path
- // reload() clears this, so we have to set it every time
- var wsroot;
- // from browser: read workspace file synchronously
- window.getWorkspaceFile = function(path, filetype) {
- if (wsroot == null) throw Error("no workspace root set");
- try {
- var fullpath = modpath.join(wsroot, modpath.normalize(path));
- var data = fs.readFileSync(fullpath); // read binary
- var buf = new Uint8Array(data); // convert to array
- var isBinary = filetype != 'text' || isProbablyBinary(path, buf);
- data = isBinary ? buf : data.toString('utf-8');
- console.log("getWorkspaceFile", path, isBinary, data.length);
- return data;
- } catch (e) {
- console.log(e);
- return null;
+ var watcher;
+ var allfiles = new Set();
+ // get workspace root dir
+ // from browser: read workspace files asynchronously
+ window.alternateLocalFilesystem = {
+ getFileData: (path) => {
+ let fullpath = getLocalFilePath(path);
+ allfiles.add(fullpath);
+ if (!fs.existsSync(fullpath)) {
+ return null;
+ }
+ return new Promise( (resolve, reject) => {
+ fs.readFile(fullpath, (err,buf) => {
+ if (err) {
+ resolve(err);
+ } else {
+ let isBinary = isProbablyBinary(path, buf);
+ let data = isBinary ? buf : buf.toString('utf-8');
+ console.log("getWorkspaceFile", path, isBinary, data.length);
+ resolve(data);
+ }
+ });
+ });
+ },
+ setFileData: (path, data) => {
+ let fullpath = getLocalFilePath(path);
+ allfiles.add(fullpath);
+ let encoding = typeof data === 'string' ? 'utf8' : null;
+ console.log("setWorkspaceFile", fullpath, data.length);
+ return new Promise( (resolve, reject) => {
+ fs.mkdir(_path.dirname(fullpath), {recursive:true}, (err,dirpath) => {
+ fs.writeFile(fullpath, data, {encoding:encoding}, (err) => {
+ if (err) {
+ reject(err);
+ } else {
+ resolve();
+ }
+ });
+ });
+ });
}
}
- // from browser: put workspace file
- window.putWorkspaceFile = function(path, data) {
- if (wsroot == null) throw Error("no workspace root set");
- var fullpath = modpath.join(wsroot, modpath.normalize(path));
- var encoding = typeof data === 'string' ? 'utf8' : null;
- fs.writeFileSync(fullpath, data, {encoding:encoding});
- }
+ // watch/unwatch files as browser loses/gains focus
+ window.addEventListener("blur", (e) => {
+ let localdir = getLocalDir();
+ if (!watcher && localdir) {
+ // watch files for changes
+ watcher = chokidar.watch(Array.from(allfiles), {
+ //awaitWriteFinish: {pollInterval:50,stabilityThreshold:300},
+ ignoreInitial: true
+ });
+ watcher.on('all', (event, path) => {
+ path = path.substring(localdir.length + 1); //strip off prefix
+ console.log('WATCH', event, path);
+ // we don't use awaitWriteFinish b/c we might close() the watcher
+ setTimeout(() => {
+ window.reloadWorkspaceFile(path);
+ }, 300);
+ });
+ console.log('watching', getLocalDir());
+ }
+ });
+ window.addEventListener("focus", (e) => {
+ if (watcher) {
+ watcher.close();
+ watcher = null;
+ }
+ console.log('stopped watching');
+ });
+
// from electron.js: set workspace root directory
+ /*
+ TODO
ipcRenderer.on('setWorkspaceRoot', (event, data) => {
wsroot = data.root;
- var binpath = modpath.join(wsroot, 'bin');
+ var binpath = _path.join(wsroot, 'bin');
if (!fs.existsSync(binpath)) fs.mkdirSync(binpath, {});
console.log('setWorkspaceRoot', wsroot);
});
@@ -72,4 +134,6 @@ process.once('loaded', () => {
var path = data.path;
window.reloadWorkspaceFile(path);
});
+ */
+ console.log('loaded preload', window.alternateLocalFilesystem, window.startUI);
});
diff --git a/electron.html b/electron.html
index d1debdf6..941af236 100644
--- a/electron.html
+++ b/electron.html
@@ -363,6 +363,7 @@ body {
+
@@ -420,6 +421,7 @@ function require(modname) {
+
-
-
-
-