diff --git a/.browserslistrc b/.browserslistrc new file mode 100644 index 0000000..214388f --- /dev/null +++ b/.browserslistrc @@ -0,0 +1,3 @@ +> 1% +last 2 versions +not dead diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..7053c49 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,5 @@ +[*.{js,jsx,ts,tsx,vue}] +indent_style = space +indent_size = 2 +trim_trailing_whitespace = true +insert_final_newline = true diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000..c1f76fb --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,28 @@ +module.exports = { + root: true, + env: { + node: true + }, + extends: [ + 'plugin:vue/vue3-essential', + '@vue/standard' + ], + parserOptions: { + parser: 'babel-eslint' + }, + rules: { + 'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off', + 'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off' + }, + overrides: [ + { + files: [ + '**/__tests__/*.{j,t}s?(x)', + '**/tests/unit/**/*.spec.{j,t}s?(x)' + ], + env: { + mocha: true + } + } + ] +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c148942 --- /dev/null +++ b/.gitignore @@ -0,0 +1,26 @@ +.DS_Store +node_modules +/dist + + +# local env files +.env.local +.env.*.local + +# Log files +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* + +# Editor directories and files +.idea +.vscode +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +#Electron-builder output +/dist_electron \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..c303563 --- /dev/null +++ b/README.md @@ -0,0 +1,29 @@ +# zy + +## Project setup +``` +yarn install +``` + +### Compiles and hot-reloads for development +``` +yarn serve +``` + +### Compiles and minifies for production +``` +yarn build +``` + +### Run your unit tests +``` +yarn test:unit +``` + +### Lints and fixes files +``` +yarn lint +``` + +### Customize configuration +See [Configuration Reference](https://cli.vuejs.org/config/). diff --git a/babel.config.js b/babel.config.js new file mode 100644 index 0000000..e955840 --- /dev/null +++ b/babel.config.js @@ -0,0 +1,5 @@ +module.exports = { + presets: [ + '@vue/cli-plugin-babel/preset' + ] +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..202a11d --- /dev/null +++ b/package.json @@ -0,0 +1,46 @@ +{ + "name": "zy", + "version": "0.1.0", + "private": true, + "scripts": { + "serve": "vue-cli-service serve", + "build": "vue-cli-service build", + "test:unit": "vue-cli-service test:unit", + "lint": "vue-cli-service lint", + "electron:build": "vue-cli-service electron:build", + "dev": "vue-cli-service electron:serve", + "postinstall": "electron-builder install-app-deps", + "postuninstall": "electron-builder install-app-deps" + }, + "main": "background.js", + "dependencies": { + "chai-as-promised": "^7.1.1", + "core-js": "^3.6.5", + "vue": "^3.0.0", + "vuex": "^4.0.0-0" + }, + "devDependencies": { + "@vue/cli-plugin-babel": "~4.5.0", + "@vue/cli-plugin-eslint": "~4.5.0", + "@vue/cli-plugin-unit-mocha": "~4.5.0", + "@vue/cli-plugin-vuex": "~4.5.0", + "@vue/cli-service": "~4.5.0", + "@vue/compiler-sfc": "^3.0.0", + "@vue/eslint-config-standard": "^5.1.2", + "@vue/test-utils": "^2.0.0-0", + "babel-eslint": "^10.1.0", + "chai": "^4.1.2", + "electron": "^10.1.3", + "electron-devtools-installer": "^3.1.0", + "eslint": "^6.7.2", + "eslint-plugin-import": "^2.20.2", + "eslint-plugin-node": "^11.1.0", + "eslint-plugin-promise": "^4.2.1", + "eslint-plugin-standard": "^4.0.0", + "eslint-plugin-vue": "^7.0.0-0", + "sass": "^1.26.5", + "sass-loader": "^8.0.2", + "spectron": "^11.0.0", + "vue-cli-plugin-electron-builder": "~2.0.0-rc.4" + } +} diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000..df36fcf Binary files /dev/null and b/public/favicon.ico differ diff --git a/public/index.html b/public/index.html new file mode 100644 index 0000000..4123528 --- /dev/null +++ b/public/index.html @@ -0,0 +1,17 @@ + + + + + + + + <%= htmlWebpackPlugin.options.title %> + + + +
+ + + diff --git a/src/App.vue b/src/App.vue new file mode 100644 index 0000000..db74163 --- /dev/null +++ b/src/App.vue @@ -0,0 +1,26 @@ + + + + + diff --git a/src/assets/logo.png b/src/assets/logo.png new file mode 100644 index 0000000..f3d2503 Binary files /dev/null and b/src/assets/logo.png differ diff --git a/src/background.js b/src/background.js new file mode 100644 index 0000000..c7b474b --- /dev/null +++ b/src/background.js @@ -0,0 +1,89 @@ +'use strict' + +import { app, protocol, BrowserWindow } from 'electron' +import { createProtocol } from 'vue-cli-plugin-electron-builder/lib' +import installExtension, { VUEJS_DEVTOOLS } from 'electron-devtools-installer' +const isDevelopment = process.env.NODE_ENV !== 'production' + +// Keep a global reference of the window object, if you don't, the window will +// be closed automatically when the JavaScript object is garbage collected. +let win + +// Scheme must be registered before the app is ready +protocol.registerSchemesAsPrivileged([ + { scheme: 'app', privileges: { secure: true, standard: true } } +]) + +function createWindow () { + // Create the browser window. + win = new BrowserWindow({ + width: 800, + height: 600, + webPreferences: { + // Use pluginOptions.nodeIntegration, leave this alone + // See nklayman.github.io/vue-cli-plugin-electron-builder/guide/security.html#node-integration for more info + nodeIntegration: process.env.ELECTRON_NODE_INTEGRATION + } + }) + + if (process.env.WEBPACK_DEV_SERVER_URL) { + // Load the url of the dev server if in development mode + win.loadURL(process.env.WEBPACK_DEV_SERVER_URL) + if (!process.env.IS_TEST) win.webContents.openDevTools() + } else { + createProtocol('app') + // Load the index.html when not in development + win.loadURL('app://./index.html') + } + + win.on('closed', () => { + win = null + }) +} + +// Quit when all windows are closed. +app.on('window-all-closed', () => { + // On macOS it is common for applications and their menu bar + // to stay active until the user quits explicitly with Cmd + Q + if (process.platform !== 'darwin') { + app.quit() + } +}) + +app.on('activate', () => { + // On macOS it's common to re-create a window in the app when the + // dock icon is clicked and there are no other windows open. + if (win === null) { + createWindow() + } +}) + +// This method will be called when Electron has finished +// initialization and is ready to create browser windows. +// Some APIs can only be used after this event occurs. +app.on('ready', async () => { + if (isDevelopment && !process.env.IS_TEST) { + // Install Vue Devtools + try { + await installExtension(VUEJS_DEVTOOLS) + } catch (e) { + console.error('Vue Devtools failed to install:', e.toString()) + } + } + createWindow() +}) + +// Exit cleanly on request from parent process in development mode. +if (isDevelopment) { + if (process.platform === 'win32') { + process.on('message', (data) => { + if (data === 'graceful-exit') { + app.quit() + } + }) + } else { + process.on('SIGTERM', () => { + app.quit() + }) + } +} diff --git a/src/components/HelloWorld.vue b/src/components/HelloWorld.vue new file mode 100644 index 0000000..07e1258 --- /dev/null +++ b/src/components/HelloWorld.vue @@ -0,0 +1,60 @@ + + + + + + diff --git a/src/main.js b/src/main.js new file mode 100644 index 0000000..3a11b0b --- /dev/null +++ b/src/main.js @@ -0,0 +1,5 @@ +import { createApp } from 'vue' +import App from './App.vue' +import store from './store' + +createApp(App).use(store).mount('#app') diff --git a/src/store/index.js b/src/store/index.js new file mode 100644 index 0000000..5f05f19 --- /dev/null +++ b/src/store/index.js @@ -0,0 +1,12 @@ +import { createStore } from 'vuex' + +export default createStore({ + state: { + }, + mutations: { + }, + actions: { + }, + modules: { + } +}) diff --git a/tests/unit/electron.spec.js b/tests/unit/electron.spec.js new file mode 100644 index 0000000..b23f86f --- /dev/null +++ b/tests/unit/electron.spec.js @@ -0,0 +1,43 @@ +import testWithSpectron from 'vue-cli-plugin-electron-builder/lib/testWithSpectron' +import chai from 'chai' +import chaiAsPromised from 'chai-as-promised' +// eslint-disable-next-line no-undef +const spectron = __non_webpack_require__('spectron') + +chai.should() +chai.use(chaiAsPromised) + +describe('Application launch', function () { + this.timeout(30000) + + beforeEach(function () { + return testWithSpectron(spectron).then(instance => { + this.app = instance.app + this.stopServe = instance.stopServe + }) + }) + + beforeEach(function () { + chaiAsPromised.transferPromiseness = this.app.transferPromiseness + }) + + afterEach(function () { + if (this.app && this.app.isRunning()) { + return this.stopServe() + } + }) + + it('opens a window', function () { + return this.app.client + .getWindowCount() + .should.eventually.have.at.least(1) + .browserWindow.isMinimized() + .should.eventually.be.false.browserWindow.isVisible() + .should.eventually.be.true.browserWindow.getBounds() + .should.eventually.have.property('width') + .and.be.above(0) + .browserWindow.getBounds() + .should.eventually.have.property('height') + .and.be.above(0) + }) +}) diff --git a/tests/unit/example.spec.js b/tests/unit/example.spec.js new file mode 100644 index 0000000..bc9939b --- /dev/null +++ b/tests/unit/example.spec.js @@ -0,0 +1,13 @@ +import { expect } from 'chai' +import { shallowMount } from '@vue/test-utils' +import HelloWorld from '@/components/HelloWorld.vue' + +describe('HelloWorld.vue', () => { + it('renders props.msg when passed', () => { + const msg = 'new message' + const wrapper = shallowMount(HelloWorld, { + props: { msg } + }) + expect(wrapper.text()).to.include(msg) + }) +})