diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 00000000..9839f660 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,36 @@ +name: Build Electron App + +on: + push: + tags: + - 'v*' + +jobs: + build: + runs-on: ubuntu-latest + + strategy: + matrix: + os: [ubuntu-latest, macos-latest, windows-latest] + + steps: + - name: Checkout code + uses: actions/checkout@v2 + + - name: Set up Node.js + uses: actions/setup-node@v2 + with: + node-version: '20' + + - name: Install dependencies + run: npm install + + - name: Build Electron app + run: npm run build + + - name: Upload artifact + uses: actions/upload-artifact@v2 + with: + name: kiri-${{ matrix.os }}-${{ github.ref_name }} + path: dist/ + diff --git a/.gitignore b/.gitignore index bb4afb6f..a4947de2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,8 +1,9 @@ -mod -tmp .DS_Store node_modules -package-lock.json -app.json +mod +dist +tmp logs/* data/* +package-lock.json +app.json diff --git a/app-el-prep.js b/app-el-prep.js new file mode 100644 index 00000000..485c865d --- /dev/null +++ b/app-el-prep.js @@ -0,0 +1,10 @@ +const fs = require('fs-extra'); +const path = require('path'); + +const srcDir = path.join(__dirname, 'src'); +const srcTmp = path.join(__dirname, 'tmp/src'); +fs.copySync(srcDir, srcTmp, { dereference: true }); + +const webDir = path.join(__dirname, 'web'); +const webTmp = path.join(__dirname, 'tmp/web'); +fs.copySync(webDir, webTmp, { dereference: true }); diff --git a/app-el.js b/app-el.js new file mode 100644 index 00000000..a3d00863 --- /dev/null +++ b/app-el.js @@ -0,0 +1,59 @@ +const { app, BrowserWindow } = require('electron'); +const path = require('path'); +const server = require('@gridspace/app-server'); + +const basDir = __dirname; +const usrDir = app.getPath("userData"); +const appDir = path.join(usrDir, 'apps/gs'); +const cnfDir = path.join(appDir, 'conf'); +const logDir = path.join(appDir, 'logs'); +const datDir = path.join(appDir, 'data'); +const debug = process.argv.slice(2).map(v => v.replaceAll('-','')).contains('debug'); +const devel = process.argv.slice(2).map(v => v.replaceAll('-','')).contains('devel'); + +// console.log({ appDir, usrDir, logDir, datDir, basDir }); +// console.log({ argv: process.argv, debug, devel }); +// console.log({ +// cwd: process.cwd(), +// dir: require('fs').readdirSync('.'), +// out: require('fs').readdirSync(appDir), +// ___: require('fs').readdirSync(basDir) +// }); + +server({ + single: true, + apps: basDir, + data: datDir, + conf: cnfDir, + logs: logDir, + debug +}); + +function createWindow() { + const mainWindow = new BrowserWindow({ + width: 1200, + height: 900, + webPreferences: { + // preload: path.join(__dirname, 'preload.js') + } + }); + + mainWindow.loadURL('http://localhost:8080/kiri'); + + if (devel) { + console.log("opening developer tools"); + mainWindow.webContents.openDevTools(); + } +} + +app.on('ready', createWindow); +app.on('window-all-closed', () => { + if (process.platform !== 'darwin') { + app.quit(); + } +}); +app.on('activate', () => { + if (BrowserWindow.getAllWindows().length === 0) { + createWindow(); + } +}); diff --git a/bin/npm-post b/bin/npm-post index 0970f5a5..e59ea326 100755 --- a/bin/npm-post +++ b/bin/npm-post @@ -1,4 +1,4 @@ #!/bin/sh -( curl https://static.grid.space/gapp/manifold.js > src/ext/manifold.js ) > /dev/null 2>&1 -( curl https://static.grid.space/gapp/manifold.wasm > src/wasm/manifold.wasm ) > /dev/null 2>&1 +[ -d tmp ] && rm -rf tmp + diff --git a/bin/npm-pre b/bin/npm-pre new file mode 100755 index 00000000..5478992e --- /dev/null +++ b/bin/npm-pre @@ -0,0 +1,5 @@ +#!/bin/sh + +( curl https://static.grid.space/gapp/manifold.js > src/ext/manifold.js ) > /dev/null 2>&1 +( curl https://static.grid.space/gapp/manifold.wasm > src/wasm/manifold.wasm ) > /dev/null 2>&1 + diff --git a/package.json b/package.json index e917fade..5d1ca35c 100644 --- a/package.json +++ b/package.json @@ -22,6 +22,7 @@ ], "dependencies": { "@fortawesome/fontawesome-free": "^6.1.1", + "@gridspace/app-server": "^0.0.10", "@gridspace/net-level-client": "^0.2.3", "@tweenjs/tween.js": "^16.6.0", "base64-js": "^1.5.1", @@ -30,6 +31,7 @@ "connect": "^3.7.0", "earcut": "^2.2.3", "express-useragent": "^1.0.13", + "fs-extra": "^11.2.0", "jszip": "^3.7.1", "moment": "^2.29.4", "serve-static": "^1.14.1", @@ -40,9 +42,51 @@ "ws": "^7.5.5" }, "devDependencies": { - "@gridspace/app-server": "^0.0.7" + "electron": "latest", + "electron-builder": "latest" }, "scripts": { - "postinstall": "bin/npm-post" + "start": "electron .", + "build": "npm run prebuild && electron-builder", + "build-debug": "npm run prebuild && DEBUG=electron-builder electron-builder", + "prebuild": "node app-el-prep.js", + "postbuild": "bin/npm-post", + "preinstall": "bin/npm-pre" + }, + "main": "app-el.js", + "build": { + "appId": "space.grid.kiri", + "files": [ + { + "from": "tmp/src", + "to": "src", + "filter": [ "**/*" ] + }, + { + "from": "tmp/web", + "to": "web", + "filter": [ "**/*" ] + }, + "conf/**/*", + "data/**/*", + "dist/**/*", + "app-el.js", + "app.js", + "package.json" + ], + "extraFiles": [ + ], + "directories": { + "output": "dist" + }, + "win": { + "target": "nsis" + }, + "mac": { + "target": "dmg" + }, + "linux": { + "target": "AppImage" + } } -} +} \ No newline at end of file diff --git a/src/ext/jscad.js b/src/ext/jscad.js deleted file mode 120000 index 9046d37e..00000000 --- a/src/ext/jscad.js +++ /dev/null @@ -1 +0,0 @@ -../../node_modules/@jscad/modeling/dist/jscad-modeling.min.js \ No newline at end of file