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
package/README.md ADDED
@@ -0,0 +1,180 @@
1
+ # yarn-spinner-ts
2
+
3
+ TypeScript parser, compiler, and runtime for Yarn Spinner 3.x, with a React adapter.
4
+
5
+ ## References
6
+
7
+ - Old JS parser: `bondage.js` (Yarn 2.x) — [GitHub](https://github.com/mnbroatch/bondage.js/tree/master/src)
8
+ - Official compiler (C#): YarnSpinner.Compiler — [GitHub](https://github.com/YarnSpinnerTool/YarnSpinner/tree/main/YarnSpinner.Compiler)
9
+ - Existing dialogue runner API: YarnBound — [GitHub](https://github.com/mnbroatch/yarn-bound?tab=readme-ov-file)
10
+
11
+ ## Features
12
+
13
+ - ✅ Full Yarn Spinner 3.x syntax support
14
+ - ✅ Parser for `.yarn` files → AST
15
+ - ✅ Compiler: AST → Intermediate Representation (IR)
16
+ - ✅ Runtime with `YarnRunner` class
17
+ - ✅ React hook: `useYarnRunner()`
18
+ - ✅ React component: `<DialogueView />`
19
+ - ✅ Expression evaluator for conditions
20
+ - ✅ Command system with built-in handlers (`<<set>>`, etc.)
21
+ - ✅ Support for:
22
+ - Lines with speakers
23
+ - Options with indented bodies
24
+ - `{if}/{else if}/{else}/{endif}` blocks
25
+ - `<<once>>...<<endonce>>` blocks
26
+ - `<<jump NodeName>>` commands
27
+ - `<<detour NodeName>>` commands
28
+ - Variables and functions
29
+ - Custom commands
30
+
31
+ ## Installation
32
+
33
+ ```bash
34
+ npm install
35
+ npm run build
36
+ ```
37
+
38
+ ## Quick Start
39
+
40
+ ### Basic Usage
41
+
42
+ ```typescript
43
+ import { parseYarn } from "yarn-spinner-ts";
44
+ import { compile } from "yarn-spinner-ts";
45
+ import { YarnRunner } from "yarn-spinner-ts";
46
+
47
+ const yarnText = `
48
+ title: Start
49
+ ---
50
+ Narrator: Hello!
51
+ -> Option 1
52
+ Narrator: You chose option 1.
53
+ -> Option 2
54
+ Narrator: You chose option 2.
55
+ ===
56
+ `;
57
+
58
+ const ast = parseYarn(yarnText);
59
+ const program = compile(ast);
60
+ const runner = new YarnRunner(program, {
61
+ startAt: "Start",
62
+ variables: { score: 10 },
63
+ functions: {
64
+ add: (a: number, b: number) => a + b,
65
+ },
66
+ handleCommand: (cmd, parsed) => {
67
+ console.log("Command:", cmd);
68
+ },
69
+ });
70
+
71
+ // Get current result
72
+ console.log(runner.currentResult); // TextResult, OptionsResult, or CommandResult
73
+
74
+ // Advance dialogue
75
+ runner.advance(); // Continue text
76
+ runner.advance(0); // Choose option 0
77
+ ```
78
+
79
+ ### React Usage
80
+
81
+ ```tsx
82
+ import { parseYarn, compile, useYarnRunner, DialogueView } from "yarn-spinner-ts";
83
+
84
+ function MyDialogue() {
85
+ const [program] = useState(() => {
86
+ const ast = parseYarn(yarnText);
87
+ return compile(ast);
88
+ });
89
+
90
+ const { result, advance } = useYarnRunner(program, {
91
+ startAt: "Start",
92
+ variables: { score: 10 },
93
+ });
94
+
95
+ return <DialogueView result={result} onAdvance={advance} />;
96
+ }
97
+ ```
98
+
99
+ ### Or use the example component:
100
+
101
+ ```tsx
102
+ import { DialogueExample } from "yarn-spinner-ts";
103
+
104
+ function App() {
105
+ return <DialogueExample />;
106
+ }
107
+ ```
108
+
109
+ ## API Reference
110
+
111
+ ### Parser
112
+
113
+ - `parseYarn(text: string): YarnDocument` — Parse Yarn script text into AST
114
+
115
+ ### Compiler
116
+
117
+ - `compile(doc: YarnDocument, opts?: CompileOptions): IRProgram` — Compile AST to IR
118
+
119
+ ### Runtime
120
+
121
+ - `YarnRunner(program: IRProgram, options: RunnerOptions)` — Dialogue runner class
122
+ - `currentResult: RuntimeResult | null` — Current dialogue state
123
+ - `advance(optionIndex?: number): void` — Advance dialogue
124
+ - `getVariable(name: string): unknown` — Get variable value
125
+ - `setVariable(name: string, value: unknown): void` — Set variable value
126
+ - `getVariables(): Readonly<Record<string, unknown>>` — Get all variables
127
+
128
+ ### React
129
+
130
+ - `useYarnRunner(program: IRProgram, options: RunnerOptions)` — React hook
131
+ - `<DialogueView result={...} onAdvance={...} />` — Ready-to-use component
132
+
133
+ ### Expression Evaluator
134
+
135
+ - `ExpressionEvaluator(variables, functions)` — Safe expression evaluator
136
+ - Supports: `===`, `!==`, `<`, `>`, `<=`, `>=`, `&&`, `||`, `!`
137
+ - Function calls: `functionName(arg1, arg2)`
138
+ - Variables, numbers, strings, booleans
139
+
140
+ ### Commands
141
+
142
+ - `CommandHandler` — Command handler registry
143
+ - Built-in: `<<set variable value>>`
144
+ - Register custom handlers: `handler.register("mycommand", (args) => { ... })`
145
+
146
+ ## Example Yarn Script
147
+
148
+ ```yarn
149
+ title: Start
150
+ ---
151
+ Narrator: Welcome!
152
+ <<set score = 10>>
153
+ {if score >= 10}
154
+ Narrator: High score!
155
+ {else}
156
+ Narrator: Low score.
157
+ {endif}
158
+ -> Ask about features
159
+ Player: What can this do?
160
+ Narrator: Lots of things!
161
+ -> Ask about commands
162
+ Player: Tell me about commands.
163
+ Narrator: Commands modify state.
164
+ <<once>>
165
+ Narrator: This only shows once!
166
+ <<endonce>>
167
+ ===
168
+ ```
169
+
170
+ ## Development
171
+
172
+ ```bash
173
+ npm run build # Build TypeScript
174
+ npm run dev # Watch mode
175
+ npm test # Run tests
176
+ ```
177
+
178
+ ## License
179
+
180
+ MIT
@@ -0,0 +1,9 @@
1
+ import type { YarnDocument } from "../model/ast";
2
+ import type { IRProgram } from "./ir";
3
+ export interface CompileOptions {
4
+ generateOnceIds?: (ctx: {
5
+ node: string;
6
+ index: number;
7
+ }) => string;
8
+ }
9
+ export declare function compile(doc: YarnDocument, opts?: CompileOptions): IRProgram;
@@ -0,0 +1,172 @@
1
+ export function compile(doc, opts = {}) {
2
+ const program = { enums: {}, nodes: {} };
3
+ // Store enum definitions
4
+ for (const enumDef of doc.enums) {
5
+ program.enums[enumDef.name] = enumDef.cases;
6
+ }
7
+ const genOnce = opts.generateOnceIds ?? ((x) => `${x.node}#once#${x.index}`);
8
+ let globalLineCounter = 0;
9
+ function ensureLineId(tags) {
10
+ const t = tags ? [...tags] : [];
11
+ if (!t.some((x) => x.startsWith("line:"))) {
12
+ t.push(`line:${(globalLineCounter++).toString(16)}`);
13
+ }
14
+ return t;
15
+ }
16
+ // Group nodes by title to handle node groups
17
+ const nodesByTitle = new Map();
18
+ for (const node of doc.nodes) {
19
+ if (!nodesByTitle.has(node.title)) {
20
+ nodesByTitle.set(node.title, []);
21
+ }
22
+ nodesByTitle.get(node.title).push(node);
23
+ }
24
+ for (const [title, nodesWithSameTitle] of nodesByTitle) {
25
+ // If only one node with this title, treat as regular node
26
+ if (nodesWithSameTitle.length === 1) {
27
+ const node = nodesWithSameTitle[0];
28
+ const instructions = [];
29
+ let onceCounter = 0;
30
+ function emitBlock(stmts) {
31
+ const block = [];
32
+ for (const s of stmts) {
33
+ switch (s.type) {
34
+ case "Line":
35
+ {
36
+ const line = s;
37
+ block.push({ op: "line", speaker: line.speaker, text: line.text, tags: ensureLineId(line.tags) });
38
+ }
39
+ break;
40
+ case "Command":
41
+ block.push({ op: "command", content: s.content });
42
+ break;
43
+ case "Jump":
44
+ block.push({ op: "jump", target: s.target });
45
+ break;
46
+ case "Detour":
47
+ block.push({ op: "detour", target: s.target });
48
+ break;
49
+ case "OptionGroup": {
50
+ // Add #lastline tag to the most recent line, if present
51
+ for (let i = block.length - 1; i >= 0; i--) {
52
+ const ins = block[i];
53
+ if (ins.op === "line") {
54
+ const tags = new Set(ins.tags ?? []);
55
+ if (![...tags].some((x) => x === "lastline" || x === "#lastline")) {
56
+ tags.add("lastline");
57
+ }
58
+ ins.tags = Array.from(tags);
59
+ break;
60
+ }
61
+ if (ins.op !== "command")
62
+ break; // stop if non-line non-command before options
63
+ }
64
+ block.push({
65
+ op: "options",
66
+ options: s.options.map((o) => ({ text: o.text, tags: ensureLineId(o.tags), block: emitBlock(o.body) })),
67
+ });
68
+ break;
69
+ }
70
+ case "If":
71
+ block.push({
72
+ op: "if",
73
+ branches: s.branches.map((b) => ({ condition: b.condition, block: emitBlock(b.body) })),
74
+ });
75
+ break;
76
+ case "Once":
77
+ block.push({ op: "once", id: genOnce({ node: node.title, index: onceCounter++ }), block: emitBlock(s.body) });
78
+ break;
79
+ case "Enum":
80
+ // Enums are metadata, skip during compilation (already stored in program.enums)
81
+ break;
82
+ }
83
+ }
84
+ return block;
85
+ }
86
+ instructions.push(...emitBlock(node.body));
87
+ const irNode = {
88
+ title: node.title,
89
+ instructions,
90
+ when: node.when,
91
+ css: node.css
92
+ };
93
+ program.nodes[node.title] = irNode;
94
+ }
95
+ else {
96
+ // Multiple nodes with same title - create node group
97
+ const groupNodes = [];
98
+ for (const node of nodesWithSameTitle) {
99
+ const instructions = [];
100
+ let onceCounter = 0;
101
+ function emitBlock(stmts) {
102
+ const block = [];
103
+ for (const s of stmts) {
104
+ switch (s.type) {
105
+ case "Line":
106
+ {
107
+ const line = s;
108
+ block.push({ op: "line", speaker: line.speaker, text: line.text, tags: ensureLineId(line.tags) });
109
+ }
110
+ break;
111
+ case "Command":
112
+ block.push({ op: "command", content: s.content });
113
+ break;
114
+ case "Jump":
115
+ block.push({ op: "jump", target: s.target });
116
+ break;
117
+ case "Detour":
118
+ block.push({ op: "detour", target: s.target });
119
+ break;
120
+ case "OptionGroup": {
121
+ for (let i = block.length - 1; i >= 0; i--) {
122
+ const ins = block[i];
123
+ if (ins.op === "line") {
124
+ const tags = new Set(ins.tags ?? []);
125
+ if (![...tags].some((x) => x === "lastline" || x === "#lastline")) {
126
+ tags.add("lastline");
127
+ }
128
+ ins.tags = Array.from(tags);
129
+ break;
130
+ }
131
+ if (ins.op !== "command")
132
+ break;
133
+ }
134
+ block.push({
135
+ op: "options",
136
+ options: s.options.map((o) => ({ text: o.text, tags: ensureLineId(o.tags), css: o.css, block: emitBlock(o.body) })),
137
+ });
138
+ break;
139
+ }
140
+ case "If":
141
+ block.push({
142
+ op: "if",
143
+ branches: s.branches.map((b) => ({ condition: b.condition, block: emitBlock(b.body) })),
144
+ });
145
+ break;
146
+ case "Once":
147
+ block.push({ op: "once", id: genOnce({ node: node.title, index: onceCounter++ }), block: emitBlock(s.body) });
148
+ break;
149
+ case "Enum":
150
+ break;
151
+ }
152
+ }
153
+ return block;
154
+ }
155
+ instructions.push(...emitBlock(node.body));
156
+ groupNodes.push({
157
+ title: node.title,
158
+ instructions,
159
+ when: node.when,
160
+ css: node.css
161
+ });
162
+ }
163
+ const group = {
164
+ title,
165
+ nodes: groupNodes
166
+ };
167
+ program.nodes[title] = group;
168
+ }
169
+ }
170
+ return program;
171
+ }
172
+ //# sourceMappingURL=compiler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compiler.js","sourceRoot":"","sources":["../../src/compile/compiler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ export type IRProgram = {
2
+ enums: Record<string, string[]>;
3
+ nodes: Record<string, IRNode | IRNodeGroup>;
4
+ };
5
+ export type IRNode = {
6
+ title: string;
7
+ instructions: IRInstruction[];
8
+ when?: string[];
9
+ css?: string;
10
+ };
11
+ export type IRNodeGroup = {
12
+ title: string;
13
+ nodes: IRNode[];
14
+ };
15
+ export type IRInstruction = {
16
+ op: "line";
17
+ speaker?: string;
18
+ text: string;
19
+ tags?: string[];
20
+ } | {
21
+ op: "command";
22
+ content: string;
23
+ } | {
24
+ op: "jump";
25
+ target: string;
26
+ } | {
27
+ op: "detour";
28
+ target: string;
29
+ } | {
30
+ op: "options";
31
+ options: Array<{
32
+ text: string;
33
+ tags?: string[];
34
+ css?: string;
35
+ block: IRInstruction[];
36
+ }>;
37
+ } | {
38
+ op: "if";
39
+ branches: Array<{
40
+ condition: string | null;
41
+ block: IRInstruction[];
42
+ }>;
43
+ } | {
44
+ op: "once";
45
+ id: string;
46
+ block: IRInstruction[];
47
+ };
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ir.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ir.js","sourceRoot":"","sources":["../../src/compile/ir.ts"],"names":[],"mappings":""}
@@ -0,0 +1,10 @@
1
+ export * from "./model/ast.js";
2
+ export * from "./parse/lexer.js";
3
+ export * from "./parse/parser.js";
4
+ export * from "./compile/ir.js";
5
+ export * from "./compile/compiler.js";
6
+ export * from "./runtime/results.js";
7
+ export * from "./runtime/evaluator.js";
8
+ export * from "./runtime/commands.js";
9
+ export * from "./runtime/runner.js";
10
+ export * from "./types.js";
package/dist/index.js ADDED
@@ -0,0 +1,11 @@
1
+ export * from "./model/ast.js";
2
+ export * from "./parse/lexer.js";
3
+ export * from "./parse/parser.js";
4
+ export * from "./compile/ir.js";
5
+ export * from "./compile/compiler.js";
6
+ export * from "./runtime/results.js";
7
+ export * from "./runtime/evaluator.js";
8
+ export * from "./runtime/commands.js";
9
+ export * from "./runtime/runner.js";
10
+ export * from "./types.js";
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,YAAY,CAAC"}
@@ -0,0 +1,72 @@
1
+ export type Position = {
2
+ line: number;
3
+ column: number;
4
+ };
5
+ export interface NodeHeaderMap {
6
+ [key: string]: string;
7
+ }
8
+ export interface YarnDocument {
9
+ type: "Document";
10
+ enums: EnumDefinition[];
11
+ nodes: YarnNode[];
12
+ }
13
+ export interface EnumDefinition {
14
+ type: "Enum";
15
+ name: string;
16
+ cases: string[];
17
+ }
18
+ export interface YarnNode {
19
+ type: "Node";
20
+ title: string;
21
+ headers: NodeHeaderMap;
22
+ nodeTags?: string[];
23
+ when?: string[];
24
+ css?: string;
25
+ body: Statement[];
26
+ }
27
+ export type Statement = Line | Command | OptionGroup | IfBlock | OnceBlock | Jump | Detour | EnumBlock;
28
+ export interface Line {
29
+ type: "Line";
30
+ speaker?: string;
31
+ text: string;
32
+ tags?: string[];
33
+ }
34
+ export interface Command {
35
+ type: "Command";
36
+ content: string;
37
+ }
38
+ export interface Jump {
39
+ type: "Jump";
40
+ target: string;
41
+ }
42
+ export interface Detour {
43
+ type: "Detour";
44
+ target: string;
45
+ }
46
+ export interface OptionGroup {
47
+ type: "OptionGroup";
48
+ options: Option[];
49
+ }
50
+ export interface Option {
51
+ type: "Option";
52
+ text: string;
53
+ body: Statement[];
54
+ tags?: string[];
55
+ css?: string;
56
+ }
57
+ export interface IfBlock {
58
+ type: "If";
59
+ branches: Array<{
60
+ condition: string | null;
61
+ body: Statement[];
62
+ }>;
63
+ }
64
+ export interface OnceBlock {
65
+ type: "Once";
66
+ body: Statement[];
67
+ }
68
+ export interface EnumBlock {
69
+ type: "Enum";
70
+ name: string;
71
+ cases: string[];
72
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ast.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ast.js","sourceRoot":"","sources":["../../src/model/ast.ts"],"names":[],"mappings":""}
@@ -0,0 +1,7 @@
1
+ export interface Token {
2
+ type: "HEADER_KEY" | "HEADER_VALUE" | "NODE_START" | "NODE_END" | "OPTION" | "COMMAND" | "TEXT" | "EMPTY" | "INDENT" | "DEDENT" | "EOF";
3
+ text: string;
4
+ line: number;
5
+ column: number;
6
+ }
7
+ export declare function lex(input: string): Token[];
@@ -0,0 +1,78 @@
1
+ // Minimal indentation-sensitive lexer to support options and their bodies.
2
+ export function lex(input) {
3
+ const lines = input.replace(/\r\n?/g, "\n").split("\n");
4
+ const tokens = [];
5
+ const indentStack = [0];
6
+ let inHeaders = true;
7
+ function push(type, text, line, column) {
8
+ tokens.push({ type, text, line, column });
9
+ }
10
+ for (let i = 0; i < lines.length; i++) {
11
+ const raw = lines[i];
12
+ const lineNum = i + 1;
13
+ const indent = raw.match(/^[ \t]*/)?.[0] ?? "";
14
+ const content = raw.slice(indent.length);
15
+ // Manage indentation tokens only within node bodies
16
+ if (!inHeaders) {
17
+ const prev = indentStack[indentStack.length - 1];
18
+ if (indent.length > prev) {
19
+ indentStack.push(indent.length);
20
+ push("INDENT", "", lineNum, 1);
21
+ }
22
+ else if (indent.length < prev) {
23
+ while (indentStack.length && indent.length < indentStack[indentStack.length - 1]) {
24
+ indentStack.pop();
25
+ push("DEDENT", "", lineNum, 1);
26
+ }
27
+ }
28
+ }
29
+ if (content.trim() === "") {
30
+ push("EMPTY", "", lineNum, 1);
31
+ continue;
32
+ }
33
+ if (content === "---") {
34
+ inHeaders = false;
35
+ push("NODE_START", content, lineNum, indent.length + 1);
36
+ continue;
37
+ }
38
+ if (content === "===") {
39
+ inHeaders = true;
40
+ // flush indentation to root
41
+ while (indentStack.length > 1) {
42
+ indentStack.pop();
43
+ push("DEDENT", "", lineNum, 1);
44
+ }
45
+ push("NODE_END", content, lineNum, indent.length + 1);
46
+ continue;
47
+ }
48
+ // Header: key: value (only valid while inHeaders)
49
+ if (inHeaders) {
50
+ const m = content.match(/^([A-Za-z_][A-Za-z0-9_]*)\s*:\s*(.*)$/);
51
+ if (m) {
52
+ push("HEADER_KEY", m[1], lineNum, indent.length + 1);
53
+ push("HEADER_VALUE", m[2], lineNum, indent.length + 1 + m[0].indexOf(m[2]));
54
+ continue;
55
+ }
56
+ }
57
+ if (content.startsWith("->")) {
58
+ push("OPTION", content.slice(2).trim(), lineNum, indent.length + 1);
59
+ continue;
60
+ }
61
+ // Commands like <<...>> (single line)
62
+ const cmd = content.match(/^<<(.+?)>>\s*$/);
63
+ if (cmd) {
64
+ push("COMMAND", cmd[1].trim(), lineNum, indent.length + 1);
65
+ continue;
66
+ }
67
+ // Plain text line
68
+ push("TEXT", content, lineNum, indent.length + 1);
69
+ }
70
+ // close remaining indentation at EOF
71
+ while (indentStack.length > 1) {
72
+ indentStack.pop();
73
+ tokens.push({ type: "DEDENT", text: "", line: lines.length, column: 1 });
74
+ }
75
+ tokens.push({ type: "EOF", text: "", line: lines.length + 1, column: 1 });
76
+ return tokens;
77
+ }
78
+ //# sourceMappingURL=lexer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lexer.js","sourceRoot":"","sources":["../../src/parse/lexer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { YarnDocument } from "../model/ast";
2
+ export declare class ParseError extends Error {
3
+ }
4
+ export declare function parseYarn(text: string): YarnDocument;