diff --git a/.gitignore b/.gitignore
index ba98385..dcc321c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,5 @@
+node_modules
+build
+data
task.json
username.json
diff --git a/favicon.ico b/favicon.ico
new file mode 100644
index 0000000..bac5b46
Binary files /dev/null and b/favicon.ico differ
diff --git a/index.html b/index.html
deleted file mode 100644
index d3c0164..0000000
--- a/index.html
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
-
-
-
-
-
- Hello World!
-
-
- Hello World!
- We are using Node.js ,
- Chromium ,
- and Electron .
-
-
-
-
-
diff --git a/lib/data.js b/lib/data.js
new file mode 100644
index 0000000..5907a0c
--- /dev/null
+++ b/lib/data.js
@@ -0,0 +1,54 @@
+const osHomedir = require('os-homedir');
+var app = require('electron').app
+if (!app) {
+ r = require('electron').remote
+ app = require('electron').remote.app
+}
+
+const path = require('path')
+const fs = require('fs');
+
+var pathJoin = function (name) {
+ // return path.join(path.dirname(app.getPath('exe')), name);
+ return path.join(osHomedir(), "ouxuan.oa", name)
+}
+
+exports.pathJoin = pathJoin
+
+
+if (!fs.existsSync(pathJoin("data"))) {
+ fs.mkdirSync(pathJoin("data"), {
+ recursive: true
+ })
+}
+
+
+exports.ProjectMapPath = pathJoin("data/project-map.json")
+
+exports.TaskPath = pathJoin("data/task.json")
+exports.UsernamePath = pathJoin("data/username.json")
+
+
+if (!fs.existsSync(pathJoin("data/open-type-map.json"))) {
+ fs.writeFileSync(pathJoin("data/open-type-map.json"), "{}")
+}
+exports.OpenTypeMapPath = pathJoin("data/open-type-map.json")
+
+
+
+if (!fs.existsSync(pathJoin("data/config.json"))) {
+ fs.writeFileSync(pathJoin("data/config.json"), JSON.stringify({
+ TaskType: "my", // wwc 未完成
+ TaskCount: 0,
+ }))
+}
+
+exports.GetConfig = function () {
+ return JSON.parse(fs.readFileSync(pathJoin("data/config.json")))
+}
+
+exports.SyncConfig = function (config) {
+ if (fs.readFileSync(pathJoin("data/config.json")) + "" != JSON.stringify(config) + "") {
+ fs.writeFileSync(pathJoin("data/config.json"), JSON.stringify(config))
+ }
+}
\ No newline at end of file
diff --git a/lib/event.js b/lib/event.js
new file mode 100644
index 0000000..1db0d83
--- /dev/null
+++ b/lib/event.js
@@ -0,0 +1,5 @@
+
+const { ipcMain, Notification } = require('electron')
+const path = require('path')
+const libdata = require(path.join(__dirname, 'data.js'));
+
diff --git a/lib/git.js b/lib/git.js
new file mode 100644
index 0000000..0548501
--- /dev/null
+++ b/lib/git.js
@@ -0,0 +1,44 @@
+
+function checkoutLocalBranch(simpleGit, branches, title, cb) {
+ if (!branches[title]) {
+ simpleGit.checkoutLocalBranch(title, function (e) {
+ if (e) console.log(e)
+ if (!e && cb) cb()
+ })
+ } else {
+ simpleGit.checkout(title, function (e) {
+ if (e) console.log(e)
+ if (!e && cb) cb()
+ })
+ }
+}
+
+
+
+exports.autoCheckoutLocalBranch = function (simpleGit, title, cb, errcb) {
+ simpleGit.checkIsRepo(function (err, ok) {
+ if (ok) {
+ simpleGit.branchLocal(function (err, branchSummary) {
+ if (!err) {
+
+ if (branchSummary.current == "master") {
+ checkoutLocalBranch(simpleGit, branchSummary.branches, title, function () {
+ cb()
+ })
+ } else {
+ simpleGit.checkout("master", function () {
+ checkoutLocalBranch(simpleGit, branchSummary.branches, title, function () {
+ cb()
+ })
+ })
+ }
+ console.log(branchSummary)
+ } else {
+ console.log(err)
+ }
+ })
+ } else {
+ if (errcb) errcb(err)
+ }
+ })
+}
\ No newline at end of file
diff --git a/lib/main.js b/lib/main.js
new file mode 100644
index 0000000..5d0bee3
--- /dev/null
+++ b/lib/main.js
@@ -0,0 +1,31 @@
+
+const { BrowserWindow } = require('electron')
+const path = require('path')
+exports.MainWindow = null
+exports.createMainWindow = function () {
+ // Create the browser window.
+ // console.log(path.join(__dirname, 'web/main.js'))
+ exports.MainWindow = new BrowserWindow({
+ width: 500,
+ height: 800,
+ resizable: false,
+ // closable:false,
+ webPreferences: {
+ preload: path.join(__dirname, 'web/main.js')
+ }
+ })
+
+ // and load the index.html of the app.
+ exports.MainWindow.loadURL('http://oa.ouxuan.net/?d=we&m=login')
+
+ exports.MainWindow.on('minimize', function (event) {
+ event.preventDefault();
+ exports.MainWindow.hide();
+ });
+
+ // mainWindow.on("close",function(event){
+ // event.preventDefault();
+ // mainWindow.hide();
+ // })
+}
+
diff --git a/lib/tray.js b/lib/tray.js
new file mode 100644
index 0000000..7536d42
--- /dev/null
+++ b/lib/tray.js
@@ -0,0 +1,207 @@
+
+const { ipcMain, app, Menu, Tray, BrowserWindow, dialog } = require('electron')
+
+const path = require('path')
+const fs = require('fs');
+
+const webdata = require(path.join(__dirname, 'web/data.js'));
+const libdata = require(path.join(__dirname, 'data.js'));
+const git = require(path.join(__dirname, 'git.js'));
+const mainwin = require(path.join(__dirname, 'main.js'));
+
+let tray = null
+ipcMain.on('new-task-notification', (event) => {
+ tray.displayBalloon({
+ title: "可能有新的任务",
+ content: `当前总任务数${libdata.GetConfig().DaibanCount}`
+ })
+});
+
+ipcMain.on('put-in-tray', (event) => {
+ if (!tray) {
+ tray = new Tray(path.join(__dirname, '../windows-icon.png'))
+
+ tray.on("double-click", function () {
+ mainwin.MainWindow.show();
+ })
+
+ tray.on("right-click", function () {
+
+ let data = webdata.getTask()
+ let project_map = webdata.getProjectMap();
+ let ot = JSON.parse(fs.readFileSync(libdata.OpenTypeMapPath));
+
+
+ result = [];
+ for (var i in data) {
+ let submenu = [];
+ for (var k in data[i]) {
+ submenu.push({
+ label: data[i][k]["title"],
+ type: "submenu",
+ submenu: [
+ {
+ label: "查看详情",
+ click: (function () {
+ let id = data[i][k]["id"];
+ return function () {
+ mainwin.MainWindow.loadURL(`http://oa.ouxuan.net/task.php?a=x&num=work&show=we&mid=${id}`)
+ mainwin.MainWindow.show();
+ }
+ })()
+ },
+ {
+ label: "切换到该任务分支",
+ click: (function () {
+ let project_name = i;
+ let title = data[project_name][k]["title"];
+ return function () {
+ if (!project_map[project_name] || project_map[project_name] == "") {
+ dialog.showErrorBox(`无法切换分支`, `该项目找不到所在路径(${project_name})`);
+ return;
+ }
+ const workingDirPath = project_map[project_name]
+ const simpleGit = require('simple-git')(workingDirPath);
+ git.autoCheckoutLocalBranch(simpleGit, title, function () {
+ console.log("autoCheckoutLocalBranch")
+ if (ot[project_name] && ot[project_name] != "" && project_map[project_name] && project_map[project_name] != "") {
+ var exec = require('child_process').execFile;
+ exec(ot[project_name], [project_map[project_name]], function (err, data) {
+ if (err) console.log(err)
+ console.log(data.toString());
+ });
+ }
+
+ }, function (err) {
+ dialog.showErrorBox(`无法切换分支`, err);
+ })
+
+ }
+ })()
+ },
+ ]
+ });
+ }
+
+ let project_dir = project_map[i]
+ if (!project_dir) {
+ project_dir = ""
+ } else {
+ project_dir = `(${project_dir})`
+ }
+
+ let project_opentype = ot[i]
+ if (!project_opentype) {
+ project_opentype = "(未设定)"
+ } else {
+ project_opentype = `(${project_opentype})`
+ }
+
+ let op = [
+ {
+ label: "关联项目路径" + project_dir,
+ click: (function (i) {
+ return function (menuItem, browserWindow, event) {
+ let project_map = JSON.parse(fs.readFileSync(libdata.ProjectMapPath));
+ let a = dialog.showOpenDialogSync({ properties: ['openDirectory'] })
+ if (a) {
+ project_map[i] = a[0]
+ fs.writeFileSync(libdata.ProjectMapPath, JSON.stringify(project_map))
+ }
+ }
+ })(i)
+ },
+ {
+ label: "关联程序" + project_opentype,
+ click: (function (i) {
+ return function (menuItem, browserWindow, event) {
+ ot = JSON.parse(fs.readFileSync(libdata.OpenTypeMapPath));
+ let a = dialog.showOpenDialogSync({ properties: ['openFile'] })
+ if (a) {
+ ot[i] = a[0]
+ fs.writeFileSync(libdata.OpenTypeMapPath, JSON.stringify(ot))
+ }
+ }
+ })(i)
+ },
+ ,
+ {
+ label: "打开项目",
+ click: (function (i) {
+ return function (menuItem, browserWindow, event) {
+ let ot = JSON.parse(fs.readFileSync(libdata.OpenTypeMapPath));
+
+ let project_map = JSON.parse(fs.readFileSync(libdata.ProjectMapPath));
+ if (ot[i] && ot[i] != "" && project_map[i] && project_map[i] != "") {
+ var exec = require('child_process').execFile;
+ exec(ot[i], [project_map[i]], function (err, data) {
+ console.log(err)
+ console.log(data.toString());
+ });
+ }
+ }
+ })(i)
+ },
+ ]
+ op = [
+ {
+ label: "项目操作",
+ type: "submenu",
+ submenu: op
+ },
+ {
+ type: "separator"
+ }
+ ]
+
+ let item = {
+ label: i,
+ type: "submenu",
+ submenu: op.concat(submenu)
+ }
+ result.push(item);
+ }
+
+ tray.popUpContextMenu(Menu.buildFromTemplate(result.concat({
+ type: "separator"
+ }, {
+ label: "仅查看未完成",
+ type: "checkbox",
+ checked: libdata.GetConfig().TaskType == "wwc",
+ click: function (menuItem, browserWindow, event) {
+ var config = libdata.GetConfig()
+ config.TaskType = "my"
+ if (menuItem.checked) {
+ config.TaskType = "wwc"
+ }
+ libdata.SyncConfig(config)
+ mainwin.MainWindow.reload()
+ }
+ }, {
+ label: "退出",
+ click: function () {
+
+ app.quit()
+ }
+ })))
+ })
+ }
+})
+
+
+
+
+
+// exports.createTrayWindow = function () {
+// // Create the browser window.
+// const mainWindow = new BrowserWindow({
+// width: 300,
+// height: 600,
+// webPreferences: {
+// preload: path.join(__dirname, 'web/tray.js')
+// }
+// })
+// mainWindow.loadFile("res/tray.html")
+// mainWindow.hide()
+// }
+
diff --git a/lib/web/data.js b/lib/web/data.js
new file mode 100644
index 0000000..a6bce76
--- /dev/null
+++ b/lib/web/data.js
@@ -0,0 +1,107 @@
+const fs = require('fs');
+
+const path = require('path');
+const libdata2 = require(path.join(__dirname, "../data.js"));
+
+console.log("libdata2")
+console.log(libdata2)
+
+function syncTask(page, cb) {
+ $.get(`http://oa.ouxuan.net/api.php?m=index&a=getyydata&adminid=${adminid}&cfrom=mweb&event=${libdata2.GetConfig().TaskType}&num=work&key=&loadci=1&page=${page}`, function (data) {
+ var data = JSON.parse(data);
+ if (data.code == 200) {
+ if (page < data["data"]["maxpage"]) {
+ syncTask(page + 1, function (rows) {
+ cb(data["data"]["rows"].concat(rows))
+ })
+ } else {
+ for (var i in data["data"]["rows"]) {
+ $.ajax({
+ url: "http://oa.ouxuan.net/task.php?a=x&num=work&show=we&mid=" + data["data"]["rows"][i]["id"],
+ async: false,
+ success: function (html) {
+ var last = ""
+ $(html).find("div").each(function (item) {
+ if (last == "所属项目") {
+ a = ($(this).text()).split("(")
+ a.pop()
+ a = a.join("(")
+ data["data"]["rows"][i]["project"] = a;
+ }
+ last = $(this).text()
+ })
+ if (!data["data"]["rows"][i]["project"] || data["data"]["rows"][i]["project"] == "") {
+ data["data"]["rows"][i]["project"] = "未归属项目"
+ }
+ }
+ });
+ }
+ cb(data["data"]["rows"], data["data"]["count"])
+ }
+ }
+ })
+}
+
+
+
+function syncTaskConfig(url, key, apikey) {
+ var isNew = false;
+ var config = libdata2.GetConfig()
+ $.ajax({
+ url: url,
+ async: false,
+ success: function (data) {
+ data = JSON.parse(data)
+ console.log(data)
+ if (data.code == 200) {
+ if (config[key] != data["data"][apikey]) {
+ isNew = true
+ }
+ config[key] = data["data"][apikey]
+ libdata2.SyncConfig(config)
+ }
+ }, error: function (err) {
+ console.log(err)
+ }
+ })
+
+ console.log("isNew", isNew)
+ return isNew;
+}
+
+
+exports.syncDaibanCount = function () {
+ return syncTaskConfig(`http://oa.ouxuan.net/api.php?m=index&a=getyydata&adminid=${adminid}&cfrom=mweb&page=1&event=daib&num=daiban&key=&loadci=1`, "DaibanCount", "count")
+}
+
+exports.syncTaskCount = function () {
+ return syncTaskConfig(`http://oa.ouxuan.net/api.php?m=index&a=getyydata&adminid=${adminid}&cfrom=mweb&event=my&num=work&key=&loadci=1&page=1`, "TaskCount", "count")
+}
+exports.syncTaskToFile = function (cb) {
+ if (!fs.existsSync(libdata2.ProjectMapPath)) fs.writeFileSync(libdata2.ProjectMapPath, JSON.stringify({}))
+ syncTask(1, function (data, count) {
+ result = {};
+ for (let i in data) {
+ if (!result[data[i]["project"]]) {
+ result[data[i]["project"]] = [];
+ }
+ result[data[i]["project"]].push(data[i])
+ }
+ fs.writeFileSync(libdata2.TaskPath, JSON.stringify(result))
+ for (var i in result) {
+ var project_map = JSON.parse(fs.readFileSync(libdata2.ProjectMapPath));
+ if (!project_map[i]) {
+ project_map[i] = "";
+ }
+ }
+ fs.writeFileSync(libdata2.ProjectMapPath, JSON.stringify(project_map))
+ if (cb) cb();
+ })
+}
+exports.getTask = function () {
+ return JSON.parse(fs.readFileSync(libdata2.TaskPath));
+}
+
+exports.getProjectMap = function () {
+ return JSON.parse(fs.readFileSync(libdata2.ProjectMapPath));
+}
diff --git a/lib/web/main.js b/lib/web/main.js
new file mode 100644
index 0000000..7f606f9
--- /dev/null
+++ b/lib/web/main.js
@@ -0,0 +1,64 @@
+const fs = require('fs');
+const path = require('path')
+const libdata = require(path.join(__dirname, "data.js"));
+const libdata2 = require(path.join(__dirname, "../data.js"));
+const ipc = require('electron').ipcRenderer
+
+
+function get(name) {
+ var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
+ var r = window.location.search.substr(1).match(reg);
+ if (r != null) return (r[2]); return null;
+}
+
+
+
+
+window.addEventListener('DOMContentLoaded', () => {
+
+ libdata.syncTaskToFile(function () {
+ ipc.send('put-in-tray')
+ })
+ setInterval(function () {
+ if (libdata.syncDaibanCount()) {
+ ipc.send('new-task-notification')
+ console.log("通知中...")
+ libdata.syncTaskToFile();
+ }
+ }, 5 * 1000)
+
+
+
+ let m = get("m");
+ if (PageJs[m]) {
+ PageJs[m]()
+ } else {
+ // alert("未有指定动作:" + m);
+ }
+})
+
+PageJs = {
+ login() {
+ if (fs.existsSync(libdata2.UsernamePath)) {
+ let data = fs.readFileSync(libdata2.UsernamePath);
+ data = JSON.parse(data)
+ const adminuser = document.getElementById("adminuser")
+ adminuser.value = data["username"];
+ const adminpass = document.getElementById("adminpass")
+ adminpass.value = data["password"];
+ loginsubmit(0)
+ } else {
+ _loginsubmit = loginsubmit
+ loginsubmit = function () {
+ const adminuser = document.getElementById("adminuser")
+ const adminpass = document.getElementById("adminpass")
+ fs.writeFileSync(libdata2.UsernamePath, JSON.stringify({
+ username: adminuser.value,
+ password: adminpass.value,
+ }))
+ _loginsubmit(0)
+ }
+ }
+ }
+}
+
diff --git a/lib/web/tray.js b/lib/web/tray.js
new file mode 100644
index 0000000..40ebf8e
--- /dev/null
+++ b/lib/web/tray.js
@@ -0,0 +1,2 @@
+// const ipc = require('electron').ipcRenderer
+// ipc.send('put-in-tray')
diff --git a/main.js b/main.js
index d2dc0fb..e2afe8d 100644
--- a/main.js
+++ b/main.js
@@ -1,187 +1,27 @@
// Modules to control application life and create native browser window
-const { app, dialog, BrowserWindow, Menu, Tray, ipcMain } = require('electron')
+const { app, BrowserWindow } = require('electron')
const path = require('path')
-const fs = require('fs');
+const main = require(path.join(__dirname, "lib/main.js"))
-
-var result = [{
- label: "title",
- sublabel: "title",
- type: "submenu",
- submenu: [
- {
- label: "切换到该任务分支",
- },
- ]
-}
-
-];
-let tray = null
-function createMenu() {
-
- const iconPath = path.join(__dirname, 'windows-icon.png')
- tray = new Tray(iconPath)
-
- tray.setToolTip('This is my application.')
-
- var menu_data = "";
- var project_map_data = "";
-
-
- tray.on("right-click", function () {
-
- // tray.popUpContextMenu(Menu.buildFromTemplate(result.concat({
- // type: "separator"
- // }, {
- // label: "退出",
- // click: function () {
- // for (var i in BrowserWindow.getAllWindows()) {
- // BrowserWindow.getAllWindows()[i].close()
- // }
- // app.quit()
- // }
- // })))
-
- // return
-
-
- console.log("right-click")
- if (!fs.existsSync("task.json") || !fs.existsSync("project-map.json")) {
- return
- }
-
- // if (!fs.existsSync("project-map.json")) fs.writeFileSync("project-map.json", JSON.stringify({}))
-
-
- var project_map_str = fs.readFileSync("project-map.json");
- var project_map = JSON.parse(fs.readFileSync("project-map.json"));
- var data = fs.readFileSync("task.json") + "";
- if (data != menu_data && menu_data != "") {
- tray.displayBalloon({
- title: "你有一个新任务",
- content: "你有一个新任务,请及时查看"
- })
- }
- project_map_data = project_map_str
- menu_data = data
- data = JSON.parse(data);
- result = [];
- for (var i in data) {
- let submenu = [];
- for (var k in data[i]) {
- submenu.push({
- label: data[i][k]["title"],
- type: "submenu",
- submenu: [
- {
- label: "切换到该任务分支",
- click: (function () {
- i, data[i][k]["title"]
- return function () {
-
- }
- })()
- },
- ]
- });
- }
-
- let project_dir = project_map[i]
- if (!project_dir) {
- project_dir = ""
- } else {
- project_dir = `(${project_dir})`
- }
- let item = {
- label: i,
- type: "submenu",
- submenu: submenu.concat([
- {
- type: "separator"
- },
- {
- label: "关联项目路径" + project_dir,
- click: (function (i) {
- return function (menuItem, browserWindow, event) {
- let project_map = JSON.parse(fs.readFileSync("project-map.json"));
- let a = dialog.showOpenDialogSync({ properties: ['openDirectory'] })
- if (a) {
- project_map[i] = a[0]
- fs.writeFileSync("project-map.json", JSON.stringify(project_map))
- }
- }
- })(i)
- },
- ])
- }
- result.push(item);
- }
-
- tray.popUpContextMenu(Menu.buildFromTemplate(result.concat({
- type: "separator"
- }, {
- label: "退出",
- click: function () {
- for (var i in BrowserWindow.getAllWindows()) {
- BrowserWindow.getAllWindows()[i].close()
- }
- app.quit()
- }
- })))
- })
-
-
-}
-function createWindow() {
- // Create the browser window.
- const mainWindow = new BrowserWindow({
- width: 300,
- height: 600,
- webPreferences: {
- preload: path.join(__dirname, 'preload.js')
- }
- })
-
- // and load the index.html of the app.
- mainWindow.loadURL('http://oa.ouxuan.net/?d=we&m=login')
- mainWindow.webContents.on('crashed', function () {
- const options = {
- type: 'info',
- title: '渲染器进程崩溃',
- message: '这个进程已经崩溃.',
- buttons: ['重载', '关闭']
- }
- dialog.showMessageBox(options, function (index) {
- if (index === 0) mainWindow.reload()
- else mainWindow.close()
- })
- })
-
- mainWindow.on('minimize', function (event) {
- event.preventDefault();
- mainWindow.hide();
- });
- // Open the DevTools.
- // mainWindow.webContents.openDevTools()
-}
-
// 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.whenReady().then(function () {
- createWindow()
- createMenu()
+ require(path.join(__dirname, "lib/event.js"))
+
+ main.createMainWindow()
+
+ const tray = require(path.join(__dirname, "lib/tray.js"))
+ // tray.createTrayWindow()
})
// Quit when all windows are closed.
app.on('window-all-closed', function () {
// On macOS it is common for applications and their menu bar
// to stay active until the user quits explicitly with Cmd + Q
-
-
for (var i in BrowserWindow.getAllWindows()) {
BrowserWindow.getAllWindows()[i].close()
}
diff --git a/package-lock.json b/package-lock.json
index 74751b0..fded5a6 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -36,18 +36,109 @@
"defer-to-connect": "^1.0.1"
}
},
+ "@types/events": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz",
+ "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==",
+ "dev": true,
+ "optional": true
+ },
+ "@types/glob": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz",
+ "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "@types/events": "*",
+ "@types/minimatch": "*",
+ "@types/node": "*"
+ }
+ },
+ "@types/minimatch": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
+ "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==",
+ "dev": true,
+ "optional": true
+ },
"@types/node": {
"version": "12.12.34",
"resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.34.tgz",
"integrity": "sha512-BneGN0J9ke24lBRn44hVHNeDlrXRYF+VRp0HbSUNnEZahXGAysHZIqnf/hER6aabdBgzM4YOV4jrR8gj4Zfi0g==",
"dev": true
},
+ "asar": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/asar/-/asar-2.1.0.tgz",
+ "integrity": "sha512-d2Ovma+bfqNpvBzY/KU8oPY67ZworixTpkjSx0PCXnQi67c2cXmssaTxpFDUM0ttopXoGx/KRxNg/GDThYbXQA==",
+ "dev": true,
+ "requires": {
+ "@types/glob": "^7.1.1",
+ "chromium-pickle-js": "^0.2.0",
+ "commander": "^2.20.0",
+ "cuint": "^0.2.2",
+ "glob": "^7.1.3",
+ "minimatch": "^3.0.4",
+ "mkdirp": "^0.5.1",
+ "tmp-promise": "^1.0.5"
+ }
+ },
+ "author-regex": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/author-regex/-/author-regex-1.0.0.tgz",
+ "integrity": "sha1-0IiFvmubv5Q5/gh8dihyRfCoFFA=",
+ "dev": true
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+ "dev": true
+ },
+ "base64-js": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz",
+ "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==",
+ "dev": true
+ },
+ "bluebird": {
+ "version": "3.7.2",
+ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
+ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
+ "dev": true
+ },
"boolean": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/boolean/-/boolean-3.0.1.tgz",
"integrity": "sha512-HRZPIjPcbwAVQvOTxR4YE3o8Xs98NqbbL1iEZDCz7CL8ql0Lt5iOyJFxfnAB0oFs8Oh02F/lLlg30Mexv46LjA==",
+ "dev": true
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
"dev": true,
- "optional": true
+ "requires": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "buffer-alloc": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz",
+ "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==",
+ "dev": true,
+ "requires": {
+ "buffer-alloc-unsafe": "^1.1.0",
+ "buffer-fill": "^1.0.0"
+ }
+ },
+ "buffer-alloc-unsafe": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz",
+ "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==",
+ "dev": true
},
"buffer-crc32": {
"version": "0.2.13",
@@ -55,6 +146,12 @@
"integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=",
"dev": true
},
+ "buffer-fill": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz",
+ "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=",
+ "dev": true
+ },
"buffer-from": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
@@ -93,6 +190,18 @@
}
}
},
+ "camelcase": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+ "dev": true
+ },
+ "chromium-pickle-js": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz",
+ "integrity": "sha1-BKEGZywYsIWrd02YPfo+oTjyIgU=",
+ "dev": true
+ },
"clone-response": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz",
@@ -102,6 +211,24 @@
"mimic-response": "^1.0.0"
}
},
+ "commander": {
+ "version": "2.20.3",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
+ "dev": true
+ },
+ "compare-version": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/compare-version/-/compare-version-0.1.2.tgz",
+ "integrity": "sha1-AWLsLZNR9d3VmpICy6k1NmpyUIA=",
+ "dev": true
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
"concat-stream": {
"version": "1.6.2",
"resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
@@ -138,15 +265,46 @@
"integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
"dev": true
},
+ "cross-zip": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/cross-zip/-/cross-zip-3.0.0.tgz",
+ "integrity": "sha512-cm+l8PJ6WiSQmKZ/x8DGvUm2u/3FX2JFs1AFd18gdHaVhP5Lf4oE6Jrj2Jd05JYSioz5x+nIRVp0zBQuzuCRcQ==",
+ "dev": true,
+ "requires": {
+ "rimraf": "^3.0.0"
+ },
+ "dependencies": {
+ "rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "dev": true,
+ "requires": {
+ "glob": "^7.1.3"
+ }
+ }
+ }
+ },
+ "cuint": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/cuint/-/cuint-0.2.2.tgz",
+ "integrity": "sha1-QICG1AlVDCYxFVYZ6fp7ytw7mRs=",
+ "dev": true
+ },
"debug": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
"integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
- "dev": true,
"requires": {
"ms": "^2.1.1"
}
},
+ "decamelize": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
+ "dev": true
+ },
"decompress-response": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz",
@@ -196,6 +354,80 @@
"extract-zip": "^1.0.3"
}
},
+ "electron-notarize": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/electron-notarize/-/electron-notarize-0.2.1.tgz",
+ "integrity": "sha512-oZ6/NhKeXmEKNROiFmRNfytqu3cxqC95sjooG7kBXQVEUSQkZnbiAhxVh5jXngL881G197pbwpeVPJyM7Ikmxw==",
+ "dev": true,
+ "requires": {
+ "debug": "^4.1.1",
+ "fs-extra": "^8.1.0"
+ }
+ },
+ "electron-osx-sign": {
+ "version": "0.4.15",
+ "resolved": "https://registry.npmjs.org/electron-osx-sign/-/electron-osx-sign-0.4.15.tgz",
+ "integrity": "sha512-1QtPNpjIji9bGZ0VRFwtJUyU1uHi7q3XUAOG0qFsvAUfs5H0T8hbgUfyg3xvPzmF1ruV8T8pQmQ86vNfLrcRiA==",
+ "dev": true,
+ "requires": {
+ "bluebird": "^3.5.0",
+ "compare-version": "^0.1.2",
+ "debug": "^2.6.8",
+ "isbinaryfile": "^3.0.2",
+ "minimist": "^1.2.0",
+ "plist": "^3.0.1"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ }
+ }
+ },
+ "electron-packager": {
+ "version": "14.2.1",
+ "resolved": "https://registry.npmjs.org/electron-packager/-/electron-packager-14.2.1.tgz",
+ "integrity": "sha512-g6y3BVrAOz/iavKD+VMFbehrQcwCWuA3CZvVbmmbQuCfegGA1ytwWn0BNIDDrEdbuz31Fti7mnNHhb5L+3Wq9A==",
+ "dev": true,
+ "requires": {
+ "@electron/get": "^1.6.0",
+ "asar": "^2.0.1",
+ "cross-zip": "^3.0.0",
+ "debug": "^4.0.1",
+ "electron-notarize": "^0.2.0",
+ "electron-osx-sign": "^0.4.11",
+ "fs-extra": "^8.1.0",
+ "galactus": "^0.2.1",
+ "get-package-info": "^1.0.0",
+ "junk": "^3.1.0",
+ "parse-author": "^2.0.0",
+ "plist": "^3.0.0",
+ "rcedit": "^2.0.0",
+ "resolve": "^1.1.6",
+ "sanitize-filename": "^1.6.0",
+ "semver": "^6.0.0",
+ "yargs-parser": "^16.0.0"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "dev": true
+ }
+ }
+ },
"encodeurl": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
@@ -218,6 +450,15 @@
"integrity": "sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA==",
"dev": true
},
+ "error-ex": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
+ "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
+ "dev": true,
+ "requires": {
+ "is-arrayish": "^0.2.1"
+ }
+ },
"es6-error": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz",
@@ -270,6 +511,38 @@
"pend": "~1.2.0"
}
},
+ "find-up": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
+ "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
+ "dev": true,
+ "requires": {
+ "locate-path": "^2.0.0"
+ }
+ },
+ "flora-colossus": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/flora-colossus/-/flora-colossus-1.0.1.tgz",
+ "integrity": "sha512-d+9na7t9FyH8gBJoNDSi28mE4NgQVGGvxQ4aHtFRetjyh5SXjuus+V5EZaxFmFdXVemSOrx0lsgEl/ZMjnOWJA==",
+ "dev": true,
+ "requires": {
+ "debug": "^4.1.1",
+ "fs-extra": "^7.0.0"
+ },
+ "dependencies": {
+ "fs-extra": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz",
+ "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.2",
+ "jsonfile": "^4.0.0",
+ "universalify": "^0.1.0"
+ }
+ }
+ }
+ },
"fs-extra": {
"version": "8.1.0",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
@@ -281,6 +554,74 @@
"universalify": "^0.1.0"
}
},
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "galactus": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/galactus/-/galactus-0.2.1.tgz",
+ "integrity": "sha1-y+0tIKQMH1Z5o1kI4rlBVzPnjbk=",
+ "dev": true,
+ "requires": {
+ "debug": "^3.1.0",
+ "flora-colossus": "^1.0.0",
+ "fs-extra": "^4.0.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "3.2.6",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
+ "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
+ "dev": true,
+ "requires": {
+ "ms": "^2.1.1"
+ }
+ },
+ "fs-extra": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz",
+ "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.2",
+ "jsonfile": "^4.0.0",
+ "universalify": "^0.1.0"
+ }
+ }
+ }
+ },
+ "get-package-info": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/get-package-info/-/get-package-info-1.0.0.tgz",
+ "integrity": "sha1-ZDJ5ZWPigRPNlHTbvQAFKYWkmZw=",
+ "dev": true,
+ "requires": {
+ "bluebird": "^3.1.1",
+ "debug": "^2.2.0",
+ "lodash.get": "^4.0.0",
+ "read-pkg-up": "^2.0.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ }
+ }
+ },
"get-stream": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
@@ -290,6 +631,20 @@
"pump": "^3.0.0"
}
},
+ "glob": {
+ "version": "7.1.6",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
+ "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ }
+ },
"global-agent": {
"version": "2.1.8",
"resolved": "https://registry.npmjs.org/global-agent/-/global-agent-2.1.8.tgz",
@@ -354,12 +709,28 @@
"integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==",
"dev": true
},
+ "hosted-git-info": {
+ "version": "2.8.8",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz",
+ "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==",
+ "dev": true
+ },
"http-cache-semantics": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz",
"integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==",
"dev": true
},
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
+ "requires": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
"inherits": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
@@ -373,12 +744,27 @@
"dev": true,
"optional": true
},
+ "is-arrayish": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+ "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
+ "dev": true
+ },
"isarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
"integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
"dev": true
},
+ "isbinaryfile": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.3.tgz",
+ "integrity": "sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw==",
+ "dev": true,
+ "requires": {
+ "buffer-alloc": "^1.2.0"
+ }
+ },
"json-buffer": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz",
@@ -401,6 +787,12 @@
"graceful-fs": "^4.1.6"
}
},
+ "junk": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/junk/-/junk-3.1.0.tgz",
+ "integrity": "sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ==",
+ "dev": true
+ },
"keyv": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz",
@@ -410,6 +802,36 @@
"json-buffer": "3.0.0"
}
},
+ "load-json-file": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz",
+ "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.2",
+ "parse-json": "^2.2.0",
+ "pify": "^2.0.0",
+ "strip-bom": "^3.0.0"
+ },
+ "dependencies": {
+ "pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+ "dev": true
+ }
+ }
+ },
+ "locate-path": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
+ "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
+ "dev": true,
+ "requires": {
+ "p-locate": "^2.0.0",
+ "path-exists": "^3.0.0"
+ }
+ },
"lodash": {
"version": "4.17.15",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
@@ -417,6 +839,12 @@
"dev": true,
"optional": true
},
+ "lodash.get": {
+ "version": "4.4.2",
+ "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz",
+ "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=",
+ "dev": true
+ },
"lowercase-keys": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
@@ -439,6 +867,15 @@
"integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==",
"dev": true
},
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "^1.1.7"
+ }
+ },
"minimist": {
"version": "1.2.5",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
@@ -457,8 +894,27 @@
"ms": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
- "dev": true
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+ },
+ "normalize-package-data": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
+ "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
+ "dev": true,
+ "requires": {
+ "hosted-git-info": "^2.1.4",
+ "resolve": "^1.10.0",
+ "semver": "2 || 3 || 4 || 5",
+ "validate-npm-package-license": "^3.0.1"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "dev": true
+ }
+ }
},
"normalize-url": {
"version": "4.5.0",
@@ -493,12 +949,94 @@
"wrappy": "1"
}
},
+ "os-homedir": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-2.0.0.tgz",
+ "integrity": "sha512-saRNz0DSC5C/I++gFIaJTXoFJMRwiP5zHar5vV3xQ2TkgEw6hDCcU5F272JjUylpiVgBrZNQHnfjkLabTfb92Q=="
+ },
"p-cancelable": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz",
"integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==",
"dev": true
},
+ "p-limit": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
+ "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
+ "dev": true,
+ "requires": {
+ "p-try": "^1.0.0"
+ }
+ },
+ "p-locate": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
+ "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
+ "dev": true,
+ "requires": {
+ "p-limit": "^1.1.0"
+ }
+ },
+ "p-try": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
+ "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
+ "dev": true
+ },
+ "parse-author": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/parse-author/-/parse-author-2.0.0.tgz",
+ "integrity": "sha1-00YL8d3Q367tQtp1QkLmX7aEqB8=",
+ "dev": true,
+ "requires": {
+ "author-regex": "^1.0.0"
+ }
+ },
+ "parse-json": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
+ "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
+ "dev": true,
+ "requires": {
+ "error-ex": "^1.2.0"
+ }
+ },
+ "path-exists": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+ "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
+ "dev": true
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true
+ },
+ "path-parse": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
+ "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
+ "dev": true
+ },
+ "path-type": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz",
+ "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=",
+ "dev": true,
+ "requires": {
+ "pify": "^2.0.0"
+ },
+ "dependencies": {
+ "pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+ "dev": true
+ }
+ }
+ },
"pend": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
@@ -512,6 +1050,17 @@
"dev": true,
"optional": true
},
+ "plist": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.1.tgz",
+ "integrity": "sha512-GpgvHHocGRyQm74b6FWEZZVRroHKE1I0/BTjAmySaohK+cUn+hZpbqXkc3KWgW3gQYkqcQej35FohcT0FRlkRQ==",
+ "dev": true,
+ "requires": {
+ "base64-js": "^1.2.3",
+ "xmlbuilder": "^9.0.7",
+ "xmldom": "0.1.x"
+ }
+ },
"prepend-http": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz",
@@ -547,6 +1096,33 @@
"once": "^1.3.1"
}
},
+ "rcedit": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/rcedit/-/rcedit-2.1.1.tgz",
+ "integrity": "sha512-N1JyXxHD2zpqqW4A77RNK1d/M+tyed9JkvL/lnUI5cf4igF/8B9FNLFCtDUhGrk2GWEPxC+RF0WXWWB3I8QC7w==",
+ "dev": true
+ },
+ "read-pkg": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz",
+ "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=",
+ "dev": true,
+ "requires": {
+ "load-json-file": "^2.0.0",
+ "normalize-package-data": "^2.3.2",
+ "path-type": "^2.0.0"
+ }
+ },
+ "read-pkg-up": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz",
+ "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=",
+ "dev": true,
+ "requires": {
+ "find-up": "^2.0.0",
+ "read-pkg": "^2.0.0"
+ }
+ },
"readable-stream": {
"version": "2.3.7",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
@@ -562,6 +1138,15 @@
"util-deprecate": "~1.0.1"
}
},
+ "resolve": {
+ "version": "1.16.0",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.16.0.tgz",
+ "integrity": "sha512-LarL/PIKJvc09k1jaeT4kQb/8/7P+qV4qSnN2K80AES+OHdfZELAKVOBjxsvtToT/uLOfFbvYvKfZmV8cee7nA==",
+ "dev": true,
+ "requires": {
+ "path-parse": "^1.0.6"
+ }
+ },
"responselike": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz",
@@ -571,6 +1156,15 @@
"lowercase-keys": "^1.0.0"
}
},
+ "rimraf": {
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
+ "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+ "dev": true,
+ "requires": {
+ "glob": "^7.1.3"
+ }
+ },
"roarr": {
"version": "2.15.3",
"resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.3.tgz",
@@ -625,6 +1219,46 @@
"type-fest": "^0.8.0"
}
},
+ "simple-git": {
+ "version": "1.132.0",
+ "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-1.132.0.tgz",
+ "integrity": "sha512-xauHm1YqCTom1sC9eOjfq3/9RKiUA9iPnxBbrY2DdL8l4ADMu0jjM5l5lphQP5YWNqAL2aXC/OeuQ76vHtW5fg==",
+ "requires": {
+ "debug": "^4.0.1"
+ }
+ },
+ "spdx-correct": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz",
+ "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==",
+ "dev": true,
+ "requires": {
+ "spdx-expression-parse": "^3.0.0",
+ "spdx-license-ids": "^3.0.0"
+ }
+ },
+ "spdx-exceptions": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz",
+ "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==",
+ "dev": true
+ },
+ "spdx-expression-parse": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz",
+ "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==",
+ "dev": true,
+ "requires": {
+ "spdx-exceptions": "^2.1.0",
+ "spdx-license-ids": "^3.0.0"
+ }
+ },
+ "spdx-license-ids": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz",
+ "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==",
+ "dev": true
+ },
"sprintf-js": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz",
@@ -641,6 +1275,12 @@
"safe-buffer": "~5.1.0"
}
},
+ "strip-bom": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+ "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
+ "dev": true
+ },
"sumchecker": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz",
@@ -650,6 +1290,25 @@
"debug": "^4.1.0"
}
},
+ "tmp": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.1.0.tgz",
+ "integrity": "sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw==",
+ "dev": true,
+ "requires": {
+ "rimraf": "^2.6.3"
+ }
+ },
+ "tmp-promise": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-1.1.0.tgz",
+ "integrity": "sha512-8+Ah9aB1IRXCnIOxXZ0uFozV1nMU5xiu7hhFVUSxZ3bYu+psD4TzagCzVbexUCgNNGJnsmNDQlS4nG3mTyoNkw==",
+ "dev": true,
+ "requires": {
+ "bluebird": "^3.5.0",
+ "tmp": "0.1.0"
+ }
+ },
"to-readable-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz",
@@ -712,12 +1371,44 @@
"integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
"dev": true
},
+ "validate-npm-package-license": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
+ "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
+ "dev": true,
+ "requires": {
+ "spdx-correct": "^3.0.0",
+ "spdx-expression-parse": "^3.0.0"
+ }
+ },
"wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
"dev": true
},
+ "xmlbuilder": {
+ "version": "9.0.7",
+ "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz",
+ "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=",
+ "dev": true
+ },
+ "xmldom": {
+ "version": "0.1.31",
+ "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.31.tgz",
+ "integrity": "sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ==",
+ "dev": true
+ },
+ "yargs-parser": {
+ "version": "16.1.0",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-16.1.0.tgz",
+ "integrity": "sha512-H/V41UNZQPkUMIT5h5hiwg4QKIY1RPvoBV4XcjUbRM8Bk2oKqqyZ0DIEbTFZB0XjbtSPG8SAa/0DxCQmiRgzKg==",
+ "dev": true,
+ "requires": {
+ "camelcase": "^5.0.0",
+ "decamelize": "^1.2.0"
+ }
+ },
"yauzl": {
"version": "2.10.0",
"resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz",
diff --git a/package.json b/package.json
index 53b02b7..1ff9d1a 100644
--- a/package.json
+++ b/package.json
@@ -1,22 +1,17 @@
{
- "name": "electron-quick-start",
+ "name": "ouxuan.oa",
"version": "1.0.0",
- "description": "A minimal Electron application",
"main": "main.js",
"scripts": {
- "start": "electron ."
+ "start": "electron .",
+ "package": "electron-packager ./ ouxuan.oa --out ./build --overwrite --icon=favicon"
},
- "repository": "https://github.com/electron/electron-quick-start",
- "keywords": [
- "Electron",
- "quick",
- "start",
- "tutorial",
- "demo"
- ],
- "author": "GitHub",
- "license": "CC0-1.0",
"devDependencies": {
- "electron": "^8.2.1"
+ "electron": "^8.2.1",
+ "electron-packager": "^14.2.1"
+ },
+ "dependencies": {
+ "os-homedir": "^2.0.0",
+ "simple-git": "^1.132.0"
}
-}
+}
\ No newline at end of file
diff --git a/preload.js b/preload.js
deleted file mode 100644
index bf8d672..0000000
--- a/preload.js
+++ /dev/null
@@ -1,115 +0,0 @@
-// All of the Node.js APIs are available in the preload process.
-// It has the same sandbox as a Chrome extension.
-
-
-const fs = require('fs');
-
-const ipc = require('electron').ipcRenderer
-
-function get(name) {
-
- var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
- var r = window.location.search.substr(1).match(reg);
- if (r != null) return (r[2]); return null;
-}
-
-function inits() {
-
- function p(page, cb) {
- $.get(`http://oa.ouxuan.net/api.php?m=index&a=getyydata&adminid=${adminid}&cfrom=mweb&event=wwc&num=work&key=&loadci=1&page=${page}`, function (data) {
- var data = JSON.parse(data);
- if (data.code == 200) {
- if (page < data["data"]["maxpage"]) {
- p(page + 1, function (rows) {
- cb(data["data"]["rows"].concat(rows))
- })
- } else {
- for (var i in data["data"]["rows"]) {
- $.ajax({
- url: "http://oa.ouxuan.net/task.php?a=x&num=work&show=we&mid=" + data["data"]["rows"][i]["id"],
- async: false,
- success: function (html) {
- var last = ""
- $(html).find("div").each(function (item) {
- if (last == "所属项目") {
- a = ($(this).text()).split("(")
- a.pop()
- a = a.join("(")
- data["data"]["rows"][i]["project"] = a
- console.log(a)
- }
- last = $(this).text()
- })
- }
- });
- }
- cb(data["data"]["rows"])
- }
- }
- })
- }
- var start = function () {
-
- p(1, function (data) {
- // alert( JSON.stringify(data));
- result = {};
- for (let i in data) {
- if (!result[data[i]["project"]]) {
- result[data[i]["project"]] = [];
- }
- result[data[i]["project"]].push(data[i])
- }
- fs.writeFileSync("task.json", JSON.stringify(result))
- setTimeout(function () {
-
- // location.reload()
- }, 1 * 1000);
- })
- }
- setTimeout(() => {
-
- console.log(js)
- console.log(js.request('adminid'))
- console.log(adminid)
- start()
- }, 2000);
-}
-
-
-
-
-
-window.addEventListener('DOMContentLoaded', () => {
- let m = get("m");
- inits()
- if (PageJs[m]) {
- PageJs[m]()
- } else {
- // alert("未有指定动作:" + m);
- }
-})
-
-PageJs = {
- login() {
- if (fs.existsSync("username.json")) {
- let data = fs.readFileSync("username.json");
- data = JSON.parse(data)
- const adminuser = document.getElementById("adminuser")
- adminuser.value = data["username"];
- const adminpass = document.getElementById("adminpass")
- adminpass.value = data["password"];
- loginsubmit(0)
- } else {
- _loginsubmit = loginsubmit
- loginsubmit = function () {
- const adminuser = document.getElementById("adminuser")
- const adminpass = document.getElementById("adminpass")
- fs.writeFileSync("username.json", JSON.stringify({
- username: adminuser.value,
- password: adminpass.value,
- }))
- _loginsubmit(0)
- }
- }
- }
-}
\ No newline at end of file
diff --git a/project-map.json b/project-map.json
deleted file mode 100644
index 9231368..0000000
--- a/project-map.json
+++ /dev/null
@@ -1 +0,0 @@
-{"同济人脸识别签到系统授权库放到云上(离线版及在线版)":"C:\\Users\\admin\\Desktop\\临时项目\\tjrl","壁球馆智能系统":["C:\\Users\\admin\\go\\src\\git.ouxuan.net\\3136352472\\ouxuanac"]}
\ No newline at end of file
diff --git a/renderer.js b/renderer.js
deleted file mode 100644
index d3bdade..0000000
--- a/renderer.js
+++ /dev/null
@@ -1,6 +0,0 @@
-// This file is required by the index.html file and will
-// be executed in the renderer process for that window.
-// No Node.js APIs are available in this process because
-// `nodeIntegration` is turned off. Use `preload.js` to
-// selectively enable features needed in the rendering
-// process.
diff --git a/res/jquery.ba-bbq.min.js b/res/jquery.ba-bbq.min.js
deleted file mode 100644
index bcbf248..0000000
--- a/res/jquery.ba-bbq.min.js
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- * jQuery BBQ: Back Button & Query Library - v1.2.1 - 2/17/2010
- * http://benalman.com/projects/jquery-bbq-plugin/
- *
- * Copyright (c) 2010 "Cowboy" Ben Alman
- * Dual licensed under the MIT and GPL licenses.
- * http://benalman.com/about/license/
- */
-(function($,p){var i,m=Array.prototype.slice,r=decodeURIComponent,a=$.param,c,l,v,b=$.bbq=$.bbq||{},q,u,j,e=$.event.special,d="hashchange",A="querystring",D="fragment",y="elemUrlAttr",g="location",k="href",t="src",x=/^.*\?|#.*$/g,w=/^.*\#/,h,C={};function E(F){return typeof F==="string"}function B(G){var F=m.call(arguments,1);return function(){return G.apply(this,F.concat(m.call(arguments)))}}function n(F){return F.replace(/^[^#]*#?(.*)$/,"$1")}function o(F){return F.replace(/(?:^[^?#]*\?([^#]*).*$)?.*/,"$1")}function f(H,M,F,I,G){var O,L,K,N,J;if(I!==i){K=F.match(H?/^([^#]*)\#?(.*)$/:/^([^#?]*)\??([^#]*)(#?.*)/);J=K[3]||"";if(G===2&&E(I)){L=I.replace(H?w:x,"")}else{N=l(K[2]);I=E(I)?l[H?D:A](I):I;L=G===2?I:G===1?$.extend({},I,N):$.extend({},N,I);L=a(L);if(H){L=L.replace(h,r)}}O=K[1]+(H?"#":L||!K[1]?"?":"")+L+J}else{O=M(F!==i?F:p[g][k])}return O}a[A]=B(f,0,o);a[D]=c=B(f,1,n);c.noEscape=function(G){G=G||"";var F=$.map(G.split(""),encodeURIComponent);h=new RegExp(F.join("|"),"g")};c.noEscape(",/");$.deparam=l=function(I,F){var H={},G={"true":!0,"false":!1,"null":null};$.each(I.replace(/\+/g," ").split("&"),function(L,Q){var K=Q.split("="),P=r(K[0]),J,O=H,M=0,R=P.split("]["),N=R.length-1;if(/\[/.test(R[0])&&/\]$/.test(R[N])){R[N]=R[N].replace(/\]$/,"");R=R.shift().split("[").concat(R);N=R.length-1}else{N=0}if(K.length===2){J=r(K[1]);if(F){J=J&&!isNaN(J)?+J:J==="undefined"?i:G[J]!==i?G[J]:J}if(N){for(;M<=N;M++){P=R[M]===""?O.length:R[M];O=O[P]=M').hide().insertAfter("body")[0].contentWindow;q=function(){return a(n.document[c][l])};o=function(u,s){if(u!==s){var t=n.document;t.open().close();t[c].hash="#"+u}};o(a())}}m.start=function(){if(r){return}var t=a();o||p();(function s(){var v=a(),u=q(t);if(v!==t){o(t=v,u);$(i).trigger(d)}else{if(u!==t){i[c][l]=i[c][l].replace(/#.*/,"")+"#"+u}}r=setTimeout(s,$[d+"Delay"])})()};m.stop=function(){if(!n){r&&clearTimeout(r);r=0}};return m})()})(jQuery,this);
\ No newline at end of file
diff --git a/res/tray.html b/res/tray.html
new file mode 100644
index 0000000..e69de29