• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

WolferyScripting / resclient-ts / #31

26 Aug 2025 01:54PM UTC coverage: 51.041% (+0.2%) from 50.87%
#31

push

DonovanDMC
1.1.3

229 of 289 branches covered (79.24%)

Branch coverage included in aggregate %.

1635 of 3363 relevant lines covered (48.62%)

10.54 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

24.56
/lib/models/ResCollectionModel.ts
1
import type ResClient from "./ResClient.js";
1✔
2
import ResModel, { type ResModelResourceEvents, type ResModelOptions } from "./ResModel.js";
1✔
3
import type ResRef from "./ResRef.js";
1✔
4
import { changeDiff } from "../util/util.js";
1✔
5
import Properties from "../util/Properties.js";
1✔
6
import type { AnyClass } from "../util/types.js";
1✔
7

1✔
8
export interface ResCollectionModelEvents<T extends ResModel | ResRef> {
1✔
9
    add: [data: CollectionModelAddRemove<T>];
1✔
10
    remove: [data: CollectionModelAddRemove<T>];
1✔
11
}
1✔
12
export interface CollectionModelAddRemove<T extends ResModel | ResRef> { item: T; key: string; }
1✔
13
export type ModelTypeUnion<T> = T extends ResModel | ResRef ? AnyClass<T> : never;
1✔
14
export default class ResCollectionModel<T extends ResModel | ResRef = ResModel | ResRef, ResourceEvents extends { [K in keyof ResourceEvents]: Array<unknown> } = ResModelResourceEvents<Record<string, T>>, ModelEvents extends { [K in keyof ModelEvents]: Array<unknown> } = ResCollectionModelEvents<T>> extends ResModel<Record<string, T>, ResourceEvents, ModelEvents> {
1!
15
    private onChange = this._onChange.bind(this);
×
16
    protected _list!: Array<T>;
×
17
    protected _modelTypes!: Array<ModelTypeUnion<T>>;
×
18
    constructor(api: ResClient, rid: string, modelTypes: ModelTypeUnion<T> | Array<ModelTypeUnion<T>>, options?: Omit<ResModelOptions, "definition">) {
×
19
        super(api, rid, options);
×
20
        Properties.of(this)
×
21
            .writable("_list", [])
×
22
            .readOnly("_modelTypes", Array.isArray(modelTypes) ? modelTypes : [modelTypes]);
×
23
    }
×
24

×
25
    private _onChange(data: Record<string, T | undefined>): void {
×
26
        const { added, removed } = changeDiff(this, data);
×
27

×
28
        for (const add of added) {
×
29
            this._list.push(add.item);
×
30
            this.api.eventBus.emit(this, "add", add);
×
31
        }
×
32

×
33
        for (const remove of removed) {
×
34
            const index = this._list.indexOf(remove.item);
×
35
            if (index !== -1) this._list.splice(index, 1);
×
36
            this.api.eventBus.emit(this, "remove", remove);
×
37
        }
×
38
    }
×
39

×
40
    protected override async _listen(on: boolean): Promise<void> {
×
41
        const m = on ? "resourceOn" : "resourceOff";
×
42
        this[m]("change", this.onChange);
×
43
    }
×
44

×
45
    protected override _shouldPromoteKey(key: string, value: unknown): boolean {
×
46
        return !this._modelTypes.some(type => value instanceof type) && super._shouldPromoteKey(key, value);
×
47
    }
×
48

×
49
    get list(): Array<T> {
×
50
        return Object.values(this.props);
×
51
    }
×
52

×
53
    get(key: string): T | undefined {
×
54
        return this.props[key];
×
55
    }
×
56
}
×
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc