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