@media-quest/engine 0.0.22 → 0.0.24

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/package.json +1 -1
  2. package/src/Delement/DElement.dto.ts +5 -5
  3. package/src/Delement/DElement.ts +88 -88
  4. package/src/Delement/DImg.ts +39 -39
  5. package/src/Delement/DStyle-utils.ts +616 -616
  6. package/src/Delement/DStyle.ts +165 -165
  7. package/src/Delement/DText.ts +13 -13
  8. package/src/Delement/Ddiv.ts +25 -25
  9. package/src/Delement/button-click-action.ts +35 -35
  10. package/src/Delement/css.spec.ts +36 -36
  11. package/src/Delement/css.ts +46 -46
  12. package/src/Delement/element-factory.ts +40 -40
  13. package/src/common/DMaybe.ts +46 -46
  14. package/src/common/DTimestamp.ts +20 -20
  15. package/src/common/DTmestamp.spec.ts +11 -11
  16. package/src/common/result.ts +41 -41
  17. package/src/engine/SchemaDto.ts +24 -24
  18. package/src/engine/SchemaEngine.ts +150 -150
  19. package/src/engine/SchemaResult.ts +10 -10
  20. package/src/engine/dplayer.spec.ts +91 -91
  21. package/src/engine/dplayer.ts +104 -104
  22. package/src/engine/history-que.spec.ts +67 -67
  23. package/src/engine/history-que.ts +17 -17
  24. package/src/engine/next-que.spec.ts +121 -121
  25. package/src/engine/next-que.ts +101 -101
  26. package/src/engine/page-que-ruleengine-action.ts +6 -6
  27. package/src/engine/scale.spec.ts +38 -38
  28. package/src/engine/scale.ts +70 -70
  29. package/src/events/mq-events.ts +63 -63
  30. package/src/page/Page.ts +182 -182
  31. package/src/page/media-player.ts +117 -117
  32. package/src/page/page-component.ts +113 -113
  33. package/src/page/page-result.ts +11 -11
  34. package/src/page/task-manager.ts +240 -240
  35. package/src/page/task-state.ts +55 -55
  36. package/src/page/task.ts +90 -90
  37. package/src/public-api.ts +26 -26
  38. package/src/rules/__test__/complex-condition.spec.ts +15 -15
  39. package/src/rules/__test__/conditon.spec.ts +124 -124
  40. package/src/rules/__test__/numeric-condition.spec.ts +84 -84
  41. package/src/rules/__test__/rule-engine.spec.ts +348 -348
  42. package/src/rules/__test__/rule-evaluation.spec.ts +140 -140
  43. package/src/rules/__test__/string-condition.spec.ts +41 -41
  44. package/src/rules/condition.ts +191 -191
  45. package/src/rules/fact.ts +18 -18
  46. package/src/rules/rule-engine.ts +45 -45
  47. package/src/rules/rule.ts +40 -40
  48. package/src/utils/DUtil.ts +116 -116
  49. package/src/utils/ID.spec.ts +39 -39
  50. package/src/utils/ID.ts +73 -73
  51. package/tsconfig.json +19 -19
@@ -1,10 +1,10 @@
1
- import { Fact } from "../rules/fact";
2
- import { MqEvent } from "../events/mq-events";
3
-
4
- export interface SchemaResult {
5
- readonly schemaId: string;
6
- readonly pagesLeft: number;
7
- readonly predefinedFacts: ReadonlyArray<Fact>;
8
- readonly eventLog: ReadonlyArray<MqEvent>;
9
- readonly answers: ReadonlyArray<Fact>;
10
- }
1
+ import { Fact } from "../rules/fact";
2
+ import { MqEvent } from "../events/mq-events";
3
+
4
+ export interface SchemaResult {
5
+ readonly schemaId: string;
6
+ readonly pagesLeft: number;
7
+ readonly predefinedFacts: ReadonlyArray<Fact>;
8
+ readonly eventLog: ReadonlyArray<MqEvent>;
9
+ readonly answers: ReadonlyArray<Fact>;
10
+ }
@@ -1,91 +1,91 @@
1
- import { DPlayer, DPlayerData } from "./dplayer";
2
- import { PageSequenceDto } from "./SchemaDto";
3
- import { Rule } from "../rules/rule";
4
- import { DTimestamp } from "../common/DTimestamp";
5
- import { RuleActionPageQue } from "./page-que-ruleengine-action";
6
- import { PageDto } from "../page/Page";
7
- import { PageResult } from "../page/page-result";
8
-
9
- const page = (id: number): PageDto => {
10
- return PageDto.createDummy(id);
11
- // return { id: PageID.create(), elements: [] };
12
- };
13
- const p1 = page(1);
14
- const p2 = page(2);
15
- const p3 = page(3);
16
- const p4 = page(4);
17
- const p5 = page(5);
18
- const p6 = page(6);
19
- const all = [p1, p2, p3, p4, p5, p6];
20
- const Seq1 = {
21
- p10: page(10),
22
- p11: page(11),
23
- p12: page(12),
24
- };
25
-
26
- const seq1: PageSequenceDto = {
27
- id: "s1",
28
- pages: [Seq1.p10, Seq1.p11, Seq1.p12],
29
- rules: [],
30
- };
31
- const data = (
32
- pages: PageDto[],
33
- pageSequences: PageSequenceDto[] = [],
34
- rules: Rule<RuleActionPageQue, never>[] = [],
35
- ): DPlayerData => ({ pages: pages, pageSequences, rules });
36
- // const seq = (pages: PageDto[], rules: Rule[]) => {};
37
- beforeEach(() => {
38
- // data = { pages: [], rules: [], pageSequences: [] };
39
- });
40
-
41
- describe("DPlayer", () => {
42
- it("should create an instance", () => {
43
- const player = new DPlayer(data([p1, p1]));
44
- expect(player).toBeTruthy();
45
- });
46
-
47
- it("can app pages, and get next", () => {
48
- const player = new DPlayer(data([p1, p2]));
49
-
50
- expect(player.getNextPage()).toBe(p1);
51
- expect(player.getNextPage()).toBe(p2);
52
- expect(player.getNextPage()).toBe(false);
53
- });
54
-
55
- it("Can insert a sequence", () => {
56
- const player = new DPlayer(data(all, [seq1]));
57
-
58
- expect(player.getNextPage()).toBe(p1);
59
- expect(player.getNextPage()).toBe(p2);
60
- player.insertSequence(seq1.id);
61
- expect(player.getNextPage()).toBe(Seq1.p10);
62
- expect(player.getNextPage()).toBe(Seq1.p11);
63
- expect(player.getNextPage()).toBe(Seq1.p12);
64
- expect(player.getNextPage()).toBe(p3);
65
- });
66
-
67
- it("Save history", () => {
68
- const player = new DPlayer(data(all));
69
-
70
- const curr = player.getNextPage() as PageDto;
71
-
72
- const result: PageResult = {
73
- pageId: curr.id,
74
- pagePrefix: curr.id,
75
- eventLog: [],
76
- pageTime: DTimestamp.diff(DTimestamp.now(), DTimestamp.now()),
77
- collectedFacts: [
78
- {
79
- referenceId: "as",
80
- referenceLabel: "as-label",
81
- kind: "numeric-fact",
82
- label: "litt",
83
- value: 2,
84
- },
85
- ],
86
- };
87
- player.saveHistory(result);
88
- expect(player.getNextPage()).toBe(p2);
89
- expect(player.getResults().answerFacts.length).toBe(1);
90
- });
91
- });
1
+ import { DPlayer, DPlayerData } from "./dplayer";
2
+ import { PageSequenceDto } from "./SchemaDto";
3
+ import { Rule } from "../rules/rule";
4
+ import { DTimestamp } from "../common/DTimestamp";
5
+ import { RuleActionPageQue } from "./page-que-ruleengine-action";
6
+ import { PageDto } from "../page/Page";
7
+ import { PageResult } from "../page/page-result";
8
+
9
+ const page = (id: number): PageDto => {
10
+ return PageDto.createDummy(id);
11
+ // return { id: PageID.create(), elements: [] };
12
+ };
13
+ const p1 = page(1);
14
+ const p2 = page(2);
15
+ const p3 = page(3);
16
+ const p4 = page(4);
17
+ const p5 = page(5);
18
+ const p6 = page(6);
19
+ const all = [p1, p2, p3, p4, p5, p6];
20
+ const Seq1 = {
21
+ p10: page(10),
22
+ p11: page(11),
23
+ p12: page(12),
24
+ };
25
+
26
+ const seq1: PageSequenceDto = {
27
+ id: "s1",
28
+ pages: [Seq1.p10, Seq1.p11, Seq1.p12],
29
+ rules: [],
30
+ };
31
+ const data = (
32
+ pages: PageDto[],
33
+ pageSequences: PageSequenceDto[] = [],
34
+ rules: Rule<RuleActionPageQue, never>[] = [],
35
+ ): DPlayerData => ({ pages: pages, pageSequences, rules });
36
+ // const seq = (pages: PageDto[], rules: Rule[]) => {};
37
+ beforeEach(() => {
38
+ // data = { pages: [], rules: [], pageSequences: [] };
39
+ });
40
+
41
+ describe("DPlayer", () => {
42
+ it("should create an instance", () => {
43
+ const player = new DPlayer(data([p1, p1]));
44
+ expect(player).toBeTruthy();
45
+ });
46
+
47
+ it("can app pages, and get next", () => {
48
+ const player = new DPlayer(data([p1, p2]));
49
+
50
+ expect(player.getNextPage()).toBe(p1);
51
+ expect(player.getNextPage()).toBe(p2);
52
+ expect(player.getNextPage()).toBe(false);
53
+ });
54
+
55
+ it("Can insert a sequence", () => {
56
+ const player = new DPlayer(data(all, [seq1]));
57
+
58
+ expect(player.getNextPage()).toBe(p1);
59
+ expect(player.getNextPage()).toBe(p2);
60
+ player.insertSequence(seq1.id);
61
+ expect(player.getNextPage()).toBe(Seq1.p10);
62
+ expect(player.getNextPage()).toBe(Seq1.p11);
63
+ expect(player.getNextPage()).toBe(Seq1.p12);
64
+ expect(player.getNextPage()).toBe(p3);
65
+ });
66
+
67
+ it("Save history", () => {
68
+ const player = new DPlayer(data(all));
69
+
70
+ const curr = player.getNextPage() as PageDto;
71
+
72
+ const result: PageResult = {
73
+ pageId: curr.id,
74
+ pagePrefix: curr.id,
75
+ eventLog: [],
76
+ pageTime: DTimestamp.diff(DTimestamp.now(), DTimestamp.now()),
77
+ collectedFacts: [
78
+ {
79
+ referenceId: "as",
80
+ referenceLabel: "as-label",
81
+ kind: "numeric-fact",
82
+ label: "litt",
83
+ value: 2,
84
+ },
85
+ ],
86
+ };
87
+ player.saveHistory(result);
88
+ expect(player.getNextPage()).toBe(p2);
89
+ expect(player.getResults().answerFacts.length).toBe(1);
90
+ });
91
+ });
@@ -1,104 +1,104 @@
1
- import { HistoryQue } from "./history-que";
2
- import { RuleEngine } from "../rules/rule-engine";
3
- import { NextQue } from "./next-que";
4
- import { SchemaDto } from "./SchemaDto";
5
- import { RuleActionPageQue } from "./page-que-ruleengine-action";
6
- import { PageDto } from "../page/Page";
7
- import { PageResult } from "../page/page-result";
8
- import { Fact } from "../rules/fact";
9
- import { MqEvent } from "../events/mq-events";
10
-
11
- export type DPlayerData = Pick<SchemaDto, "pages" | "pageSequences" | "rules" | "predefinedFacts">;
12
- export class DPlayer {
13
- private readonly eventLog: Array<MqEvent> = [];
14
- private history = new HistoryQue();
15
- private ruleEngine = new RuleEngine<RuleActionPageQue, never>();
16
- private nextQue = new NextQue();
17
- private data: DPlayerData;
18
- private readonly predefinedFacts: ReadonlyArray<Fact>;
19
-
20
- constructor(data: DPlayerData) {
21
- this.data = data;
22
- const pages = data.pages ?? [];
23
- this.predefinedFacts = data.predefinedFacts ? [...data.predefinedFacts] : [];
24
- this.nextQue.resetQue(pages);
25
- }
26
-
27
- saveEvent(event: MqEvent) {
28
- this.eventLog.push(event);
29
- }
30
-
31
- saveHistory(pageHistory: PageResult) {
32
- // console.log("SAVE HISTORY", pageHistory);
33
- this.history.addToHistory(pageHistory);
34
- this.eventLog.push(...pageHistory.eventLog);
35
- // Evaluate rules
36
- const userGeneratedFact = this.history.getFacts();
37
- const predefinedFacts = this.predefinedFacts;
38
- const facts = [...userGeneratedFact, ...predefinedFacts];
39
- const result = this.ruleEngine.solveAll(this.data.rules, facts);
40
-
41
- const matchingRules = result.matching;
42
- const actions = matchingRules.map((r) => r.actionList).flat(1);
43
- // Execute actions
44
- actions.forEach((a) => {
45
- // console.log(a.payload);
46
- switch (a.kind) {
47
- case "jumpToPage":
48
- this.nextQue.jumpToPageById(a.pageId);
49
- break;
50
- case "excludeByPageId":
51
- this.nextQue.removeByPageId(a.pageIds);
52
- break;
53
- case "excludeByTag":
54
- this.nextQue.removeByTag(a.tagIds);
55
- break;
56
- default:
57
- console.log("UNKNOWN ACTION", a);
58
- const check: never = a;
59
- }
60
- });
61
- }
62
-
63
- getResults() {
64
- const pagesLeft = this.nextQue.size;
65
- const answerFacts = this.history.getFacts();
66
- const predefinedFacts = this.predefinedFacts;
67
- const eventLog = [...this.eventLog];
68
- console.log(answerFacts);
69
- return { answerFacts, predefinedFacts, eventLog, pagesLeft };
70
- }
71
-
72
- insertSequence(sequenceId: string) {
73
- this.insertSequenceById(sequenceId);
74
- }
75
-
76
- getNextPage(): PageDto | false {
77
- const next = this.nextQue.pop();
78
- return next ?? false;
79
- }
80
-
81
- private insertSequenceById(id: string) {
82
- const seq = this.data.pageSequences?.find((s) => s.id === id);
83
- if (seq) {
84
- this.nextQue.insertAsNextByForce([...seq.pages]);
85
- } else {
86
- // HOW TO HANDLE INVALID ID_REFS?? LOGGER??
87
- // LOG INVALID COMMAND.
88
- }
89
- }
90
-
91
- /**
92
- * Total number of pages left in que
93
- */
94
- get pagesLeft(): number {
95
- return this.nextQue.pageCount;
96
- }
97
-
98
- /**
99
- * Total number of pages in test
100
- */
101
- get totalPageCount(): number {
102
- return this.data.pages.length;
103
- }
104
- }
1
+ import { HistoryQue } from "./history-que";
2
+ import { RuleEngine } from "../rules/rule-engine";
3
+ import { NextQue } from "./next-que";
4
+ import { SchemaDto } from "./SchemaDto";
5
+ import { RuleActionPageQue } from "./page-que-ruleengine-action";
6
+ import { PageDto } from "../page/Page";
7
+ import { PageResult } from "../page/page-result";
8
+ import { Fact } from "../rules/fact";
9
+ import { MqEvent } from "../events/mq-events";
10
+
11
+ export type DPlayerData = Pick<SchemaDto, "pages" | "pageSequences" | "rules" | "predefinedFacts">;
12
+ export class DPlayer {
13
+ private readonly eventLog: Array<MqEvent> = [];
14
+ private history = new HistoryQue();
15
+ private ruleEngine = new RuleEngine<RuleActionPageQue, never>();
16
+ private nextQue = new NextQue();
17
+ private data: DPlayerData;
18
+ private readonly predefinedFacts: ReadonlyArray<Fact>;
19
+
20
+ constructor(data: DPlayerData) {
21
+ this.data = data;
22
+ const pages = data.pages ?? [];
23
+ this.predefinedFacts = data.predefinedFacts ? [...data.predefinedFacts] : [];
24
+ this.nextQue.resetQue(pages);
25
+ }
26
+
27
+ saveEvent(event: MqEvent) {
28
+ this.eventLog.push(event);
29
+ }
30
+
31
+ saveHistory(pageHistory: PageResult) {
32
+ // console.log("SAVE HISTORY", pageHistory);
33
+ this.history.addToHistory(pageHistory);
34
+ this.eventLog.push(...pageHistory.eventLog);
35
+ // Evaluate rules
36
+ const userGeneratedFact = this.history.getFacts();
37
+ const predefinedFacts = this.predefinedFacts;
38
+ const facts = [...userGeneratedFact, ...predefinedFacts];
39
+ const result = this.ruleEngine.solveAll(this.data.rules, facts);
40
+
41
+ const matchingRules = result.matching;
42
+ const actions = matchingRules.map((r) => r.actionList).flat(1);
43
+ // Execute actions
44
+ actions.forEach((a) => {
45
+ // console.log(a.payload);
46
+ switch (a.kind) {
47
+ case "jumpToPage":
48
+ this.nextQue.jumpToPageById(a.pageId);
49
+ break;
50
+ case "excludeByPageId":
51
+ this.nextQue.removeByPageId(a.pageIds);
52
+ break;
53
+ case "excludeByTag":
54
+ this.nextQue.removeByTag(a.tagIds);
55
+ break;
56
+ default:
57
+ console.log("UNKNOWN ACTION", a);
58
+ const check: never = a;
59
+ }
60
+ });
61
+ }
62
+
63
+ getResults() {
64
+ const pagesLeft = this.nextQue.size;
65
+ const answerFacts = this.history.getFacts();
66
+ const predefinedFacts = this.predefinedFacts;
67
+ const eventLog = [...this.eventLog];
68
+ console.log(answerFacts);
69
+ return { answerFacts, predefinedFacts, eventLog, pagesLeft };
70
+ }
71
+
72
+ insertSequence(sequenceId: string) {
73
+ this.insertSequenceById(sequenceId);
74
+ }
75
+
76
+ getNextPage(): PageDto | false {
77
+ const next = this.nextQue.pop();
78
+ return next ?? false;
79
+ }
80
+
81
+ private insertSequenceById(id: string) {
82
+ const seq = this.data.pageSequences?.find((s) => s.id === id);
83
+ if (seq) {
84
+ this.nextQue.insertAsNextByForce([...seq.pages]);
85
+ } else {
86
+ // HOW TO HANDLE INVALID ID_REFS?? LOGGER??
87
+ // LOG INVALID COMMAND.
88
+ }
89
+ }
90
+
91
+ /**
92
+ * Total number of pages left in que
93
+ */
94
+ get pagesLeft(): number {
95
+ return this.nextQue.pageCount;
96
+ }
97
+
98
+ /**
99
+ * Total number of pages in test
100
+ */
101
+ get totalPageCount(): number {
102
+ return this.data.pages.length;
103
+ }
104
+ }
@@ -1,67 +1,67 @@
1
- import { HistoryQue } from "./history-que";
2
- import { DTimestamp } from "../common/DTimestamp";
3
- import { PageID } from "../utils/ID";
4
- import { PageDto } from "../page/Page";
5
- import { PageResult } from "../page/page-result";
6
-
7
- const p = (id: number): PageDto => {
8
- return {
9
- id: PageID.create(),
10
- prefix: "prefix" + id,
11
- components: [],
12
- initialTasks: [],
13
- staticElements: [],
14
- background: "",
15
- tags: [],
16
- };
17
- };
18
-
19
- const pageResult = (id: number, value: number): PageResult => {
20
- const pageEntered = DTimestamp.now();
21
- const pageExited = DTimestamp.addMills(pageEntered, 1000);
22
- const pageTime = DTimestamp.diff(pageEntered, pageExited);
23
-
24
- const result: PageResult = {
25
- pageId: "_dummyId" + id,
26
- pagePrefix: "prefix" + id,
27
- eventLog: [],
28
- pageTime,
29
- collectedFacts: [
30
- {
31
- referenceId: "" + id,
32
- referenceLabel: "label-for-" + id,
33
- value,
34
- label: "value-label " + value,
35
- kind: "numeric-fact",
36
- },
37
- ],
38
- };
39
- return result;
40
- };
41
- // const h = (page: PageDto, answeredQuestions: AnsweredQuestion[]): PageResult => ({
42
- // pageId: page.id,
43
- // answeredQuestions,
44
- // });
45
- const p1 = p(1);
46
- const p2 = p(2);
47
- const p3 = p(3);
48
- const p4 = p(4);
49
- const p5 = p(5);
50
- const p6 = p(6);
51
- const all = [p1, p2, p3, p4, p5, p6];
52
-
53
- let history = new HistoryQue();
54
- beforeEach(() => {
55
- history = new HistoryQue();
56
- });
57
-
58
- describe("HistoryQue", () => {
59
- it("should create an instance", () => {
60
- expect(history).toBeTruthy();
61
- });
62
-
63
- it("Can add history, and get facts back", () => {
64
- history.addToHistory(pageResult(1, 2));
65
- expect(history.getFacts().length).toBe(1);
66
- });
67
- });
1
+ import { HistoryQue } from "./history-que";
2
+ import { DTimestamp } from "../common/DTimestamp";
3
+ import { PageID } from "../utils/ID";
4
+ import { PageDto } from "../page/Page";
5
+ import { PageResult } from "../page/page-result";
6
+
7
+ const p = (id: number): PageDto => {
8
+ return {
9
+ id: PageID.create(),
10
+ prefix: "prefix" + id,
11
+ components: [],
12
+ initialTasks: [],
13
+ staticElements: [],
14
+ background: "",
15
+ tags: [],
16
+ };
17
+ };
18
+
19
+ const pageResult = (id: number, value: number): PageResult => {
20
+ const pageEntered = DTimestamp.now();
21
+ const pageExited = DTimestamp.addMills(pageEntered, 1000);
22
+ const pageTime = DTimestamp.diff(pageEntered, pageExited);
23
+
24
+ const result: PageResult = {
25
+ pageId: "_dummyId" + id,
26
+ pagePrefix: "prefix" + id,
27
+ eventLog: [],
28
+ pageTime,
29
+ collectedFacts: [
30
+ {
31
+ referenceId: "" + id,
32
+ referenceLabel: "label-for-" + id,
33
+ value,
34
+ label: "value-label " + value,
35
+ kind: "numeric-fact",
36
+ },
37
+ ],
38
+ };
39
+ return result;
40
+ };
41
+ // const h = (page: PageDto, answeredQuestions: AnsweredQuestion[]): PageResult => ({
42
+ // pageId: page.id,
43
+ // answeredQuestions,
44
+ // });
45
+ const p1 = p(1);
46
+ const p2 = p(2);
47
+ const p3 = p(3);
48
+ const p4 = p(4);
49
+ const p5 = p(5);
50
+ const p6 = p(6);
51
+ const all = [p1, p2, p3, p4, p5, p6];
52
+
53
+ let history = new HistoryQue();
54
+ beforeEach(() => {
55
+ history = new HistoryQue();
56
+ });
57
+
58
+ describe("HistoryQue", () => {
59
+ it("should create an instance", () => {
60
+ expect(history).toBeTruthy();
61
+ });
62
+
63
+ it("Can add history, and get facts back", () => {
64
+ history.addToHistory(pageResult(1, 2));
65
+ expect(history.getFacts().length).toBe(1);
66
+ });
67
+ });
@@ -1,17 +1,17 @@
1
- import { Fact } from "../rules/fact";
2
- import { PageResult } from "../page/page-result";
3
-
4
- export class HistoryQue {
5
- private history: PageResult[] = [];
6
-
7
- getFacts(): Array<Fact> {
8
- const answers = this.history.map((h) => h.collectedFacts).flat(1);
9
- // const facts = answers.map((a) => a.fact);
10
- // TODO FIND LATEST FACT (answer) if have multiple.
11
- return answers;
12
- }
13
-
14
- addToHistory(result: PageResult) {
15
- this.history.push(result);
16
- }
17
- }
1
+ import { Fact } from "../rules/fact";
2
+ import { PageResult } from "../page/page-result";
3
+
4
+ export class HistoryQue {
5
+ private history: PageResult[] = [];
6
+
7
+ getFacts(): Array<Fact> {
8
+ const answers = this.history.map((h) => h.collectedFacts).flat(1);
9
+ // const facts = answers.map((a) => a.fact);
10
+ // TODO FIND LATEST FACT (answer) if have multiple.
11
+ return answers;
12
+ }
13
+
14
+ addToHistory(result: PageResult) {
15
+ this.history.push(result);
16
+ }
17
+ }