Skip to content

Commit

Permalink
Merge pull request #30 from electron/forge
Browse files Browse the repository at this point in the history
feat: Save as Forge Project
  • Loading branch information
felixrieseberg authored Jul 12, 2018
2 parents b996446 + cd99cda commit 2b92a39
Show file tree
Hide file tree
Showing 8 changed files with 126 additions and 4 deletions.
2 changes: 2 additions & 0 deletions src/ipc-events.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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'
Expand All @@ -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,
];
6 changes: 3 additions & 3 deletions src/main/files.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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) => {
Expand All @@ -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] ]);
}
});
}
Expand Down
7 changes: 7 additions & 0 deletions src/main/menu.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
13 changes: 12 additions & 1 deletion src/renderer/file-manager.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import * as path from 'path';
import { shell } from 'electron';

import { ipcRendererManager } from './ipc';
import { IpcEvents } from '../ipc-events';
Expand All @@ -7,6 +8,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() {
Expand All @@ -18,7 +21,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);
});
}

Expand Down Expand Up @@ -74,6 +81,9 @@ export class FileManager {
}
}

// Show in folder
shell.showItemInFolder(pathToSave);

if (pathToSave !== localPath) {
appState.localPath = pathToSave;
}
Expand All @@ -99,6 +109,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 });
Expand Down
13 changes: 13 additions & 0 deletions src/renderer/transforms/dotfiles.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import { Files } from '../../interfaces';

/**
* This transform adds dotfiles (like .gitignore)
*
* @param {Files} files
* @returns {Promise<Files>}
*/
export async function dotfilesTransform(files: Files): Promise<Files> {
files.set('.gitignore', 'node_modules\nout');

return files;
}
68 changes: 68 additions & 0 deletions src/renderer/transforms/forge.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
import { Files } from '../../interfaces';
import { PACKAGE_NAME } from '../../constants';

/**
* This transform turns the files into an electron-forge
* project.
*
* @param {Files} files
* @returns {Promise<Files>}
*/
export async function forgeTransform(files: Files): Promise<Files> {
if (files.get(PACKAGE_NAME)) {
try {
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 || {};
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: {}
}
];

files.set(PACKAGE_NAME, JSON.stringify(parsed, undefined, 2));
} catch (error) {
console.warn(`Forge Transform: Failed to parse package.json`, { error });
}
}

return files;
}
8 changes: 8 additions & 0 deletions src/utils/get-package.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand Down
13 changes: 13 additions & 0 deletions src/utils/get-username.ts
Original file line number Diff line number Diff line change
@@ -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;
}

0 comments on commit 2b92a39

Please sign in to comment.