+
this.close(e)} className='modalBack'/>
+ {this.state.component == null ? null : (
+
+ )}
+
+ )
+ }
+}
+
+let el = document.createElement('div')
+document.body.appendChild(el)
+let modalBase = ReactDOM.render(
, el)
+
+export function openModal (component, props) {
+ if (modalBase == null) { return }
+ modalBase.setState({component: component, componentProps: props, isHidden: false})
+}
+
+export function closeModal () {
+ if (modalBase == null) { return }
+ modalBase.setState({component: null, componentProps: null, isHidden: true})
+}
+
+export function isModalOpen () {
+ return !modalBase.state.isHidden
+}
diff --git a/lib/openExternal.js b/lib/openExternal.js
new file mode 100644
index 00000000..f8223159
--- /dev/null
+++ b/lib/openExternal.js
@@ -0,0 +1,6 @@
+var shell = require('shell')
+
+export default function (e) {
+ shell.openExternal(e.currentTarget.href)
+ e.preventDefault()
+}
diff --git a/lib/reducer.js b/lib/reducer.js
new file mode 100644
index 00000000..feb172a1
--- /dev/null
+++ b/lib/reducer.js
@@ -0,0 +1,153 @@
+import { combineReducers } from 'redux'
+import _ from 'lodash'
+import { SWITCH_FOLDER, SWITCH_MODE, SWITCH_ARTICLE, SET_SEARCH_FILTER, SET_TAG_FILTER, CLEAR_SEARCH, ARTICLE_UPDATE, ARTICLE_DESTROY, FOLDER_CREATE, FOLDER_UPDATE, FOLDER_DESTROY, IDLE_MODE, CREATE_MODE } from './actions'
+import dataStore from 'boost/dataStore'
+import keygen from 'boost/keygen'
+
+const initialStatus = {
+ mode: IDLE_MODE,
+ search: ''
+}
+
+let data = dataStore.getData()
+let initialArticles = data.articles
+let initialFolders = data.folders
+
+function folders (state = initialFolders, action) {
+ state = state.slice()
+ switch (action.type) {
+ case FOLDER_CREATE:
+ {
+ let newFolder = action.data.folder
+ Object.assign(newFolder, {
+ key: keygen(),
+ createAt: new Date(),
+ updatedAt: new Date(),
+ // random number (0-7)
+ color: Math.round(Math.random() * 7)
+ })
+
+ let conflictFolder = _.findWhere(state, {name: newFolder.name})
+ if (conflictFolder != null) throw new Error('name conflicted!')
+ state.push(newFolder)
+
+ dataStore.setFolders(null, state)
+ return state
+ }
+ case FOLDER_UPDATE:
+ {
+ let folder = action.data.folder
+ let targetFolder = _.findWhere(state, {key: folder.key})
+
+ // Folder existence check
+ if (targetFolder == null) throw new Error('Folder doesnt exist')
+ // Name conflict check
+ if (targetFolder.name !== folder.name) {
+ let conflictFolder = _.findWhere(state, {name: folder.name})
+ if (conflictFolder != null) throw new Error('Name conflicted')
+ }
+ Object.assign(targetFolder, folder, {
+ updatedAt: new Date()
+ })
+
+ dataStore.setFolders(null, state)
+ return state
+ }
+ case FOLDER_DESTROY:
+ {
+ if (state.length < 2) throw new Error('Folder must exist more than one')
+
+ let targetKey = action.data.key
+ let targetIndex = _.findIndex(state, folder => folder.key === targetKey)
+ if (targetIndex >= 0) {
+ state.splice(targetIndex, 1)
+ }
+ dataStore.setFolders(null, state)
+ return state
+ }
+ default:
+ return state
+ }
+}
+
+function articles (state = initialArticles, action) {
+ state = state.slice()
+ switch (action.type) {
+ case ARTICLE_UPDATE:
+ {
+ let article = action.data.article
+
+ let targetIndex = _.findIndex(state, _article => article.key === _article.key)
+ if (targetIndex < 0) state.unshift(article)
+ else state.splice(targetIndex, 1, article)
+
+ dataStore.setArticles(null, state)
+ return state
+ }
+ case ARTICLE_DESTROY:
+ {
+ let articleKey = action.data.key
+
+ let targetIndex = _.findIndex(state, _article => articleKey === _article.key)
+ if (targetIndex >= 0) state.splice(targetIndex, 1)
+
+ dataStore.setArticles(null, state)
+ return state
+ }
+ case FOLDER_DESTROY:
+ {
+ let folderKey = action.data.key
+
+ state = state.filter(article => article.FolderKey !== folderKey)
+
+ dataStore.setArticles(null, state)
+ return state
+ }
+ default:
+ return state
+ }
+}
+
+function status (state = initialStatus, action) {
+ state = Object.assign({}, state)
+ switch (action.type) {
+ case SWITCH_FOLDER:
+ state.mode = IDLE_MODE
+ state.search = `in:${action.data} `
+
+ return state
+ case SWITCH_MODE:
+ state.mode = action.data
+ if (state.mode === CREATE_MODE) state.articleKey = null
+
+ return state
+ case SWITCH_ARTICLE:
+ state.articleKey = action.data
+ state.mode = IDLE_MODE
+
+ return state
+ case SET_SEARCH_FILTER:
+ state.search = action.data
+ state.mode = IDLE_MODE
+
+ return state
+ case SET_TAG_FILTER:
+ state.search = `#${action.data}`
+ state.mode = IDLE_MODE
+
+ return state
+ case CLEAR_SEARCH:
+ state.search = ''
+ state.mode = IDLE_MODE
+
+ return state
+ default:
+ return state
+ }
+}
+
+export default combineReducers({
+ folders,
+ articles,
+ status
+})
diff --git a/lib/search.js b/lib/search.js
new file mode 100644
index 00000000..0a8d7a3a
--- /dev/null
+++ b/lib/search.js
@@ -0,0 +1,40 @@
+'use strict'
+
+var _ = require('lodash')
+
+const TEXT_FILTER = 'TEXT_FILTER'
+const FOLDER_FILTER = 'FOLDER_FILTER'
+const TAG_FILTER = 'TAG_FILTER'
+
+export default function search (articles, search) {
+ let filters = search.split(' ').map(key => key.trim()).filter(key => key.length > 0 && !key.match(/^#$/)).map(key => {
+ if (key.match(/^in:.+$/)) {
+ return {type: FOLDER_FILTER, value: key.match(/^in:(.+)$/)[1]}
+ }
+ if (key.match(/^#(.+)/)) {
+ return {type: TAG_FILTER, value: key.match(/^#(.+)$/)[1]}
+ }
+ return {type: TEXT_FILTER, value: key}
+ })
+ // let folderFilters = filters.filter(filter => filter.type === FOLDER_FILTER)
+ let textFilters = filters.filter(filter => filter.type === TEXT_FILTER)
+ let tagFilters = filters.filter(filter => filter.type === TAG_FILTER)
+
+ if (textFilters.length > 0) {
+ articles = textFilters.reduce((articles, textFilter) => {
+ return articles.filter(article => {
+ return article.title.match(new RegExp(textFilter.value, 'i')) || article.content.match(new RegExp(textFilter.value, 'i'))
+ })
+ }, articles)
+ }
+
+ if (tagFilters.length > 0) {
+ articles = tagFilters.reduce((articles, tagFilter) => {
+ return articles.filter(article => {
+ return _.find(article.Tags, tag => tag.name.match(new RegExp(tagFilter.value, 'i')))
+ })
+ }, articles)
+ }
+
+ return articles
+}
diff --git a/lib/socket.js b/lib/socket.js
new file mode 100644
index 00000000..1f0eb597
--- /dev/null
+++ b/lib/socket.js
@@ -0,0 +1,52 @@
+import { API_URL } from '../config'
+import socketio from 'socket.io-client'
+import auth from './auth'
+import store from './store'
+import { updateUser, updateArticle, destroyArticle, destroyFolder } from './actions'
+
+export const CONN = 'CONN'
+export const ALERT = 'ALERT'
+export const USER_UPDATE = 'USER_UPDATE'
+export const ARTICLE_UPDATE = 'ARTICLE_UPDATE'
+export const ARTICLE_DESTROY = 'ARTICLE_DESTROY'
+export const FOLDER_DESTROY = 'FOLDER_DESTROY'
+
+let io = socketio(API_URL)
+
+io.on(CONN, function (data) {
+ console.log('connected', data)
+
+ let token = auth.token()
+ if (token != null) {
+ io.emit('JOIN', {token})
+ }
+})
+
+io.on(ALERT, function (data) {
+ console.log(ALERT, data)
+})
+
+io.on(USER_UPDATE, function (data) {
+ console.log(USER_UPDATE, data)
+ let { user } = data
+ store.dispatch(updateUser(user))
+})
+
+io.on(FOLDER_DESTROY, function (data) {
+ console.log(FOLDER_DESTROY, data)
+ store.dispatch(destroyFolder(data.TeamId, data.FolderId))
+})
+
+io.on(ARTICLE_UPDATE, function (data) {
+ console.log(ARTICLE_UPDATE, data)
+ let { userId, article } = data
+ store.dispatch(updateArticle(userId, article))
+})
+
+io.on(ARTICLE_DESTROY, function (data) {
+ console.log(ARTICLE_DESTROY, data)
+ let { userId, articleKey } = data
+ store.dispatch(destroyArticle(userId, articleKey))
+})
+
+export default io
diff --git a/lib/store.js b/lib/store.js
new file mode 100644
index 00000000..e910bfaa
--- /dev/null
+++ b/lib/store.js
@@ -0,0 +1,6 @@
+import reducer from './reducer'
+import { createStore } from 'redux'
+
+let store = createStore(reducer)
+
+export default store
diff --git a/main.js b/main.js
index 6d43bc0e..0512751b 100644
--- a/main.js
+++ b/main.js
@@ -1,5 +1,4 @@
var app = require('app')
-var BrowserWindow = require('browser-window')
var Menu = require('menu')
var MenuItem = require('menu-item')
var Tray = require('tray')
@@ -11,7 +10,7 @@ require('crash-reporter').start()
var mainWindow = null
var appIcon = null
var menu = null
-var popUpWindow = null
+var finderWindow = null
var update = null
@@ -22,35 +21,12 @@ var update = null
var version = app.getVersion()
var versionText = (version == null || version.length === 0) ? 'DEV version' : 'v' + version
var nn = require('node-notifier')
-var autoUpdater = require('auto-updater')
+var updater = require('./atom-lib/updater')
var path = require('path')
-autoUpdater
- .on('error', function (err, message) {
- console.error(message)
- nn.notify({
- title: 'Error! ' + versionText,
- icon: path.join(__dirname, 'browser/main/resources/favicon-230x230.png'),
- message: message
- })
- })
- .on('checking-for-update', function () {
- // Connecting
- })
- .on('update-available', function () {
- nn.notify({
- title: 'Update is available!! ' + versionText,
- icon: path.join(__dirname, 'browser/main/resources/favicon-230x230.png'),
- message: 'Download started.. wait for the update ready.'
- })
- })
- .on('update-not-available', function () {
- nn.notify({
- title: 'Latest Build!! ' + versionText,
- icon: path.join(__dirname, 'browser/main/resources/favicon-230x230.png'),
- message: 'Hope you to enjoy our app :D'
- })
- })
+var appQuit = false
+
+updater
.on('update-downloaded', function (event, releaseNotes, releaseName, releaseDate, updateUrl, quitAndUpdate) {
nn.notify({
title: 'Ready to Update!! ' + versionText,
@@ -65,14 +41,18 @@ autoUpdater
})
app.on('ready', function () {
+ app.on('before-quit', function () {
+ appQuit = true
+ })
console.log('Version ' + version)
- autoUpdater.setFeedUrl('http://orbital.b00st.io/rokt33r/boost/latest?version=' + version)
- autoUpdater.checkForUpdates()
+ updater.setFeedUrl('http://orbital.b00st.io/rokt33r/boost-dev/latest?version=' + version)
+ updater.checkForUpdates()
// menu start
- var template = require('./modules/menu-template')
+ var template = require('./atom-lib/menu-template')
ipc.on('update-app', function (event, msg) {
if (update != null) {
+ appQuit = true
update()
}
})
@@ -81,25 +61,14 @@ app.on('ready', function () {
Menu.setApplicationMenu(menu)
// menu end
- appIcon = new Tray(__dirname + '/tray-icon.png')
+ appIcon = new Tray(__dirname + '/resources/tray-icon.png')
appIcon.setToolTip('Boost')
var trayMenu = new Menu()
trayMenu.append(new MenuItem({
label: 'Open main window',
click: function () {
- if (mainWindow == null) {
- makeNewMainWindow()
- }
- mainWindow.show()
- }
- }))
- trayMenu.append(new MenuItem({
- label: 'Update App',
- click: function () {
- if (update != null) {
- update()
- }
+ if (mainWindow != null) mainWindow.show()
}
}))
trayMenu.append(new MenuItem({
@@ -110,40 +79,26 @@ app.on('ready', function () {
}))
appIcon.setContextMenu(trayMenu)
- makeNewMainWindow()
+ mainWindow = require('./atom-lib/main-window')
+ mainWindow.on('close', function (e) {
+ if (appQuit) return true
+ e.preventDefault()
+ mainWindow.hide()
+ })
+ if (update != null) {
+ mainWindow.webContents.on('did-finish-load', function () {
+ mainWindow.webContents.send('update-available', 'whoooooooh!')
+ })
+ }
app.on('activate-with-no-open-windows', function () {
- if (mainWindow == null) {
- makeNewMainWindow()
- return
- }
+ if (mainWindow == null) return null
mainWindow.show()
})
- popUpWindow = new BrowserWindow({
- width: 600,
- height: 400,
- show: false,
- frame: false,
- 'zoom-factor': 1.0,
- 'always-on-top': true,
- 'web-preferences': {
- 'overlay-scrollbars': true,
- 'skip-taskbar': true
- },
- 'standard-window': false
- })
-
- popUpWindow.loadUrl('file://' + __dirname + '/browser/finder/index.electron.html')
-
- popUpWindow.on('blur', function () {
- popUpWindow.hide()
- })
-
- popUpWindow.setVisibleOnAllWorkspaces(true)
+ finderWindow = require('./atom-lib/finder-window')
var globalShortcut = require('global-shortcut')
- console.log('jetpack launch')
var userDataPath = app.getPath('userData')
if (!jetpack.cwd(userDataPath).exists('keymap.json')) {
jetpack.cwd(userDataPath).file('keymap.json', {content: '{}'})
@@ -162,7 +117,7 @@ app.on('ready', function () {
if (mainWindow != null && !mainWindow.isFocused()) {
mainWindow.hide()
}
- popUpWindow.show()
+ finderWindow.show()
})
} catch (err) {
console.log(err.name)
@@ -172,7 +127,7 @@ app.on('ready', function () {
console.log('got new keymap')
console.log(newKeymap)
globalShortcut.unregisterAll()
- global.keymap = JSON.parse(newKeymap)
+ global.keymap = newKeymap
jetpack.cwd(userDataPath).file('keymap.json', {content: JSON.stringify(global.keymap)})
var toggleFinderKey = global.keymap.toggleFinder != null ? global.keymap.toggleFinder : 'ctrl+tab+shift'
@@ -181,7 +136,7 @@ app.on('ready', function () {
if (mainWindow != null && !mainWindow.isFocused()) {
mainWindow.hide()
}
- popUpWindow.show()
+ finderWindow.show()
})
} catch (err) {
console.log(err.name)
@@ -189,40 +144,10 @@ app.on('ready', function () {
})
global.hideFinder = function () {
- if (mainWindow == null || !mainWindow.isVisible()) {
+ if (!mainWindow.isVisible()) {
Menu.sendActionToFirstResponder('hide:')
+ } else {
+ mainWindow.focus()
}
- popUpWindow.hide()
}
})
-
-function makeNewMainWindow () {
- console.log('new Window!')
- mainWindow = new BrowserWindow({
- width: 1080,
- height: 720,
- 'zoom-factor': 1.0,
- 'web-preferences': {
- 'overlay-scrollbars': true
- },
- 'standard-window': false
- })
- if (update != null) {
- mainWindow.webContents.on('did-finish-load', function () {
- mainWindow.webContents.send('update-available', 'whoooooooh!')
- })
- }
-
- mainWindow.loadUrl('file://' + __dirname + '/browser/main/index.electron.html')
-
- mainWindow.webContents.on('new-window', function (e) {
- e.preventDefault()
- })
-
- mainWindow.on('closed', function () {
- console.log('main closed')
- mainWindow = null
- app.dock.hide()
- })
- app.dock.show()
-}
diff --git a/modules/ace-modes.js b/modules/ace-modes.js
deleted file mode 100644
index f4f2c72f..00000000
--- a/modules/ace-modes.js
+++ /dev/null
@@ -1,10 +0,0 @@
-var fs = require('fs')
-
-module.exports = fs.readdirSync(__dirname + '/../browser/ace/src-min')
- .filter(function (file) {
- return file.match(/^mode-/)
- })
- .map(function (file) {
- var match = file.match(/^mode-([a-z0-9\_]+).js$/)
- return match[1]
- })
diff --git a/node_modules/boost b/node_modules/boost
new file mode 120000
index 00000000..dc598c56
--- /dev/null
+++ b/node_modules/boost
@@ -0,0 +1 @@
+../lib
\ No newline at end of file
diff --git a/package.json b/package.json
index 636d1111..7868fc02 100644
--- a/package.json
+++ b/package.json
@@ -1,13 +1,19 @@
{
"name": "boost",
- "version": "0.3.0",
+ "version": "0.4.0-alpha.7",
"description": "Boost App",
"main": "main.js",
"scripts": {
- "start": "electron ./main.js",
- "web": "npm run serve | npm run dev",
- "serve": "./node_modules/.bin/http-server ./browser -p 8080",
- "dev": "webpack-dev-server --progress --colors --port 8090"
+ "start": "BOOST_ENV=development electron ./main.js",
+ "webpack": "webpack-dev-server --hot --inline --config webpack.config.js",
+ "compile": "NODE_ENV=production webpack --config webpack.config.production.js",
+ "build": "electron-packager ./ Boost --app-version=$npm_package_version $npm_package_config_platform $npm_package_config_version $npm_package_config_ignore --overwrite",
+ "codesign": "codesign --verbose --deep --force --sign \"MAISIN solutions Inc.\" Boost-darwin-x64/Boost.app"
+ },
+ "config": {
+ "version": "--version=0.34.0 --app-bundle-id=com.maisin.boost",
+ "platform": "--platform=darwin --arch=x64 --prune --icon=resources/app.icns",
+ "ignore": "--ignore=Boost-darwin-x64 --ignore=node_modules/devicon/icons --ignore=submodules/ace/(?!src-min)|submodules/ace/(?=src-min-noconflict)"
},
"repository": {
"type": "git",
@@ -31,37 +37,44 @@
},
"homepage": "https://github.com/Rokt33r/codexen-app#readme",
"dependencies": {
+ "devicon": "^2.0.0",
"font-awesome": "^4.3.0",
"fs-jetpack": "^0.7.0",
+ "lodash": "^3.10.1",
"markdown-it": "^4.3.1",
"md5": "^2.0.0",
"moment": "^2.10.3",
- "nib": "^1.1.0",
- "node-jsx": "^0.13.3",
"node-notifier": "^4.2.3",
- "react": "^0.13.3",
- "react-router": "^0.13.3",
- "react-select": "^0.5.4",
- "reflux": "^0.2.8",
- "stylus": "^0.52.0",
+ "socket.io-client": "^1.3.6",
"superagent": "^1.2.0",
"superagent-promise": "^1.0.3"
},
"devDependencies": {
- "css-loader": "^0.15.1",
- "http-server": "^0.8.0",
- "jsx-loader": "^0.13.2",
- "node-libs-browser": "^0.5.2",
- "style-loader": "^0.12.3",
- "stylus-loader": "^1.2.1",
- "webpack": "^1.10.0",
- "webpack-dev-server": "^1.10.1"
+ "babel-loader": "^5.3.2",
+ "babel-plugin-react-transform": "^1.1.1",
+ "css-loader": "^0.19.0",
+ "electron-packager": "^5.1.0",
+ "electron-prebuilt": "^0.33.6",
+ "nib": "^1.1.0",
+ "react": "^0.14.0",
+ "react-dom": "^0.14.0",
+ "react-redux": "^4.0.0",
+ "react-router": "^1.0.0-rc1",
+ "react-select": "^0.8.1",
+ "react-transform-catch-errors": "^1.0.0",
+ "react-transform-hmr": "^1.0.1",
+ "redbox-react": "^1.1.1",
+ "redux": "^3.0.2",
+ "standard": "^5.3.1",
+ "style-loader": "^0.12.4",
+ "stylus": "^0.52.4",
+ "stylus-loader": "^1.3.1",
+ "webpack": "^1.12.2",
+ "webpack-dev-server": "^1.12.0"
},
"standard": {
- "ignore": [
- "/browser/ace/"
- ],
- "global": [
+ "ignore": [],
+ "globals": [
"localStorage"
]
}
diff --git a/readme.md b/readme.md
deleted file mode 100644
index f08d4273..00000000
--- a/readme.md
+++ /dev/null
@@ -1,20 +0,0 @@
-# CodeXen app 0.2.0
-
-
-Short code(Snippet/Templatefile/Command) storage + boosting service
-> This repo is a workbench to build CodeXen app
-
-## Status
-v0.1 is building now
-
-## How To Use
-
-``` sh
-git clone https://github.com/Rokt33r/codexen-app.git
-npm install
-npm start
-```
-
-You can check it -> [localhost:8080](http://localhost:8080)
-
-> Electron build will be updated soon.
diff --git a/Lato-Regular.ttf b/resources/Lato-Regular.ttf
similarity index 100%
rename from Lato-Regular.ttf
rename to resources/Lato-Regular.ttf
diff --git a/Lato-Regular.woff b/resources/Lato-Regular.woff
similarity index 100%
rename from Lato-Regular.woff
rename to resources/Lato-Regular.woff
diff --git a/Lato-Regular.woff2 b/resources/Lato-Regular.woff2
similarity index 100%
rename from Lato-Regular.woff2
rename to resources/Lato-Regular.woff2
diff --git a/resources/app.icns b/resources/app.icns
new file mode 100644
index 00000000..6eeed201
Binary files /dev/null and b/resources/app.icns differ
diff --git a/browser/main/resources/favicon-230x230.png b/resources/favicon-230x230.png
similarity index 100%
rename from browser/main/resources/favicon-230x230.png
rename to resources/favicon-230x230.png
diff --git a/resources/finder.png b/resources/finder.png
new file mode 100644
index 00000000..4caf9249
Binary files /dev/null and b/resources/finder.png differ
diff --git a/tray-icon.png b/resources/tray-icon.png
similarity index 100%
rename from tray-icon.png
rename to resources/tray-icon.png
diff --git a/tray-icon@2x.png b/resources/tray-icon@2x.png
similarity index 100%
rename from tray-icon@2x.png
rename to resources/tray-icon@2x.png
diff --git a/submodules/ace b/submodules/ace
new file mode 160000
index 00000000..b082bcb4
--- /dev/null
+++ b/submodules/ace
@@ -0,0 +1 @@
+Subproject commit b082bcb4bf2da27a8def3c438a33ebf0dffe5afe
diff --git a/update-log.md b/update-log.md
deleted file mode 100644
index f92b0cc7..00000000
--- a/update-log.md
+++ /dev/null
@@ -1,18 +0,0 @@
-※ 最近の方が上に来るように書きためていく
-
-# Update Log
-
-## v0.1.2 (2015/7/3)
-
-- 利用規約・プライベートポリシーの追加
-
-## v0.1.1 (2015/6/25)
-
-- バーグ改善
-- Recipe機能追加
-
-## v0.1.0 (2015/6/17)
-
-- Web/OS X app release
-
-## v0.2.0 (2015/7/...)
diff --git a/webpack.config.js b/webpack.config.js
index b113c964..b9492ffb 100644
--- a/webpack.config.js
+++ b/webpack.config.js
@@ -1,39 +1,83 @@
-module.exports = {
- entry: {
- main: './browser/main/index.jsx',
- 'main-style': './browser/main/style.js'
- },
- output: {
- filename: '[name].js',
- publicPath: 'http://localhost:8090/assets'
- },
- devtool: '#inline-source-map',
+var webpack = require('webpack')
+var path = require('path')
+var JsonpTemplatePlugin = webpack.JsonpTemplatePlugin
+var FunctionModulePlugin = require('webpack/lib/FunctionModulePlugin')
+var NodeTargetPlugin = require('webpack/lib/node/NodeTargetPlugin')
+var ExternalsPlugin = webpack.ExternalsPlugin
+var opt = {
+ path: path.join(__dirname, 'compiled'),
+ filename: '[name].js',
+ sourceMapFilename: '[name].map',
+ libraryTarget: 'commonjs2',
+ publicPath: 'http://localhost:8080/assets/'
+}
+var config = {
module: {
loaders: [
{
- test: /\.jsx$/,
- loader: 'jsx-loader?insertPragma=React.DOM&harmony'
+ test: /\.js?$/,
+ loader: 'babel-loader?cacheDirectory',
+ exclude: /node_modules/
},
{
- test: /\.styl$/,
+ test: /\.styl?$/,
+ exclude: /(node_modules|bower_components)/,
loader: 'style-loader!css-loader!stylus-loader'
- },
- {
- test: /\.css$/,
- loader: 'style-loader!css-loader'
}
]
},
- externals: {
- 'react': 'React',
- 'react/addons': 'React',
- 'react-router': 'ReactRouter',
- 'ace': 'ace',
- 'reflux': 'Reflux',
- 'moment': 'moment',
- 'markdown-it': 'markdownit'
+ debug: true,
+ devtool: 'eval-source-map',
+ entry: {
+ main: './browser/main/index.js',
+ finder: './browser/finder/index.js'
},
+ output: opt,
resolve: {
- extensions: ['', '.js', '.jsx']
- }
+ extensions: ['', '.js', '.jsx'],
+ packageMains: ['webpack', 'browser', 'web', 'browserify', ['jam', 'main'], 'main']
+ },
+ plugins: [
+ new webpack.NoErrorsPlugin(),
+ new ExternalsPlugin('commonjs', [
+ 'app',
+ 'auto-updater',
+ 'browser-window',
+ 'content-tracing',
+ 'dialog',
+ 'global-shortcut',
+ 'ipc',
+ 'menu',
+ 'menu-item',
+ 'power-monitor',
+ 'protocol',
+ 'tray',
+ 'remote',
+ 'web-frame',
+ 'clipboard',
+ 'crash-reporter',
+ 'screen',
+ 'shell'
+ ]),
+ new NodeTargetPlugin()
+ ],
+ externals: [
+ 'socket.io-client',
+ 'md5',
+ 'superagent',
+ 'superagent-promise',
+ 'lodash',
+ 'markdown-it',
+ 'moment'
+ ]
}
+
+config.target = function renderer (compiler) {
+ compiler.apply(
+ new JsonpTemplatePlugin(opt),
+ new FunctionModulePlugin(opt)
+ )
+}
+
+module.exports = config
+
diff --git a/webpack.config.production.js b/webpack.config.production.js
new file mode 100644
index 00000000..737e0d13
--- /dev/null
+++ b/webpack.config.production.js
@@ -0,0 +1,54 @@
+var webpack = require('webpack')
+module.exports = {
+ devtool: 'source-map',
+ entry: {
+ main: './browser/main/index.js',
+ finder: './browser/finder/index.js'
+ },
+ output: {
+ path: 'compiled',
+ filename: '[name].js',
+ sourceMapFilename: '[name].map',
+ libraryTarget: 'commonjs2'
+ },
+ module: {
+ loaders: [
+ {
+ test: /(\.js|\.jsx)?$/,
+ exclude: /(node_modules|bower_components)/,
+ loader: 'babel'
+ },
+ {
+ test: /\.styl?$/,
+ exclude: /(node_modules|bower_components)/,
+ loader: 'style-loader!css-loader!stylus-loader'
+ }
+ ]
+ },
+ plugins: [
+ new webpack.optimize.OccurenceOrderPlugin(),
+ new webpack.DefinePlugin({
+ 'process.env': {
+ 'NODE_ENV': JSON.stringify('production')
+ }
+ })
+ // new webpack.optimize.UglifyJsPlugin({
+ // compressor: {
+ // warnings: false
+ // }
+ // })
+ ],
+ externals: [
+ 'socket.io-client',
+ 'md5',
+ 'superagent',
+ 'superagent-promise',
+ 'lodash',
+ 'markdown-it',
+ 'moment'
+ ],
+ resolve: {
+ extensions: ['', '.js', '.jsx', 'styl']
+ },
+ target: 'atom'
+}