* Get electron building something at all * Merge Frank test setup work (#3418) * Working window.electron.getPath * Loading project-specific settings in electron tests * Simplify test until we can get snapshots/traces working in electron tests * test tweaks --------- Co-authored-by: Frank Noirot <frank@kittycad.io> * add test #3375 and #3420 * put kcl files together * move files * can sort projects #3362 * File in the file pane should open with a single click #3385 * pressing delete on home screen should do nothing #3387 * add aria labels to icons * Rename and delete projects, also spam arrow keys when renaming #3364 #3365 #3259 * Fix up paths * Update flake.nix to support Electron * Remove a layer of indirection * Work without a web server * Fix settings#projectDir link on home * Fix login (requires new @kittycad/lib WHICH IS NOT INCLUDED HERE) * Lee: Tests are broken because auth skip needs to happen * get setting override envs passed through * tweak eletron CI * yml tweak * fmt * NUKE tauri shit post merge with main * another test auth tweak * Revert "another test auth tweak" This reverts commitb2254b10af
. * try CI again * CI tweaks * SKIP_AUTH true now on playwright * Skipping auth when NODE_ENV=development now * fmt Signed-off-by: Jess Frazelle <github@jessfraz.com> * Use BASE_URL() * fix exists Signed-off-by: Jess Frazelle <github@jessfraz.com> * fix foldername for macos Signed-off-by: Jess Frazelle <github@jessfraz.com> * update for windows Signed-off-by: Jess Frazelle <github@jessfraz.com> * fix version in lower right Signed-off-by: Jess Frazelle <github@jessfraz.com> * cleanup unused imports Signed-off-by: Jess Frazelle <github@jessfraz.com> * progress on is playwright Signed-off-by: Jess Frazelle <github@jessfraz.com> * fix test folders Signed-off-by: Jess Frazelle <github@jessfraz.com> * fix fmt Signed-off-by: Jess Frazelle <github@jessfraz.com> * remove tauri from actions bullshit Signed-off-by: Jess Frazelle <github@jessfraz.com> * remove tauri dir Signed-off-by: Jess Frazelle <github@jessfraz.com> * fixups the coredump async shit Signed-off-by: Jess Frazelle <github@jessfraz.com> * updates Signed-off-by: Jess Frazelle <github@jessfraz.com> * node env dev Signed-off-by: Jess Frazelle <github@jessfraz.com> * fix cancellable Signed-off-by: Jess Frazelle <github@jessfraz.com> * cleanup unnessary things Signed-off-by: Jess Frazelle <github@jessfraz.com> * fix Signed-off-by: Jess Frazelle <github@jessfraz.com> * env vars Signed-off-by: Jess Frazelle <github@jessfraz.com> * Bring back fix for NOT using hardcoded main.kcl * env Signed-off-by: Jess Frazelle <github@jessfraz.com> * fmt Signed-off-by: Jess Frazelle <github@jessfraz.com> * updates Signed-off-by: Jess Frazelle <github@jessfraz.com> * Revert "updates" This reverts commit da5d9f1043eb94404e8b3f8044088e990e34a4ef. * updates Signed-off-by: Jess Frazelle <github@jessfraz.com> * remove tauri clippuy Signed-off-by: Jess Frazelle <github@jessfraz.com> * less retries for now, no debug Signed-off-by: Jess Frazelle <github@jessfraz.com> * updates Signed-off-by: Jess Frazelle <github@jessfraz.com> * tsconfig Signed-off-by: Jess Frazelle <github@jessfraz.com> * small tsc fix * update some tsc Signed-off-by: Jess Frazelle <github@jessfraz.com> * tsc env Signed-off-by: Jess Frazelle <github@jessfraz.com> * fix other tsc Signed-off-by: Jess Frazelle <github@jessfraz.com> * small change for routeLoaders * rm old screenshot Signed-off-by: Jess Frazelle <github@jessfraz.com> * fix auth Signed-off-by: Jess Frazelle <github@jessfraz.com> * fix last onew Signed-off-by: Jess Frazelle <github@jessfraz.com> * auth clean up * fix package.json Signed-off-by: Jess Frazelle <github@jessfraz.com> * fix Signed-off-by: Jess Frazelle <github@jessfraz.com> * dissmissed screen on tests * add waits between files being written * put back retried Signed-off-by: Jess Frazelle <github@jessfraz.com> * fix weird programMemory Map issue * put private back * Revert "put private back" This reverts commitd311b978ca
. * Revert "fix weird programMemory Map issue" This reverts commit6c387bdf62
. * remove serde-wasm-bindgen Signed-off-by: Jess Frazelle <github@jessfraz.com> * add env Signed-off-by: Jess Frazelle <github@jessfraz.com> * A snapshot a day keeps the bugs away! 📷🐛 (OS: ubuntu) * A snapshot a day keeps the bugs away! 📷🐛 (OS: ubuntu) * fix tests * more test tweaks * A snapshot a day keeps the bugs away! 📷🐛 (OS: ubuntu) * another tweak * A snapshot a day keeps the bugs away! 📷🐛 (OS: ubuntu) * more test tweaks * more tweaks * increase macos timeout * try fix macos * disable macos playwright tests --------- Signed-off-by: Jess Frazelle <github@jessfraz.com> Co-authored-by: Kurt Hutten <k.hutten@protonmail.ch> Co-authored-by: Frank Noirot <frank@kittycad.io> Co-authored-by: Adam Sunderland <iterion@gmail.com> Co-authored-by: Jess Frazelle <github@jessfraz.com> Co-authored-by: Jess Frazelle <jessfraz@users.noreply.github.com> Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
152 lines
4.5 KiB
TypeScript
152 lines
4.5 KiB
TypeScript
// Some of the following was taken from bits and pieces of the vite-typescript
|
|
// template that ElectronJS provides.
|
|
|
|
import dotenv from 'dotenv'
|
|
import { app, BrowserWindow, ipcMain, dialog, shell } from 'electron'
|
|
import path from 'path'
|
|
import { Issuer } from 'openid-client'
|
|
import { Bonjour, Service } from 'bonjour-service'
|
|
// @ts-ignore: TS1343
|
|
import * as kittycad from '@kittycad/lib/import'
|
|
|
|
// If it's not set, scream.
|
|
const NODE_ENV = process.env.NODE_ENV
|
|
if (!NODE_ENV) {
|
|
console.error('*FOX SCREAM* process.env.NODE_ENV is not explicitly set!')
|
|
process.exit(1)
|
|
}
|
|
dotenv.config({ path: [`.env.${NODE_ENV}.local`, `.env.${NODE_ENV}`] })
|
|
|
|
// Handle creating/removing shortcuts on Windows when installing/uninstalling.
|
|
if (require('electron-squirrel-startup')) {
|
|
app.quit()
|
|
}
|
|
|
|
const createWindow = () => {
|
|
const mainWindow = new BrowserWindow({
|
|
autoHideMenuBar: true,
|
|
show: false,
|
|
width: 1800,
|
|
height: 1200,
|
|
webPreferences: {
|
|
nodeIntegration: false, // do not give the application implicit system access
|
|
contextIsolation: true, // expose system functions in preload
|
|
sandbox: false, // expose nodejs in preload
|
|
preload: path.join(__dirname, './preload.js'),
|
|
},
|
|
})
|
|
|
|
// and load the index.html of the app.
|
|
if (MAIN_WINDOW_VITE_DEV_SERVER_URL) {
|
|
mainWindow.loadURL(MAIN_WINDOW_VITE_DEV_SERVER_URL)
|
|
} else {
|
|
mainWindow.loadFile(
|
|
path.join(__dirname, `../renderer/${MAIN_WINDOW_VITE_NAME}/index.html`)
|
|
)
|
|
}
|
|
|
|
// Open the DevTools.
|
|
// mainWindow.webContents.openDevTools()
|
|
|
|
mainWindow.show()
|
|
}
|
|
|
|
// Quit when all windows are closed, except on macOS. There, it's common
|
|
// for applications and their menu bar to stay active until the user quits
|
|
// explicitly with Cmd + Q.
|
|
app.on('window-all-closed', () => {
|
|
if (process.platform !== 'darwin') {
|
|
app.quit()
|
|
}
|
|
})
|
|
|
|
// This method will be called when Electron has finished
|
|
// initialization and is ready to create browser windows.
|
|
// Some APIs can only be used after this event occurs.
|
|
app.on('ready', createWindow)
|
|
|
|
// For now there is no good reason to separate these out to another file(s)
|
|
// There is just not enough code to warrant it and further abstracts everything
|
|
// which is already quite abstracted
|
|
|
|
ipcMain.handle('app.getPath', (event, data) => {
|
|
return app.getPath(data)
|
|
})
|
|
|
|
ipcMain.handle('dialog.showOpenDialog', (event, data) => {
|
|
return dialog.showOpenDialog(data)
|
|
})
|
|
ipcMain.handle('dialog.showSaveDialog', (event, data) => {
|
|
return dialog.showSaveDialog(data)
|
|
})
|
|
|
|
ipcMain.handle('shell.showItemInFolder', (event, data) => {
|
|
return shell.showItemInFolder(data)
|
|
})
|
|
|
|
ipcMain.handle('shell.openExternal', (event, data) => {
|
|
return shell.openExternal(data)
|
|
})
|
|
|
|
ipcMain.handle('login', async (event, host) => {
|
|
// Do an OAuth 2.0 Device Authorization Grant dance to get a token.
|
|
// We quiet ts because we are not using this in the standard way.
|
|
// @ts-ignore
|
|
const issuer = new Issuer({
|
|
device_authorization_endpoint: `${host}/oauth2/device/auth`,
|
|
token_endpoint: `${host}/oauth2/device/token`,
|
|
})
|
|
const client = new issuer.Client({
|
|
// We can hardcode the client ID.
|
|
// This value is safe to be embedded in version control.
|
|
// This is the client ID of the KittyCAD app.
|
|
client_id: '2af127fb-e14e-400a-9c57-a9ed08d1a5b7',
|
|
token_endpoint_auth_method: 'none',
|
|
})
|
|
|
|
const handle = await client.deviceAuthorization()
|
|
|
|
shell.openExternal(handle.verification_uri_complete)
|
|
|
|
// Wait for the user to login.
|
|
try {
|
|
console.log('Polling for token')
|
|
const tokenSet = await handle.poll()
|
|
console.log('Received token set')
|
|
console.log(tokenSet)
|
|
return tokenSet.access_token
|
|
} catch (e) {
|
|
console.log(e)
|
|
}
|
|
|
|
return Promise.reject(new Error('No access token received'))
|
|
})
|
|
|
|
ipcMain.handle('kittycad', (event, data) => {
|
|
return data.access
|
|
.split('.')
|
|
.reduce(
|
|
(obj: any, prop: any) => obj[prop],
|
|
kittycad
|
|
)(data.args)
|
|
})
|
|
|
|
const SERVICE_NAME = '_machine-api._tcp.local.'
|
|
|
|
ipcMain.handle('find_machine_api', () => {
|
|
const timeoutAfterMs = 5000
|
|
return new Promise((resolve, reject) => {
|
|
// if it takes too long reject this promise
|
|
setTimeout(() => resolve(null), timeoutAfterMs)
|
|
const bonjourEt = new Bonjour({}, (error: Error) => {
|
|
console.log('An issue with Bonjour services was encountered!')
|
|
console.error(error)
|
|
resolve(null)
|
|
})
|
|
console.log('Looking for machine API...')
|
|
bonjourEt.find({ type: SERVICE_NAME }, (service: Service) => {
|
|
resolve(service.fqdn)
|
|
})
|
|
})
|
|
})
|