yarn-spinner-runner-ts 0.1.0

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 (114) hide show
  1. package/README.md +180 -0
  2. package/dist/compile/compiler.d.ts +9 -0
  3. package/dist/compile/compiler.js +172 -0
  4. package/dist/compile/compiler.js.map +1 -0
  5. package/dist/compile/ir.d.ts +47 -0
  6. package/dist/compile/ir.js +2 -0
  7. package/dist/compile/ir.js.map +1 -0
  8. package/dist/index.d.ts +10 -0
  9. package/dist/index.js +11 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/model/ast.d.ts +72 -0
  12. package/dist/model/ast.js +2 -0
  13. package/dist/model/ast.js.map +1 -0
  14. package/dist/parse/lexer.d.ts +7 -0
  15. package/dist/parse/lexer.js +78 -0
  16. package/dist/parse/lexer.js.map +1 -0
  17. package/dist/parse/parser.d.ts +4 -0
  18. package/dist/parse/parser.js +433 -0
  19. package/dist/parse/parser.js.map +1 -0
  20. package/dist/runtime/commands.d.ts +31 -0
  21. package/dist/runtime/commands.js +157 -0
  22. package/dist/runtime/commands.js.map +1 -0
  23. package/dist/runtime/evaluator.d.ts +52 -0
  24. package/dist/runtime/evaluator.js +309 -0
  25. package/dist/runtime/evaluator.js.map +1 -0
  26. package/dist/runtime/results.d.ts +22 -0
  27. package/dist/runtime/results.js +2 -0
  28. package/dist/runtime/results.js.map +1 -0
  29. package/dist/runtime/runner.d.ts +63 -0
  30. package/dist/runtime/runner.js +456 -0
  31. package/dist/runtime/runner.js.map +1 -0
  32. package/dist/tests/full_featured.test.d.ts +1 -0
  33. package/dist/tests/full_featured.test.js +130 -0
  34. package/dist/tests/full_featured.test.js.map +1 -0
  35. package/dist/tests/index.test.d.ts +1 -0
  36. package/dist/tests/index.test.js +30 -0
  37. package/dist/tests/index.test.js.map +1 -0
  38. package/dist/tests/jump_detour.test.d.ts +1 -0
  39. package/dist/tests/jump_detour.test.js +47 -0
  40. package/dist/tests/jump_detour.test.js.map +1 -0
  41. package/dist/tests/nodes_lines.test.d.ts +1 -0
  42. package/dist/tests/nodes_lines.test.js +23 -0
  43. package/dist/tests/nodes_lines.test.js.map +1 -0
  44. package/dist/tests/once.test.d.ts +1 -0
  45. package/dist/tests/once.test.js +29 -0
  46. package/dist/tests/once.test.js.map +1 -0
  47. package/dist/tests/options.test.d.ts +1 -0
  48. package/dist/tests/options.test.js +32 -0
  49. package/dist/tests/options.test.js.map +1 -0
  50. package/dist/tests/variables_flow_cmds.test.d.ts +1 -0
  51. package/dist/tests/variables_flow_cmds.test.js +30 -0
  52. package/dist/tests/variables_flow_cmds.test.js.map +1 -0
  53. package/dist/types.d.ts +3 -0
  54. package/dist/types.js +2 -0
  55. package/dist/types.js.map +1 -0
  56. package/docs/commands.md +21 -0
  57. package/docs/compatibility-checklist.md +77 -0
  58. package/docs/css-attribute.md +47 -0
  59. package/docs/detour.md +24 -0
  60. package/docs/enums.md +25 -0
  61. package/docs/flow-control.md +25 -0
  62. package/docs/functions.md +20 -0
  63. package/docs/jumps.md +24 -0
  64. package/docs/line-groups.md +21 -0
  65. package/docs/lines-nodes-and-options.md +30 -0
  66. package/docs/logic-and-variables.md +25 -0
  67. package/docs/markup.md +19 -0
  68. package/docs/node-groups.md +13 -0
  69. package/docs/once.md +21 -0
  70. package/docs/options.md +45 -0
  71. package/docs/saliency.md +25 -0
  72. package/docs/scenes-actors-setup.md +195 -0
  73. package/docs/scenes.md +64 -0
  74. package/docs/shadow-lines.md +18 -0
  75. package/docs/smart-variables.md +19 -0
  76. package/docs/storylets-and-saliency-a-primer.md +14 -0
  77. package/docs/tags-metadata.md +18 -0
  78. package/eslint.config.cjs +33 -0
  79. package/examples/browser/README.md +40 -0
  80. package/examples/browser/index.html +23 -0
  81. package/examples/browser/main.tsx +16 -0
  82. package/examples/browser/vite.config.ts +22 -0
  83. package/examples/react/DialogueExample.tsx +2 -0
  84. package/examples/react/DialogueView.tsx +2 -0
  85. package/examples/react/useYarnRunner.tsx +2 -0
  86. package/examples/scenes/scenes.yaml +10 -0
  87. package/examples/yarn/full_featured.yarn +43 -0
  88. package/package.json +55 -0
  89. package/src/compile/compiler.ts +183 -0
  90. package/src/compile/ir.ts +28 -0
  91. package/src/index.ts +17 -0
  92. package/src/model/ast.ts +93 -0
  93. package/src/parse/lexer.ts +108 -0
  94. package/src/parse/parser.ts +435 -0
  95. package/src/react/DialogueExample.tsx +149 -0
  96. package/src/react/DialogueScene.tsx +107 -0
  97. package/src/react/DialogueView.tsx +160 -0
  98. package/src/react/dialogue.css +181 -0
  99. package/src/react/useYarnRunner.tsx +33 -0
  100. package/src/runtime/commands.ts +183 -0
  101. package/src/runtime/evaluator.ts +327 -0
  102. package/src/runtime/results.ts +27 -0
  103. package/src/runtime/runner.ts +480 -0
  104. package/src/scene/parser.ts +83 -0
  105. package/src/scene/types.ts +17 -0
  106. package/src/tests/full_featured.test.ts +131 -0
  107. package/src/tests/index.test.ts +34 -0
  108. package/src/tests/jump_detour.test.ts +47 -0
  109. package/src/tests/nodes_lines.test.ts +27 -0
  110. package/src/tests/once.test.ts +32 -0
  111. package/src/tests/options.test.ts +34 -0
  112. package/src/tests/variables_flow_cmds.test.ts +33 -0
  113. package/src/types.ts +4 -0
  114. package/tsconfig.json +21 -0
@@ -0,0 +1,456 @@
1
+ import { ExpressionEvaluator } from "./evaluator.js";
2
+ import { CommandHandler, parseCommand } from "./commands.js";
3
+ const globalOnceSeen = new Set();
4
+ const globalNodeGroupOnceSeen = new Set(); // Track "once" nodes in groups: "title#index"
5
+ export class YarnRunner {
6
+ constructor(program, opts) {
7
+ this.onceSeen = globalOnceSeen;
8
+ this.nodeGroupOnceSeen = globalNodeGroupOnceSeen;
9
+ this.visitCounts = {};
10
+ this.ip = 0; // instruction pointer within node
11
+ this.currentNodeIndex = -1; // Index of selected node in group (-1 if single node)
12
+ this.callStack = [];
13
+ this.currentResult = null;
14
+ this.history = [];
15
+ this.program = program;
16
+ this.variables = { ...(opts.variables ?? {}) };
17
+ this.functions = {
18
+ // Default conversion helpers
19
+ string: (v) => String(v ?? ""),
20
+ number: (v) => Number(v),
21
+ bool: (v) => Boolean(v),
22
+ visited: (nodeName) => {
23
+ const name = String(nodeName ?? "");
24
+ return (this.visitCounts[name] ?? 0) > 0;
25
+ },
26
+ visited_count: (nodeName) => {
27
+ const name = String(nodeName ?? "");
28
+ return this.visitCounts[name] ?? 0;
29
+ },
30
+ format_invariant: (n) => {
31
+ const num = Number(n);
32
+ if (!isFinite(num))
33
+ return "0";
34
+ return new Intl.NumberFormat("en-US", { useGrouping: false, maximumFractionDigits: 20 }).format(num);
35
+ },
36
+ random: () => Math.random(),
37
+ random_range: (a, b) => {
38
+ const x = Number(a), y = Number(b);
39
+ const min = Math.min(x, y);
40
+ const max = Math.max(x, y);
41
+ return min + Math.random() * (max - min);
42
+ },
43
+ dice: (sides) => {
44
+ const s = Math.max(1, Math.floor(Number(sides)) || 1);
45
+ return Math.floor(Math.random() * s) + 1;
46
+ },
47
+ min: (a, b) => Math.min(Number(a), Number(b)),
48
+ max: (a, b) => Math.max(Number(a), Number(b)),
49
+ round: (n) => Math.round(Number(n)),
50
+ round_places: (n, places) => {
51
+ const p = Math.max(0, Math.floor(Number(places)) || 0);
52
+ const factor = Math.pow(10, p);
53
+ return Math.round(Number(n) * factor) / factor;
54
+ },
55
+ floor: (n) => Math.floor(Number(n)),
56
+ ceil: (n) => Math.ceil(Number(n)),
57
+ inc: (n) => {
58
+ const v = Number(n);
59
+ return Number.isInteger(v) ? v + 1 : Math.ceil(v);
60
+ },
61
+ dec: (n) => {
62
+ const v = Number(n);
63
+ return Number.isInteger(v) ? v - 1 : Math.floor(v);
64
+ },
65
+ decimal: (n) => {
66
+ const v = Number(n);
67
+ return Math.abs(v - Math.trunc(v));
68
+ },
69
+ int: (n) => Math.trunc(Number(n)),
70
+ ...(opts.functions ?? {}),
71
+ };
72
+ this.handleCommand = opts.handleCommand;
73
+ this.evaluator = new ExpressionEvaluator(this.variables, this.functions, this.program.enums);
74
+ this.commandHandler = opts.commandHandler ?? new CommandHandler(this.variables);
75
+ this.nodeTitle = opts.startAt;
76
+ this.step();
77
+ }
78
+ /**
79
+ * Get the current node title (may resolve to a node group).
80
+ */
81
+ getCurrentNodeTitle() {
82
+ return this.nodeTitle;
83
+ }
84
+ /**
85
+ * Resolve a node title to an actual node (handling node groups).
86
+ */
87
+ resolveNode(title) {
88
+ const nodeOrGroup = this.program.nodes[title];
89
+ if (!nodeOrGroup)
90
+ throw new Error(`Node ${title} not found`);
91
+ // If it's a single node, return it
92
+ if (!("nodes" in nodeOrGroup)) {
93
+ this.currentNodeIndex = -1;
94
+ return nodeOrGroup;
95
+ }
96
+ // It's a node group - select the first matching node based on when conditions
97
+ const group = nodeOrGroup;
98
+ for (let i = 0; i < group.nodes.length; i++) {
99
+ const candidate = group.nodes[i];
100
+ if (this.evaluateWhenConditions(candidate.when, title, i)) {
101
+ this.currentNodeIndex = i;
102
+ // If "once" condition, mark as seen immediately
103
+ if (candidate.when?.includes("once")) {
104
+ this.markNodeGroupOnceSeen(title, i);
105
+ }
106
+ return candidate;
107
+ }
108
+ }
109
+ // No matching node found - throw error or return first? Docs suggest error if no match
110
+ throw new Error(`No matching node found in group ${title}`);
111
+ }
112
+ /**
113
+ * Evaluate when conditions for a node in a group.
114
+ */
115
+ evaluateWhenConditions(conditions, nodeTitle, nodeIndex) {
116
+ if (!conditions || conditions.length === 0) {
117
+ // No when condition - available by default (but should not happen in groups)
118
+ return true;
119
+ }
120
+ // All conditions must be true (AND logic)
121
+ for (const condition of conditions) {
122
+ const trimmed = condition.trim();
123
+ if (trimmed === "once") {
124
+ // Check if this node has been visited once
125
+ const onceKey = `${nodeTitle}#${nodeIndex}`;
126
+ if (this.nodeGroupOnceSeen.has(onceKey)) {
127
+ return false; // Already seen once
128
+ }
129
+ // Will mark as seen when node is entered
130
+ continue;
131
+ }
132
+ if (trimmed === "always") {
133
+ // Always available
134
+ continue;
135
+ }
136
+ // Otherwise, treat as expression (e.g., "$has_sword")
137
+ if (!this.evaluator.evaluate(trimmed)) {
138
+ return false; // Condition failed
139
+ }
140
+ }
141
+ return true; // All conditions passed
142
+ }
143
+ /**
144
+ * Mark a node group node as seen (for "once" condition).
145
+ */
146
+ markNodeGroupOnceSeen(nodeTitle, nodeIndex) {
147
+ const onceKey = `${nodeTitle}#${nodeIndex}`;
148
+ this.nodeGroupOnceSeen.add(onceKey);
149
+ }
150
+ advance(optionIndex) {
151
+ // If awaiting option selection, consume chosen option by pushing its block
152
+ if (this.currentResult?.type === "options") {
153
+ if (optionIndex == null)
154
+ throw new Error("Option index required");
155
+ // Resolve to actual node (handles groups)
156
+ const node = this.resolveNode(this.nodeTitle);
157
+ // We encoded options at ip-1; locate it
158
+ const ins = node.instructions[this.ip - 1];
159
+ if (ins?.op !== "options")
160
+ throw new Error("Invalid options state");
161
+ const chosen = ins.options[optionIndex];
162
+ if (!chosen)
163
+ throw new Error("Invalid option index");
164
+ // Push a block frame that we will resume across advances
165
+ this.callStack.push({ kind: "block", title: this.nodeTitle, ip: this.ip, block: chosen.block, idx: 0 });
166
+ if (this.resumeBlock())
167
+ return;
168
+ return;
169
+ }
170
+ // If we have a pending block, resume it first
171
+ if (this.resumeBlock())
172
+ return;
173
+ this.step();
174
+ }
175
+ interpolate(text) {
176
+ return text.replace(/\{([^}]+)\}/g, (_m, expr) => {
177
+ try {
178
+ const val = this.evaluator.evaluateExpression(String(expr));
179
+ return String(val ?? "");
180
+ }
181
+ catch {
182
+ return "";
183
+ }
184
+ });
185
+ }
186
+ resumeBlock() {
187
+ const top = this.callStack[this.callStack.length - 1];
188
+ if (!top || top.kind !== "block")
189
+ return false;
190
+ // Execute from stored idx until we emit one result or finish block
191
+ while (true) {
192
+ const ins = top.block[top.idx++];
193
+ if (!ins) {
194
+ // finished block; pop and continue main step
195
+ this.callStack.pop();
196
+ this.step();
197
+ return true;
198
+ }
199
+ switch (ins.op) {
200
+ case "line":
201
+ this.emit({ type: "text", text: this.interpolate(ins.text), speaker: ins.speaker, tags: ins.tags, isDialogueEnd: false });
202
+ return true;
203
+ case "command": {
204
+ try {
205
+ const parsed = parseCommand(ins.content);
206
+ this.commandHandler.execute(parsed, this.evaluator).catch(() => { });
207
+ if (this.handleCommand)
208
+ this.handleCommand(ins.content, parsed);
209
+ }
210
+ catch {
211
+ if (this.handleCommand)
212
+ this.handleCommand(ins.content);
213
+ }
214
+ this.emit({ type: "command", command: ins.content, isDialogueEnd: false });
215
+ return true;
216
+ }
217
+ case "options": {
218
+ this.emit({ type: "options", options: ins.options.map((o) => ({ text: o.text, tags: o.tags })), isDialogueEnd: false });
219
+ return true;
220
+ }
221
+ case "if": {
222
+ const branch = ins.branches.find((b) => (b.condition ? this.evaluator.evaluate(b.condition) : true));
223
+ if (branch) {
224
+ // Push nested block at current top position (resume after)
225
+ this.callStack.push({ kind: "block", title: this.nodeTitle, ip: this.ip, block: branch.block, idx: 0 });
226
+ return this.resumeBlock();
227
+ }
228
+ break;
229
+ }
230
+ case "once": {
231
+ if (!this.onceSeen.has(ins.id)) {
232
+ this.onceSeen.add(ins.id);
233
+ this.callStack.push({ kind: "block", title: this.nodeTitle, ip: this.ip, block: ins.block, idx: 0 });
234
+ return this.resumeBlock();
235
+ }
236
+ break;
237
+ }
238
+ case "jump": {
239
+ this.nodeTitle = ins.target;
240
+ this.ip = 0;
241
+ this.step();
242
+ return true;
243
+ }
244
+ case "detour": {
245
+ this.callStack.push({ kind: "detour", title: top.title, ip: top.ip });
246
+ this.nodeTitle = ins.target;
247
+ this.ip = 0;
248
+ this.step();
249
+ return true;
250
+ }
251
+ }
252
+ }
253
+ }
254
+ step() {
255
+ while (true) {
256
+ const resolved = this.resolveNode(this.nodeTitle);
257
+ const currentNode = { title: this.nodeTitle, instructions: resolved.instructions };
258
+ const ins = currentNode.instructions[this.ip];
259
+ if (!ins) {
260
+ // Node ended
261
+ this.visitCounts[this.nodeTitle] = (this.visitCounts[this.nodeTitle] ?? 0) + 1;
262
+ this.emit({ type: "text", text: "", isDialogueEnd: true });
263
+ return;
264
+ }
265
+ this.ip++;
266
+ switch (ins.op) {
267
+ case "line":
268
+ this.emit({ type: "text", text: this.interpolate(ins.text), speaker: ins.speaker, tags: ins.tags, isDialogueEnd: this.lookaheadIsEnd() });
269
+ return;
270
+ case "command": {
271
+ try {
272
+ const parsed = parseCommand(ins.content);
273
+ this.commandHandler.execute(parsed, this.evaluator).catch(() => { });
274
+ if (this.handleCommand)
275
+ this.handleCommand(ins.content, parsed);
276
+ }
277
+ catch {
278
+ if (this.handleCommand)
279
+ this.handleCommand(ins.content);
280
+ }
281
+ this.emit({ type: "command", command: ins.content, isDialogueEnd: this.lookaheadIsEnd() });
282
+ return;
283
+ }
284
+ case "jump": {
285
+ // Exiting current node due to jump
286
+ this.visitCounts[this.nodeTitle] = (this.visitCounts[this.nodeTitle] ?? 0) + 1;
287
+ this.nodeTitle = ins.target;
288
+ this.ip = 0;
289
+ this.currentNodeIndex = -1; // Reset node index for new resolution
290
+ // resolveNode will handle node groups
291
+ continue;
292
+ }
293
+ case "detour": {
294
+ // Save return position, jump to target node, return when it ends
295
+ this.callStack.push({ kind: "detour", title: this.nodeTitle, ip: this.ip });
296
+ this.nodeTitle = ins.target;
297
+ this.ip = 0;
298
+ this.currentNodeIndex = -1; // Reset node index for new resolution
299
+ // resolveNode will handle node groups
300
+ continue;
301
+ }
302
+ case "options": {
303
+ this.emit({ type: "options", options: ins.options.map((o) => ({ text: o.text, tags: o.tags, css: o.css })), isDialogueEnd: this.lookaheadIsEnd() });
304
+ return;
305
+ }
306
+ case "if": {
307
+ const branch = ins.branches.find((b) => (b.condition ? this.evaluator.evaluate(b.condition) : true));
308
+ if (branch) {
309
+ this.callStack.push({ kind: "block", title: this.nodeTitle, ip: this.ip, block: branch.block, idx: 0 });
310
+ if (this.resumeBlock())
311
+ return;
312
+ }
313
+ break;
314
+ }
315
+ case "once": {
316
+ if (!this.onceSeen.has(ins.id)) {
317
+ this.onceSeen.add(ins.id);
318
+ this.callStack.push({ kind: "block", title: this.nodeTitle, ip: this.ip, block: ins.block, idx: 0 });
319
+ if (this.resumeBlock())
320
+ return;
321
+ }
322
+ break;
323
+ }
324
+ }
325
+ }
326
+ }
327
+ executeBlock(block) {
328
+ // Execute instructions of block, then resume
329
+ const saved = { title: this.nodeTitle, ip: this.ip };
330
+ this.nodeTitle = block.title;
331
+ const tempIpStart = 0;
332
+ const tempNode = { title: block.title, instructions: block.instructions };
333
+ // Use a temporary node context
334
+ const restore = () => {
335
+ this.nodeTitle = saved.title;
336
+ this.ip = saved.ip;
337
+ };
338
+ // Step through block, emitting first result
339
+ let idx = tempIpStart;
340
+ while (true) {
341
+ const ins = tempNode.instructions[idx++];
342
+ if (!ins)
343
+ break;
344
+ switch (ins.op) {
345
+ case "line":
346
+ this.emit({ type: "text", text: ins.text, speaker: ins.speaker, isDialogueEnd: false });
347
+ restore();
348
+ return;
349
+ case "command":
350
+ try {
351
+ const parsed = parseCommand(ins.content);
352
+ this.commandHandler.execute(parsed, this.evaluator).catch(() => { });
353
+ if (this.handleCommand)
354
+ this.handleCommand(ins.content, parsed);
355
+ }
356
+ catch {
357
+ if (this.handleCommand)
358
+ this.handleCommand(ins.content);
359
+ }
360
+ this.emit({ type: "command", command: ins.content, isDialogueEnd: false });
361
+ restore();
362
+ return;
363
+ case "options":
364
+ this.emit({ type: "options", options: ins.options.map((o) => ({ text: o.text })), isDialogueEnd: false });
365
+ // Maintain context that options belong to main node at ip-1
366
+ restore();
367
+ return;
368
+ case "if": {
369
+ const branch = ins.branches.find((b) => (b.condition ? this.evaluator.evaluate(b.condition) : true));
370
+ if (branch) {
371
+ // enqueue nested block and resume from main context
372
+ this.callStack.push({ kind: "block", title: this.nodeTitle, ip: this.ip, block: branch.block, idx: 0 });
373
+ restore();
374
+ if (this.resumeBlock())
375
+ return;
376
+ return;
377
+ }
378
+ break;
379
+ }
380
+ case "once": {
381
+ if (!this.onceSeen.has(ins.id)) {
382
+ this.onceSeen.add(ins.id);
383
+ this.callStack.push({ kind: "block", title: this.nodeTitle, ip: this.ip, block: ins.block, idx: 0 });
384
+ restore();
385
+ if (this.resumeBlock())
386
+ return;
387
+ return;
388
+ }
389
+ break;
390
+ }
391
+ case "jump": {
392
+ this.nodeTitle = ins.target;
393
+ this.ip = 0;
394
+ this.step();
395
+ return;
396
+ }
397
+ case "detour": {
398
+ this.callStack.push({ kind: "detour", title: saved.title, ip: saved.ip });
399
+ this.nodeTitle = ins.target;
400
+ this.ip = 0;
401
+ this.step();
402
+ return;
403
+ }
404
+ }
405
+ }
406
+ // Block produced no output; resume
407
+ restore();
408
+ this.step();
409
+ }
410
+ lookaheadIsEnd() {
411
+ // Check if current node has more emit-worthy instructions
412
+ const node = this.resolveNode(this.nodeTitle);
413
+ for (let k = this.ip; k < node.instructions.length; k++) {
414
+ const op = node.instructions[k]?.op;
415
+ if (!op)
416
+ break;
417
+ if (op === "line" || op === "options" || op === "command" || op === "if" || op === "once")
418
+ return false;
419
+ if (op === "jump" || op === "detour")
420
+ return false;
421
+ }
422
+ // Node is ending - mark as end (will trigger detour return if callStack exists)
423
+ return true;
424
+ }
425
+ emit(res) {
426
+ this.currentResult = res;
427
+ this.history.push(res);
428
+ // If we ended a detour node, return to caller after emitting last result
429
+ // Position is restored here, but we wait for next advance() to continue
430
+ if (res.isDialogueEnd && this.callStack.length > 0) {
431
+ const frame = this.callStack.pop();
432
+ this.nodeTitle = frame.title;
433
+ this.ip = frame.ip;
434
+ }
435
+ }
436
+ /**
437
+ * Get the current variable store (read-only view).
438
+ */
439
+ getVariables() {
440
+ return { ...this.variables };
441
+ }
442
+ /**
443
+ * Get variable value.
444
+ */
445
+ getVariable(name) {
446
+ return this.variables[name];
447
+ }
448
+ /**
449
+ * Set variable value.
450
+ */
451
+ setVariable(name, value) {
452
+ this.variables[name] = value;
453
+ this.evaluator.setVariable(name, value);
454
+ }
455
+ }
456
+ //# sourceMappingURL=runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/runtime/runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,130 @@
1
+ import { test } from "node:test";
2
+ import { strictEqual } from "node:assert";
3
+ import { parseYarn, compile, YarnRunner } from "../index.js";
4
+ test("full featured Yarn script with all elements", () => {
5
+ const script = `
6
+ title: Start
7
+ group: Demo
8
+ color: blue
9
+ ---
10
+ Narrator: Welcome to the comprehensive Yarn test.
11
+ <<set score 7>>
12
+ {if score >= 10}
13
+ Narrator: High score branch.
14
+ {else if score >= 5}
15
+ Narrator: Medium score branch.
16
+ {else}
17
+ Narrator: Low score branch.
18
+ {endif}
19
+
20
+ <<once>>
21
+ Narrator: This once block should only appear the first time.
22
+ <<endonce>>
23
+
24
+ -> Take the main path
25
+ Narrator: Proceeding on the main path.
26
+ <<jump NextScene>>
27
+ -> Explore a detour
28
+ Narrator: Let's explore a detour first.
29
+ <<detour AsideInfo>>
30
+ Narrator: Back from detour.
31
+ <<jump NextScene>>
32
+ ===
33
+
34
+ title: NextScene
35
+ group: Demo
36
+ ---
37
+ Narrator: You have arrived in the next scene.
38
+ -> Ask about features
39
+ Player: What can this system do?
40
+ Narrator: It supports options, conditions, once, jump, and detour.
41
+ -> Finish
42
+ Narrator: Ending the scene.
43
+ ===
44
+
45
+ title: AsideInfo
46
+ group: Demo
47
+ ---
48
+ Narrator: This is detour content.
49
+ ===
50
+ `;
51
+ const doc = parseYarn(script);
52
+ const ir = compile(doc);
53
+ // First run: once content should appear
54
+ let runner = new YarnRunner(ir, { startAt: "Start" });
55
+ // Welcome text
56
+ const a = runner.currentResult;
57
+ strictEqual(a.type, "text");
58
+ if (a.type === "text")
59
+ strictEqual(/Welcome/.test(a.text), true, "Should show welcome");
60
+ runner.advance();
61
+ // set command result
62
+ const b = runner.currentResult;
63
+ strictEqual(b.type, "command", "Should emit command");
64
+ runner.advance();
65
+ // Medium score branch (score is 7, >= 5 but < 10)
66
+ const c = runner.currentResult;
67
+ strictEqual(c.type, "text");
68
+ if (c.type === "text")
69
+ strictEqual(/Medium score branch/.test(c.text), true, "Should take medium branch");
70
+ runner.advance();
71
+ // Once block content
72
+ const d = runner.currentResult;
73
+ strictEqual(d.type, "text");
74
+ if (d.type === "text")
75
+ strictEqual(/This once block should only appear the first time\./.test(d.text), true, "Once block should appear first time");
76
+ runner.advance();
77
+ // Options
78
+ const e = runner.currentResult;
79
+ strictEqual(e.type, "options", "Should show options");
80
+ if (e.type === "options")
81
+ strictEqual(e.options.length, 2, "Should have 2 options");
82
+ // Choose detour path (index 1)
83
+ runner.advance(1);
84
+ // Body text before detour
85
+ const f = runner.currentResult;
86
+ strictEqual(f.type, "text");
87
+ if (f.type === "text")
88
+ strictEqual(/Let's explore a detour first/.test(f.text), true, "Should show option body");
89
+ runner.advance(); // detour executes
90
+ // Detour content should be emitted
91
+ const g = runner.currentResult;
92
+ strictEqual(g.type, "text");
93
+ if (g.type === "text")
94
+ strictEqual(/This is detour content/.test(g.text), true, "Should enter detour");
95
+ runner.advance(); // return from detour
96
+ // After detour, should continue with next line
97
+ const h = runner.currentResult;
98
+ strictEqual(h.type, "text");
99
+ if (h.type === "text")
100
+ strictEqual(/Back from detour/.test(h.text), true, "Should return from detour");
101
+ runner.advance(); // jump executes
102
+ // NextScene arrival
103
+ const i = runner.currentResult;
104
+ strictEqual(i.type, "text");
105
+ if (i.type === "text")
106
+ strictEqual(/arrived in the next scene/.test(i.text), true, "Should jump to NextScene");
107
+ runner.advance();
108
+ // Options in NextScene
109
+ const j = runner.currentResult;
110
+ strictEqual(j.type, "options", "Should show options in NextScene");
111
+ if (j.type === "options")
112
+ strictEqual(j.options.length, 2, "Should have 2 options in NextScene");
113
+ // Second run: once block should be skipped
114
+ runner = new YarnRunner(ir, { startAt: "Start" });
115
+ const k = runner.currentResult;
116
+ strictEqual(k.type, "text");
117
+ if (k.type === "text")
118
+ strictEqual(/Welcome/.test(k.text), true, "Welcome should appear");
119
+ runner.advance(); // command
120
+ runner.advance(); // branch line
121
+ // Should skip once and show options immediately after branch
122
+ let l = runner.currentResult;
123
+ if (l.type === "text") {
124
+ // Advance one more time in case an intermediate text was emitted
125
+ runner.advance();
126
+ l = runner.currentResult;
127
+ }
128
+ strictEqual(l.type, "options", "Once should be skipped on second run");
129
+ });
130
+ //# sourceMappingURL=full_featured.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"full_featured.test.js","sourceRoot":"","sources":["../../src/tests/full_featured.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,30 @@
1
+ import { test } from "node:test";
2
+ import { strictEqual } from "node:assert";
3
+ import { parseYarn, compile, YarnRunner } from "../index.js";
4
+ test("basic dialogue with options", () => {
5
+ const dialogue = `
6
+ title: Start
7
+ ---
8
+ Narrator: Hi
9
+ -> Opt A
10
+ Narrator: A chosen
11
+ -> Opt B
12
+ Narrator: B chosen
13
+ ===
14
+ `;
15
+ const doc = parseYarn(dialogue);
16
+ const ir = compile(doc);
17
+ const runner = new YarnRunner(ir, { startAt: "Start" });
18
+ const r1 = runner.currentResult;
19
+ strictEqual(r1.type, "text");
20
+ runner.advance();
21
+ const r2 = runner.currentResult;
22
+ strictEqual(r2.type, "options");
23
+ runner.advance(0);
24
+ const r3 = runner.currentResult;
25
+ strictEqual(r3.type, "text");
26
+ if (r3.type === "text") {
27
+ strictEqual(r3.text.includes("A chosen"), true);
28
+ }
29
+ });
30
+ //# sourceMappingURL=index.test.js.map