From 64c12b7245c6ffd2894787aff3c1863c09c753e3 Mon Sep 17 00:00:00 2001 From: Felix Rieseberg Date: Tue, 10 Jul 2018 10:50:20 +0100 Subject: [PATCH 1/5] :wrench: Beef up package.json generation --- src/utils/get-package.ts | 8 ++++++++ src/utils/get-username.ts | 13 +++++++++++++ 2 files changed, 21 insertions(+) create mode 100644 src/utils/get-username.ts diff --git a/src/utils/get-package.ts b/src/utils/get-package.ts index 1112e8b62a..fa5f8f2437 100644 --- a/src/utils/get-package.ts +++ b/src/utils/get-package.ts @@ -4,6 +4,7 @@ import { AppState } from '../renderer/state'; import { UNTITLED_NAME } from '../constants'; import { EditorValues } from '../interfaces'; import { findModulesInEditors } from '../renderer/npm'; +import { getUsername } from './get-username'; export interface PackageJsonOptions { includeElectron?: boolean; @@ -46,8 +47,15 @@ export async function getPackageJson( return JSON.stringify({ name, + productName: name, + description: 'My Electron application description', + keywords: [], main: './main.js', version: '1.0.0', + author: getUsername(), + scripts: { + start: 'electron .' + }, dependencies, devDependencies }, undefined, 2); diff --git a/src/utils/get-username.ts b/src/utils/get-username.ts new file mode 100644 index 0000000000..83f32af671 --- /dev/null +++ b/src/utils/get-username.ts @@ -0,0 +1,13 @@ +import * as os from 'os'; + +let username: string = ''; + +/** + * Returns the curren username + * + * @export + * @returns {string} + */ +export function getUsername(): string { + return username = username || os.userInfo().username; +} From 9c29590c907e5b6cc8304ebbbd59de47a3197b41 Mon Sep 17 00:00:00 2001 From: Felix Rieseberg Date: Tue, 10 Jul 2018 10:50:35 +0100 Subject: [PATCH 2/5] :wrench: Add a Forge transform --- src/renderer/transforms/forge.ts | 58 ++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 src/renderer/transforms/forge.ts diff --git a/src/renderer/transforms/forge.ts b/src/renderer/transforms/forge.ts new file mode 100644 index 0000000000..c84eaf22c5 --- /dev/null +++ b/src/renderer/transforms/forge.ts @@ -0,0 +1,58 @@ +import { Files } from '../../interfaces'; +import { PACKAGE_NAME } from '../../constants'; + +/** + * This transform turns the files into an electron-forge + * project. + * + * @param {Files} files + * @returns {Files} + */ +export function forgeTransform(files: Files): Files { + if (files[PACKAGE_NAME]) { + try { + const parsed = JSON.parse(files[PACKAGE_NAME]); + + // Scripts + parsed.scripts = parsed.scripts || {}; + parsed.scripts.start = 'electron-forge start'; + parsed.scripts.package = 'electron-forge package'; + parsed.scripts.make = 'electron-forge make'; + parsed.scripts.publish = 'electron-forge publish'; + parsed.scripts.lint = 'echo "No linting configured"'; + + // electron-forge config + parsed.config = parsed.config || {}; + parsed.config.forge = {}; + parsed.config.forge.packagerConfig = {}; + + // electron-forge makers + parsed.config.forge.makers = [ + { + name: '@electron-forge/maker-squirrel', + config: { + name: 'test' + } + }, + { + name: '@electron-forge/maker-zip', + platforms: [ + 'darwin' + ] + }, + { + name: '@electron-forge/maker-deb', + config: {} + }, + { + name: '@electron-forge/maker-rpm', + config: {} + } + ]; + } catch (error) { + console.warn(`Forge Transform: Failed to parse package.json`, { error }); + } + } + + return files; +} From ea3a3473e8ae3e4998c10a80caa2bbfd242a2d07 Mon Sep 17 00:00:00 2001 From: Felix Rieseberg Date: Tue, 10 Jul 2018 10:52:21 +0100 Subject: [PATCH 3/5] :wrench: Add a dotfiles transform --- src/renderer/transforms/dotfiles.ts | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 src/renderer/transforms/dotfiles.ts diff --git a/src/renderer/transforms/dotfiles.ts b/src/renderer/transforms/dotfiles.ts new file mode 100644 index 0000000000..4605883363 --- /dev/null +++ b/src/renderer/transforms/dotfiles.ts @@ -0,0 +1,13 @@ +import { Files } from '../../interfaces'; + +/** + * This transform adds dotfiles (like .gitignore) + * + * @param {Files} files + * @returns {Files} + */ +export function dotfilesTransform(files: Files): Files { + files['.gitignore'] = 'node_modules\nout'; + + return files; +} From 57c0dee597c01ac069d4908fb1cd72991a8a294e Mon Sep 17 00:00:00 2001 From: Felix Rieseberg Date: Tue, 10 Jul 2018 11:05:45 +0100 Subject: [PATCH 4/5] :wrench: Save it all as an actual Forge project --- src/ipc-events.ts | 2 ++ src/main/files.ts | 6 +++--- src/main/menu.ts | 7 +++++++ src/renderer/file-manager.ts | 9 ++++++++- src/renderer/transforms/dotfiles.ts | 6 +++--- src/renderer/transforms/forge.ts | 18 ++++++++++++++---- 6 files changed, 37 insertions(+), 11 deletions(-) diff --git a/src/ipc-events.ts b/src/ipc-events.ts index 865f614135..18d04a3ca6 100644 --- a/src/ipc-events.ts +++ b/src/ipc-events.ts @@ -9,6 +9,7 @@ export enum IpcEvents { FS_SAVE_FIDDLE = 'FS_SAVE_FIDDLE', FS_SAVE_FIDDLE_AS = 'FS_SAVE_FIDDLE_AS', FS_SAVE_FIDDLE_GIST = 'FS_SAVE_FIDDLE_GIST', + FS_SAVE_FIDDLE_FORGE = 'FS_SAVE_FIDDLE_FORGE', FS_SAVE_FIDDLE_DIALOG = 'FS_SAVE_FIDDLE_DIALOG', FS_SAVE_FIDDLE_ERROR = 'FS_SAVE_FIDDLE_ERROR', SHOW_WARNING_DIALOG = 'SHOW_WARNING_DIALOG' @@ -30,5 +31,6 @@ export const ipcRendererEvents = [ IpcEvents.FS_OPEN_FIDDLE, IpcEvents.FS_SAVE_FIDDLE, IpcEvents.FS_SAVE_FIDDLE_AS, + IpcEvents.FS_SAVE_FIDDLE_FORGE, IpcEvents.FS_SAVE_FIDDLE_GIST, ]; diff --git a/src/main/files.ts b/src/main/files.ts index 80352669a6..d4cf8ce54d 100644 --- a/src/main/files.ts +++ b/src/main/files.ts @@ -34,10 +34,10 @@ export function showOpenDialog() { * Shows the "Save Fiddle" dialog and forwards * the path to the renderer */ -export function showSaveDialog() { +export function showSaveDialog(event?: IpcEvents, as?: string) { // We want to save to a folder, so we'll use an open dialog here dialog.showOpenDialog({ - title: 'Save Fiddle', + title: `Save Fiddle${as ? ` as ${as}` : ''}`, buttonLabel: 'Save here', properties: ['openDirectory', 'createDirectory'] }, async (filePaths) => { @@ -47,7 +47,7 @@ export function showSaveDialog() { // Let's confirm real quick if we want this if (await ensureSaveTargetEmpty(filePaths[0])) { - ipcMainManager.send(IpcEvents.FS_SAVE_FIDDLE, [ filePaths[0] ]); + ipcMainManager.send(event || IpcEvents.FS_SAVE_FIDDLE, [ filePaths[0] ]); } }); } diff --git a/src/main/menu.ts b/src/main/menu.ts index a35beefc44..487f16f0c3 100644 --- a/src/main/menu.ts +++ b/src/main/menu.ts @@ -131,10 +131,17 @@ function getFileMenu(): MenuItemConstructorOptions { click: showSaveDialog, accelerator: 'CmdOrCtrl+Shift+S' }, + { + type: 'separator' + }, { label: 'Save to Gist', click: () => ipcMainManager.send(IpcEvents.FS_SAVE_FIDDLE_GIST), }, + { + label: 'Save as Forge Project', + click: () => showSaveDialog(IpcEvents.FS_SAVE_FIDDLE_FORGE, 'Gist') + } ]; // macOS has these items in the "Fiddle" menu diff --git a/src/renderer/file-manager.ts b/src/renderer/file-manager.ts index 1403d0651e..da4670f888 100644 --- a/src/renderer/file-manager.ts +++ b/src/renderer/file-manager.ts @@ -7,6 +7,8 @@ import { INDEX_HTML_NAME, MAIN_JS_NAME, RENDERER_JS_NAME, PACKAGE_NAME } from '. import { appState } from './state'; import { getTitle } from '../utils/get-title'; import { getFs } from '../utils/fs'; +import { dotfilesTransform } from './transforms/dotfiles'; +import { forgeTransform } from './transforms/forge'; export class FileManager { constructor() { @@ -18,7 +20,11 @@ export class FileManager { }); ipcRendererManager.on(IpcEvents.FS_SAVE_FIDDLE, (_event, filePath) => { - this.saveFiddle(filePath); + this.saveFiddle(filePath, dotfilesTransform); + }); + + ipcRendererManager.on(IpcEvents.FS_SAVE_FIDDLE_FORGE, (_event, filePath) => { + this.saveFiddle(filePath, dotfilesTransform, forgeTransform); }); } @@ -99,6 +105,7 @@ export class FileManager { for (const transform of transforms) { try { + console.log(`getFiles: Applying ${transform.name}`); output = await transform(output); } catch (error) { console.warn(`getFiles: Failed to apply transform`, { transform, error }); diff --git a/src/renderer/transforms/dotfiles.ts b/src/renderer/transforms/dotfiles.ts index 4605883363..d7a55b5b00 100644 --- a/src/renderer/transforms/dotfiles.ts +++ b/src/renderer/transforms/dotfiles.ts @@ -4,10 +4,10 @@ import { Files } from '../../interfaces'; * This transform adds dotfiles (like .gitignore) * * @param {Files} files - * @returns {Files} + * @returns {Promise} */ -export function dotfilesTransform(files: Files): Files { - files['.gitignore'] = 'node_modules\nout'; +export async function dotfilesTransform(files: Files): Promise { + files.set('.gitignore', 'node_modules\nout'); return files; } diff --git a/src/renderer/transforms/forge.ts b/src/renderer/transforms/forge.ts index c84eaf22c5..f2412155df 100644 --- a/src/renderer/transforms/forge.ts +++ b/src/renderer/transforms/forge.ts @@ -6,12 +6,20 @@ import { PACKAGE_NAME } from '../../constants'; * project. * * @param {Files} files - * @returns {Files} + * @returns {Promise} */ -export function forgeTransform(files: Files): Files { - if (files[PACKAGE_NAME]) { +export async function forgeTransform(files: Files): Promise { + if (files.get(PACKAGE_NAME)) { try { - const parsed = JSON.parse(files[PACKAGE_NAME]); + const parsed = JSON.parse(files.get(PACKAGE_NAME)!); + + // devDependencies + parsed.devDependencies = parsed.devDependencies || {}; + parsed.devDependencies['@electron-forge/cli'] = 'latest'; + parsed.devDependencies['@electron-forge/maker-deb'] = 'latest'; + parsed.devDependencies['@electron-forge/maker-rpm'] = 'latest'; + parsed.devDependencies['@electron-forge/maker-squirrel'] = 'latest'; + parsed.devDependencies['@electron-forge/maker-zip'] = 'latest'; // Scripts parsed.scripts = parsed.scripts || {}; @@ -49,6 +57,8 @@ export function forgeTransform(files: Files): Files { config: {} } ]; + + files.set(PACKAGE_NAME, JSON.stringify(parsed, undefined, 2)); } catch (error) { console.warn(`Forge Transform: Failed to parse package.json`, { error }); } From cd99cda65c058d8d3abae8026229c33e67ff42ee Mon Sep 17 00:00:00 2001 From: Felix Rieseberg Date: Tue, 10 Jul 2018 11:09:47 +0100 Subject: [PATCH 5/5] :wrench: Show output item in explorer/finder --- src/renderer/file-manager.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/renderer/file-manager.ts b/src/renderer/file-manager.ts index da4670f888..8fa9f17a16 100644 --- a/src/renderer/file-manager.ts +++ b/src/renderer/file-manager.ts @@ -1,4 +1,5 @@ import * as path from 'path'; +import { shell } from 'electron'; import { ipcRendererManager } from './ipc'; import { IpcEvents } from '../ipc-events'; @@ -80,6 +81,9 @@ export class FileManager { } } + // Show in folder + shell.showItemInFolder(pathToSave); + if (pathToSave !== localPath) { appState.localPath = pathToSave; }