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,52 @@
1
+ /**
2
+ * Safe expression evaluator for Yarn Spinner conditions.
3
+ * Supports variables, functions, comparisons, and logical operators.
4
+ */
5
+ export declare class ExpressionEvaluator {
6
+ private variables;
7
+ private functions;
8
+ private enums;
9
+ private smartVariables;
10
+ constructor(variables?: Record<string, unknown>, functions?: Record<string, (...args: unknown[]) => unknown>, enums?: Record<string, string[]>);
11
+ /**
12
+ * Evaluate a condition expression and return a boolean result.
13
+ * Supports: variables, literals (numbers, strings, booleans), comparisons, logical ops, function calls.
14
+ */
15
+ evaluate(expr: string): boolean;
16
+ /**
17
+ * Evaluate an expression that can return any value (not just boolean).
18
+ */
19
+ evaluateExpression(expr: string): unknown;
20
+ private preprocess;
21
+ private evaluateFunctionCall;
22
+ private parseArguments;
23
+ private containsComparison;
24
+ private evaluateComparison;
25
+ private evaluateLogical;
26
+ private resolveValue;
27
+ /**
28
+ * Resolve shorthand enum (.CaseName) when setting a variable with known enum type
29
+ */
30
+ resolveEnumValue(expr: string, enumName?: string): string;
31
+ /**
32
+ * Get enum type for a variable (if it was declared with enum type)
33
+ */
34
+ getEnumTypeForVariable(varName: string): string | undefined;
35
+ private deepEquals;
36
+ /**
37
+ * Update variables. Can be used to mutate state during dialogue.
38
+ */
39
+ setVariable(name: string, value: unknown): void;
40
+ /**
41
+ * Register a smart variable (variable with expression that recalculates on access).
42
+ */
43
+ setSmartVariable(name: string, expression: string): void;
44
+ /**
45
+ * Check if a variable is a smart variable.
46
+ */
47
+ isSmartVariable(name: string): boolean;
48
+ /**
49
+ * Get variable value.
50
+ */
51
+ getVariable(name: string): unknown;
52
+ }
@@ -0,0 +1,309 @@
1
+ /**
2
+ * Safe expression evaluator for Yarn Spinner conditions.
3
+ * Supports variables, functions, comparisons, and logical operators.
4
+ */
5
+ export class ExpressionEvaluator {
6
+ constructor(variables = {}, functions = {}, enums = {} // enum name -> cases
7
+ ) {
8
+ this.variables = variables;
9
+ this.functions = functions;
10
+ this.enums = enums;
11
+ this.smartVariables = {}; // variable name -> expression
12
+ }
13
+ /**
14
+ * Evaluate a condition expression and return a boolean result.
15
+ * Supports: variables, literals (numbers, strings, booleans), comparisons, logical ops, function calls.
16
+ */
17
+ evaluate(expr) {
18
+ try {
19
+ const result = this.evaluateExpression(expr);
20
+ return !!result;
21
+ }
22
+ catch {
23
+ return false;
24
+ }
25
+ }
26
+ /**
27
+ * Evaluate an expression that can return any value (not just boolean).
28
+ */
29
+ evaluateExpression(expr) {
30
+ const trimmed = this.preprocess(expr.trim());
31
+ if (!trimmed)
32
+ return false;
33
+ // Handle function calls like `functionName(arg1, arg2)`
34
+ if (trimmed.includes("(") && trimmed.includes(")")) {
35
+ return this.evaluateFunctionCall(trimmed);
36
+ }
37
+ // Handle comparisons
38
+ if (this.containsComparison(trimmed)) {
39
+ return this.evaluateComparison(trimmed);
40
+ }
41
+ // Handle logical operators
42
+ if (trimmed.includes("&&") || trimmed.includes("||")) {
43
+ return this.evaluateLogical(trimmed);
44
+ }
45
+ // Handle negation
46
+ if (trimmed.startsWith("!")) {
47
+ return !this.evaluateExpression(trimmed.slice(1).trim());
48
+ }
49
+ // Simple variable or literal
50
+ return this.resolveValue(trimmed);
51
+ }
52
+ preprocess(expr) {
53
+ // Normalize operator word aliases to JS-like symbols
54
+ // Whole word replacements only
55
+ return expr
56
+ .replace(/\bnot\b/gi, "!")
57
+ .replace(/\band\b/gi, "&&")
58
+ .replace(/\bor\b/gi, "||")
59
+ .replace(/\bxor\b/gi, "^")
60
+ .replace(/\beq\b|\bis\b/gi, "==")
61
+ .replace(/\bneq\b/gi, "!=")
62
+ .replace(/\bgte\b/gi, ">=")
63
+ .replace(/\blte\b/gi, "<=")
64
+ .replace(/\bgt\b/gi, ">")
65
+ .replace(/\blt\b/gi, "<");
66
+ }
67
+ evaluateFunctionCall(expr) {
68
+ const match = expr.match(/^([a-zA-Z_][a-zA-Z0-9_]*)\s*\((.*)\)$/);
69
+ if (!match)
70
+ throw new Error(`Invalid function call: ${expr}`);
71
+ const [, name, argsStr] = match;
72
+ const func = this.functions[name];
73
+ if (!func)
74
+ throw new Error(`Function not found: ${name}`);
75
+ const args = this.parseArguments(argsStr);
76
+ const evaluatedArgs = args.map((arg) => this.evaluateExpression(arg.trim()));
77
+ return func(...evaluatedArgs);
78
+ }
79
+ parseArguments(argsStr) {
80
+ if (!argsStr.trim())
81
+ return [];
82
+ const args = [];
83
+ let depth = 0;
84
+ let current = "";
85
+ for (const char of argsStr) {
86
+ if (char === "(")
87
+ depth++;
88
+ else if (char === ")")
89
+ depth--;
90
+ else if (char === "," && depth === 0) {
91
+ args.push(current.trim());
92
+ current = "";
93
+ continue;
94
+ }
95
+ current += char;
96
+ }
97
+ if (current.trim())
98
+ args.push(current.trim());
99
+ return args;
100
+ }
101
+ containsComparison(expr) {
102
+ return /[<>=!]/.test(expr);
103
+ }
104
+ evaluateComparison(expr) {
105
+ // Match comparison operators (avoid matching !=, <=, >=)
106
+ const match = expr.match(/^(.+?)\s*(===|!==|<=|>=|<|>)\s*(.+)$/);
107
+ if (!match)
108
+ throw new Error(`Invalid comparison: ${expr}`);
109
+ const [, left, op, right] = match;
110
+ const leftVal = this.evaluateExpression(left.trim());
111
+ const rightVal = this.evaluateExpression(right.trim());
112
+ switch (op) {
113
+ case "===":
114
+ case "==":
115
+ return this.deepEquals(leftVal, rightVal);
116
+ case "!==":
117
+ case "!=":
118
+ return !this.deepEquals(leftVal, rightVal);
119
+ case "<":
120
+ return Number(leftVal) < Number(rightVal);
121
+ case ">":
122
+ return Number(leftVal) > Number(rightVal);
123
+ case "<=":
124
+ return Number(leftVal) <= Number(rightVal);
125
+ case ">=":
126
+ return Number(leftVal) >= Number(rightVal);
127
+ default:
128
+ throw new Error(`Unknown operator: ${op}`);
129
+ }
130
+ }
131
+ evaluateLogical(expr) {
132
+ // Split by && or ||, respecting parentheses
133
+ const parts = [];
134
+ let depth = 0;
135
+ let current = "";
136
+ let lastOp = null;
137
+ for (const char of expr) {
138
+ if (char === "(")
139
+ depth++;
140
+ else if (char === ")")
141
+ depth--;
142
+ else if (depth === 0 && expr.includes(char === "&" ? "&&" : char === "|" ? "||" : "")) {
143
+ // Check for && or ||
144
+ const remaining = expr.slice(expr.indexOf(char));
145
+ if (remaining.startsWith("&&")) {
146
+ if (current.trim()) {
147
+ parts.push({ expr: current.trim(), op: lastOp });
148
+ current = "";
149
+ }
150
+ lastOp = "&&";
151
+ // skip &&
152
+ continue;
153
+ }
154
+ else if (remaining.startsWith("||")) {
155
+ if (current.trim()) {
156
+ parts.push({ expr: current.trim(), op: lastOp });
157
+ current = "";
158
+ }
159
+ lastOp = "||";
160
+ // skip ||
161
+ continue;
162
+ }
163
+ }
164
+ current += char;
165
+ }
166
+ if (current.trim())
167
+ parts.push({ expr: current.trim(), op: lastOp });
168
+ // Simple case: single expression
169
+ if (parts.length === 0)
170
+ return !!this.evaluateExpression(expr);
171
+ // Evaluate parts (supports &&, ||, ^ as xor)
172
+ let result = this.evaluateExpression(parts[0].expr);
173
+ for (let i = 1; i < parts.length; i++) {
174
+ const part = parts[i];
175
+ const val = this.evaluateExpression(part.expr);
176
+ if (part.op === "&&") {
177
+ result = result && val;
178
+ }
179
+ else if (part.op === "||") {
180
+ result = result || val;
181
+ }
182
+ }
183
+ return !!result;
184
+ }
185
+ resolveValue(expr) {
186
+ // Try enum syntax: EnumName.CaseName or .CaseName
187
+ const enumMatch = expr.match(/^\.?([A-Za-z_][A-Za-z0-9_]*)\.([A-Za-z_][A-Za-z0-9_]*)$/);
188
+ if (enumMatch) {
189
+ const [, enumName, caseName] = enumMatch;
190
+ if (this.enums[enumName] && this.enums[enumName].includes(caseName)) {
191
+ return `${enumName}.${caseName}`; // Store as "EnumName.CaseName" string
192
+ }
193
+ }
194
+ // Try shorthand enum: .CaseName (requires context from variables)
195
+ if (expr.startsWith(".") && expr.length > 1) {
196
+ const caseName = expr.slice(1);
197
+ // Try to infer enum from variable types - for now, return as-is and let validation handle it
198
+ return expr;
199
+ }
200
+ // Try as variable first
201
+ const key = expr.startsWith("$") ? expr.slice(1) : expr;
202
+ // Check if this is a smart variable (has stored expression)
203
+ if (Object.prototype.hasOwnProperty.call(this.smartVariables, key)) {
204
+ // Re-evaluate the expression each time it's accessed
205
+ return this.evaluateExpression(this.smartVariables[key]);
206
+ }
207
+ if (Object.prototype.hasOwnProperty.call(this.variables, key)) {
208
+ return this.variables[key];
209
+ }
210
+ // Try as number
211
+ const num = Number(expr);
212
+ if (!isNaN(num) && expr.trim() === String(num)) {
213
+ return num;
214
+ }
215
+ // Try as boolean
216
+ if (expr === "true")
217
+ return true;
218
+ if (expr === "false")
219
+ return false;
220
+ // Try as string (quoted)
221
+ if ((expr.startsWith('"') && expr.endsWith('"')) || (expr.startsWith("'") && expr.endsWith("'"))) {
222
+ return expr.slice(1, -1);
223
+ }
224
+ // Default: treat as variable (may be undefined)
225
+ return this.variables[key];
226
+ }
227
+ /**
228
+ * Resolve shorthand enum (.CaseName) when setting a variable with known enum type
229
+ */
230
+ resolveEnumValue(expr, enumName) {
231
+ if (expr.startsWith(".") && enumName) {
232
+ const caseName = expr.slice(1);
233
+ if (this.enums[enumName] && this.enums[enumName].includes(caseName)) {
234
+ return `${enumName}.${caseName}`;
235
+ }
236
+ throw new Error(`Invalid enum case ${caseName} for enum ${enumName}`);
237
+ }
238
+ // Check if it's already EnumName.CaseName format
239
+ const match = expr.match(/^([A-Za-z_][A-Za-z0-9_]*)\.([A-Za-z_][A-Za-z0-9_]*)$/);
240
+ if (match) {
241
+ const [, name, caseName] = match;
242
+ if (this.enums[name] && this.enums[name].includes(caseName)) {
243
+ return expr;
244
+ }
245
+ throw new Error(`Invalid enum case ${caseName} for enum ${name}`);
246
+ }
247
+ return expr;
248
+ }
249
+ /**
250
+ * Get enum type for a variable (if it was declared with enum type)
251
+ */
252
+ getEnumTypeForVariable(varName) {
253
+ // Check if variable value matches EnumName.CaseName pattern
254
+ const key = varName.startsWith("$") ? varName.slice(1) : varName;
255
+ const value = this.variables[key];
256
+ if (typeof value === "string") {
257
+ const match = value.match(/^([A-Za-z_][A-Za-z0-9_]*)\./);
258
+ if (match) {
259
+ return match[1];
260
+ }
261
+ }
262
+ return undefined;
263
+ }
264
+ deepEquals(a, b) {
265
+ if (a === b)
266
+ return true;
267
+ if (a == null || b == null)
268
+ return a === b;
269
+ if (typeof a !== typeof b)
270
+ return false;
271
+ if (typeof a === "object") {
272
+ return JSON.stringify(a) === JSON.stringify(b);
273
+ }
274
+ return false;
275
+ }
276
+ /**
277
+ * Update variables. Can be used to mutate state during dialogue.
278
+ */
279
+ setVariable(name, value) {
280
+ // If setting a smart variable, remove it (converting to regular variable)
281
+ if (Object.prototype.hasOwnProperty.call(this.smartVariables, name)) {
282
+ delete this.smartVariables[name];
283
+ }
284
+ this.variables[name] = value;
285
+ }
286
+ /**
287
+ * Register a smart variable (variable with expression that recalculates on access).
288
+ */
289
+ setSmartVariable(name, expression) {
290
+ // Remove from regular variables if it exists
291
+ if (Object.prototype.hasOwnProperty.call(this.variables, name)) {
292
+ delete this.variables[name];
293
+ }
294
+ this.smartVariables[name] = expression;
295
+ }
296
+ /**
297
+ * Check if a variable is a smart variable.
298
+ */
299
+ isSmartVariable(name) {
300
+ return Object.prototype.hasOwnProperty.call(this.smartVariables, name);
301
+ }
302
+ /**
303
+ * Get variable value.
304
+ */
305
+ getVariable(name) {
306
+ return this.variables[name];
307
+ }
308
+ }
309
+ //# sourceMappingURL=evaluator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evaluator.js","sourceRoot":"","sources":["../../src/runtime/evaluator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ export type TextResult = {
2
+ type: "text";
3
+ text: string;
4
+ speaker?: string;
5
+ tags?: string[];
6
+ isDialogueEnd: boolean;
7
+ };
8
+ export type OptionsResult = {
9
+ type: "options";
10
+ options: {
11
+ text: string;
12
+ tags?: string[];
13
+ css?: string;
14
+ }[];
15
+ isDialogueEnd: boolean;
16
+ };
17
+ export type CommandResult = {
18
+ type: "command";
19
+ command: string;
20
+ isDialogueEnd: boolean;
21
+ };
22
+ export type RuntimeResult = TextResult | OptionsResult | CommandResult;
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=results.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"results.js","sourceRoot":"","sources":["../../src/runtime/results.ts"],"names":[],"mappings":""}
@@ -0,0 +1,63 @@
1
+ import type { IRProgram } from "../compile/ir";
2
+ import type { RuntimeResult } from "./results.js";
3
+ import { CommandHandler, parseCommand } from "./commands.js";
4
+ export interface RunnerOptions {
5
+ startAt: string;
6
+ variables?: Record<string, unknown>;
7
+ functions?: Record<string, (...args: unknown[]) => unknown>;
8
+ handleCommand?: (command: string, parsed?: ReturnType<typeof parseCommand>) => void;
9
+ commandHandler?: CommandHandler;
10
+ }
11
+ export declare class YarnRunner {
12
+ private readonly program;
13
+ private readonly variables;
14
+ private readonly functions;
15
+ private readonly handleCommand?;
16
+ private readonly commandHandler;
17
+ private readonly evaluator;
18
+ private readonly onceSeen;
19
+ private readonly nodeGroupOnceSeen;
20
+ private readonly visitCounts;
21
+ private nodeTitle;
22
+ private ip;
23
+ private currentNodeIndex;
24
+ private callStack;
25
+ currentResult: RuntimeResult | null;
26
+ history: RuntimeResult[];
27
+ constructor(program: IRProgram, opts: RunnerOptions);
28
+ /**
29
+ * Get the current node title (may resolve to a node group).
30
+ */
31
+ getCurrentNodeTitle(): string;
32
+ /**
33
+ * Resolve a node title to an actual node (handling node groups).
34
+ */
35
+ private resolveNode;
36
+ /**
37
+ * Evaluate when conditions for a node in a group.
38
+ */
39
+ private evaluateWhenConditions;
40
+ /**
41
+ * Mark a node group node as seen (for "once" condition).
42
+ */
43
+ private markNodeGroupOnceSeen;
44
+ advance(optionIndex?: number): void;
45
+ private interpolate;
46
+ private resumeBlock;
47
+ private step;
48
+ private executeBlock;
49
+ private lookaheadIsEnd;
50
+ private emit;
51
+ /**
52
+ * Get the current variable store (read-only view).
53
+ */
54
+ getVariables(): Readonly<Record<string, unknown>>;
55
+ /**
56
+ * Get variable value.
57
+ */
58
+ getVariable(name: string): unknown;
59
+ /**
60
+ * Set variable value.
61
+ */
62
+ setVariable(name: string, value: unknown): void;
63
+ }