Skip to content

Commit

Permalink
initial plugin setup
Browse files Browse the repository at this point in the history
  • Loading branch information
DRBragg committed Oct 17, 2019
0 parents commit 649f70e
Show file tree
Hide file tree
Showing 7 changed files with 186 additions and 0 deletions.
23 changes: 23 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# vue-cli-plugin-nucleus-tracking

Vue-cli 3 plugin for adding nucleus tracking support to projects using electron. Uses a custom fork of `nucleus-electron` built for Cello Health Digital's kiosk apps.

## How to Use

### Existing kiosks:

```
yarn add -D vue-cli-plugin-nucleus-tracking
vue invoke vue-cli-plugin-nucleus-tracking
```

You will be propted to enter your API key.

### New Projects

```
vue add nucleus-tracking
```

You will be propted to enter your API key.
35 changes: 35 additions & 0 deletions generator/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
module.exports = (api, opts) => {
api.extendPackage({
dependencies: {
'electron-nucleus': 'DRBragg/electron-nucleus#chd_custom'
}
})

api.render(
{ './src/background.js': './templates/default/src/background.js' },
opts
)

api.injectImports(api.entryFile, `import ipcRenderer from 'electron';`)

const tracker = `\n\n// Send tracking data via ipc channel\n// Allows us to use this.$tracker(action, data) anywhere in the app\nVue.prototype.$tracker = function(action, data={}) {\n\tipcRenderer.ipcRenderer.send('track', { action: action, data: data })\n}`

api.onCreateComplete(() => {
// inject to main.js
const fs = require('fs')
const ext = api.hasPlugin('typescript') ? 'ts' : 'js'
const mainPath = api.resolve(`./src/main.${ext}`)

// get content
let contentMain = fs.readFileSync(mainPath, { encoding: 'utf-8' })
const lines = contentMain.split(/\r?\n/g).reverse()

// inject import
const lastImportIndex = lines.findIndex(line => line.match(/^import/))
lines[lastImportIndex] += tracker

// modify app
contentMain = lines.reverse().join('\n')
fs.writeFileSync(mainPath, contentMain, { encoding: 'utf-8' })
})
}
106 changes: 106 additions & 0 deletions generator/templates/default/src/background.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
'use strict'

import { app, protocol, BrowserWindow, ipcMain } from 'electron'
import {
createProtocol,
installVueDevtools
} from 'vue-cli-plugin-electron-builder/lib'
const isDevelopment = process.env.NODE_ENV !== 'production'

// create and configure a nucleus instance
const Nucleus = require('electron-nucleus')('<%= nucleusApiKey %>', {
onlyMainProcess: true,
persist: true,
enableLogs: isDevelopment
})

// listens to the 'track' channel and then passes args to the nucleus tracker
ipcMain.on('track', (event, args) => {
Nucleus.track(args.action, args.data)
})

// 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: {
nodeIntegration: true
}
})

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
// Devtools extensions are broken in Electron 6.0.0 and greater
// See https://github.com/nklayman/vue-cli-plugin-electron-builder/issues/378 for more info
// Electron will not launch with Devtools extensions installed on Windows 10 with dark mode
// If you are not using Windows 10 dark mode, you may uncomment these lines
// In addition, if the linked issue is closed, you can upgrade electron and uncomment these lines
// try {
// await installVueDevtools()
// } 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()
})
}
}
1 change: 1 addition & 0 deletions index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
module.exports = (api, opts) => {}
Binary file added logo.jpeg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
13 changes: 13 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
{
"name": "vue-cli-plugin-nucleus-tracking",
"version": "0.1.1",
"description": "Vue-cli 3 plugin for adding nucleus tracking support to Vue projects using electron",
"main": "index.js",
"repository": {
"type": "git",
"url": "git+https://github.com/cellohealthdigital/vue-cli-plugin-nucleus-tracking.git"
},
"author": "Cello Health Digital Team <cellohealthdigital@gmail.com>",
"license": "MIT",
"homepage": "https://github.com/cellohealthdigital/vue-cli-plugin-nucleus-tracking#readme"
}
8 changes: 8 additions & 0 deletions prompts.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
module.exports = [
{
name: `nucleusApiKey`,
type: 'input',
message: 'Add you Nucleus API key',
default: ''
}
]

0 comments on commit 649f70e

Please sign in to comment.