basic app window
parent
86d6aca1c9
commit
6a56a70b9c
18
bs.js
18
bs.js
|
|
@ -1,18 +0,0 @@
|
||||||
import chokidar from 'chokidar';
|
|
||||||
import cluster from 'cluster';
|
|
||||||
import { QMainWindow } from '@nodegui/nodegui';
|
|
||||||
import { watchFile } from 'fs';
|
|
||||||
import watch from 'watch';
|
|
||||||
|
|
||||||
if(cluster.isMaster) {
|
|
||||||
cluster.fork();
|
|
||||||
} else {
|
|
||||||
// chokidar.watch('test.js', {
|
|
||||||
// useFsEvents: false,
|
|
||||||
// usePolling: false,
|
|
||||||
// ""
|
|
||||||
// }).on('all', (a, b) => console.log(a, b));
|
|
||||||
watch.watchTree('out', console.log);
|
|
||||||
// watchFile('test.js', console.log)
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
import './core/items/CoreItems.js';
|
||||||
|
import './core/tasks/CoreTasks.js';
|
||||||
|
import './core/themes/standard.js';
|
||||||
12
index.html
12
index.html
|
|
@ -1,12 +0,0 @@
|
||||||
<!DOCTYPE html>
|
|
||||||
<html lang="en">
|
|
||||||
<head>
|
|
||||||
<meta charset="UTF-8">
|
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
||||||
<title>df-idle</title>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<script type="module" src="./out/index.js"></script>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
12
package.json
12
package.json
|
|
@ -1,5 +1,5 @@
|
||||||
{
|
{
|
||||||
"name": "df-idle",
|
"name": "hadean",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
|
|
@ -12,6 +12,7 @@
|
||||||
"@types/faker": "^5.5.6",
|
"@types/faker": "^5.5.6",
|
||||||
"@types/fs-extra": "^9.0.11",
|
"@types/fs-extra": "^9.0.11",
|
||||||
"@types/mocha": "^8.2.2",
|
"@types/mocha": "^8.2.2",
|
||||||
|
"@types/node-ipc": "^9.1.5",
|
||||||
"@types/uuid": "^8.3.0",
|
"@types/uuid": "^8.3.0",
|
||||||
"@types/watch": "^1.0.2",
|
"@types/watch": "^1.0.2",
|
||||||
"@types/ws": "^7.4.5",
|
"@types/ws": "^7.4.5",
|
||||||
|
|
@ -29,6 +30,7 @@
|
||||||
"module-alias": "^2.2.2",
|
"module-alias": "^2.2.2",
|
||||||
"neo-blessed": "^0.2.0",
|
"neo-blessed": "^0.2.0",
|
||||||
"node-dev": "^7.0.0",
|
"node-dev": "^7.0.0",
|
||||||
|
"node-ipc": "^10.0.2",
|
||||||
"nodemon": "^2.0.7",
|
"nodemon": "^2.0.7",
|
||||||
"printable-characters": "^1.0.42",
|
"printable-characters": "^1.0.42",
|
||||||
"sisteransi": "^1.0.5",
|
"sisteransi": "^1.0.5",
|
||||||
|
|
@ -42,14 +44,14 @@
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"compile:watch": "tsc --watch",
|
"compile:watch": "tsc --watch",
|
||||||
"start": "node --no-warnings --loader ./lib/aliases.mjs --enable-source-maps out/src/index.js",
|
"start": "yarn x out/src/index.js",
|
||||||
"dev": "nodemon -I --watch out --exec yarn start",
|
"dev": "yarn x out/src/hot-index.js",
|
||||||
"prod": "git fetch && git pull && yarn && tsc && yarn start",
|
"prod": "git fetch && git pull && yarn && tsc && yarn start",
|
||||||
"test": "mocha",
|
"test": "mocha",
|
||||||
"lint": "eslint src/**/*.ts",
|
"lint": "eslint src/**/*.ts",
|
||||||
"web": "web-dev-server --open index.html --node-resolve --watch",
|
"web": "web-dev-server --open index.html --node-resolve --watch",
|
||||||
"profile": "node --inspect-brk --no-warnings --loader ./lib/aliases.mjs --enable-source-maps out/src/index.js",
|
"profile": "node --inspect-brk --no-warnings --loader ./lib/aliases.mjs --enable-source-maps out/src/index.js",
|
||||||
"gui": "qode out/src/qt/qode.js",
|
"qx": "qode --no-warnings --loader ./lib/aliases.mjs",
|
||||||
"qode": "qode"
|
"x": "node --no-warnings --loader ./lib/aliases.mjs"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,86 +0,0 @@
|
||||||
import cluster from 'cluster';
|
|
||||||
import chokidar from 'chokidar';
|
|
||||||
import watch from 'watch';
|
|
||||||
|
|
||||||
let init: Function = null;
|
|
||||||
const hotReload = true;
|
|
||||||
let restartTimer: NodeJS.Timeout = null;
|
|
||||||
|
|
||||||
let worker: cluster.Worker = null;
|
|
||||||
function createWorker() {
|
|
||||||
start();
|
|
||||||
|
|
||||||
function start() {
|
|
||||||
if (cluster.isMaster) {
|
|
||||||
worker = cluster.fork();
|
|
||||||
// console.log(worker);
|
|
||||||
// worker.process.stdout.pipe(process.stdout);
|
|
||||||
// worker.process.stderr.pipe(process.stderr);
|
|
||||||
worker.on('message', (message) => {
|
|
||||||
if(message === 'ipc-restart') {
|
|
||||||
worker.on('exit', () => {
|
|
||||||
setTimeout(createWorker, 0);
|
|
||||||
});
|
|
||||||
worker.kill();
|
|
||||||
} else if (message === 'ipc-quit') {
|
|
||||||
worker.on('exit', () => {
|
|
||||||
process.exit(0);
|
|
||||||
})
|
|
||||||
worker.kill();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// from any cluster context, gracefully exit if needed, and begin anew!
|
|
||||||
export function restart() {
|
|
||||||
if (cluster.isWorker) {
|
|
||||||
process.send('ipc-restart');
|
|
||||||
} else if(worker) {
|
|
||||||
worker.on('exit', () => {
|
|
||||||
setTimeout(createWorker, 0);
|
|
||||||
})
|
|
||||||
worker.kill();
|
|
||||||
} else {
|
|
||||||
createWorker();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export function quit() {
|
|
||||||
if (cluster.isWorker) {
|
|
||||||
process.send('ipc-quit');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export function start() {
|
|
||||||
if(init) {
|
|
||||||
if (cluster.isWorker) {
|
|
||||||
init();
|
|
||||||
} else {
|
|
||||||
// TODO make hotreload actually bring a popup on the client
|
|
||||||
// so that the user should press enter to enable a reload.
|
|
||||||
if(hotReload) {
|
|
||||||
function fileChange(f: watch.FileOrFiles) {
|
|
||||||
console.log('changes detected');
|
|
||||||
// appendFileSync('log.log', evt + ' ' + path + '\n');
|
|
||||||
// console.log(cluster.isMaster, evt, path);
|
|
||||||
if(restartTimer) clearTimeout(restartTimer)
|
|
||||||
restartTimer = setTimeout(() => {
|
|
||||||
restart();
|
|
||||||
restartTimer = null;
|
|
||||||
}, 1000);
|
|
||||||
}
|
|
||||||
// chokidar.watch('./out').on('all', fileChange);
|
|
||||||
watch.watchTree('./out', fileChange);
|
|
||||||
} else {
|
|
||||||
createWorker();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
export function setInitialize(fn: Function) {
|
|
||||||
init = fn;
|
|
||||||
}
|
|
||||||
|
|
@ -0,0 +1,8 @@
|
||||||
|
export const IPC_PATH = '/tmp/dfi.dev';
|
||||||
|
export const IPC_CLIENT_APPSAPCE = 'dfi.';
|
||||||
|
export const IPC_CLIENT_CONNECT_NAME = 'dev';
|
||||||
|
|
||||||
|
export const IPC_QUIT_EVENT = 'app.quit';
|
||||||
|
export const IPC_RESTART_EVENT = 'app.restart';
|
||||||
|
|
||||||
|
export const APPLICATION_NAME = 'Hadean'
|
||||||
16
src/Game.ts
16
src/Game.ts
|
|
@ -4,19 +4,18 @@ import { Pawn } from './Pawn.js';
|
||||||
import { TaskList } from './TaskList.js';
|
import { TaskList } from './TaskList.js';
|
||||||
import { Inventory } from './Inventory.js';
|
import { Inventory } from './Inventory.js';
|
||||||
import Time, { Tickable } from './Time.js';
|
import Time, { Tickable } from './Time.js';
|
||||||
import { render, Renderable, setTitle, start, Menu } from '@ui';
|
import { setTitle, start, update } from '@ui';
|
||||||
import { ready } from './multiplayer/mDNS.js';
|
import { ready } from './multiplayer/mDNS.js';
|
||||||
import faker from 'faker';
|
import faker from 'faker';
|
||||||
import { World } from '@world';
|
import { World } from '@world';
|
||||||
|
|
||||||
let game: Game = null;
|
let game: Game = null;
|
||||||
|
|
||||||
export class Game extends Frigid implements Tickable, Renderable {
|
export class Game extends Frigid implements Tickable {
|
||||||
pawns: Pawn[] = [];
|
pawns: Pawn[] = [];
|
||||||
selected: Pawn;
|
selected: Pawn;
|
||||||
inventory: Inventory;
|
inventory: Inventory;
|
||||||
board: TaskList;
|
board: TaskList;
|
||||||
menu: Menu;
|
|
||||||
clock: Time;
|
clock: Time;
|
||||||
name: string;
|
name: string;
|
||||||
world: World;
|
world: World;
|
||||||
|
|
@ -32,7 +31,7 @@ export class Game extends Frigid implements Tickable, Renderable {
|
||||||
for(const pawn of this.pawns) {
|
for(const pawn of this.pawns) {
|
||||||
pawn.tick();
|
pawn.tick();
|
||||||
}
|
}
|
||||||
render();
|
update();
|
||||||
}
|
}
|
||||||
|
|
||||||
get inv() { return this.inventory; }
|
get inv() { return this.inventory; }
|
||||||
|
|
@ -61,7 +60,6 @@ export class Game extends Frigid implements Tickable, Renderable {
|
||||||
this.world ??= new World();
|
this.world ??= new World();
|
||||||
this.pawns ??= [];
|
this.pawns ??= [];
|
||||||
this.selected ??= this.pawns[0] || null;
|
this.selected ??= this.pawns[0] || null;
|
||||||
this.menu = new Menu();
|
|
||||||
this.board ??= new TaskList();
|
this.board ??= new TaskList();
|
||||||
this.inventory ??= new Inventory();
|
this.inventory ??= new Inventory();
|
||||||
this.inventory.validate();
|
this.inventory.validate();
|
||||||
|
|
@ -69,17 +67,9 @@ export class Game extends Frigid implements Tickable, Renderable {
|
||||||
this.clock.thing = this;
|
this.clock.thing = this;
|
||||||
this.clock.start();
|
this.clock.start();
|
||||||
ready(this.name);
|
ready(this.name);
|
||||||
render(this);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static serializationDependencies() {
|
static serializationDependencies() {
|
||||||
return [ Pawn, Inventory, TaskList, Time, World ];
|
return [ Pawn, Inventory, TaskList, Time, World ];
|
||||||
}
|
}
|
||||||
|
|
||||||
render() {
|
|
||||||
this.menu.render();
|
|
||||||
this.board.render();
|
|
||||||
// TODO this logic dont make sense
|
|
||||||
return '';
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
@ -1,9 +1,9 @@
|
||||||
import { Serializable } from 'frigid';
|
import { Serializable } from 'frigid';
|
||||||
import { Game } from './Game.js';
|
import { Game } from './Game.js';
|
||||||
import { Item, ItemState } from './registries/Items.js';
|
import { Item, ItemState } from './registries/Items.js';
|
||||||
import { Renderable, Popup } from '@ui';
|
import { Popup } from '@ui';
|
||||||
|
|
||||||
export class Inventory extends Serializable implements Renderable {
|
export class Inventory extends Serializable {
|
||||||
items: ItemState<any>[];
|
items: ItemState<any>[];
|
||||||
|
|
||||||
ctor() {
|
ctor() {
|
||||||
|
|
|
||||||
40
src/Pawn.ts
40
src/Pawn.ts
|
|
@ -3,13 +3,13 @@ import faker from 'faker';
|
||||||
import { Task, TaskState } from './registries/Tasks.js';
|
import { Task, TaskState } from './registries/Tasks.js';
|
||||||
import Time, { Tickable } from './Time.js';
|
import Time, { Tickable } from './Time.js';
|
||||||
import { Game } from './Game.js';
|
import { Game } from './Game.js';
|
||||||
import { render, Renderable, RenderMode } from '@ui';
|
// import { render, Renderable, RenderMode } from '@ui';
|
||||||
import { Memory } from './Memory.js';
|
import { Memory } from './Memory.js';
|
||||||
import { getTheme } from '@themes';
|
import { getTheme } from '@themes';
|
||||||
|
|
||||||
// TODO add stats getter to return % of all stats
|
// TODO add stats getter to return % of all stats
|
||||||
|
|
||||||
export class Pawn extends Serializable implements Tickable, Renderable {
|
export class Pawn extends Serializable implements Tickable {
|
||||||
name: {
|
name: {
|
||||||
first: string,
|
first: string,
|
||||||
last: string
|
last: string
|
||||||
|
|
@ -80,25 +80,25 @@ export class Pawn extends Serializable implements Tickable, Renderable {
|
||||||
return [TaskState]
|
return [TaskState]
|
||||||
}
|
}
|
||||||
|
|
||||||
toString() {
|
// toString() {
|
||||||
return this.render(RenderMode.ONELINE);
|
// return this.render(RenderMode.ONELINE);
|
||||||
}
|
// }
|
||||||
|
|
||||||
render(mode: RenderMode): string {
|
// render(mode: RenderMode): string {
|
||||||
if(mode === RenderMode.ONELINE) {
|
// if(mode === RenderMode.ONELINE) {
|
||||||
if(this.name) {
|
// if(this.name) {
|
||||||
return this.name.first + ' ' + this.name.last;
|
// return this.name.first + ' ' + this.name.last;
|
||||||
} else {
|
// } else {
|
||||||
return '[Object Pawn]';
|
// return '[Object Pawn]';
|
||||||
}
|
// }
|
||||||
} else if (mode === RenderMode.DETAILS) {
|
// } else if (mode === RenderMode.DETAILS) {
|
||||||
return `${
|
// return `${
|
||||||
this.toString()
|
// this.toString()
|
||||||
}{|}${
|
// }{|}${
|
||||||
this.status
|
// this.status
|
||||||
}\nDETAILS\nDETAILS`
|
// }\nDETAILS\nDETAILS`
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
}
|
}
|
||||||
|
|
||||||
// const task =
|
// const task =
|
||||||
|
|
@ -0,0 +1,34 @@
|
||||||
|
import ipc from 'node-ipc';
|
||||||
|
import {
|
||||||
|
IPC_CLIENT_CONNECT_NAME,
|
||||||
|
IPC_CLIENT_APPSAPCE,
|
||||||
|
IPC_QUIT_EVENT,
|
||||||
|
IPC_RESTART_EVENT
|
||||||
|
} from './Constants.js';
|
||||||
|
|
||||||
|
const name = IPC_CLIENT_CONNECT_NAME;
|
||||||
|
ipc.config.appspace = IPC_CLIENT_APPSAPCE;
|
||||||
|
ipc.config.silent = true;
|
||||||
|
|
||||||
|
let connected = false;
|
||||||
|
|
||||||
|
ipc.connectTo(name, () => {
|
||||||
|
ipc.of[name].on('connect', () => connected = true);
|
||||||
|
ipc.of[name].on('disconnect', () => connected = false);
|
||||||
|
});
|
||||||
|
|
||||||
|
export function quit() {
|
||||||
|
if (connected) {
|
||||||
|
ipc.of[name].emit(IPC_QUIT_EVENT);
|
||||||
|
} else {
|
||||||
|
process.exit(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export function restart() {
|
||||||
|
if (connected) {
|
||||||
|
ipc.of[name].emit(IPC_RESTART_EVENT);
|
||||||
|
} else {
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,9 +1,8 @@
|
||||||
import { getTheme } from '@themes';
|
import { getTheme } from '@themes';
|
||||||
import { Serializable } from 'frigid';
|
import { Serializable } from 'frigid';
|
||||||
import { Task, TaskState } from './registries/Tasks.js';
|
import { Task, TaskState } from './registries/Tasks.js';
|
||||||
import { render, Renderable, panels } from '@ui';
|
|
||||||
|
|
||||||
export class TaskList extends Serializable implements Renderable {
|
export class TaskList extends Serializable {
|
||||||
tasks: TaskState<unknown, unknown>[] = [];
|
tasks: TaskState<unknown, unknown>[] = [];
|
||||||
|
|
||||||
clear() {
|
clear() {
|
||||||
|
|
@ -34,13 +33,11 @@ export class TaskList extends Serializable implements Renderable {
|
||||||
}
|
}
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
// const width = tasksPanel.width;
|
// panels.left.setContent(`${this.tasks.map(task => `${
|
||||||
panels.left.setContent(`${this.tasks.map(task => `${
|
// getTheme().normal(task.toString())
|
||||||
getTheme().normal(task.toString())
|
// } ${
|
||||||
} ${
|
// getTheme().dimmed(task.worker?.toString() ?? '')
|
||||||
getTheme().dimmed(task.worker?.toString() ?? '')
|
// }`).join('\n')}`);
|
||||||
}`).join('\n')}`);
|
// return '';
|
||||||
return '';
|
|
||||||
// return this.tasks.map(task => task.toString()).join('\n');
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1,7 +1,6 @@
|
||||||
import chalk from "chalk";
|
import chalk from "chalk";
|
||||||
import { Serializable } from "frigid";
|
import { Serializable } from "frigid";
|
||||||
import { getTheme } from "@themes";
|
import { getTheme } from "@themes";
|
||||||
import { Renderable } from "@ui";
|
|
||||||
|
|
||||||
type AbbreviatedMonthName = string;
|
type AbbreviatedMonthName = string;
|
||||||
|
|
||||||
|
|
@ -19,7 +18,7 @@ const months: AbbreviatedMonthName[] = [
|
||||||
'Oct', 'Nov', 'Dec'
|
'Oct', 'Nov', 'Dec'
|
||||||
]
|
]
|
||||||
|
|
||||||
export default class Time extends Serializable implements Renderable {
|
export default class Time extends Serializable {
|
||||||
rate: number;
|
rate: number;
|
||||||
paused = true;
|
paused = true;
|
||||||
|
|
||||||
|
|
|
||||||
30
src/Util.ts
30
src/Util.ts
|
|
@ -1,7 +1,33 @@
|
||||||
|
import { lstatSync } from 'fs';
|
||||||
|
import { parse, resolve } from 'path';
|
||||||
|
import walkSync from 'walk-sync';
|
||||||
|
import { fileURLToPath } from 'url';
|
||||||
|
import { APPLICATION_NAME } from './Constants.js';
|
||||||
|
|
||||||
export function osrsNumber(x: number): string {
|
export function osrsNumber(x: number): string {
|
||||||
if(x < 10_000) return '' + x;
|
if(x < 10_000) return '' + x;
|
||||||
else if (x < 10_000_000) return Math.floor(x / 1000) + 'K';
|
else if (x < 10_000_000) return Math.floor(x / 1000) + 'K';
|
||||||
else return Math.floor(x / 1_000_000) + 'M';
|
else return Math.floor(x / 1_000_000) + 'M';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export async function loadExtensions() {
|
||||||
|
console.log(APPLICATION_NAME + ': Loading extensions');
|
||||||
|
const extensionsPath = resolve(parse(fileURLToPath(import.meta.url)).dir, '../content');
|
||||||
|
|
||||||
|
const extensions = walkSync(extensionsPath)
|
||||||
|
.map(path => [path, resolve(extensionsPath, path)])
|
||||||
|
.filter(path => lstatSync(path[1]).isFile())
|
||||||
|
.filter(path => parse(path[1]).ext === '.js');
|
||||||
|
|
||||||
|
console.log('found', extensions.length, 'extensions');
|
||||||
|
|
||||||
|
for (const path of extensions) {
|
||||||
|
console.log('=== [', path[0], '] ===');
|
||||||
|
await import(path[1]);
|
||||||
|
console.log();
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log('Setup Complete.');
|
||||||
|
}
|
||||||
|
|
||||||
|
// export function
|
||||||
|
|
@ -0,0 +1,76 @@
|
||||||
|
import ipc from 'node-ipc';
|
||||||
|
import {
|
||||||
|
IPC_PATH,
|
||||||
|
IPC_QUIT_EVENT,
|
||||||
|
IPC_RESTART_EVENT
|
||||||
|
} from './Constants.js';
|
||||||
|
import { spawn, ChildProcess } from 'child_process';
|
||||||
|
import watch from 'watch';
|
||||||
|
|
||||||
|
ipc.config.silent = true;
|
||||||
|
|
||||||
|
const exec = 'qode';
|
||||||
|
const args = [
|
||||||
|
...process.execArgv,
|
||||||
|
'out/src/index.js'
|
||||||
|
]
|
||||||
|
|
||||||
|
ipc.serve(IPC_PATH, () => {
|
||||||
|
ipc.server.on(IPC_QUIT_EVENT, async () => {
|
||||||
|
await killProcess();
|
||||||
|
ipc.server.stop();
|
||||||
|
process.exit(0);
|
||||||
|
});
|
||||||
|
ipc.server.on(IPC_RESTART_EVENT, restart)
|
||||||
|
});
|
||||||
|
|
||||||
|
ipc.server.start();
|
||||||
|
|
||||||
|
let proc: ChildProcess = null;
|
||||||
|
|
||||||
|
function startProcess() {
|
||||||
|
console.log('starting process...');
|
||||||
|
proc = spawn(exec, args, {
|
||||||
|
stdio: 'inherit'
|
||||||
|
});
|
||||||
|
proc.on('exit', () => {
|
||||||
|
console.log('process died');
|
||||||
|
proc = null;
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
async function killProcess() {
|
||||||
|
if(proc) {
|
||||||
|
console.log('killing process...');
|
||||||
|
const killedPromise = new Promise((res) => {
|
||||||
|
proc.on('exit', () => {
|
||||||
|
res(void 0);
|
||||||
|
})
|
||||||
|
})
|
||||||
|
proc.kill();
|
||||||
|
await killedPromise;
|
||||||
|
proc = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function restart() {
|
||||||
|
await killProcess();
|
||||||
|
startProcess();
|
||||||
|
}
|
||||||
|
|
||||||
|
startProcess();
|
||||||
|
|
||||||
|
let restartTimer: NodeJS.Timeout = null;
|
||||||
|
|
||||||
|
function fileChange() {
|
||||||
|
console.log('changes detected');
|
||||||
|
// appendFileSync('log.log', evt + ' ' + path + '\n');
|
||||||
|
// console.log(cluster.isMaster, evt, path);
|
||||||
|
if(restartTimer) clearTimeout(restartTimer)
|
||||||
|
restartTimer = setTimeout(() => {
|
||||||
|
restart();
|
||||||
|
restartTimer = null;
|
||||||
|
}, 1000);
|
||||||
|
}
|
||||||
|
// chokidar.watch('./out').on('all', fileChange);
|
||||||
|
watch.watchTree('./out', fileChange);
|
||||||
122
src/index.ts
122
src/index.ts
|
|
@ -1,74 +1,58 @@
|
||||||
import { ensureDirSync } from 'fs-extra';
|
import { ensureDirSync } from 'fs-extra';
|
||||||
import { appendFileSync, lstatSync } from 'fs';
|
import { parse } from 'path';
|
||||||
import { parse, resolve } from 'path';
|
|
||||||
import walkSync from 'walk-sync';
|
|
||||||
import { fileURLToPath } from 'url';
|
|
||||||
import { Game } from '@game';
|
import { Game } from '@game';
|
||||||
import { isStarted, stop, render } from '@ui';
|
import {
|
||||||
import { writeFileSync } from 'fs';
|
isStarted,
|
||||||
|
stop,
|
||||||
|
update,
|
||||||
|
GameView,
|
||||||
|
setView,
|
||||||
|
start
|
||||||
|
} from '@ui';
|
||||||
import ansi from 'sisteransi';
|
import ansi from 'sisteransi';
|
||||||
import cluster from 'cluster';
|
|
||||||
if(cluster.isMaster) cluster.setupMaster();
|
|
||||||
import { setInitialize, start } from './Clustering.js';
|
|
||||||
|
|
||||||
setInitialize(begin);
|
// HACK static extension loading
|
||||||
|
import './../content/content.js';
|
||||||
|
import { loadExtensions } from './Util.js';
|
||||||
|
import { APPLICATION_NAME } from './Constants.js';
|
||||||
|
|
||||||
|
// console.clear();
|
||||||
|
|
||||||
|
function gracefulShutdown() {
|
||||||
|
if (isStarted()) {
|
||||||
|
stop();
|
||||||
|
}
|
||||||
|
console.log('shutting down gracefully...');
|
||||||
|
if (Game.current) {
|
||||||
|
console.log('saving world...');
|
||||||
|
Game.current.sync();
|
||||||
|
}
|
||||||
|
console.log('exitting');
|
||||||
|
process.stdout.write(ansi.cursor.show);
|
||||||
|
|
||||||
|
process.exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
process.on('exit', gracefulShutdown);
|
||||||
|
|
||||||
|
const saveFile = process.argv[2] || 'data/world01.json';
|
||||||
|
|
||||||
|
ensureDirSync(parse(saveFile).dir);
|
||||||
|
|
||||||
|
// loadExtensions();
|
||||||
|
|
||||||
|
for (let seconds = 0; seconds > 0; seconds--) {
|
||||||
|
process.stdout.write('Starting ' + APPLICATION_NAME + ' in ' + seconds + '\r');
|
||||||
|
await new Promise(res => setTimeout(res, 1000));
|
||||||
|
}
|
||||||
|
process.stdout.write('Starting ' + APPLICATION_NAME + ' in ' + 0 + '\n');
|
||||||
|
// console.clear();
|
||||||
|
|
||||||
|
// TODO move render logic into game, so that the ui doesnt exist until the game does...
|
||||||
|
// maybe, i mean, an argument could be made for not that, because the game
|
||||||
|
// isnt necessarily the entire thing, its just one instance of a save file.
|
||||||
|
// But probably the initial menu screens will be their own thing entirely.
|
||||||
|
const game = Game.create(saveFile);
|
||||||
start();
|
start();
|
||||||
|
const gameView = new GameView(game);
|
||||||
async function begin() {
|
setView(gameView);
|
||||||
console.clear();
|
|
||||||
|
|
||||||
function gracefulShutdown() {
|
|
||||||
if (isStarted()) {
|
|
||||||
stop();
|
|
||||||
}
|
|
||||||
console.log('shutting down gracefully...');
|
|
||||||
if (Game.current) {
|
|
||||||
console.log('saving world...');
|
|
||||||
Game.current.sync();
|
|
||||||
}
|
|
||||||
console.log('exitting');
|
|
||||||
process.stdout.write(ansi.cursor.show);
|
|
||||||
|
|
||||||
process.exit(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
process.on('exit', gracefulShutdown);
|
|
||||||
|
|
||||||
const saveFile = process.argv[2] || 'data/world01.json';
|
|
||||||
|
|
||||||
ensureDirSync(parse(saveFile).dir);
|
|
||||||
|
|
||||||
|
|
||||||
// TODO extract extension loading into separate file
|
|
||||||
console.log('df-idle: Loading extensions');
|
|
||||||
const extensionsPath = resolve(parse(fileURLToPath(import.meta.url)).dir, '../content');
|
|
||||||
|
|
||||||
const extensions = walkSync(extensionsPath)
|
|
||||||
.map(path => [path, resolve(extensionsPath, path)])
|
|
||||||
.filter(path => lstatSync(path[1]).isFile())
|
|
||||||
.filter(path => parse(path[1]).ext === '.js');
|
|
||||||
|
|
||||||
console.log('found', extensions.length, 'extensions');
|
|
||||||
|
|
||||||
for (const path of extensions) {
|
|
||||||
console.log('=== [', path[0], '] ===');
|
|
||||||
await import(path[1]);
|
|
||||||
console.log();
|
|
||||||
}
|
|
||||||
|
|
||||||
console.log('Setup Complete.');
|
|
||||||
|
|
||||||
|
|
||||||
for (let seconds = 2; seconds > 0; seconds--) {
|
|
||||||
process.stdout.write('Starting DF-Idle in ' + seconds + '\r');
|
|
||||||
await new Promise(res => setTimeout(res, 1000));
|
|
||||||
}
|
|
||||||
console.clear();
|
|
||||||
|
|
||||||
// TODO move render logic into game, so that the ui doesnt exist until the game does...
|
|
||||||
// maybe, i mean, an argument could be made for not that, because the game
|
|
||||||
// isnt necessarily the entire thing, its just one instance of a save file.
|
|
||||||
// But probably the initial menu screens will be their own thing entirely.
|
|
||||||
const game = Game.create(saveFile);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,38 @@
|
||||||
|
import { Game } from '@game';
|
||||||
|
import { QLabel, QWidget } from '@nodegui/nodegui';
|
||||||
|
import { View } from './View.js';
|
||||||
|
|
||||||
|
// 40x30
|
||||||
|
const w = 40;
|
||||||
|
const h = 30;
|
||||||
|
export class GameView extends View {
|
||||||
|
game: Game;
|
||||||
|
title: QLabel;
|
||||||
|
left: QWidget;
|
||||||
|
right: QWidget;
|
||||||
|
|
||||||
|
addComponents(): void {
|
||||||
|
this.addLayout();
|
||||||
|
|
||||||
|
this.title = new QLabel();
|
||||||
|
this.left = new QWidget();
|
||||||
|
this.right = new QWidget();
|
||||||
|
|
||||||
|
this.title.setText(this.game.name);
|
||||||
|
|
||||||
|
this.left.setInlineStyle('border: 1px solid white;')
|
||||||
|
this.right.setInlineStyle('border: 1px solid white;')
|
||||||
|
|
||||||
|
// this.layout.addWidget(this.left, 1, 0, 29, 20);
|
||||||
|
// this.layout.addWidget(this.right, 1, 21, 29, 20);
|
||||||
|
|
||||||
|
this.layout.addWidget(this.title, 0, 0, 1, w);
|
||||||
|
this.layout.addWidget(this.left, 1, 0, h - 1, w / 2);
|
||||||
|
this.layout.addWidget(this.right, 1, w / 2, h - 1, w / 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
constructor(game: Game) {
|
||||||
|
super();
|
||||||
|
this.game = game;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,18 @@
|
||||||
|
import { QGridLayout, QLabel, QWidget } from "@nodegui/nodegui";
|
||||||
|
import { View } from "./View.js";
|
||||||
|
|
||||||
|
export class LoadingView extends View {
|
||||||
|
label: QLabel;
|
||||||
|
|
||||||
|
addComponents(): void {
|
||||||
|
this.addLayout();
|
||||||
|
|
||||||
|
this.label = new QLabel();
|
||||||
|
this.label.setText('Loading World...');
|
||||||
|
this.layout.addWidget(this.label);
|
||||||
|
}
|
||||||
|
|
||||||
|
destory() {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,5 @@
|
||||||
|
export class Popup {
|
||||||
|
static show(content: string) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,18 @@
|
||||||
|
import { QGridLayout, QMainWindow, QWidget } from "@nodegui/nodegui";
|
||||||
|
import { win } from "@ui";
|
||||||
|
|
||||||
|
export abstract class View {
|
||||||
|
root: QWidget;
|
||||||
|
layout: QGridLayout;
|
||||||
|
|
||||||
|
addLayout() {
|
||||||
|
this.root = new QWidget();
|
||||||
|
this.root.setObjectName("root");
|
||||||
|
win.setCentralWidget(this.root);
|
||||||
|
|
||||||
|
this.layout = new QGridLayout();
|
||||||
|
this.root.setLayout(this.layout);
|
||||||
|
}
|
||||||
|
|
||||||
|
abstract addComponents(): void;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,74 @@
|
||||||
|
import {
|
||||||
|
QMainWindow, WidgetEventTypes
|
||||||
|
} from '@nodegui/nodegui';
|
||||||
|
import { APPLICATION_NAME } from '../Constants.js';
|
||||||
|
import { LoadingView } from './LoadingView.js';
|
||||||
|
import { View } from './View.js';
|
||||||
|
export { GameView } from './GameView.js';
|
||||||
|
export { Popup } from './Popup.js';
|
||||||
|
|
||||||
|
export const win = new QMainWindow();
|
||||||
|
win.setFixedSize(800, 600);
|
||||||
|
win.setWindowTitle(APPLICATION_NAME);
|
||||||
|
win.setStyleSheet(`
|
||||||
|
#root {
|
||||||
|
background-color: black;
|
||||||
|
height: '100%';
|
||||||
|
}
|
||||||
|
QPushButton {
|
||||||
|
background: #333333;
|
||||||
|
}
|
||||||
|
QPushButton:pressed {
|
||||||
|
background: cyan;
|
||||||
|
color: black;
|
||||||
|
}
|
||||||
|
* {
|
||||||
|
font-family: 'MxPlus IBM VGA 8x16';
|
||||||
|
font-size: 16px;
|
||||||
|
}
|
||||||
|
`);
|
||||||
|
win.show();
|
||||||
|
(global as any).win = win;
|
||||||
|
win.addEventListener(WidgetEventTypes.Paint, _ => _);
|
||||||
|
win.addEventListener(WidgetEventTypes.UpdateRequest, () => {
|
||||||
|
console.log('sdfghj');
|
||||||
|
});
|
||||||
|
win.addEventListener('customContextMenuRequested', console.log)
|
||||||
|
win.addEventListener('objectNameChanged', console.log)
|
||||||
|
win.addEventListener('windowIconChanged', console.log)
|
||||||
|
win.addEventListener('windowTitleChanged', console.log)
|
||||||
|
|
||||||
|
setView(new LoadingView());
|
||||||
|
|
||||||
|
export function start() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
export function stop() {
|
||||||
|
win.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
export function setView(view: View) {
|
||||||
|
view.addComponents();
|
||||||
|
}
|
||||||
|
|
||||||
|
export function setTitle(title: string) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
export function update() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
export function isStarted() {
|
||||||
|
return win.isVisible();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// HACK this is bullshit, :)
|
||||||
|
function f() {
|
||||||
|
win.repaint();
|
||||||
|
win.update();
|
||||||
|
setTimeout(f, 100);
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
|
@ -1,54 +0,0 @@
|
||||||
|
|
||||||
import {
|
|
||||||
QMainWindow,
|
|
||||||
QWidget,
|
|
||||||
QGridLayout,
|
|
||||||
QPushButton
|
|
||||||
} from '@nodegui/nodegui';
|
|
||||||
import chokidar from 'chokidar';
|
|
||||||
|
|
||||||
import cluster from 'cluster';
|
|
||||||
import { watchFile } from 'fs';
|
|
||||||
if (cluster.isMaster) cluster.setupMaster();
|
|
||||||
import { setInitialize, start } from '../Clustering.js';
|
|
||||||
|
|
||||||
|
|
||||||
setInitialize(() => {
|
|
||||||
|
|
||||||
const win = new QMainWindow();
|
|
||||||
win.setFixedSize(800, 600);
|
|
||||||
win.setWindowTitle("Hello World");
|
|
||||||
const centralWidget = new QWidget();
|
|
||||||
centralWidget.setObjectName("myroot");
|
|
||||||
win.setCentralWidget(centralWidget);
|
|
||||||
const rootLayout = new QGridLayout();
|
|
||||||
// rootLayout.addWidget
|
|
||||||
|
|
||||||
centralWidget.setLayout(rootLayout);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
const button = new QPushButton();
|
|
||||||
button.setText('Testing Font Family');
|
|
||||||
rootLayout.addWidget(button);
|
|
||||||
|
|
||||||
win.setStyleSheet(`
|
|
||||||
#myroot {
|
|
||||||
background-color: black;
|
|
||||||
height: '100%';
|
|
||||||
}
|
|
||||||
QPushButton {
|
|
||||||
background: #333333;
|
|
||||||
}
|
|
||||||
QPushButton:pressed {
|
|
||||||
background: cyan;
|
|
||||||
color: black;
|
|
||||||
}
|
|
||||||
* {
|
|
||||||
font-family: 'MxPlus IBM VGA 8x16';
|
|
||||||
font-size: 16px;
|
|
||||||
}
|
|
||||||
`);
|
|
||||||
win.show();
|
|
||||||
});
|
|
||||||
start();
|
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
import { Serializable } from 'frigid';
|
import { Serializable } from 'frigid';
|
||||||
import { getTheme } from '@themes';
|
import { getTheme } from '@themes';
|
||||||
import { Renderable } from '@ui';
|
|
||||||
import { osrsNumber } from '../Util.js';
|
import { osrsNumber } from '../Util.js';
|
||||||
|
|
||||||
export type ItemID = string;
|
export type ItemID = string;
|
||||||
|
|
@ -53,7 +52,7 @@ export class Item<Data = any> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export class ItemState<Data> extends Serializable implements Renderable {
|
export class ItemState<Data> extends Serializable {
|
||||||
qty: number;
|
qty: number;
|
||||||
itemId: ItemID;
|
itemId: ItemID;
|
||||||
data: Data;
|
data: Data;
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@ import { Game } from "@game";
|
||||||
import { boxStyle, getTheme } from "@themes";
|
import { boxStyle, getTheme } from "@themes";
|
||||||
import { panels } from "./UI.js";
|
import { panels } from "./UI.js";
|
||||||
import blessed from 'neo-blessed';
|
import blessed from 'neo-blessed';
|
||||||
import { quit, restart } from "../Clustering.js";
|
import { quit, restart } from "../ProcessManager.js";
|
||||||
|
|
||||||
// TODO convert all these popup-y things to be View based
|
// TODO convert all these popup-y things to be View based
|
||||||
// make them be boxes that have a view
|
// make them be boxes that have a view
|
||||||
|
|
|
||||||
15
test.js
15
test.js
|
|
@ -1,15 +0,0 @@
|
||||||
// test
|
|
||||||
//asdf
|
|
||||||
|
|
||||||
//asdasd
|
|
||||||
|
|
||||||
/changes?
|
|
||||||
|
|
||||||
sdfasfd
|
|
||||||
|
|
||||||
fdsd
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
hddhfbgdfkljfkfdskljkdlkjdlfkjs
|
|
||||||
|
|
@ -13,7 +13,7 @@
|
||||||
"@tasks": ["./src/registries/Tasks"],
|
"@tasks": ["./src/registries/Tasks"],
|
||||||
"@items": ["./src/registries/Items"],
|
"@items": ["./src/registries/Items"],
|
||||||
"@world": ["./src/World"],
|
"@world": ["./src/World"],
|
||||||
"@ui": ["./src/qt/index.js"],
|
"@ui": ["./src/qt/index"],
|
||||||
"@game": ["./src/Game"]
|
"@game": ["./src/Game"]
|
||||||
},
|
},
|
||||||
"noImplicitAny": true
|
"noImplicitAny": true
|
||||||
|
|
|
||||||
102
yarn.lock
102
yarn.lock
|
|
@ -250,6 +250,13 @@
|
||||||
resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-8.2.2.tgz#91daa226eb8c2ff261e6a8cbf8c7304641e095e0"
|
resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-8.2.2.tgz#91daa226eb8c2ff261e6a8cbf8c7304641e095e0"
|
||||||
integrity sha512-Lwh0lzzqT5Pqh6z61P3c3P5nm6fzQK/MMHl9UKeneAeInVflBSz1O2EkX6gM6xfJd7FBXBY5purtLx7fUiZ7Hw==
|
integrity sha512-Lwh0lzzqT5Pqh6z61P3c3P5nm6fzQK/MMHl9UKeneAeInVflBSz1O2EkX6gM6xfJd7FBXBY5purtLx7fUiZ7Hw==
|
||||||
|
|
||||||
|
"@types/node-ipc@^9.1.5":
|
||||||
|
version "9.1.5"
|
||||||
|
resolved "https://registry.yarnpkg.com/@types/node-ipc/-/node-ipc-9.1.5.tgz#0f9dac03fe6c96b6ff379725faf20d8a97eb00fa"
|
||||||
|
integrity sha512-xxYUVj/Y8fNkxQlvndVeWlL99wAF4KwISsRy21RSAAT/SKyrh+X3/BZXHcM/ZJPNri9h1JWw58wDKT1zr2pXVw==
|
||||||
|
dependencies:
|
||||||
|
"@types/node" "*"
|
||||||
|
|
||||||
"@types/node@*":
|
"@types/node@*":
|
||||||
version "15.12.2"
|
version "15.12.2"
|
||||||
resolved "https://registry.npmjs.org/@types/node/-/node-15.12.2.tgz"
|
resolved "https://registry.npmjs.org/@types/node/-/node-15.12.2.tgz"
|
||||||
|
|
@ -885,6 +892,19 @@ cookies@~0.8.0:
|
||||||
depd "~2.0.0"
|
depd "~2.0.0"
|
||||||
keygrip "~1.1.0"
|
keygrip "~1.1.0"
|
||||||
|
|
||||||
|
copyfiles@^2.4.0:
|
||||||
|
version "2.4.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/copyfiles/-/copyfiles-2.4.1.tgz#d2dcff60aaad1015f09d0b66e7f0f1c5cd3c5da5"
|
||||||
|
integrity sha512-fereAvAvxDrQDOXybk3Qu3dPbOoKoysFMWtkY3mv5BsL8//OSZVL5DCLYqgRfY5cWirgRzlC+WSrxp6Bo3eNZg==
|
||||||
|
dependencies:
|
||||||
|
glob "^7.0.5"
|
||||||
|
minimatch "^3.0.3"
|
||||||
|
mkdirp "^1.0.4"
|
||||||
|
noms "0.0.0"
|
||||||
|
through2 "^2.0.1"
|
||||||
|
untildify "^4.0.0"
|
||||||
|
yargs "^16.1.0"
|
||||||
|
|
||||||
core-util-is@~1.0.0:
|
core-util-is@~1.0.0:
|
||||||
version "1.0.2"
|
version "1.0.2"
|
||||||
resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
|
resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
|
||||||
|
|
@ -1095,6 +1115,11 @@ dynamic-dedupe@^0.3.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
xtend "^4.0.0"
|
xtend "^4.0.0"
|
||||||
|
|
||||||
|
easy-stack@^1.0.1:
|
||||||
|
version "1.0.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/easy-stack/-/easy-stack-1.0.1.tgz#8afe4264626988cabb11f3c704ccd0c835411066"
|
||||||
|
integrity sha512-wK2sCs4feiiJeFXn3zvY0p41mdU5VUgbgs1rNsc/y5ngFUijdWd+iIN8eoyuZHKB8xN6BL4PdWmzqFmxNg6V2w==
|
||||||
|
|
||||||
ee-first@1.1.1:
|
ee-first@1.1.1:
|
||||||
version "1.1.1"
|
version "1.1.1"
|
||||||
resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
|
resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
|
||||||
|
|
@ -1172,6 +1197,14 @@ etag@^1.8.1:
|
||||||
resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
|
resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
|
||||||
integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=
|
integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=
|
||||||
|
|
||||||
|
event-pubsub@5.0.3:
|
||||||
|
version "5.0.3"
|
||||||
|
resolved "https://registry.yarnpkg.com/event-pubsub/-/event-pubsub-5.0.3.tgz#ce2855b2c1ef4abb139e482f09146f61d4b712c3"
|
||||||
|
integrity sha512-2QiHxshejKgJrYMzSI9MEHrvhmzxBL+eLyiM5IiyjDBySkgwS2+tdtnO3gbx8pEisu/yOFCIhfCb63gCEu0yBQ==
|
||||||
|
dependencies:
|
||||||
|
copyfiles "^2.4.0"
|
||||||
|
strong-type "^0.1.3"
|
||||||
|
|
||||||
exec-sh@^0.2.0:
|
exec-sh@^0.2.0:
|
||||||
version "0.2.2"
|
version "0.2.2"
|
||||||
resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.2.2.tgz#2a5e7ffcbd7d0ba2755bdecb16e5a427dfbdec36"
|
resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.2.2.tgz#2a5e7ffcbd7d0ba2755bdecb16e5a427dfbdec36"
|
||||||
|
|
@ -1347,7 +1380,7 @@ glob-parent@~5.1.0, glob-parent@~5.1.2:
|
||||||
dependencies:
|
dependencies:
|
||||||
is-glob "^4.0.1"
|
is-glob "^4.0.1"
|
||||||
|
|
||||||
glob@7.1.7, glob@^7.1.3:
|
glob@7.1.7, glob@^7.0.5, glob@^7.1.3:
|
||||||
version "7.1.7"
|
version "7.1.7"
|
||||||
resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90"
|
resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90"
|
||||||
integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==
|
integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==
|
||||||
|
|
@ -1500,7 +1533,7 @@ inflight@^1.0.4:
|
||||||
once "^1.3.0"
|
once "^1.3.0"
|
||||||
wrappy "1"
|
wrappy "1"
|
||||||
|
|
||||||
inherits@2, inherits@2.0.4, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3:
|
inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3:
|
||||||
version "2.0.4"
|
version "2.0.4"
|
||||||
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
|
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
|
||||||
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
|
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
|
||||||
|
|
@ -1696,6 +1729,18 @@ isexe@^2.0.0:
|
||||||
resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
|
resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
|
||||||
integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=
|
integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=
|
||||||
|
|
||||||
|
js-message@1.0.7:
|
||||||
|
version "1.0.7"
|
||||||
|
resolved "https://registry.yarnpkg.com/js-message/-/js-message-1.0.7.tgz#fbddd053c7a47021871bb8b2c95397cc17c20e47"
|
||||||
|
integrity sha512-efJLHhLjIyKRewNS9EGZ4UpI8NguuL6fKkhRxVuMmrGV2xN/0APGdQYwLFky5w9naebSZ0OwAGp0G6/2Cg90rA==
|
||||||
|
|
||||||
|
js-queue@2.0.2:
|
||||||
|
version "2.0.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/js-queue/-/js-queue-2.0.2.tgz#0be590338f903b36c73d33c31883a821412cd482"
|
||||||
|
integrity sha512-pbKLsbCfi7kriM3s1J4DDCo7jQkI58zPLHi0heXPzPlj0hjUsm+FesPUbE0DSbIVIK503A36aUBoCN7eMFedkA==
|
||||||
|
dependencies:
|
||||||
|
easy-stack "^1.0.1"
|
||||||
|
|
||||||
js-tokens@^4.0.0:
|
js-tokens@^4.0.0:
|
||||||
version "4.0.0"
|
version "4.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
|
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
|
||||||
|
|
@ -1951,7 +1996,7 @@ mimic-response@^1.0.0, mimic-response@^1.0.1:
|
||||||
resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b"
|
resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b"
|
||||||
integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==
|
integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==
|
||||||
|
|
||||||
minimatch@3.0.4, minimatch@^3.0.2, minimatch@^3.0.4:
|
minimatch@3.0.4, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4:
|
||||||
version "3.0.4"
|
version "3.0.4"
|
||||||
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
|
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
|
||||||
integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==
|
integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==
|
||||||
|
|
@ -2000,7 +2045,7 @@ minizlib@^2.1.1:
|
||||||
dependencies:
|
dependencies:
|
||||||
minimist "^1.2.5"
|
minimist "^1.2.5"
|
||||||
|
|
||||||
mkdirp@^1.0.3:
|
mkdirp@^1.0.3, mkdirp@^1.0.4:
|
||||||
version "1.0.4"
|
version "1.0.4"
|
||||||
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"
|
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"
|
||||||
integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
|
integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
|
||||||
|
|
@ -2105,6 +2150,16 @@ node-fetch@^2.6.0, node-fetch@^2.6.1:
|
||||||
resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052"
|
resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052"
|
||||||
integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==
|
integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==
|
||||||
|
|
||||||
|
node-ipc@^10.0.2:
|
||||||
|
version "10.0.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/node-ipc/-/node-ipc-10.0.2.tgz#4d95affc16cef45f1675eddea26bd3b24e01ad21"
|
||||||
|
integrity sha512-YIHWoXxyAGE5HHhOpxNhcBd+6/ZwlQRB6N5ukiJR22CHhDyFlPkQl2Di/D3Eghn9AzgqiSPCdo38Nj670ELbaA==
|
||||||
|
dependencies:
|
||||||
|
event-pubsub "5.0.3"
|
||||||
|
js-message "1.0.7"
|
||||||
|
js-queue "2.0.2"
|
||||||
|
strong-type "^1.0.1"
|
||||||
|
|
||||||
node-notifier@^8.0.1:
|
node-notifier@^8.0.1:
|
||||||
version "8.0.2"
|
version "8.0.2"
|
||||||
resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-8.0.2.tgz#f3167a38ef0d2c8a866a83e318c1ba0efeb702c5"
|
resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-8.0.2.tgz#f3167a38ef0d2c8a866a83e318c1ba0efeb702c5"
|
||||||
|
|
@ -2133,6 +2188,14 @@ nodemon@^2.0.7:
|
||||||
undefsafe "^2.0.3"
|
undefsafe "^2.0.3"
|
||||||
update-notifier "^4.1.0"
|
update-notifier "^4.1.0"
|
||||||
|
|
||||||
|
noms@0.0.0:
|
||||||
|
version "0.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/noms/-/noms-0.0.0.tgz#da8ebd9f3af9d6760919b27d9cdc8092a7332859"
|
||||||
|
integrity sha1-2o69nzr51nYJGbJ9nNyAkqczKFk=
|
||||||
|
dependencies:
|
||||||
|
inherits "^2.0.1"
|
||||||
|
readable-stream "~1.0.31"
|
||||||
|
|
||||||
nopt@~1.0.10:
|
nopt@~1.0.10:
|
||||||
version "1.0.10"
|
version "1.0.10"
|
||||||
resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee"
|
resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee"
|
||||||
|
|
@ -2370,7 +2433,7 @@ rc@^1.2.7, rc@^1.2.8:
|
||||||
minimist "^1.2.0"
|
minimist "^1.2.0"
|
||||||
strip-json-comments "~2.0.1"
|
strip-json-comments "~2.0.1"
|
||||||
|
|
||||||
"readable-stream@^2.0.0 || ^1.1.13", readable-stream@^2.0.2:
|
"readable-stream@^2.0.0 || ^1.1.13", readable-stream@^2.0.2, readable-stream@~2.3.6:
|
||||||
version "2.3.7"
|
version "2.3.7"
|
||||||
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57"
|
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57"
|
||||||
integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==
|
integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==
|
||||||
|
|
@ -2383,7 +2446,7 @@ rc@^1.2.7, rc@^1.2.8:
|
||||||
string_decoder "~1.1.1"
|
string_decoder "~1.1.1"
|
||||||
util-deprecate "~1.0.1"
|
util-deprecate "~1.0.1"
|
||||||
|
|
||||||
readable-stream@~1.0.26-2:
|
readable-stream@~1.0.26-2, readable-stream@~1.0.31:
|
||||||
version "1.0.34"
|
version "1.0.34"
|
||||||
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c"
|
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c"
|
||||||
integrity sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=
|
integrity sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=
|
||||||
|
|
@ -2674,6 +2737,16 @@ strip-json-comments@~2.0.1:
|
||||||
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
|
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
|
||||||
integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo=
|
integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo=
|
||||||
|
|
||||||
|
strong-type@^0.1.3:
|
||||||
|
version "0.1.6"
|
||||||
|
resolved "https://registry.yarnpkg.com/strong-type/-/strong-type-0.1.6.tgz#663bf8dadf533ce61e42683eb6d6711e8795cf83"
|
||||||
|
integrity sha512-eJe5caH6Pi5oMMeQtIoBPpvNu/s4jiyb63u5tkHNnQXomK+puyQ5i+Z5iTLBr/xUz/pIcps0NSfzzFI34+gAXg==
|
||||||
|
|
||||||
|
strong-type@^1.0.1:
|
||||||
|
version "1.1.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/strong-type/-/strong-type-1.1.0.tgz#8ab8feb3a26c37fa389c52a04581ffb53c7d3a29"
|
||||||
|
integrity sha512-X5Z6riticuH5GnhUyzijfDi1SoXas8ODDyN7K8lJeQK+Jfi4dKdoJGL4CXTskY/ATBcN+rz5lROGn1tAUkOX7g==
|
||||||
|
|
||||||
supervisor@^0.12.0:
|
supervisor@^0.12.0:
|
||||||
version "0.12.0"
|
version "0.12.0"
|
||||||
resolved "https://registry.yarnpkg.com/supervisor/-/supervisor-0.12.0.tgz#de7e6337015b291851c10f3538c4a7f04917ecc1"
|
resolved "https://registry.yarnpkg.com/supervisor/-/supervisor-0.12.0.tgz#de7e6337015b291851c10f3538c4a7f04917ecc1"
|
||||||
|
|
@ -2746,6 +2819,14 @@ term-size@^2.1.0:
|
||||||
resolved "https://registry.yarnpkg.com/term-size/-/term-size-2.2.1.tgz#2a6a54840432c2fb6320fea0f415531e90189f54"
|
resolved "https://registry.yarnpkg.com/term-size/-/term-size-2.2.1.tgz#2a6a54840432c2fb6320fea0f415531e90189f54"
|
||||||
integrity sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==
|
integrity sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==
|
||||||
|
|
||||||
|
through2@^2.0.1:
|
||||||
|
version "2.0.5"
|
||||||
|
resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd"
|
||||||
|
integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==
|
||||||
|
dependencies:
|
||||||
|
readable-stream "~2.3.6"
|
||||||
|
xtend "~4.0.1"
|
||||||
|
|
||||||
thunky@^1.0.2:
|
thunky@^1.0.2:
|
||||||
version "1.1.0"
|
version "1.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d"
|
resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d"
|
||||||
|
|
@ -2854,6 +2935,11 @@ universalify@^2.0.0:
|
||||||
resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717"
|
resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717"
|
||||||
integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==
|
integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==
|
||||||
|
|
||||||
|
untildify@^4.0.0:
|
||||||
|
version "4.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/untildify/-/untildify-4.0.0.tgz#2bc947b953652487e4600949fb091e3ae8cd919b"
|
||||||
|
integrity sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==
|
||||||
|
|
||||||
unzipper@^0.8.13:
|
unzipper@^0.8.13:
|
||||||
version "0.8.14"
|
version "0.8.14"
|
||||||
resolved "https://registry.yarnpkg.com/unzipper/-/unzipper-0.8.14.tgz#ade0524cd2fc14d11b8de258be22f9d247d3f79b"
|
resolved "https://registry.yarnpkg.com/unzipper/-/unzipper-0.8.14.tgz#ade0524cd2fc14d11b8de258be22f9d247d3f79b"
|
||||||
|
|
@ -3039,7 +3125,7 @@ xdg-basedir@^4.0.0:
|
||||||
resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13"
|
resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13"
|
||||||
integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==
|
integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==
|
||||||
|
|
||||||
xtend@^4.0.0:
|
xtend@^4.0.0, xtend@~4.0.1:
|
||||||
version "4.0.2"
|
version "4.0.2"
|
||||||
resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54"
|
resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54"
|
||||||
integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==
|
integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==
|
||||||
|
|
@ -3084,7 +3170,7 @@ yargs-unparser@2.0.0:
|
||||||
flat "^5.0.2"
|
flat "^5.0.2"
|
||||||
is-plain-obj "^2.1.0"
|
is-plain-obj "^2.1.0"
|
||||||
|
|
||||||
yargs@16.2.0:
|
yargs@16.2.0, yargs@^16.1.0:
|
||||||
version "16.2.0"
|
version "16.2.0"
|
||||||
resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66"
|
resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66"
|
||||||
integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==
|
integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue