diff --git a/.bowerrc b/.bowerrc new file mode 100644 index 00000000..0c16bd5a --- /dev/null +++ b/.bowerrc @@ -0,0 +1,3 @@ +{ + "directory": "browser/vendor/" +} diff --git a/bower.json b/bower.json new file mode 100644 index 00000000..d3bad4c6 --- /dev/null +++ b/bower.json @@ -0,0 +1,8 @@ +{ + "name": "codexen-app", + "dependencies": { + "react": "~0.13.3", + "fontawesome": "~4.3.0", + "react-router": "~0.13.3" + } +} diff --git a/browser/index.html b/browser/index.html new file mode 100644 index 00000000..cbb53cad --- /dev/null +++ b/browser/index.html @@ -0,0 +1,11 @@ + + + + + + + + Go Main + Go Popup + + diff --git a/browser/main/Containers/BlueprintContainer.jsx b/browser/main/Containers/BlueprintContainer.jsx new file mode 100644 index 00000000..bf2c36d2 --- /dev/null +++ b/browser/main/Containers/BlueprintContainer.jsx @@ -0,0 +1,11 @@ +var React = require('react/addons') + +module.exports = React.createClass({ + render: function () { + return ( +
+ Blueprint Container +
+ ) + } +}) diff --git a/browser/main/Containers/DashboardContainer.jsx b/browser/main/Containers/DashboardContainer.jsx new file mode 100644 index 00000000..6f04754e --- /dev/null +++ b/browser/main/Containers/DashboardContainer.jsx @@ -0,0 +1,52 @@ +var React = require('react/addons') + +module.exports = React.createClass({ + render: function () { + return ( +
+

Codexen App v0.2.0

+ +

About CodeXen

+ +

+ CodeXen is short code storage tool make coding more stressless. If you use CodeXen, then you will be disentangled from troublesome organizing a large number of snippets and googling same code many times. +

+ +
    +
  1. +

    Post your code

    +

    + Post your commonly used code with description,category,and tags. +

    +
  2. +
  3. +

    Save on cloud

    +

    + From short snippet to long complex code,CodeXen saves any code simply. +

    +
  4. +
  5. +

    + Use code like a magic +

    +

    + CodeXen call code you posted whereever you are.Type [shift+control+tab] simultaneously. +

    +
  6. +
  7. +

    + Code Elegantly +

    +

    + That's all! + You must be loved with CodeXen. Enjoy coding;) +

    +
  8. +
+

+ © 2015 MAISIN&CO.,Inc. +

+
+ ) + } +}) diff --git a/browser/main/Containers/LoginContainer.jsx b/browser/main/Containers/LoginContainer.jsx new file mode 100644 index 00000000..6fc39c3c --- /dev/null +++ b/browser/main/Containers/LoginContainer.jsx @@ -0,0 +1,44 @@ +var React = require('react/addons') +var ReactRouter = require('react-router') +var Link = ReactRouter.Link +var Auth = require('../Services/Auth') + +module.exports = React.createClass({ + mixins: [React.addons.LinkedStateMixin, ReactRouter.Navigation], + getInitialState: function () { + return { + email: '', + password: '' + } + }, + handleSubmit: function (e) { + console.log(this.state) + Auth.attempt() + // TODO: request user data + .then(function (user) { + this.transitionTo('dashboard', {planetName: user.name}) + }.bind(this)) + e.preventDefault() + }, + render: function () { + return ( +
+

CodeXen

+

Log In | Register

+
+
+ + +
+
+ + +
+
+ +
+
+
+ ) + } +}) diff --git a/browser/main/Containers/MainContainer.jsx b/browser/main/Containers/MainContainer.jsx new file mode 100644 index 00000000..3bdf2202 --- /dev/null +++ b/browser/main/Containers/MainContainer.jsx @@ -0,0 +1,18 @@ +var React = require('react/addons') +var ReactRouter = require('react-router') +var RouteHandler = ReactRouter.RouteHandler + +module.exports = React.createClass({ + mixins: [ReactRouter.Navigation, ReactRouter.State], + render: function () { + // Redirect Login state + if (this.getPath() === '/') { + this.transitionTo('/login') + } + return ( +
+ +
+ ) + } +}) diff --git a/browser/main/Containers/PlanetContainer.jsx b/browser/main/Containers/PlanetContainer.jsx new file mode 100644 index 00000000..e2557d5f --- /dev/null +++ b/browser/main/Containers/PlanetContainer.jsx @@ -0,0 +1,138 @@ +var React = require('react/addons') +var RouteHandler = require('react-router').RouteHandler +var ReactRouter = require('react-router') +var Link = ReactRouter.Link + +var userPlanets = [ + { + id: 1, + name: 'testcat', + profileName: 'TestCat' + }, + { + id: 2, + name: 'group1', + profileName: 'Some Group#1' + }, + { + id: 3, + name: 'group2', + profileName: 'Some Group#1' + } +] + +var PlanetNavigator = React.createClass({ + propTypes: { + currentPlanet: React.PropTypes.object + }, + render: function () { + var planets = userPlanets.map(function (planet) { + return ( +
  • {planet.profileName[0]}
  • + ) + }.bind(this)) + + return ( +
    + +
    + ) + } +}) + +var PlanetMain = React.createClass({ + propTypes: { + currentPlanet: React.PropTypes.object + }, + render: function () { + return ( +
    + + +
    + ) + } +}) + +var SideNavigator = React.createClass({ + propTypes: { + currentPlanet: React.PropTypes.shape({ + name: React.PropTypes.string + }) + }, + render: function () { + var currentPlanetName = this.props.currentPlanet.name + + return ( +
    +
    +

    {currentPlanetName}

    + +
    + + +
    + ) + } +}) + +var Screen = React.createClass({ + render: function () { + return ( +
    + +
    + ) + } +}) + +module.exports = React.createClass({ + mixins: [ReactRouter.Navigation], + propTypes: { + params: React.PropTypes.object, + planetName: React.PropTypes.string + }, + render: function () { + var currentPlanetName = this.props.params.planetName + var currentPlanet = null + userPlanets.some(function (planet) { + if (planet.name === currentPlanetName) { + currentPlanet = planet + return true + } + return false + }) + if (currentPlanet == null) { + var redirectTo = userPlanets[0].name + this.transitionTo('planet', {planetName: redirectTo}) + return ( +
    + Redirecting... +
    + ) + } + + return ( +
    + + +
    + ) + } +}) diff --git a/browser/main/Containers/RegisterContainer.jsx b/browser/main/Containers/RegisterContainer.jsx new file mode 100644 index 00000000..a09ec0e2 --- /dev/null +++ b/browser/main/Containers/RegisterContainer.jsx @@ -0,0 +1,55 @@ +var React = require('react/addons') +var ReactRouter = require('react-router') +var Link = ReactRouter.Link +var Auth = require('../Services/Auth') + +module.exports = React.createClass({ + mixins: [React.addons.LinkedStateMixin, ReactRouter.Navigation], + getInitialState: function () { + return { + email: '', + password: '', + name: '', + profileName: '' + } + }, + handleSubmit: function (e) { + Auth.register() + // TODO: request user data + .then(function (user) { + this.transitionTo('dashboard', {planetName: user.name}) + }.bind(this)) + + e.preventDefault() + }, + render: function () { + return ( +
    +

    CodeXen

    +

    Log In | Register

    +
    +
    + + +
    +
    + + +
    +
    +
    + + +
    +
    + + +
    +
    + +
    +
    +
    + ) + } +}) diff --git a/browser/main/Containers/SnippetContainer.jsx b/browser/main/Containers/SnippetContainer.jsx new file mode 100644 index 00000000..57356a93 --- /dev/null +++ b/browser/main/Containers/SnippetContainer.jsx @@ -0,0 +1,110 @@ +var React = require('react/addons') +var Snippet = require('../Services/Snippet') + +var SnippetList = React.createClass({ + propTypes: { + snippets: React.PropTypes.array, + selectSnippet: React.PropTypes.func + }, + itemClickHandlerFactory: function (snippet) { + return function () { + console.log(this.props.selectSnippet) + this.props.selectSnippet(snippet) + }.bind(this) + }, + render: function () { + var snippets = this.props.snippets.map(function (snippet) { + var tags = snippet.Tags.map(function (tag) { + return ( + #{tag.name} + ) + }) + return ( +
  • +
    {snippet.callSign}
    +
    {snippet.description}
    +
    {snippet.updatedAt}
    +
    {tags}
    +
  • + ) + }.bind(this)) + + return ( +
    +
    +
      + {snippets} +
    +
    + ) + } +}) + +var SnippetViewer = React.createClass({ + propTypes: { + snippet: React.PropTypes.object + }, + render: function () { + var snippet = this.props.snippet + var content + if (snippet != null) { + var tags = snippet.Tags.map(function (tag) { + return ( + #{tag.name} + ) + }) + content = ( +
    +
    {snippet.callSign} {snippet.updatedAt}
    +
    +
    +
    {snippet.description}
    +
    {tags}
    +
    +
    {snippet.content}
    +
    +
    + ) + } else { + content = ( +
    + Not selected +
    + ) + } + return content + } +}) + +var SnippetContainer = React.createClass({ + propTypes: { + params: React.PropTypes.shape({ + planetName: React.PropTypes.string + }) + }, + getInitialState: function () { + return { + snippets: [], + curentSnippet: {} + } + }, + componentDidMount: function () { + Snippet.getByPlanet(this.props.params.planetName) + .then(function (snippets) { + this.setState({snippets: snippets, currentSnippet: snippets.length > 0 ? snippets[0] : null}) + }.bind(this)) + }, + selectSnippet: function (snippet) { + this.setState({currentSnippet: snippet}) + }, + render: function () { + return ( +
    + + +
    + ) + } +}) + +module.exports = SnippetContainer diff --git a/browser/main/Services/Auth.js b/browser/main/Services/Auth.js new file mode 100644 index 00000000..f8af1ad3 --- /dev/null +++ b/browser/main/Services/Auth.js @@ -0,0 +1,40 @@ +/* global localStorage */ +var Auth = {} + +var currentUser = null +Auth.attempt = function (params) { + return new Promise(function (resolve, reject) { + var token = 'some token' + var user = { + name: 'testcat', + email: 'testcat@example.com', + profileName: 'Test Cat' + } + localStorage.setItem('token', token) + + resolve(user) + }) +} + +Auth.register = function (params) { + return new Promise(function (resolve, reject) { + var token = 'some token' + var user = { + name: 'testcat', + email: 'testcat@example.com', + profileName: 'Test Cat' + } + localStorage.setItem('token', token) + + resolve(user) + }) +} + +Auth.getUser = function () { + return new Promise(function (resolve, reject) { + + resolve(currentUser) + }) +} + +module.exports = Auth diff --git a/browser/main/Services/Snippet.js b/browser/main/Services/Snippet.js new file mode 100644 index 00000000..716ddb3e --- /dev/null +++ b/browser/main/Services/Snippet.js @@ -0,0 +1,38 @@ +var Snippet = {} + +var snippets = { + testcat: [ + { + id: 1, + callSign: 'alert', + description: 'yolo', + content: '
    ', + mode: 'html', + createdAt: '2015-06-26T15:10:59.000Z', + updatedAt: '2015-06-26T15:10:59.000Z', + UserId: 1, + Tags: [{'id': 18, 'name': 'bootstrap', 'color': null}, {'id': 19, 'name': 'alert', 'color': null}] + }, + { + id: 2, + callSign: 'log', + description: 'javascript log', + content: 'console.log(\'yolo\')', + mode: 'js', + createdAt: '2015-06-26T15:10:59.000Z', + updatedAt: '2015-06-26T15:10:59.000Z', + UserId: 1, + Tags: [{'id': 20, 'name': 'log', 'color': null}, {'id': 1, 'name': 'js', 'color': null}] + } + ], + group1: [], + group2: [] +} + +Snippet.getByPlanet = function (planetName) { + return new Promise(function (resolve, reject) { + resolve(snippets[planetName]) + }) +} + +module.exports = Snippet diff --git a/browser/main/index.electron.html b/browser/main/index.electron.html new file mode 100644 index 00000000..0b416d2a --- /dev/null +++ b/browser/main/index.electron.html @@ -0,0 +1,16 @@ + + + + CodeXen + + + + + +
    + + + diff --git a/browser/main/index.html b/browser/main/index.html new file mode 100644 index 00000000..6ee43383 --- /dev/null +++ b/browser/main/index.html @@ -0,0 +1,16 @@ + + + + CodeXen + + + + + + + +
    + + + + diff --git a/browser/main/index.jsx b/browser/main/index.jsx new file mode 100644 index 00000000..3950996b --- /dev/null +++ b/browser/main/index.jsx @@ -0,0 +1,34 @@ +require('../styles/main/index.styl') + +var React = require('react/addons') + +var ReactRouter = require('react-router') +var Route = ReactRouter.Route +var DefaultRoute = ReactRouter.DefaultRoute + +var MainContainer = require('./Containers/MainContainer.jsx') + +var LoginContainer = require('./Containers/LoginContainer.jsx') +var RegisterContainer = require('./Containers/RegisterContainer.jsx') + +var PlanetContainer = require('./Containers/PlanetContainer.jsx') + +var Dashboard = require('./Containers/DashboardContainer.jsx') +var SnippetContainer = require('./Containers/SnippetContainer.jsx') +var BlueprintContainer = require('./Containers/BlueprintContainer.jsx') + +var routes = ( + + + + + + + + + +) + +ReactRouter.run(routes, ReactRouter.HashLocation, function (Root) { + React.render(, document.getElementById('content')) +}) diff --git a/browser/styles/main/components/SideNavigator.styl b/browser/styles/main/components/SideNavigator.styl new file mode 100644 index 00000000..c06e6383 --- /dev/null +++ b/browser/styles/main/components/SideNavigator.styl @@ -0,0 +1,50 @@ +.SideNavigator + absolute top bottom left + width 200px + border-right solid 2px brandColor + padding 10px + box-sizing border-box + .nav-header + clearfix() + margin-bottom 15px + .planet-name + float left + line-height 30px + font-size 1.1em + .menu-btn + float right + display block + font-size 0.8em + color lightButtonColor + border solid 2px lightButtonColor + box-sizing border-box + circle() + background-image none + background-color transparent + width 30px + height 30px + text-align center + cursor pointer + transform scale(0.8) + &:active, &.active, &:hover, &.hover + background-color lightButtonColor + color white + nav + a + display block + position relative + right 0px + box-sizing border-box + width 190px + padding 15px 15px + margin 10px 0 + text-decoration none + border-radius left 10px + background-color transparent + color textColor + transition 0.1s + &:hover, &.hover + background-color hoverBackgroundColor + &:active, &.active + background-color brandColor + color white diff --git a/browser/styles/main/containers/DashboardContainer.styl b/browser/styles/main/containers/DashboardContainer.styl new file mode 100644 index 00000000..38b7de09 --- /dev/null +++ b/browser/styles/main/containers/DashboardContainer.styl @@ -0,0 +1,15 @@ +.DashboardContainer + fullsize() + box-sizing border-box + overflow-y auto + padding 10px + .jumbotron + background-color brandColor + color white + padding 65px 20px + font-size 3.5em + margin-bottom 25px + h2, h3 + margin-bottom 15px + p + margin-bottom 25px diff --git a/browser/styles/main/containers/SnippetContainer.styl b/browser/styles/main/containers/SnippetContainer.styl new file mode 100644 index 00000000..607a6173 --- /dev/null +++ b/browser/styles/main/containers/SnippetContainer.styl @@ -0,0 +1,53 @@ +.SnippetContainer + fullsize() + .tags + a + margin 0 2px + .SnippetList + absolute top bottom left + width 250px + border-right solid 1px highlightenBorderColor + .search + border-bottom solid 1px borderColor + padding 5px + margin 0 + + &>ul + absolute bottom left right + top 44px + overflow-y auto + li + border-bottom solid 1px borderColor + padding 10px + cursor pointer + .callSign + margin-bottom 5px + font-weight 600 + .description + margin-bottom 5px + .updatedAt + margin-bottom 5px + color lighten(textColor, 25%) + font-size 0.8em + &:hover, &.hover + background-color hoverBackgroundColor + + .SnippetViewer + absolute top bottom right + left 250px + .viewer-header + height 44px + line-height 44px + padding 0 15px + border-bottom solid 1px borderColor + box-sizing border-box + small + font-size 0.5em + .viewer-body + absolute bottom left right + top 44px + .viewer-detail + border-bottom solid 1px borderColor + padding 10px + .description + margin-bottom 15px diff --git a/browser/styles/main/index.styl b/browser/styles/main/index.styl new file mode 100644 index 00000000..7816e88a --- /dev/null +++ b/browser/styles/main/index.styl @@ -0,0 +1,104 @@ +@import '../../../node_modules/nib/lib/nib' +@import '../vars' +@import '../mixins/*' +global-reset() +@import '../shared/*' +@import './components/*' +@import './containers/*' + +body + font-family "Lato" + color textColor + +h1 + font-size 2em +h2 + font-size 1.5em +h3 + font-size 1.3em +h4 + font-size 1.15em +a + color brandColor + &:visited{ + color brandColor + } + +hr + border-top none + border-bottom solid 1px borderColor + margin 25px 0 + +.text-center + text-align center + +.form-group + margin-bottom 15px + &>label + display block + margin-bottom 5px + &>input[type='text'], &>input[type='password'] + display block + border solid 2px borderColor + padding 0 15px + font-size 1em + height 33px + border-radius 16.5px + box-sizing border-box + width 100% + + +#content + fullsize() + +.LoginContainer, .RegisterContainer + width 400px + margin 15px auto + padding 25px 15px + box-sizing border-box + h1, h2 + margin 5px auto 25px + +.PlanetNavigator + background-color #032B35 + color white + absolute left top bottom + width 50px + text-align center + box-sizing border-box + ul>li + padding 10px 3px + border-bottom solid 1px invBorderColor + &.active + background-color brandColor + a + background-color white + a + display block + width 44px + height 44px + text-align center + background-color #4D4D4D + color black + line-height 44px + font-size 1.1em + cursor pointer + circle() + transition 0.1s + &:hover, &:active + background-color white + img + circle() + width 44px + height 44px + +.PlanetContainer + fullsize() +.PlanetMain + absolute top bottom right + left 50px + + +.Screen + absolute top bottom right + left 200px diff --git a/browser/styles/mixins/circle.styl b/browser/styles/mixins/circle.styl new file mode 100644 index 00000000..b20e891b --- /dev/null +++ b/browser/styles/mixins/circle.styl @@ -0,0 +1,3 @@ +circle() + border-radius 50% + overflow hidden diff --git a/browser/styles/mixins/fullsize.styl b/browser/styles/mixins/fullsize.styl new file mode 100644 index 00000000..98866c01 --- /dev/null +++ b/browser/styles/mixins/fullsize.styl @@ -0,0 +1,6 @@ +fullsize() + position absolute + top 0 + left 0 + right 0 + bottom 0 diff --git a/browser/styles/shared/btn.styl b/browser/styles/shared/btn.styl new file mode 100644 index 00000000..90ba009b --- /dev/null +++ b/browser/styles/shared/btn.styl @@ -0,0 +1,44 @@ +.btn-primary, .btn-default + border-style solid + border-width 2px + background-image none + height 44px + padding 0 15px + border-radius 22px + box-sizing border-box + font-size 1.1em + font-weight 600 + transition 0.1s + cursor pointer + +.btn-block + display block + width 100% + margin 0 auto + +.btn-square + display inline-block + width 44px + padding 0 + +.btn-sm + height 32px + border-radius 16px + &.btn-square + width 32px + +.btn-primary + border-color brandBorderColor + background-color transparent + color brandColor + &:hover, &.hover, &:active, &.active + color white + background-color brandColor + +.btn-default + border-color invBorderColor + background-color transparent + color invBorderColor + &:hover, &.hover, &:active, &.active + color white + background-color invBorderColor diff --git a/browser/styles/vars.styl b/browser/styles/vars.styl new file mode 100644 index 00000000..83a41293 --- /dev/null +++ b/browser/styles/vars.styl @@ -0,0 +1,15 @@ +borderColor = #E8E8E8 +highlightenBorderColor = darken(borderColor, 20%) +invBorderColor = #404849 +brandBorderColor = #3FB399 + +buttonBorderColor = #4C4C4C + +lightButtonColor = #898989 + +brandColor = #2BAC8F + +textColor = #434343 + +backgroundColor= white +hoverBackgroundColor= transparentify(#444, 7%) diff --git a/main.js b/main.js new file mode 100644 index 00000000..12b2165e --- /dev/null +++ b/main.js @@ -0,0 +1,38 @@ +var app = require('app') // Module to control application life. +var BrowserWindow = require('browser-window') // Module to create native browser window. + +// Report crashes to our server. +require('crash-reporter').start() + +// Keep a global reference of the window object, if you don't, the window will +// be closed automatically when the javascript object is GCed. +var mainWindow = null + +// app.on('window-all-closed', function () { +// if (process.platform !== 'darwin') app.quit() +// }) + + +app.on('ready', function () { + makeNewMainWindow() + + function makeNewMainWindow () { + console.log('new Window!') + mainWindow = new BrowserWindow({ + width: 920, + height: 640, + 'web-preferences': { + 'overlay-scrollbars': true + } + }) + + mainWindow.loadUrl('file://' + __dirname + '/browser/main/index.electron.html') + + mainWindow.on('closed', function () { + console.log('main closed') + mainWindow = null + app.dock.hide() + }) + app.dock.show() + } +}) diff --git a/npm-debug.log b/npm-debug.log new file mode 100644 index 00000000..5704df8c --- /dev/null +++ b/npm-debug.log @@ -0,0 +1,36 @@ +0 info it worked if it ends with ok +1 verbose cli [ 'node', '/usr/local/bin/npm', 'start' ] +2 info using npm@2.11.2 +3 info using node@v0.12.4 +4 verbose node symlink /usr/local/bin/node +5 verbose run-script [ 'prestart', 'start', 'poststart' ] +6 info prestart codexen-app-builder@0.2.0 +7 info start codexen-app-builder@0.2.0 +8 verbose unsafe-perm in lifecycle true +9 info codexen-app-builder@0.2.0 Failed to exec start script +10 verbose stack Error: codexen-app-builder@0.2.0 start: `npm run serve | npm run dev` +10 verbose stack Exit status 1 +10 verbose stack at EventEmitter. (/usr/local/lib/node_modules/npm/lib/utils/lifecycle.js:213:16) +10 verbose stack at EventEmitter.emit (events.js:110:17) +10 verbose stack at ChildProcess. (/usr/local/lib/node_modules/npm/lib/utils/spawn.js:24:14) +10 verbose stack at ChildProcess.emit (events.js:110:17) +10 verbose stack at maybeClose (child_process.js:1015:16) +10 verbose stack at Process.ChildProcess._handle.onexit (child_process.js:1087:5) +11 verbose pkgid codexen-app-builder@0.2.0 +12 verbose cwd /Users/dickchoi/codexen/codexen-app +13 error Darwin 14.3.0 +14 error argv "node" "/usr/local/bin/npm" "start" +15 error node v0.12.4 +16 error npm v2.11.2 +17 error code ELIFECYCLE +18 error codexen-app-builder@0.2.0 start: `npm run serve | npm run dev` +18 error Exit status 1 +19 error Failed at the codexen-app-builder@0.2.0 start script 'npm run serve | npm run dev'. +19 error This is most likely a problem with the codexen-app-builder package, +19 error not with npm itself. +19 error Tell the author that this fails on your system: +19 error npm run serve | npm run dev +19 error You can get their info via: +19 error npm owner ls codexen-app-builder +19 error There is likely additional logging output above. +20 verbose exit [ 1, true ] diff --git a/package.json b/package.json index 752fdafc..c15875c6 100644 --- a/package.json +++ b/package.json @@ -3,9 +3,9 @@ "version": "0.2.0", "description": "CodeXen App Builder", "scripts": { - "install": "gulp build", - "start": "http-server build", - "test": "echo \"Error: no test specified\" && exit 1" + "start": "npm run serve | npm run dev", + "serve": "./node_modules/.bin/http-server ./browser -p 8080", + "dev": "webpack-dev-server --progress --colors --port 8090" }, "repository": { "type": "git", @@ -30,48 +30,26 @@ }, "homepage": "https://github.com/Rokt33r/codexen-app#readme", "dependencies": { + "@rokt33r/ace-builds": "^1.1.9", + "del": "^1.2.0", "dotenv": "^1.1.0", - "robotjs": "^0.1.2", - "node-notifier": "^4.2.1" + "marked": "^0.3.3", + "moment": "^2.10.3", + "node-jsx": "^0.13.3", + "node-notifier": "^4.2.1", + "react": "^0.13.3", + "react-router": "^0.13.3", + "react-tooltip": "^0.3.3" }, "devDependencies": { - "@rokt33r/ace-builds": "^1.1.9", - "@rokt33r/angular-ui-ace": "^0.2.3", - "angular": "^1.3.15", - "angular-bootstrap": "^0.12.0", - "angular-hotkeys": "^1.4.5", - "angular-md5": "^0.1.7", - "angular-sanitize": "^1.3.15", - "angular-ui-router": "^0.2.15", - "bootstrap-styl": "^4.0.4", - "del": "^1.2.0", - "font-awesome": "^4.3.0", - "globby": "^2.0.0", - "gulp": "^3.8.11", - "gulp-angular-templatecache": "^1.6.0", - "gulp-autoprefixer": "^2.3.0", - "gulp-cached": "^1.1.0", - "gulp-changed": "^1.2.1", - "gulp-concat": "^2.5.2", - "gulp-inject": "^1.3.1", - "gulp-livereload": "^3.8.0", - "gulp-minify-css": "^1.1.1", - "gulp-minify-html": "^1.0.3", - "gulp-ng-annotate": "^0.5.3", - "gulp-notify": "^2.2.0", - "gulp-plumber": "^1.0.1", - "gulp-remember": "^0.3.0", - "gulp-rename": "^1.2.2", - "gulp-rev": "^4.0.0", - "gulp-stylus": "^2.0.3", - "gulp-template": "^3.0.0", - "gulp-uglify": "^1.2.0", - "marked": "^0.3.3", - "merge-stream": "^0.1.7", - "moment": "^2.10.3", - "run-sequence": "^1.1.0", - "satellizer": "^0.10.1", - "streamqueue": "^1.1.0", - "ui-select": "^0.11.2" + "css-loader": "^0.15.1", + "http-server": "^0.8.0", + "jsx-loader": "^0.13.2", + "nib": "^1.1.0", + "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" } } diff --git a/webpack.config.js b/webpack.config.js new file mode 100644 index 00000000..5185ad65 --- /dev/null +++ b/webpack.config.js @@ -0,0 +1,33 @@ +module.exports = { + entry: { + main: './browser/main/index.jsx' + }, + output: { + filename: '[name].js', //this is the default name, so you can skip it + publicPath: 'http://localhost:8090/assets' + }, + devtool: "#inline-source-map", // Sourcemap + module: { + loaders: [ + { + //tell webpack to use jsx-loader for all *.jsx files + test: /\.jsx$/, + loader: 'jsx-loader?insertPragma=React.DOM&harmony' + }, + { + test: /\.styl$/, + loader: 'style-loader!css-loader!stylus-loader' + } + ] + }, + externals: { + //don't bundle the 'react' npm package with our bundle.js + //but get it from a global 'React' variable + 'react': 'React', + 'react/addons': 'React', + 'react-router': 'ReactRouter' + }, + resolve: { + extensions: ['', '.js', '.jsx'] + } +}