feat: traits HMR!

This commit is contained in:
cha0s 2021-03-26 09:42:18 -05:00
parent 7e1d8d11c6
commit 5a7ff04a31
4 changed files with 48 additions and 0 deletions

View File

@ -0,0 +1 @@
export default new Set();

View File

@ -1,5 +1,6 @@
import {gatherWithLatus} from '@latus/core';
import hotEntities from './hot-entities';
import types from './types';
export {default as EntityListView} from './entity-list-view';
@ -10,6 +11,20 @@ export default {
'@avocado/resource/resources': gatherWithLatus(
require.context('./resources', false, /\.js$/),
),
'@avocado/traits/hmr': (Trait, type) => {
const it = hotEntities.values();
for (let current = it.next(); current.done !== true; current = it.next()) {
const {value: entity} = current;
if (entity.is(type) && entity.trait(type).hotJSON) {
const json = {
...entity.trait(type).toJSON(),
...entity.trait(type).hotJSON(),
};
entity.removeTrait(type);
entity.addTrait(type, json);
}
}
},
'@avocado/traits/traits': gatherWithLatus(
require.context('./traits', false, /\.js$/),
),

View File

@ -11,6 +11,7 @@ import {compose, EventEmitter} from '@latus/core';
import {defineTraitAccessors, enumerateTraitAccessorKeys} from '../accessors';
import BaseEntity from '../base-entity';
import hotEntities from '../hot-entities';
const debug = D('@avocado/entity');
@ -58,6 +59,9 @@ export default (latus) => {
this.room = null;
this.uptime = 0;
this.visibleAabb = [0, 0, 0, 0];
if (module.hot) {
hotEntities.add(this);
}
}
addTickingPromise(tickingPromise) {
@ -189,6 +193,9 @@ export default (latus) => {
return;
}
this.#isDestroying = true;
if (module.hot) {
hotEntities.delete(this);
}
const destroyers = this.invokeHookFlat('destroy');
if (destroyers.length > 0) {
await this.addTickingPromise(new TickingPromise(

View File

@ -8,6 +8,31 @@ export default {
'@latus/core/config': () => ({
'traits.decorate': ['...'],
}),
'@latus/core/hmr': (path, latus) => {
const Traits = latus.invokePlugin('@avocado/traits/traits', path);
if (!Traits) {
return;
}
const entries = Object.entries(Traits);
for (let i = 0; i < entries.length; ++i) {
const [type, Trait] = entries[i];
const {[type]: {id}} = latus.get('%traits');
class Wrapped extends Trait {
static get type() {
return type;
}
static get id() {
return id;
}
}
latus.set(`%traits.${type}`, Wrapped);
latus.set(`%traits.${id}`, Wrapped);
latus.invoke('@avocado/traits/hmr', Wrapped, type);
}
},
'@latus/core/starting': (latus) => {
latus.set('%traits', gather(
latus,