modify kiri ui to use updated dependency management

This commit is contained in:
Stewart Allen 2022-02-22 00:05:29 -05:00
commit d7be37478d
38 changed files with 300 additions and 230 deletions

283
app.js
View file

@ -39,6 +39,12 @@ const EventEmitter = require('events');
class AppEmitter extends EventEmitter {}
const events = new AppEmitter();
function addonce(array, v) {
if (array.indexOf(v) < 0) {
array.push(v);
}
};
function init(mod) {
startTime = time();
lastmod = mod.util.lastmod;
@ -52,54 +58,120 @@ function init(mod) {
dversion = debug ? `_${version}` : version;
cacheDir = mod.util.datadir("cache");
let depcache = {};
const approot = "main/gapp";
const refcache = {};
const callstack = [];
let xxxx = false;
function find_deps(path, seen = [], uses = []) {
let cached = depcache[path];
if (cached) {
return cached;
}
if (seen.indexOf(path) >= 0) {
if (debug > 1) {
console.log(`circular dependency at ${path}`, seen);
function find_refs(cache, path) {
let rec = refcache[path];
if (rec) {
let crec = cache[path];
if (!crec) {
cache[path] = rec;
for (let d of rec.deps) find_refs(cache, d);
for (let u of rec.deps) find_refs(cache, u);
}
return [];
return;
}
seen.push(path);
let deps = [ "main/gapp" ];
let lines = fs.readFileSync(`${dir}/src/${path}.js`)
callstack.push(path);
rec = cache[path] = refcache[path] = {
uses: [],
deps: [ approot ]
};
let full = `${dir}/src/${path}.js`;
try {
fs.lstatSync(full);
} catch (e) {
console.log({missing: full, callstack});
throw e;
}
let lines = fs.readFileSync(full)
.toString()
.split('\n');
for (let line of lines) {
let arr, pos;
let upos = line.indexOf('// use:');
if (upos >= 0) {
let use = line.substring(upos + 7).trim().replace('.','/');
if (uses.indexOf(use) < 0) {
uses.push(use);
}
continue;
arr = rec.uses;
pos = upos + 7;
}
let dpos = line.indexOf('// dep:');
if (dpos >= 0) {
let dep = line.substring(dpos + 7).trim().replace('.','/');
if (deps.indexOf(dep) < 0) {
deps.push(dep);
}
let deep = find_deps(dep, seen, uses);
deps = deps.filter(p => deep.indexOf(p) < 0);
// deeper dependencies go first
deps = [...deep, ...deps];
arr = rec.deps;
pos = dpos + 7;
}
if (upos >= 0 && dpos >= 0) {
console.log(`invalid line: ${line}`);
process.exit();
}
if (arr && pos >= 0) {
let path = line.substring(pos).trim().replace(/\./g,'/').trim();
addonce(arr, path);
find_refs(cache, path);
}
}
depcache[path] = deps;
return deps;
// if (xxxx) console.log({path, ...rec});
callstack.pop();
}
// return record position indicated by path
function pos(path, list) {
for (let i=0; i<list.length; i++) {
if (list[i].path === path) {
return i;
}
}
console.log(`not found: ${path}`);
process.exit();
}
function order_refs(cache) {
const recs = Object.entries(cache).map(entry => {
return { path: entry[0], deps: entry[1].deps }
}).sort((a,b) => {
return a.path === b.path ? 0 : a.path < b.path ? -1 : 1;
});
if (xxxx) console.log({ordering: recs});
// for each rec, ensure that dependencies are inserted before it
let lrec = recs.slice();
for (let rec of lrec) {
let { path, deps } = rec;
for (let dep of deps) {
let rpos = pos(path, recs);
let dpos = pos(dep, recs);
if (dpos > rpos) {
let drec = recs[dpos];
// remove old dep record
recs.splice(dpos, 1);
// insert dep before
recs.splice(rpos, 0, drec);
let nrpos = pos(path, recs);
let ndpos = pos(dep, recs);
let fail = nrpos != ndpos + 1;
// if (xxxx) { console.log({move: dep, dpos, before: path, rpos}); }
if (fail) {
console.log({move: dep, dpos, before: path, rpos, ndpos, nrpos, recs: recs.slice(0,10)});
process.exit();
}
}
}
}
if (xxxx) console.log({recs});
return recs.map(rec => rec.path);
}
// process script dependencies, expand paths
for (let [key,val] of Object.entries(script)) {
let nval = val.map(p => p.charAt(0) === '&' ? p.substring(1) : p);
let modd = false;
let uses = [];
for (let [ key, val ] of Object.entries(script)) {
if (val.indexOf(approot) < 0) {
val = [ approot, ...val ];
}
const list = val.map(p => p.charAt(0) === '&' ? p.substring(1) : p);
const cache = {};
const roots = [];
// xxxx = key === "kiri_work";
// for each path in the list, find deps and add to list
for (let path of val) {
let fc = path.charAt(0);
if (fc === '@') {
@ -107,38 +179,25 @@ function init(mod) {
}
if (fc === '&') {
path = path.substring(1);
} else {
continue;
}
let uses = [];
let deps = find_deps(path, [], uses);
if (uses.length) {
let miss = uses.filter(u => deps.indexOf(u) < 0);
if (miss.length) {
val.appendAll(miss);
}
// console.log({key, uses, miss, deps});
deps.appendAll(miss);
}
if (deps) {
// remove deps already in list
deps = deps.filter(p => nval.indexOf(p) < 0);
let ppos = nval.indexOf(path);
if (ppos < 0) {
throw `missing ${path} in nval`;
}
// inject deps
nval.splice(ppos, 0, ...deps);
modd = true;
}
// if list is modified, substitute
if (modd) {
if (debug > 1) {
console.log({path, val, nval});
}
val = nval;
addonce(roots, path);
}
find_refs(cache, path);
}
if (xxxx) console.log({processing: key, val});
let refs = order_refs(cache).filter(p => roots.indexOf(p) < 0);
// remove paths that are in refs
let paths = list.filter(p => {
if (p.charAt(0) === '&') {
p = p.substring(1);
}
return refs.indexOf(p) < 0 && roots.indexOf(p) < 0;
});
// when dependency roots exist, re-write val array
if (roots.length) {
val = [...refs, ...paths, ...roots];
}
// val.splice(1, 0, ...roots);
if (xxxx) console.log({key, cache, refs, paths, roots, val});
script[key] = val.map(p => p.charAt(0) !== '@' ? `src/${p}.js` : p);
}
@ -270,8 +329,9 @@ function initModule(mod, file, dir) {
if (opt.end) {
codelist.push(path);
} else {
let io = Math.max(0, codelist.indexOf('@inject'));
codelist.splice(io, 0, path);
codelist.push(path);
// let io = Math.max(0, codelist.indexOf('@inject'));
// codelist.splice(io, 0, path);
}
if (opt.cachever) {
cachever[path] = opt.cachever;
@ -322,89 +382,15 @@ function initModule(mod, file, dir) {
const script = {
kiri : [
"main/gapp",
"moto/license",
"main/kiri",
"@inject",
"ext/three",
"ext/three-bgu",
"ext/three-svg",
"ext/jszip",
"ext/clip2",
"ext/tween",
"ext/fsave",
// "ext/earcut",
"ext/base64",
"add/array",
"add/three",
"geo/base",
"geo/point",
"geo/points",
"geo/slope",
"geo/line",
"geo/bounds",
"geo/polygons",
"geo/polygon",
"geo/mesh",
"data/local",
"data/index",
"moto/ajax",
"moto/orbit",
"moto/space",
"load/3mf",
"load/obj",
"load/stl",
"load/svg",
"load/url",
"load/file",
"moto/broker",
"moto/webui",
"kiri/conf",
"kiri/consts",
"kiri/utils",
"kiri/stats",
"kiri/api",
"kiri/ui",
"kiri/pack",
"kiri/lang",
"kiri/lang-en",
"kiri/files",
"kiri/slice",
"kiri/layers",
"kiri/client",
"kiri-mode/fdm/fill",
"kiri-mode/fdm/driver",
"kiri-mode/fdm/client",
"kiri-mode/sla/driver",
"kiri-mode/sla/client",
"kiri-mode/cam/driver",
"kiri-mode/cam/client",
"kiri-mode/cam/tool",
"kiri-mode/cam/animate",
"kiri-mode/laser/driver",
"kiri/alerts",
"kiri/stack",
"kiri/stacks",
"kiri/widget",
"kiri/widgets",
"kiri/function",
"kiri/platform",
"kiri/selection",
"kiri/settings",
"kiri/codec",
"kiri/main",
"kiri/init",
"kiri/do",
"kiri/export",
"kiri/tools",
"kiri/frame",
"@devices",
"@icons",
"&main/kiri",
"&kiri/lang-en"
],
kiri_work : [
"main/gapp",
// "main/gapp",
"moto/license",
"main/kiri",
"@inject",
"ext/three",
"ext/pngjs",
@ -456,12 +442,12 @@ const script = {
"kiri-mode/laser/driver",
"kiri/widget",
"kiri/codec",
"kiri/worker"
"kiri/worker",
"main/kiri",
],
kiri_pool : [
"main/gapp",
// "main/gapp",
"moto/license",
"main/kiri",
"@inject",
"ext/clip2",
"ext/earcut",
@ -486,10 +472,11 @@ const script = {
"kiri/layers",
"kiri/widget",
"kiri/codec",
"kiri/minion"
"kiri/minion",
"main/kiri",
],
engine : [
"main/gapp",
// "main/gapp",
"moto/license",
"main/kiri",
"@inject",
@ -520,11 +507,11 @@ const script = {
"kiri-run/engine"
],
frame : [
"main/gapp",
// "main/gapp",
"kiri-run/frame"
],
meta : [
"main/gapp",
// "main/gapp",
"moto/license",
"main/meta",
],

View file

@ -2,6 +2,7 @@
"use strict";
// use: add.array
gapp.register("add.class", [], (root, exports) => {
self.ArrayWriter = class ArrayWriter {

View file

@ -2,6 +2,8 @@
"use strict";
// use: add.array
// use: add.class
gapp.register("geo.base", [], (root, exports) => {
const base = root.base = {};

View file

@ -2,6 +2,7 @@
"use strict";
// dep: geo.base
// dep: ext.clip2
// dep: geo.point
// dep: geo.bounds

View file

@ -10,12 +10,15 @@
// dep: geo.line
// dep: geo.point
// dep: geo.polygon
// dep: geo.polygons
gapp.register("geo.slicer", [], (root, exports) => {
const { base } = root;
const { config, util, polygons } = base
const { newOrderedLine, newPolygon, newPoint } = base;
const POLY = base.polygons;
function dval(v, dv) {
return v !== undefined ? v : dv;
}

View file

@ -2,6 +2,8 @@
"use strict";
// dep: kiri-mode.cam.driver
// use: kiri-mode.cam.animate
gapp.register("kiri-mode.cam.client", [], (root, exports) => {
const { base, kiri } = root;

View file

@ -5,11 +5,15 @@
// dep: main.kiri
// use: kiri.api
// use: kiri.widgets
// use: kiri-mode.cam.client
// use: kiri-mode.cam.slice
// use: kiri-mode.cam.prepare
// use: kiri-mode.cam.export
// use: kiri-mode.cam.tool
gapp.register("kiri-mode.cam.driver", [], (root, exports) => {
const { kiri } = root;
const { driver } = kiri;
const CAM = driver.CAM = {};
CAM.process = {

View file

@ -4,6 +4,7 @@
// dep: geo.base
// dep: geo.polygons
// dep: kiri-mode.cam.driver
gapp.register("kiri-mode.cam.export", [], (root, exports) => {
const { base, kiri } = root;

View file

@ -5,6 +5,8 @@
// dep: geo.paths
// dep: geo.point
// dep: geo.polygons
// dep: kiri-mode.cam.driver
// use: kiri-mode.cam.ops
gapp.register("kiri-mode.cam.prepare", [], (root, exports) => {
const { base, kiri } = root;

View file

@ -5,6 +5,9 @@
// dep: geo.point
// dep: geo.polygons
// dep: kiri.slice
// dep: kiri-mode.cam.driver
// use: kiri-mode.cam.slicer
// use: kiri-mode.cam.ops
gapp.register("kiri-mode.cam.slice", [], (root, exports) => {
const { base, kiri } = root;

View file

@ -2,6 +2,7 @@
"use strict";
// dep: kiri-mode.cam.driver
gapp.register("kiri-mode.cam.tools", [], (root, exports) => {
const { kiri } = root;

View file

@ -2,6 +2,13 @@
"use strict";
// dep: geo.base
// dep: geo.line
// dep: geo.point
// dep: geo.polygon
// dep: geo.polygons
// dep: kiri.slice
// dep: kiri-mode.cam.driver
gapp.register("kiri-mode.cam.tools", [], (root, exports) => {
const { base, kiri } = root;

View file

@ -3,6 +3,10 @@
"use strict";
// use: kiri.api
// use: kiri-mode.fdm.client
// use: kiri-mode.fdm.slice
// use: kiri-mode.fdm.prepare
// use: kiri-mode.fdm.export
gapp.register("kiri-mode.fdm.driver", [], (root, exports) => {
const { kiri } = root;

View file

@ -4,7 +4,7 @@
// dep: geo.base
// dep: kiri.api
// dep: kiri.util
// dep: kiri.utils
// dep: kiri-mode.fdm.driver
gapp.register("kiri-mode.fdm.export", [], (root, exports) => {

View file

@ -11,7 +11,7 @@
// dep: kiri.slice
// dep: kiri.consts
// dep: kiri-mode.fdm.driver
// use: kiri.worker
// use: kiri.client
gapp.register("kiri-mode.fdm.prepare", [], (root, exports) => {
const { base, kiri, noop } = root;
@ -1403,7 +1403,7 @@ function slicePrintPath(print, slice, startPoint, offset, output, opt = {}) {
}
FDM.isDark = function() {
return current.print.settings.controller.dark ? true : false;
return worker.print.settings.controller.dark ? true : false;
};
FDM.rateToColor = function(rate, max) {

View file

@ -3,13 +3,14 @@
"use strict";
// dep: geo.base
// dep: geo.slicer
// dep: geo.polygons
// dep: kiri.api
// dep: kiri.fill
// dep: kiri.utils
// dep: kiri.consts
// dep: kiri-mode.fdm.driver
// use: add.clip2
// use: kiri-mode.fdm.fill
// use: ext.clip2
// use: add.three
gapp.register("kiri-mode.fdm.slice", [], (root, exports) => {

View file

@ -2,8 +2,8 @@
"use strict";
// dep: base.polygons
// dep: base.point
// dep: geo.polygons
// dep: geo.point
// dep: kiri.slice
gapp.register("kiri-mode.laser.driver", [], (root, exports) => {

View file

@ -3,7 +3,10 @@
"use strict";
// use: kiri.print
// use: kiri.worker
// use: kiri.client
// use: kiri-mode.sla.client
// use: kiri-mode.sla.slice
// use: kiri-mode.sla.export
gapp.register("kiri-mode.sla.driver", [], (root, exports) => {
const { kiri } = root

View file

@ -5,7 +5,7 @@
// dep: geo.base
// dep: kiri-mode.sla.driver
// dep: kiri-mode.sla.x_cxdlp
// dep: kiri-mode.sla.x_photons
// dep: kiri-mode.sla.x_photon
gapp.register("kiri-mode.sla.export", [], (root, exports) => {
const { base, kiri } = root

View file

@ -2,9 +2,9 @@
"use strict";
// dep: main.kiri
// dep: data.local
// dep: kiri.utils
// dep: kiri.consts
// use: kiri.client
// use: kiri.settings
gapp.register("kiri.api", [], (root, exports) => {

View file

@ -4,6 +4,10 @@
// dep: main.kiri
// dep: geo.base
// dep: geo.polygon
// dep: kiri.widget
// dep: kiri.slice
// dep: kiri.layers
gapp.register("kiri.codec", [], (root, exports) => {
const { base, kiri } = root;

View file

@ -6,6 +6,7 @@
// dep: data.local
// dep: kiri.consts
// dep: kiri.api
// dep: kiri.main
gapp.register("kiri.export", [], (root, exports) => {
const { base, data, kiri } = root;

View file

@ -5,7 +5,6 @@
// use: load.stl
// use: load.svg
// use: kiri.api
// use: kiri.feature
// use: kiri.platform
// use: kiri.settings
// use: kiri.widget

View file

@ -3,7 +3,12 @@
"use strict";
// dep: kiri.api
// dep: kiri.export
// dep: moto.space
// dep: kiri-mode.cam.driver
// dep: kiri-mode.fdm.driver
// dep: kiri-mode.sla.driver
// dep: kiri-mode.laser.driver
gapp.register("kiri.function", [], (root, exports) => {
const { kiri, noop } = root;

View file

@ -4,10 +4,13 @@
// dep: geo.base
// dep: kiri.api
// dep: kiri.main
// dep: kiri.lang
// dep: kiri.stats
// dep: kiri.consts
// dep: kiri.platform
// dep: kiri.selection
// use: kiri.pack
gapp.register("kiri.init", [], (root, exports) => {
const { base, kiri } = root;
@ -2891,7 +2894,6 @@ gapp.register("kiri.init", [], (root, exports) => {
// if a language needs to load, the script is injected and loaded
// first. once this loads, or doesn't, the initialization begins
let lang = SETUP.ln ? SETUP.ln[0] : sdb.getItem('kiri-lang') || kiri.lang.get();
// inject language script if not english
if (lang && lang !== 'en' && lang !== 'en-us') {
let map = kiri.lang.map(lang);

View file

@ -2,9 +2,29 @@
"use strict";
// dep: main.kiri
// dep: moto.license
// dep: geo.base
// dep: kiri.ui
// dep: kiri.api
// dep: kiri.conf
// dep: kiri.lang
// dep: kiri.utils
// dep: kiri.files
// dep: kiri.consts
// dep: kiri.widget
// dep: kiri.stats
// dep: kiri.stacks
// dep: kiri.function
// dep: kiri.platform
// dep: kiri.selection
// dep: kiri.settings
// use: kiri.alerts
// use: kiri.files
// use: kiri.frame
gapp.register("kiri.main", [], (root, exports) => {
const { base, data, load, kiri, moto, noop } = root;
const { base, data, kiri, moto, noop } = root;
const { api, consts, lang, Widget, newWidget, utils, stats } = kiri;
const { areEqual, parseOpt, encodeOpt, ajax, o2js, js2o, ls2o } = utils;
const { feature, platform, selection, settings } = api;
@ -939,7 +959,7 @@ gapp.register("kiri.main", [], (root, exports) => {
DOC.onkeydown = function (evt) { if (evt.keyCode == 27) evt.preventDefault() }
// complete module loading
kiri.load_exec();
// kiri.load_exec();
// upon restore, seed presets
api.event.emit('preset', api.conf.dbo());

View file

@ -2,6 +2,8 @@
"use strict";
gapp.register("kiri.minion", [], (root, exports) => {
let BASE = self.base,
KIRI = self.kiri,
UTIL = BASE.util,
@ -125,3 +127,5 @@ const funcs = {
reply({ seq, error: "invalid command" });
}
};
});

View file

@ -3,6 +3,7 @@
"use strict";
// dep: moto.space
// dep: moto.webui
// dep: kiri.api
// dep: kiri.consts
// dep: kiri.utils

View file

@ -4,11 +4,9 @@
gapp.register("kiri.ui", [], (root, exports) => {
if (kiri.ui) return;
const { kiri } = root;
let SELF = self,
KIRI = self.kiri,
DOC = SELF.document,
let DOC = self.document,
inputAction = null,
lastGroup = null,
lastDiv = null,
@ -36,9 +34,9 @@ gapp.register("kiri.ui", [], (root, exports) => {
lastPop = null,
savePop = null;
SELF.$ = (SELF.$ || function (id) { return DOC.getElementById(id) } );
self.$ = (self.$ || function (id) { return DOC.getElementById(id) } );
KIRI.ui = {
kiri.ui = {
prefix: function(pre) { prefix = pre; return kiri.ui },
inputAction: function(fn) { inputAction = fn; return kiri.ui },
lastChange: function() { return lastChange },
@ -128,7 +126,7 @@ gapp.register("kiri.ui", [], (root, exports) => {
}
$('mod-any').innerHTML = html.join('');
function done(value) {
KIRI.api.modal.hide();
kiri.api.modal.hide();
setTimeout(() => { resolve(value) }, 150);
}
if (iid) {
@ -148,7 +146,7 @@ gapp.register("kiri.ui", [], (root, exports) => {
}
});
setTimeout(() => {
KIRI.api.modal.show('any');
kiri.api.modal.show('any');
if (iid) {
iid.focus();
iid.selectionStart = iid.value.length;

View file

@ -3,11 +3,10 @@
"use strict";
// dep: data.local
// dep: main.kiri
// use: moto.ajax
gapp.register("kiri.utils", [], (root, exports) => {
const { kiri, moto, data } = root;
const { kiri, data } = root;
function parseOpt(ov) {
let opt = {}, kv, kva;

View file

@ -2,6 +2,13 @@
"use strict";
// dep: geo.base
// dep: geo.mesh
// dep: geo.point
// dep: geo.points
// dep: geo.polygons
// dep: kiri.utils
// use: kiri.codec
gapp.register("kiri.widget", [], (root, exports) => {
const { base, kiri } = root;

View file

@ -2,7 +2,9 @@
"use strict";
const { base, kiri } = self;
gapp.register("kiri.worker", [], (root, exports) => {
const { base, kiri } = root;
const { util, polygons, wasm_ctrl } = base;
const { codec } = kiri;
const { time } = util;
@ -874,5 +876,7 @@ dispatch.onmessage = self.onmessage = function(e) {
}
};
});
// load kiri modules
kiri.load_exec(dispatch);
// kiri.load_exec(dispatch);

View file

@ -66,26 +66,7 @@ gapp.overlay = Object.assign;
// register module without a load function
gapp.register = (name, deps, fn) => {
gapp.load(undefined, name, deps);
if (fn) {
let toks = name.split('.');
let root = self;
let map = toks.pop();
for (let tok of toks) {
if (!root[tok]) {
dbug.debug({creating_root: tok, for: name});
root = root[tok] = {};
} else {
root = root[tok];
}
}
let tmp = root[map] || {};
fn(self, exports => {
if (exports) {
return root[map] = Object.assign(tmp, exports);
}
});
}
gapp.load(fn, name, deps);
};
// register module with a load function
@ -108,7 +89,10 @@ gapp.check = (name, deps = []) => {
};
// perform dependency checks and run module load functions
gapp.main = (app, deps, fn) => {
gapp.main = (app, deps, post, pre) => {
const root = self;
// optional fn to run before loading
if (pre) pre(root);
// app loader may also pass deps
gapp.check(app, deps);
// load mods after checking if dependency is present
@ -123,13 +107,29 @@ gapp.main = (app, deps, fn) => {
}
// mods with no function are allowed so they can be depended on
if (fn) {
mod.fn();
let toks = name.split('.');
let map = toks.pop();
let path = root;
for (let tok of toks) {
if (!path[tok]) {
dbug.debug({creating_root: tok, for: name});
path = path[tok] = {};
} else {
path = path[tok];
}
}
let tmp = path[map] || {};
fn(root, exports => {
if (exports) {
return path[map] = Object.assign(tmp, exports);
}
});
}
}
// force runtime error if gapp.load() called gapp.main()
mods = null;
// optional if not called inline with startup
if (fn) fn(self);
if (post) post(root);
};
})();

View file

@ -2,22 +2,32 @@
"use strict";
gapp.register("main.kiri", [], (root) => {
// use: kiri.init
// use: kiri.main
gapp.main("main.kiri", [], (root) => {
const modfns = root.kirimod = [];
const { kiri } = root;
const { api } = kiri;
const kiri = root.kiri = {
beta: 3303,
driver: {}, // driver modules
load(fn) {
modfns.push(fn);
},
load_exec(api) {
// complete module loading
modfns.forEach(modfn => { modfn(api || kiri.api)} );
// rewrite load() to be immediate post-finalize
kiri.load = (modfn) => { modfn(api || kiri.api) };
}
};
// complete module loading
kiri.load_exec();
}, (root) => {
const modfns = root.kirimod = [];
const kiri = root.kiri = {
beta: 3303,
driver: {}, // driver modules
load(fn) {
modfns.push(fn);
},
load_exec(api) {
// complete module loading
modfns.forEach(modfn => { modfn(api || kiri.api)} );
// rewrite load() to be immediate post-finalize
kiri.load = (modfn) => { modfn(api || kiri.api) };
}
};
});

View file

@ -7,9 +7,9 @@
// dep: moto.broker
// dep: moto.space
// dep: mesh.util
// dep: add.array
// dep: ext.three
// dep: ext.three-bgu
// use: add.array
gapp.register("mesh.api", [], (root, exports) => {
const { Matrix4, Vector3 } = THREE;

View file

@ -2,12 +2,9 @@
"use strict";
gapp.register("moto.client", [
"add.array", // dep: add.array
"moto.broker", // dep: moto.broker
], (root, exports) => {
// dep: add.array
// dep: moto.broker
gapp.register("moto.client", [], (root, exports) => {
let ccvalue = self.navigator ? navigator.hardwareConcurrency || 1 : 1,
ccmax = ccvalue > 3 ? ccvalue - 1 : 1,

View file

@ -3,13 +3,10 @@
"use strict";
// dep: ext.tween
gapp.register("moto.space", [
'add.three', // dep: add.three
'add.array', // dep: add.array
'moto.orbit' // dep: moto.orbit
], (root, exports) => {
// dep: add.three
// dep: add.array
// dep: moto.orbit
gapp.register("moto.space", [], (root, exports) => {
const { moto } = root;

View file

@ -1,7 +1,7 @@
// English language map. Other localization maps will
// defer to English map for any missing key/value pairs
kiri.lang['en'] =
kiri.lang['en-us'] = {
self.kiri.lang['en'] =
self.kiri.lang['en-us'] = {
// common keys and menus
animate: "animate", // CAM animate button
arrange: "arrange", // layout workspace objects