feat: traits HMR!
This commit is contained in:
parent
7e1d8d11c6
commit
5a7ff04a31
1
packages/entity/src/hot-entities.js
Normal file
1
packages/entity/src/hot-entities.js
Normal file
|
@ -0,0 +1 @@
|
|||
export default new Set();
|
|
@ -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$/),
|
||||
),
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Reference in New Issue
Block a user