1
0
mirror of https://github.com/BoostIo/Boostnote synced 2025-12-15 10:46:32 +00:00

Merge pull request #231 from sota1235/master

[Refactor] Use ESLint instead of StandarJS and add settings for TravisCI
This commit is contained in:
Sota Sugiura
2017-01-12 00:48:05 +09:00
committed by GitHub
53 changed files with 123 additions and 134 deletions

3
.eslintignore Normal file
View File

@@ -0,0 +1,3 @@
node_modules/
compiled/
dist/

6
.eslintrc Normal file
View File

@@ -0,0 +1,6 @@
{
"extends": ["standard", "standard-jsx"],
"rules": {
"no-useless-escape": 0
}
}

6
.travis.yml Normal file
View File

@@ -0,0 +1,6 @@
language: node_js
node_js:
- 'stable'
- 'lts/*'
script: npm run lint && npm run test

View File

@@ -75,8 +75,8 @@ const NoteItem = ({ isActive, note, dateDisplay, handleNoteClick, handleNoteCont
: <i styleName='item-title-icon' className='fa fa-fw fa-file-text-o' /> : <i styleName='item-title-icon' className='fa fa-fw fa-file-text-o' />
} }
{note.isStarred ? {note.isStarred
<i styleName='item-star' className='fa fa-star' /> : '' ? <i styleName='item-star' className='fa fa-star' /> : ''
} }
</div> </div>
</div> </div>
@@ -91,10 +91,10 @@ NoteItem.propTypes = {
type: PropTypes.string.isRequired, type: PropTypes.string.isRequired,
title: PropTypes.string.isrequired, title: PropTypes.string.isrequired,
tags: PropTypes.array, tags: PropTypes.array,
isStarred: PropTypes.bool.isRequired, isStarred: PropTypes.bool.isRequired
}), }),
handleNoteClick: PropTypes.func.isRequired, handleNoteClick: PropTypes.func.isRequired,
handleNoteContextMenu: PropTypes.func.isRequired, handleNoteContextMenu: PropTypes.func.isRequired
} }
export default CSSModules(NoteItem, styles) export default CSSModules(NoteItem, styles)

View File

@@ -40,10 +40,10 @@ NoteItemSimple.propTypes = {
storage: PropTypes.string.isRequired, storage: PropTypes.string.isRequired,
key: PropTypes.string.isRequired, key: PropTypes.string.isRequired,
type: PropTypes.string.isRequired, type: PropTypes.string.isRequired,
title: PropTypes.string.isrequired, title: PropTypes.string.isrequired
}), }),
handleNoteClick: PropTypes.func.isRequired, handleNoteClick: PropTypes.func.isRequired,
handleNoteContextMenu: PropTypes.func.isRequired, handleNoteContextMenu: PropTypes.func.isRequired
} }
export default CSSModules(NoteItemSimple, styles) export default CSSModules(NoteItemSimple, styles)

View File

@@ -38,7 +38,7 @@ SideNavFilter.propTypes = {
isHomeActive: PropTypes.bool.isRequired, isHomeActive: PropTypes.bool.isRequired,
handleAllNotesButtonClick: PropTypes.func.isRequired, handleAllNotesButtonClick: PropTypes.func.isRequired,
isStarredActive: PropTypes.bool.isRequired, isStarredActive: PropTypes.bool.isRequired,
handleStarredButtonClick: PropTypes.func.isRequired, handleStarredButtonClick: PropTypes.func.isRequired
} }
export default CSSModules(SideNavFilter, styles) export default CSSModules(SideNavFilter, styles)

View File

@@ -1,4 +1,4 @@
import React, { PropTypes } from 'react' import React from 'react'
import CSSModules from 'browser/lib/CSSModules' import CSSModules from 'browser/lib/CSSModules'
import styles from './SnippetTab.styl' import styles from './SnippetTab.styl'
import context from 'browser/lib/context' import context from 'browser/lib/context'

View File

@@ -27,8 +27,8 @@ const StorageItem = ({
onClick={handleButtonClick} onClick={handleButtonClick}
onContextMenu={handleContextMenu} onContextMenu={handleContextMenu}
> >
<span styleName={isFolded ? <span styleName={isFolded
'folderList-item-name--folded' : 'folderList-item-name' ? 'folderList-item-name--folded' : 'folderList-item-name'
} }
style={{borderColor: folderColor}} style={{borderColor: folderColor}}
> >
@@ -52,7 +52,7 @@ StorageItem.propTypes = {
folderName: PropTypes.string.isRequired, folderName: PropTypes.string.isRequired,
folderColor: PropTypes.string, folderColor: PropTypes.string,
isFolded: PropTypes.bool.isRequired, isFolded: PropTypes.bool.isRequired,
noteCount: PropTypes.number, noteCount: PropTypes.number
} }
export default CSSModules(StorageItem, styles) export default CSSModules(StorageItem, styles)

View File

@@ -1,4 +1,4 @@
import React, { PropTypes } from 'react' import React from 'react'
import CSSModules from 'browser/lib/CSSModules' import CSSModules from 'browser/lib/CSSModules'
import styles from './NoteDetail.styl' import styles from './NoteDetail.styl'
import MarkdownPreview from 'browser/components/MarkdownPreview' import MarkdownPreview from 'browser/components/MarkdownPreview'
@@ -97,9 +97,7 @@ class NoteDetail extends React.Component {
let { note, config } = this.props let { note, config } = this.props
if (note == null) { if (note == null) {
return ( return (
<div styleName='root'> <div styleName='root' />
</div>
) )
} }

View File

@@ -1,4 +1,4 @@
import React, { PropTypes } from 'react' import React from 'react'
import NoteItem from 'browser/components/NoteItem' import NoteItem from 'browser/components/NoteItem'
import moment from 'moment' import moment from 'moment'
@@ -54,12 +54,11 @@ class NoteList extends React.Component {
} }
render () { render () {
let { storageMap, notes, index } = this.props let { notes, index } = this.props
let notesList = notes let notesList = notes
.slice(0, 10 + 10 * this.state.range) .slice(0, 10 + 10 * this.state.range)
.map((note, _index) => { .map((note, _index) => {
const isActive = (index === _index) const isActive = (index === _index)
const key = `${note.storage}-${note.key}` const key = `${note.storage}-${note.key}`
const dateDisplay = moment(note.updatedAt).fromNow() const dateDisplay = moment(note.updatedAt).fromNow()

View File

@@ -1,4 +1,4 @@
import React, { PropTypes } from 'react' import React from 'react'
import CSSModules from 'browser/lib/CSSModules' import CSSModules from 'browser/lib/CSSModules'
import styles from './StorageSection.styl' import styles from './StorageSection.styl'
import StorageItem from 'browser/components/StorageItem' import StorageItem from 'browser/components/StorageItem'

View File

@@ -2,7 +2,6 @@ import React, { PropTypes } from 'react'
import ReactDOM from 'react-dom' import ReactDOM from 'react-dom'
import { connect, Provider } from 'react-redux' import { connect, Provider } from 'react-redux'
import _ from 'lodash' import _ from 'lodash'
import ipc from './ipcClient'
import store from './store' import store from './store'
import CSSModules from 'browser/lib/CSSModules' import CSSModules from 'browser/lib/CSSModules'
import styles from './FinderMain.styl' import styles from './FinderMain.styl'

View File

@@ -1,4 +1,3 @@
import CodeMirror from 'codemirror' import CodeMirror from 'codemirror'
import _ from 'lodash'
CodeMirror.modeInfo.push({name: 'Stylus', mime: 'text/x-styl', mode: 'stylus', ext: ['styl'], alias: ['styl']}) CodeMirror.modeInfo.push({name: 'Stylus', mime: 'text/x-styl', mode: 'stylus', ext: ['styl'], alias: ['styl']})

View File

@@ -1,7 +1,7 @@
/** /**
* @fileoverview Formatting date string. * @fileoverview Formatting date string.
*/ */
import moment from 'moment'; import moment from 'moment'
/** /**
* @description Return date string. For example, 'Sep.9, 2016 12:00'. * @description Return date string. For example, 'Sep.9, 2016 12:00'.
@@ -11,7 +11,7 @@ import moment from 'moment';
export function getLastUpdated (date) { export function getLastUpdated (date) {
const m = moment(date) const m = moment(date)
if (!m.isValid()) { if (!m.isValid()) {
throw Error('Invalid argument.'); throw Error('Invalid argument.')
} }
return m.format('MMM D, gggg H:mm') return m.format('MMM D, gggg H:mm')

View File

@@ -128,8 +128,8 @@ class FolderSelect extends React.Component {
} }
nextOption () { nextOption () {
let { storages } = this.props
let { optionIndex } = this.state let { optionIndex } = this.state
let { folders } = this.props
optionIndex++ optionIndex++
if (optionIndex >= folders.length) optionIndex = 0 if (optionIndex >= folders.length) optionIndex = 0

View File

@@ -21,7 +21,7 @@ const LastUpdatedString = ({ date }) => {
} }
LastUpdatedString.propTypes = { LastUpdatedString.propTypes = {
date: PropTypes.string, date: PropTypes.string
} }
export default CSSModules(LastUpdatedString, styles) export default CSSModules(LastUpdatedString, styles)

View File

@@ -205,7 +205,7 @@ class MarkdownNoteDetail extends React.Component {
} }
render () { render () {
let { data, config } = this.props let { config } = this.props
let { note } = this.state let { note } = this.state
return ( return (

View File

@@ -14,6 +14,7 @@ import SnippetTab from 'browser/components/SnippetTab'
import StatusBar from '../StatusBar' import StatusBar from '../StatusBar'
import context from 'browser/lib/context' import context from 'browser/lib/context'
import ConfigManager from 'browser/main/lib/ConfigManager' import ConfigManager from 'browser/main/lib/ConfigManager'
import _ from 'lodash'
function pass (name) { function pass (name) {
switch (name) { switch (name) {
@@ -459,7 +460,7 @@ class SnippetNoteDetail extends React.Component {
} }
render () { render () {
let { data, config } = this.props let { config } = this.props
let { note } = this.state let { note } = this.state
let editorFontSize = parseInt(config.editor.fontSize, 10) let editorFontSize = parseInt(config.editor.fontSize, 10)

View File

@@ -8,7 +8,7 @@ class TagSelect extends React.Component {
super(props) super(props)
this.state = { this.state = {
newTag: '', newTag: ''
} }
} }

View File

@@ -112,7 +112,7 @@ class Main extends React.Component {
ConfigManager.set({ navWidth }) ConfigManager.set({ navWidth })
dispatch({ dispatch({
type: 'SET_NAV_WIDTH', type: 'SET_NAV_WIDTH',
navWidth, navWidth
}) })
}) })
} }

View File

@@ -324,8 +324,8 @@ class NoteList extends React.Component {
const isDefault = config.listStyle === 'DEFAULT' const isDefault = config.listStyle === 'DEFAULT'
const isActive = location.query.key === note.storage + '-' + note.key const isActive = location.query.key === note.storage + '-' + note.key
const dateDisplay = moment( const dateDisplay = moment(
config.sortBy === 'CREATED_AT' ? config.sortBy === 'CREATED_AT'
note.createdAt : note.updatedAt ? note.createdAt : note.updatedAt
).fromNow() ).fromNow()
const key = `${note.storage}-${note.key}` const key = `${note.storage}-${note.key}`

View File

@@ -7,9 +7,6 @@ import ConfigManager from 'browser/main/lib/ConfigManager'
import StorageItem from './StorageItem' import StorageItem from './StorageItem'
import SideNavFilter from 'browser/components/SideNavFilter' import SideNavFilter from 'browser/components/SideNavFilter'
const electron = require('electron')
const { remote } = electron
class SideNav extends React.Component { class SideNav extends React.Component {
// TODO: should not use electron stuff v0.7 // TODO: should not use electron stuff v0.7
handleMenuButtonClick (e) { handleMenuButtonClick (e) {

View File

@@ -10,8 +10,6 @@ import ConfigManager from 'browser/main/lib/ConfigManager'
import dataApi from 'browser/main/lib/dataApi' import dataApi from 'browser/main/lib/dataApi'
const OSX = window.process.platform === 'darwin' const OSX = window.process.platform === 'darwin'
const { remote } = require('electron')
const { Menu, MenuItem } = remote
class TopBar extends React.Component { class TopBar extends React.Component {
constructor (props) { constructor (props) {
@@ -71,10 +69,10 @@ class TopBar extends React.Component {
break break
} }
} }
if (storage == null) alert('No storage to create a note') if (storage == null) window.alert('No storage to create a note')
let folder = _.find(storage.folders, {key: params.folderKey}) let folder = _.find(storage.folders, {key: params.folderKey})
if (folder == null) folder = storage.folders[0] if (folder == null) folder = storage.folders[0]
if (folder == null) alert('No folder to create a note') if (folder == null) window.alert('No folder to create a note')
return { return {
storage, storage,

View File

@@ -1,11 +1,10 @@
import React, { PropTypes } from 'react' import React from 'react'
import CSSModules from 'browser/lib/CSSModules' import CSSModules from 'browser/lib/CSSModules'
import styles from './InitModal.styl' import styles from './InitModal.styl'
import dataApi from 'browser/main/lib/dataApi' import dataApi from 'browser/main/lib/dataApi'
import store from 'browser/main/store' import store from 'browser/main/store'
import { hashHistory } from 'react-router' import { hashHistory } from 'react-router'
import _ from 'lodash' import _ from 'lodash'
import keygen from 'browser/lib/keygen'
const CSON = require('@rokt33r/season') const CSON = require('@rokt33r/season')
const path = require('path') const path = require('path')

View File

@@ -1,4 +1,4 @@
import React, { PropTypes } from 'react' import React from 'react'
import CSSModules from 'browser/lib/CSSModules' import CSSModules from 'browser/lib/CSSModules'
import styles from './NewNoteModal.styl' import styles from './NewNoteModal.styl'
import dataApi from 'browser/main/lib/dataApi' import dataApi from 'browser/main/lib/dataApi'

View File

@@ -7,8 +7,6 @@ import store from 'browser/main/store'
const electron = require('electron') const electron = require('electron')
const ipc = electron.ipcRenderer const ipc = electron.ipcRenderer
const OSX = global.process.platform === 'darwin'
class HotkeyTab extends React.Component { class HotkeyTab extends React.Component {
constructor (props) { constructor (props) {
super(props) super(props)
@@ -150,7 +148,7 @@ class HotkeyTab extends React.Component {
} }
HotkeyTab.propTypes = { HotkeyTab.propTypes = {
dispatch: PropTypes.func, dispatch: PropTypes.func
} }
export default CSSModules(HotkeyTab, styles) export default CSSModules(HotkeyTab, styles)

View File

@@ -1,4 +1,4 @@
import React, { PropTypes } from 'react' import React from 'react'
import CSSModules from 'browser/lib/CSSModules' import CSSModules from 'browser/lib/CSSModules'
import styles from './InfoTab.styl' import styles from './InfoTab.styl'
@@ -34,7 +34,7 @@ class InfoTab extends React.Component {
</div> </div>
</div> </div>
</div> </div>
<div styleName='clear'></div> <div styleName='clear' />
<div styleName='madeBy'>Made by&nbsp; <div styleName='madeBy'>Made by&nbsp;
<a href='http://maisin.co/' <a href='http://maisin.co/'
onClick={(e) => this.handleLinkClick(e)} onClick={(e) => this.handleLinkClick(e)}

View File

@@ -106,7 +106,10 @@ class UnstyledFolderItem extends React.Component {
const popover = { position: 'absolute', zIndex: 2 } const popover = { position: 'absolute', zIndex: 2 }
const cover = { const cover = {
position: 'fixed', position: 'fixed',
top: 0, right: 0, bottom: 0, left: 0 top: 0,
right: 0,
bottom: 0,
left: 0
} }
const pickerStyle = Object.assign({}, { const pickerStyle = Object.assign({}, {
position: 'absolute' position: 'absolute'

View File

@@ -5,9 +5,6 @@ import ConfigManager from 'browser/main/lib/ConfigManager'
import store from 'browser/main/store' import store from 'browser/main/store'
import consts from 'browser/lib/consts' import consts from 'browser/lib/consts'
const electron = require('electron')
const ipc = electron.ipcRenderer
const OSX = global.process.platform === 'darwin' const OSX = global.process.platform === 'darwin'
class UiTab extends React.Component { class UiTab extends React.Component {

View File

@@ -5,16 +5,16 @@ const packager = require('electron-packager')
const WIN = process.platform === 'win32' const WIN = process.platform === 'win32'
module.exports = function (grunt) { module.exports = function (grunt) {
var auth_code var authCode
try { try {
auth_code = grunt.file.readJSON('secret/auth_code.json') authCode = grunt.file.readJSON('secret/auth_code.json')
} catch (e) { } catch (e) {
if (e.origError.code === 'ENOENT') { if (e.origError.code === 'ENOENT') {
console.warn('secret/auth_code.json is not found. CodeSigning is not available.') console.warn('secret/auth_code.json is not found. CodeSigning is not available.')
} }
} }
const OSX_COMMON_NAME = auth_code != null ? auth_code.OSX_COMMON_NAME : '' const OSX_COMMON_NAME = authCode != null ? authCode.OSX_COMMON_NAME : ''
const WIN_CERT_PASSWORD = auth_code != null ? auth_code.WIN_CERT_PASSWORD : '' const WIN_CERT_PASSWORD = authCode != null ? authCode.WIN_CERT_PASSWORD : ''
var initConfig = { var initConfig = {
pkg: grunt.file.readJSON('package.json'), pkg: grunt.file.readJSON('package.json'),

View File

@@ -1,19 +1,10 @@
const electron = require('electron') const electron = require('electron')
const app = electron.app const app = electron.app
const Menu = electron.Menu
var finderWindow = null
app.on('ready', function () { app.on('ready', function () {
if (process.platform === 'darwin') { if (process.platform === 'darwin') {
app.dock.hide() app.dock.hide()
} }
// var template = require('./finder-menu')
// var menu = Menu.buildFromTemplate(template)
// Menu.setApplicationMenu(menu)
finderWindow = require('./finder-window')
}) })
module.exports = app module.exports = app

View File

@@ -2,7 +2,6 @@ const electron = require('electron')
const app = electron.app const app = electron.app
const Menu = electron.Menu const Menu = electron.Menu
const ipc = electron.ipcMain const ipc = electron.ipcMain
const autoUpdater = electron.autoUpdater
const path = require('path') const path = require('path')
const ChildProcess = require('child_process') const ChildProcess = require('child_process')
const _ = require('lodash') const _ = require('lodash')
@@ -11,7 +10,6 @@ const GhReleases = require('electron-gh-releases')
var ipcServer = null var ipcServer = null
var mainWindow = null var mainWindow = null
var finderWindow = null
var shouldQuit = app.makeSingleInstance(function (commandLine, workingDirectory) { var shouldQuit = app.makeSingleInstance(function (commandLine, workingDirectory) {
if (mainWindow) { if (mainWindow) {
@@ -26,12 +24,8 @@ var shouldQuit = app.makeSingleInstance(function(commandLine, workingDirectory)
if (shouldQuit) { if (shouldQuit) {
app.quit() app.quit()
return
} }
var version = app.getVersion()
var versionText = (version == null || version.length === 0) ? 'DEV version' : 'v' + version
var isUpdateReady = false var isUpdateReady = false
var ghReleasesOpts = { var ghReleasesOpts = {
@@ -108,14 +102,9 @@ app.on('ready', function () {
Menu.setApplicationMenu(menu) Menu.setApplicationMenu(menu)
break break
case 'win32': case 'win32':
finderWindow = require('./finder-window')
mainWindow.setMenu(menu) mainWindow.setMenu(menu)
break break
case 'linux': case 'linux':
// Finder is available on cinnamon only.
if (process.env.DESKTOP_SESSION === 'cinnamon') {
finderWindow = require('./finder-window')
}
Menu.setApplicationMenu(menu) Menu.setApplicationMenu(menu)
mainWindow.setMenu(menu) mainWindow.setMenu(menu)
} }

View File

@@ -9,7 +9,9 @@
"hot": "electron ./index.js --hot", "hot": "electron ./index.js --hot",
"webpack": "webpack-dev-server --hot --inline --config webpack.config.js", "webpack": "webpack-dev-server --hot --inline --config webpack.config.js",
"compile": "grunt compile", "compile": "grunt compile",
"test": "PWD=$(pwd) NODE_ENV=test ava" "test": "PWD=$(pwd) NODE_ENV=test ava",
"fix": "npm run lint --fix",
"lint": "eslint ./**/*.js"
}, },
"config": { "config": {
"electron-version": "1.2.8" "electron-version": "1.2.8"
@@ -87,6 +89,9 @@
"dom-storage": "^2.0.2", "dom-storage": "^2.0.2",
"electron-packager": "^6.0.0", "electron-packager": "^6.0.0",
"electron-prebuilt": "^1.2.8", "electron-prebuilt": "^1.2.8",
"eslint": "^3.13.1",
"eslint-config-standard": "^6.2.1",
"eslint-config-standard-jsx": "^3.2.0",
"faker": "^3.1.0", "faker": "^3.1.0",
"grunt": "^0.4.5", "grunt": "^0.4.5",
"grunt-electron-installer": "^1.2.0", "grunt-electron-installer": "^1.2.0",
@@ -119,7 +124,7 @@
}, },
"ava": { "ava": {
"files": [ "files": [
"tests/**/*.js" "tests/**/*-test.js"
], ],
"require": [ "require": [
"babel-register" "babel-register"

View File

@@ -10,6 +10,8 @@
<h5 align="center">Built with Electron, React + Redux, Webpack and CSSModules</h5> <h5 align="center">Built with Electron, React + Redux, Webpack and CSSModules</h5>
<h1> </h1> <h1> </h1>
[![Build Status](https://travis-ci.org/BoostIO/Boostnote.svg?branch=master)](https://travis-ci.org/BoostIO/Boostnote)
> We launched our [Boostnote store](https://boostnote.paintory.com/)!! :tada: Also, you can support us via [Patreon](https://www.patreon.com/boostnote) and [Open collective](https://opencollective.com/boostnote)! > We launched our [Boostnote store](https://boostnote.paintory.com/)!! :tada: Also, you can support us via [Patreon](https://www.patreon.com/boostnote) and [Open collective](https://opencollective.com/boostnote)!
![Boostnote app screenshot](./resources/repository/top.png) ![Boostnote app screenshot](./resources/repository/top.png)

View File

@@ -36,7 +36,7 @@ test.beforeEach((t) => {
}) })
test.serial('Initialize All Storages', (t) => { test.serial('Initialize All Storages', (t) => {
const { v1StorageData, legacyStorageData, emptyStorageData } = t.context const { v1StorageData, legacyStorageData } = t.context
return Promise.resolve() return Promise.resolve()
.then(function test () { .then(function test () {
return init() return init()

View File

@@ -12,7 +12,6 @@ const TestDummy = require('../fixtures/TestDummy')
const sander = require('sander') const sander = require('sander')
const os = require('os') const os = require('os')
const CSON = require('@rokt33r/season') const CSON = require('@rokt33r/season')
const faker = require('faker')
const storagePath = path.join(os.tmpdir(), 'test/move-note') const storagePath = path.join(os.tmpdir(), 'test/move-note')
const storagePath2 = path.join(os.tmpdir(), 'test/move-note2') const storagePath2 = path.join(os.tmpdir(), 'test/move-note2')