diff --git a/project.js b/project.js index 8e58c8a..58151ec 100644 --- a/project.js +++ b/project.js @@ -1,2 +1,2 @@ -'use strict';var _keys=require('babel-runtime/core-js/object/keys');var _keys2=_interopRequireDefault(_keys);var _classCallCheck2=require('babel-runtime/helpers/classCallCheck');var _classCallCheck3=_interopRequireDefault(_classCallCheck2);var _createClass2=require('babel-runtime/helpers/createClass');var _createClass3=_interopRequireDefault(_createClass2);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj};}var fs=require('fs');var octicons=require('octicons');var path=require('path');var Project=function(){function Project(){(0,_classCallCheck3.default)(this,Project);}(0,_createClass3.default)(Project,[{key:'_fileExists',value:function _fileExists(path){try{fs.statSync(path);return true;}catch(err){return false;}}},{key:'_uid',value:function _uid(project){return project.title.toLowerCase().replace(' ','_');}},{key:'_title',value:function _title(project){var title=project.title;if(project.group){title+=' - '+project.group;}return title;}},{key:'_subtitle',value:function _subtitle(project){if(project.paths){return project.paths.join(', ');}return'';}},{key:'_icon',value:function _icon(project){var iconPaths=[];if(project.icon){if(project.icon.startsWith('icon-')){var octiconNames=(0,_keys2.default)(octicons);if(octiconNames.indexOf(project.icon.slice(5))>=0){return path.join(__dirname,'icons',project.icon.slice(5)+'.png');}}if(project.icon.startsWith('~/')){var homedir=process.env.HOME||'';project.icon=path.resolve(homedir,project.icon.slice(2));}if(!path.isAbsolute(project.icon)){for(var i=0;i2&&arguments[2]!==undefined?arguments[2]:[];var command=['open','-na',`"${app}"`];if(project.paths){command.push('"'+project.paths.join('" "')+'"');}if(args.length>0){command.push('--args');command=command.concat(args);}return command.join(' ');}},{key:'parse',value:function parse(project){var item={uid:new Buffer(this._title(project)+this._subtitle(project)).toString('base64'),title:this._title(project),subtitle:this._subtitle(project),icon:{path:this._icon(project)},arg:this._openArgument(project,'Atom'),valid:project.paths&&project.paths.length>0,mods:{alt:{valid:true,subtitle:'Open project path(s) in terminal',arg:this._openArgument(project,process.env.terminalApp||'Terminal')},cmd:{valid:true,subtitle:'Open in new window',arg:this._openArgument(project,'Atom',['-n'])},ctrl:{valid:true,subtitle:'Open in development mode',arg:this._openArgument(project,'Atom',['-d'])},fn:{valid:true,subtitle:'Append project path(s) to last open window',arg:this._openArgument(project,'Atom',['-a'])},shift:{valid:true,subtitle:'Open project path(s) in finder',arg:this._openArgument(project,'Finder')}}};return item;}},{key:'parseAll',value:function parseAll(projects){var result=[];for(var i=0;i=0){return path.join(__dirname,'icons',project.icon.slice(5)+'.png');}}if(project.icon.startsWith('~/')){var homedir=process.env.HOME||'';project.icon=path.resolve(homedir,project.icon.slice(2));}if(!path.isAbsolute(project.icon)){for(var i=0;i2&&arguments[2]!==undefined?arguments[2]:[];var command=['open','-na',`"${app}"`];if(project.paths){command.push('"'+project.paths.join('" "')+'"');}if(args.length>0){command.push('--args');command=command.concat(args);}return command.join(' ');}},{key:'parse',value:function parse(project){var item={uid:new Buffer(this._title(project)+this._subtitle(project)).toString('base64'),title:this._title(project),subtitle:this._subtitle(project),icon:{path:this._icon(project)},arg:this._openArgument(project,'Atom'),valid:project.paths&&project.paths.length>0,mods:{alt:{valid:true,subtitle:'Open project path(s) in terminal',arg:this._openArgument(project,process.env.terminalApp||'Terminal')},cmd:{valid:true,subtitle:'Open in new window',arg:this._openArgument(project,'Atom',['-n'])},ctrl:{valid:true,subtitle:'Open in development mode',arg:this._openArgument(project,'Atom',['-d'])},fn:{valid:true,subtitle:'Append project path(s) to last open window',arg:this._openArgument(project,'Atom',['-a'])},shift:{valid:true,subtitle:'Open project path(s) in finder',arg:this._openArgument(project,'Finder')}}};return item;}},{key:'parseAll',value:function parseAll(projects){var result=[];for(var i=0;i= 0) {\n return path.join(__dirname, 'icons', project.icon.slice(5) + '.png');\n }\n }\n\n // Replace tilde\n if (project.icon.startsWith('~/')) {\n let homedir = process.env.HOME || '';\n project.icon = path.resolve(homedir, project.icon.slice(2));\n }\n\n // Search for project icon if its path is relative\n if (!path.isAbsolute(project.icon)) {\n for (let i = 0; i < project.paths.length; i++) {\n iconPaths.push(path.resolve(project.paths[i], project.icon));\n }\n }\n\n // Absolute path\n if (this._fileExists(project.icon)) {\n return project.icon;\n }\n }\n\n // Search every project root dir for icon.png\n for (let i = 0; i < project.paths.length; i++) {\n iconPaths.push(path.join(project.paths[i], 'icon.png'));\n }\n\n // Find project icon\n for (let i = 0; i < iconPaths.length; i++) {\n if (this._fileExists(iconPaths[i])) {\n return iconPaths[i];\n }\n }\n\n return 'icon.png';\n }\n\n /**\n * Open arguments\n * @param {Object} project\n * @param {string} app Application name\n * @param {Array.string} args Application arguments\n * @return {string}\n */\n _openArgument(project: Object, app: string, args: Array = []): string {\n // Build shell command\n let command = [\n 'open',\n '-na',\n `\"${app}\"`\n ];\n\n // Append project path(s)\n if (project.paths) {\n command.push('\"' + project.paths.join('\" \"') + '\"');\n }\n\n // Append arguments\n if (args.length > 0) {\n command.push('--args');\n command = command.concat(args);\n }\n\n return command.join(' ');\n }\n\n /**\n * Parse project\n * @param {Object} project\n * @return {Object}\n */\n parse(project: Object): Object {\n let item = {\n uid: new Buffer(this._title(project) + this._subtitle(project)).toString('base64'),\n title: this._title(project),\n subtitle: this._subtitle(project),\n icon: {\n path: this._icon(project)\n },\n arg: this._openArgument(project, 'Atom'),\n valid: project.paths && project.paths.length > 0,\n mods: {\n alt: {\n valid: true,\n subtitle: 'Open project path(s) in terminal',\n arg: this._openArgument(project, process.env.terminalApp || 'Terminal')\n },\n cmd: {\n valid: true,\n subtitle: 'Open in new window',\n arg: this._openArgument(project, 'Atom', ['-n'])\n },\n ctrl: {\n valid: true,\n subtitle: 'Open in development mode',\n arg: this._openArgument(project, 'Atom', ['-d'])\n },\n fn: {\n valid: true,\n subtitle: 'Append project path(s) to last open window',\n arg: this._openArgument(project, 'Atom', ['-a'])\n },\n shift: {\n valid: true,\n subtitle: 'Open project path(s) in finder',\n arg: this._openArgument(project, 'Finder')\n }\n }\n };\n\n return item;\n }\n\n /**\n * Parse a list of projects\n * @param {Array.Object} projects\n * @return {Array.Object}\n */\n parseAll(projects: Array): Array {\n let result = [];\n\n for (let i = 0; i < projects.length; i++) {\n result[result.length] = this.parse(projects[i]);\n }\n\n return result;\n }\n}\n\nmodule.exports = new Project();\n"]} \ No newline at end of file +{"version":3,"sources":["project.js.flow"],"names":["fs","require","octicons","path","Project","statSync","err","project","title","toLowerCase","replace","group","paths","join","iconPaths","icon","startsWith","octiconNames","indexOf","slice","__dirname","homedir","process","env","HOME","resolve","isAbsolute","i","length","push","_fileExists","app","args","command","concat","item","uid","Buffer","_title","_subtitle","toString","subtitle","_icon","arg","_openArgument","valid","mods","alt","terminalApp","cmd","ctrl","fn","shift","projects","result","parse","module","exports"],"mappings":"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","file":"project.js","sourcesContent":["// @flow\n\nconst fs = require('fs');\nconst octicons = require('octicons');\nconst path = require('path');\n\n/**\n * Atom Project\n * @class\n */\nclass Project {\n /**\n * Check if file exists\n * @param {string} path\n * @return {boolean}\n */\n _fileExists(path: string): boolean {\n try {\n fs.statSync(path);\n return true;\n } catch (err) {\n return false;\n }\n }\n\n /**\n * Project UID\n * @param {Object} project\n * @return {string}\n */\n _uid(project: Object): string {\n return project.title.toLowerCase().replace(' ', '_');\n }\n\n /**\n * Project title\n * @param {Object} project\n * @return {string}\n */\n _title(project: Object): string {\n let title:string = project.title;\n\n if (project.group) {\n title += ' - ' + project.group;\n }\n\n return title;\n }\n\n /**\n * Project sub-title\n * @param {Object} project\n * @return {string}\n */\n _subtitle(project: Object): string {\n if (project.paths) {\n return project.paths.join(', ');\n }\n\n return '';\n }\n\n /**\n * Project icon\n * @param {Object} project\n * @return {string} Full path to icon\n */\n _icon(project: Object) {\n let iconPaths = [];\n\n if (project.icon) {\n // Octicon\n if (project.icon.startsWith('icon-')) {\n let octiconNames = Object.keys(octicons);\n if (octiconNames.indexOf(project.icon.slice(5)) >= 0) {\n return path.join(__dirname, 'icons', project.icon.slice(5) + '.png');\n }\n }\n\n // Replace tilde\n if (project.icon.startsWith('~/')) {\n let homedir = process.env.HOME || '';\n project.icon = path.resolve(homedir, project.icon.slice(2));\n }\n\n // Search for project icon if its path is relative\n if (!path.isAbsolute(project.icon)) {\n for (let i = 0; i < project.paths.length; i++) {\n iconPaths.push(path.resolve(project.paths[i], project.icon));\n }\n }\n\n // Absolute path\n if (this._fileExists(project.icon)) {\n return project.icon;\n }\n }\n\n // Search every project root dir for icon.png\n for (let i = 0; i < project.paths.length; i++) {\n iconPaths.push(path.join(project.paths[i], 'icon.png'));\n }\n\n // Find project icon\n for (let i = 0; i < iconPaths.length; i++) {\n if (this._fileExists(iconPaths[i])) {\n return iconPaths[i];\n }\n }\n\n return 'icon.png';\n }\n\n /**\n * Open arguments\n * @param {Object} project\n * @param {string} app Application name\n * @param {Array.string} args Application arguments\n * @return {string}\n */\n _openArgument(project: Object, app: string, args: Array = []): string {\n // Build shell command\n let command = [\n 'open',\n '-na',\n `\"${app}\"`\n ];\n\n // Append project path(s)\n if (project.paths) {\n command.push('\"' + project.paths.join('\" \"') + '\"');\n }\n\n // Append arguments\n if (args.length > 0) {\n command.push('--args');\n command = command.concat(args);\n }\n\n return command.join(' ');\n }\n\n /**\n * Parse project\n * @param {Object} project\n * @return {Object}\n */\n parse(project: Object): Object {\n let item = {\n uid: new Buffer(this._title(project) + this._subtitle(project)).toString('base64'),\n title: this._title(project),\n subtitle: this._subtitle(project),\n icon: {\n path: this._icon(project)\n },\n arg: this._openArgument(project, 'Atom'),\n valid: project.paths && project.paths.length > 0,\n mods: {\n alt: {\n valid: true,\n subtitle: 'Open project path(s) in terminal',\n arg: this._openArgument(project, process.env.terminalApp || 'Terminal')\n },\n cmd: {\n valid: true,\n subtitle: 'Open in new window',\n arg: this._openArgument(project, 'Atom', ['-n'])\n },\n ctrl: {\n valid: true,\n subtitle: 'Open in development mode',\n arg: this._openArgument(project, 'Atom', ['-d'])\n },\n fn: {\n valid: true,\n subtitle: 'Append project path(s) to last open window',\n arg: this._openArgument(project, 'Atom', ['-a'])\n },\n shift: {\n valid: true,\n subtitle: 'Open project path(s) in finder',\n arg: this._openArgument(project, 'Finder')\n }\n }\n };\n\n return item;\n }\n\n /**\n * Parse a list of projects\n * @param {Array.Object} projects\n * @return {Array.Object}\n */\n parseAll(projects: Array): Array {\n let result = [];\n\n for (let i = 0; i < projects.length; i++) {\n if (projects[i].paths) {\n result[result.length] = this.parse(projects[i]);\n }\n }\n\n return result;\n }\n}\n\nmodule.exports = new Project();\n"]} \ No newline at end of file