wyreframe 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 (117) hide show
  1. package/README.md +123 -0
  2. package/dist/index.d.ts +267 -0
  3. package/dist/index.d.ts.map +1 -0
  4. package/dist/index.js +195 -0
  5. package/dist/index.js.map +1 -0
  6. package/package.json +63 -0
  7. package/src/parser/Core/Bounds.mjs +61 -0
  8. package/src/parser/Core/Bounds.res +65 -0
  9. package/src/parser/Core/Grid.mjs +268 -0
  10. package/src/parser/Core/Grid.res +265 -0
  11. package/src/parser/Core/Position.mjs +83 -0
  12. package/src/parser/Core/Position.res +54 -0
  13. package/src/parser/Core/Types.mjs +435 -0
  14. package/src/parser/Core/Types.res +331 -0
  15. package/src/parser/Core/__tests__/Bounds_test.mjs +326 -0
  16. package/src/parser/Core/__tests__/Bounds_test.res +412 -0
  17. package/src/parser/Core/__tests__/Grid_test.mjs +322 -0
  18. package/src/parser/Core/__tests__/Grid_test.res +319 -0
  19. package/src/parser/Core/__tests__/Types_test.mjs +614 -0
  20. package/src/parser/Core/__tests__/Types_test.res +650 -0
  21. package/src/parser/Detector/BoxTracer.mjs +302 -0
  22. package/src/parser/Detector/BoxTracer.res +374 -0
  23. package/src/parser/Detector/HierarchyBuilder.mjs +158 -0
  24. package/src/parser/Detector/HierarchyBuilder.res +315 -0
  25. package/src/parser/Detector/ShapeDetector.mjs +134 -0
  26. package/src/parser/Detector/ShapeDetector.res +236 -0
  27. package/src/parser/Detector/__tests__/BoxTracer_test.mjs +70 -0
  28. package/src/parser/Detector/__tests__/BoxTracer_test.res +92 -0
  29. package/src/parser/Detector/__tests__/HierarchyBuilder_test.mjs +489 -0
  30. package/src/parser/Detector/__tests__/HierarchyBuilder_test.res +849 -0
  31. package/src/parser/Detector/__tests__/ShapeDetector_test.mjs +377 -0
  32. package/src/parser/Detector/__tests__/ShapeDetector_test.res +563 -0
  33. package/src/parser/Errors/ErrorContext.mjs +106 -0
  34. package/src/parser/Errors/ErrorContext.res +191 -0
  35. package/src/parser/Errors/ErrorMessages.mjs +289 -0
  36. package/src/parser/Errors/ErrorMessages.res +303 -0
  37. package/src/parser/Errors/ErrorTypes.mjs +105 -0
  38. package/src/parser/Errors/ErrorTypes.res +169 -0
  39. package/src/parser/Interactions/InteractionMerger.mjs +266 -0
  40. package/src/parser/Interactions/InteractionMerger.res +450 -0
  41. package/src/parser/Interactions/InteractionParser.mjs +88 -0
  42. package/src/parser/Interactions/InteractionParser.res +127 -0
  43. package/src/parser/Interactions/SimpleInteractionParser.mjs +278 -0
  44. package/src/parser/Interactions/SimpleInteractionParser.res +262 -0
  45. package/src/parser/Interactions/__tests__/InteractionMerger_test.mjs +576 -0
  46. package/src/parser/Interactions/__tests__/InteractionMerger_test.res +646 -0
  47. package/src/parser/Parser.gen.tsx +96 -0
  48. package/src/parser/Parser.mjs +212 -0
  49. package/src/parser/Parser.res +481 -0
  50. package/src/parser/Scanner/__tests__/Grid_manual.mjs +214 -0
  51. package/src/parser/Scanner/__tests__/Grid_manual.res +141 -0
  52. package/src/parser/Semantic/ASTBuilder.mjs +197 -0
  53. package/src/parser/Semantic/ASTBuilder.res +288 -0
  54. package/src/parser/Semantic/AlignmentCalc.mjs +41 -0
  55. package/src/parser/Semantic/AlignmentCalc.res +104 -0
  56. package/src/parser/Semantic/Elements/ButtonParser.mjs +58 -0
  57. package/src/parser/Semantic/Elements/ButtonParser.res +131 -0
  58. package/src/parser/Semantic/Elements/CheckboxParser.mjs +58 -0
  59. package/src/parser/Semantic/Elements/CheckboxParser.res +79 -0
  60. package/src/parser/Semantic/Elements/CodeTextParser.mjs +50 -0
  61. package/src/parser/Semantic/Elements/CodeTextParser.res +111 -0
  62. package/src/parser/Semantic/Elements/ElementParser.mjs +15 -0
  63. package/src/parser/Semantic/Elements/ElementParser.res +83 -0
  64. package/src/parser/Semantic/Elements/EmphasisParser.mjs +46 -0
  65. package/src/parser/Semantic/Elements/EmphasisParser.res +67 -0
  66. package/src/parser/Semantic/Elements/InputParser.mjs +41 -0
  67. package/src/parser/Semantic/Elements/InputParser.res +97 -0
  68. package/src/parser/Semantic/Elements/LinkParser.mjs +60 -0
  69. package/src/parser/Semantic/Elements/LinkParser.res +156 -0
  70. package/src/parser/Semantic/Elements/TextParser.mjs +19 -0
  71. package/src/parser/Semantic/Elements/TextParser.res +42 -0
  72. package/src/parser/Semantic/Elements/__tests__/ButtonParser_test.mjs +189 -0
  73. package/src/parser/Semantic/Elements/__tests__/ButtonParser_test.res +257 -0
  74. package/src/parser/Semantic/Elements/__tests__/CheckboxParser_test.mjs +202 -0
  75. package/src/parser/Semantic/Elements/__tests__/CheckboxParser_test.res +250 -0
  76. package/src/parser/Semantic/Elements/__tests__/CodeTextParser_manual.mjs +293 -0
  77. package/src/parser/Semantic/Elements/__tests__/CodeTextParser_manual.res +134 -0
  78. package/src/parser/Semantic/Elements/__tests__/InputParser_test.mjs +253 -0
  79. package/src/parser/Semantic/Elements/__tests__/InputParser_test.res +304 -0
  80. package/src/parser/Semantic/Elements/__tests__/LinkParser_test.mjs +289 -0
  81. package/src/parser/Semantic/Elements/__tests__/LinkParser_test.res +402 -0
  82. package/src/parser/Semantic/Elements/__tests__/TextParser_test.mjs +149 -0
  83. package/src/parser/Semantic/Elements/__tests__/TextParser_test.res +167 -0
  84. package/src/parser/Semantic/ParserRegistry.mjs +82 -0
  85. package/src/parser/Semantic/ParserRegistry.res +145 -0
  86. package/src/parser/Semantic/SemanticParser.mjs +850 -0
  87. package/src/parser/Semantic/SemanticParser.res +1368 -0
  88. package/src/parser/Semantic/__tests__/ASTBuilder_test.mjs +187 -0
  89. package/src/parser/Semantic/__tests__/ASTBuilder_test.res +192 -0
  90. package/src/parser/Semantic/__tests__/ParserRegistry_test.mjs +154 -0
  91. package/src/parser/Semantic/__tests__/ParserRegistry_test.res +191 -0
  92. package/src/parser/Semantic/__tests__/SemanticParser_integration_test.mjs +768 -0
  93. package/src/parser/Semantic/__tests__/SemanticParser_integration_test.res +1069 -0
  94. package/src/parser/Semantic/__tests__/SemanticParser_manual.mjs +1329 -0
  95. package/src/parser/Semantic/__tests__/SemanticParser_manual.res +544 -0
  96. package/src/parser/TestMain.mjs +21 -0
  97. package/src/parser/TestMain.res +14 -0
  98. package/src/parser/TextExtractor.mjs +179 -0
  99. package/src/parser/TextExtractor.res +264 -0
  100. package/src/parser/__tests__/GridScanner_integration.test.mjs +632 -0
  101. package/src/parser/__tests__/GridScanner_integration.test.res +816 -0
  102. package/src/parser/__tests__/Performance.test.mjs +244 -0
  103. package/src/parser/__tests__/Performance.test.res +371 -0
  104. package/src/parser/__tests__/PerformanceFixtures.mjs +200 -0
  105. package/src/parser/__tests__/PerformanceFixtures.res +284 -0
  106. package/src/parser/__tests__/WyreframeParser_integration.test.mjs +770 -0
  107. package/src/parser/__tests__/WyreframeParser_integration.test.res +1008 -0
  108. package/src/parser/__tests__/fixtures/alignment-test.txt +9 -0
  109. package/src/parser/__tests__/fixtures/all-elements.txt +16 -0
  110. package/src/parser/__tests__/fixtures/login-scene.txt +17 -0
  111. package/src/parser/__tests__/fixtures/multi-scene.txt +25 -0
  112. package/src/parser/__tests__/fixtures/nested-boxes.txt +15 -0
  113. package/src/parser/__tests__/fixtures/simple-box.txt +5 -0
  114. package/src/parser/__tests__/fixtures/with-dividers.txt +14 -0
  115. package/src/renderer/Renderer.gen.tsx +32 -0
  116. package/src/renderer/Renderer.mjs +391 -0
  117. package/src/renderer/Renderer.res +558 -0
package/README.md ADDED
@@ -0,0 +1,123 @@
1
+ # Wyreframe
2
+
3
+ > A library that converts ASCII wireframes into working HTML/UI
4
+
5
+ [![npm version](https://img.shields.io/npm/v/wyreframe.svg)](https://www.npmjs.com/package/wyreframe)
6
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
7
+
8
+ ```
9
+ +---------------------------+
10
+ | 'WYREFRAME' | Draw in ASCII
11
+ | +---------------------+ | ↓
12
+ | | #email | | Convert to HTML!
13
+ | +---------------------+ |
14
+ | [ Login ] |
15
+ +---------------------------+
16
+ ```
17
+
18
+ ## Installation
19
+
20
+ ```bash
21
+ npm install wyreframe
22
+ ```
23
+
24
+ ## Quick Start
25
+
26
+ ```javascript
27
+ import { createUI } from 'wyreframe';
28
+
29
+ const ui = `
30
+ @scene: login
31
+
32
+ +---------------------------+
33
+ | 'WYREFRAME' |
34
+ | +---------------------+ |
35
+ | | #email | |
36
+ | +---------------------+ |
37
+ | [ Login ] |
38
+ +---------------------------+
39
+
40
+ #email:
41
+ placeholder: "Enter your email"
42
+
43
+ [Login]:
44
+ @click -> goto(dashboard, slide-left)
45
+ `;
46
+
47
+ const result = createUI(ui);
48
+
49
+ if (result.success) {
50
+ document.getElementById('app').appendChild(result.root);
51
+ result.sceneManager.goto('login');
52
+ }
53
+ ```
54
+
55
+ ## Syntax Summary
56
+
57
+ | Syntax | Description | Example |
58
+ |------|------|------|
59
+ | `+---+` | Box/Container | `<div>` |
60
+ | `[ Text ]` | Button | `<button>` |
61
+ | `#id` | Input field | `<input>` |
62
+ | `"text"` | Link | `<a>` |
63
+ | `'text'` | Emphasis text | Title, Heading |
64
+ | `[x]` / `[ ]` | Checkbox | `<input type="checkbox">` |
65
+ | `---` | Scene separator | Multi-scene |
66
+
67
+ ## API
68
+
69
+ ```javascript
70
+ import { parse, render, createUI, createUIOrThrow } from 'wyreframe';
71
+
72
+ // Parse only
73
+ const result = parse(text);
74
+
75
+ // Render only
76
+ const { root, sceneManager } = render(ast);
77
+
78
+ // Parse + Render (recommended)
79
+ const result = createUI(text);
80
+
81
+ // Throw on error
82
+ const { root, sceneManager } = createUIOrThrow(text);
83
+ ```
84
+
85
+ ### SceneManager
86
+
87
+ ```javascript
88
+ sceneManager.goto('dashboard'); // Navigate to scene
89
+ sceneManager.getCurrentScene(); // Get current scene
90
+ sceneManager.getSceneIds(); // Get all scene IDs
91
+ ```
92
+
93
+ ## Interactions
94
+
95
+ ```yaml
96
+ #email:
97
+ placeholder: "Email"
98
+
99
+ [Login]:
100
+ variant: primary
101
+ @click -> goto(dashboard, slide-left)
102
+ ```
103
+
104
+ **Transition effects:** `fade`, `slide-left`, `slide-right`, `zoom`
105
+
106
+ ## Documentation
107
+
108
+ - [Parser Architecture](docs/PARSER_ARCHITECTURE.md)
109
+ - [Testing Guide](docs/TESTING.md)
110
+ - [Examples](examples/index.html)
111
+
112
+ ## Development
113
+
114
+ ```bash
115
+ npm install
116
+ npm run res:build # ReScript build
117
+ npm run dev # Dev server (http://localhost:3000/examples)
118
+ npm test # Run tests
119
+ ```
120
+
121
+ ## License
122
+
123
+ MIT License
@@ -0,0 +1,267 @@
1
+ /**
2
+ * Wyreframe - ASCII Wireframe to HTML/UI Converter
3
+ *
4
+ * This module provides a TypeScript-friendly API wrapper
5
+ * around the ReScript parser implementation.
6
+ */
7
+ /** Device type for responsive design */
8
+ export type DeviceType = 'desktop' | 'laptop' | 'tablet' | 'tablet-landscape' | 'mobile' | 'mobile-landscape';
9
+ /** Transition effect for scene changes */
10
+ export type TransitionType = 'fade' | 'slide-left' | 'slide-right' | 'zoom';
11
+ /** Text alignment */
12
+ export type Alignment = 'left' | 'center' | 'right';
13
+ /** Button variant styles */
14
+ export type ButtonVariant = 'primary' | 'secondary' | 'ghost';
15
+ /** Action types for interactions */
16
+ export interface GotoAction {
17
+ type: 'goto';
18
+ target: string;
19
+ transition?: TransitionType;
20
+ }
21
+ export type Action = GotoAction;
22
+ /** UI Element types */
23
+ export interface BoxElement {
24
+ TAG: 'Box';
25
+ name?: string;
26
+ children: Element[];
27
+ }
28
+ export interface ButtonElement {
29
+ TAG: 'Button';
30
+ id: string;
31
+ text: string;
32
+ align: Alignment;
33
+ variant?: ButtonVariant;
34
+ actions: Action[];
35
+ }
36
+ export interface InputElement {
37
+ TAG: 'Input';
38
+ id: string;
39
+ placeholder?: string;
40
+ variant?: string;
41
+ }
42
+ export interface LinkElement {
43
+ TAG: 'Link';
44
+ id: string;
45
+ text: string;
46
+ align: Alignment;
47
+ actions: Action[];
48
+ }
49
+ export interface TextElement {
50
+ TAG: 'Text';
51
+ content: string;
52
+ emphasis: boolean;
53
+ align: Alignment;
54
+ }
55
+ export interface CheckboxElement {
56
+ TAG: 'Checkbox';
57
+ checked: boolean;
58
+ label: string;
59
+ }
60
+ export interface DividerElement {
61
+ TAG: 'Divider';
62
+ }
63
+ export interface RowElement {
64
+ TAG: 'Row';
65
+ children: Element[];
66
+ align: Alignment;
67
+ }
68
+ export interface SectionElement {
69
+ TAG: 'Section';
70
+ name: string;
71
+ children: Element[];
72
+ }
73
+ export type Element = BoxElement | ButtonElement | InputElement | LinkElement | TextElement | CheckboxElement | DividerElement | RowElement | SectionElement;
74
+ /** Scene definition */
75
+ export interface Scene {
76
+ id: string;
77
+ title: string;
78
+ device: DeviceType;
79
+ transition: TransitionType;
80
+ elements: Element[];
81
+ }
82
+ /** Abstract Syntax Tree */
83
+ export interface AST {
84
+ scenes: Scene[];
85
+ }
86
+ /** Parse error information */
87
+ export interface ParseError {
88
+ message: string;
89
+ line?: number;
90
+ column?: number;
91
+ source?: string;
92
+ }
93
+ /** Scene manager for programmatic navigation */
94
+ export interface SceneManager {
95
+ /** Navigate to a scene by ID */
96
+ goto: (sceneId: string) => void;
97
+ /** Get the current scene ID */
98
+ getCurrentScene: () => string | undefined;
99
+ /** Get all available scene IDs */
100
+ getSceneIds: () => string[];
101
+ }
102
+ /** Render options */
103
+ export interface RenderOptions {
104
+ /** Theme name */
105
+ theme?: string;
106
+ /** Enable interactions (default: true) */
107
+ interactive?: boolean;
108
+ /** Inject default styles (default: true) */
109
+ injectStyles?: boolean;
110
+ /** Additional CSS class for container */
111
+ containerClass?: string;
112
+ }
113
+ /** Render result */
114
+ export interface RenderResult {
115
+ /** Rendered root element */
116
+ root: HTMLElement;
117
+ /** Scene manager for navigation */
118
+ sceneManager: SceneManager;
119
+ }
120
+ export type ParseSuccessResult = {
121
+ success: true;
122
+ ast: AST;
123
+ };
124
+ export type ParseErrorResult = {
125
+ success: false;
126
+ errors: ParseError[];
127
+ };
128
+ export type ParseResult = ParseSuccessResult | ParseErrorResult;
129
+ export type InteractionSuccessResult = {
130
+ success: true;
131
+ interactions: unknown[];
132
+ };
133
+ export type InteractionErrorResult = {
134
+ success: false;
135
+ errors: ParseError[];
136
+ };
137
+ export type InteractionResult = InteractionSuccessResult | InteractionErrorResult;
138
+ export type CreateUISuccessResult = {
139
+ success: true;
140
+ root: HTMLElement;
141
+ sceneManager: SceneManager;
142
+ ast: AST;
143
+ };
144
+ export type CreateUIErrorResult = {
145
+ success: false;
146
+ errors: ParseError[];
147
+ };
148
+ export type CreateUIResult = CreateUISuccessResult | CreateUIErrorResult;
149
+ /**
150
+ * Parse mixed text containing wireframe and interactions.
151
+ *
152
+ * @param text - Text containing ASCII wireframe and/or interaction DSL
153
+ * @returns Parse result with success flag
154
+ *
155
+ * @example
156
+ * ```typescript
157
+ * const result = parse(text);
158
+ * if (result.success) {
159
+ * const { root, sceneManager } = render(result.ast);
160
+ * document.body.appendChild(root);
161
+ * } else {
162
+ * console.error(result.errors);
163
+ * }
164
+ * ```
165
+ */
166
+ export declare function parse(text: string): ParseResult;
167
+ /**
168
+ * Parse text and throw on error.
169
+ * Use this for simpler code when you expect parsing to succeed.
170
+ *
171
+ * @param text - Text containing ASCII wireframe and/or interaction DSL
172
+ * @returns Parsed AST
173
+ * @throws Error if parsing fails
174
+ *
175
+ * @example
176
+ * ```typescript
177
+ * try {
178
+ * const ast = parseOrThrow(text);
179
+ * const { root } = render(ast);
180
+ * document.body.appendChild(root);
181
+ * } catch (error) {
182
+ * console.error('Parse failed:', error.message);
183
+ * }
184
+ * ```
185
+ */
186
+ export declare function parseOrThrow(text: string): AST;
187
+ /**
188
+ * Parse only the wireframe structure (no interactions).
189
+ *
190
+ * @param wireframe - ASCII wireframe string
191
+ * @returns Parse result with success flag
192
+ */
193
+ export declare function parseWireframe(wireframe: string): ParseResult;
194
+ /**
195
+ * Parse only the interaction DSL.
196
+ *
197
+ * @param dsl - Interaction DSL string
198
+ * @returns Interaction result with success flag
199
+ */
200
+ export declare function parseInteractions(dsl: string): InteractionResult;
201
+ /**
202
+ * Render AST to DOM elements.
203
+ *
204
+ * @param ast - Parsed AST from parse()
205
+ * @param options - Render options
206
+ * @returns Render result with root element and scene manager
207
+ *
208
+ * @example
209
+ * ```typescript
210
+ * const { root, sceneManager } = render(ast);
211
+ * document.getElementById('app')!.appendChild(root);
212
+ *
213
+ * // Navigate between scenes
214
+ * sceneManager.goto('dashboard');
215
+ * ```
216
+ */
217
+ export declare function render(ast: AST, options?: RenderOptions): RenderResult;
218
+ /**
219
+ * Parse and render in one step.
220
+ * Convenience function that combines parse() and render().
221
+ *
222
+ * @param text - Text containing ASCII wireframe and/or interaction DSL
223
+ * @param options - Render options
224
+ * @returns Create UI result with success flag
225
+ *
226
+ * @example
227
+ * ```typescript
228
+ * const result = createUI(text);
229
+ * if (result.success) {
230
+ * document.getElementById('app')!.appendChild(result.root);
231
+ * result.sceneManager.goto('login');
232
+ * }
233
+ * ```
234
+ */
235
+ export declare function createUI(text: string, options?: RenderOptions): CreateUIResult;
236
+ /**
237
+ * Parse and render, throwing on error.
238
+ *
239
+ * @param text - Text containing ASCII wireframe and/or interaction DSL
240
+ * @param options - Render options
241
+ * @returns Render result with root element, scene manager, and AST
242
+ * @throws Error if parsing fails
243
+ *
244
+ * @example
245
+ * ```typescript
246
+ * const { root, sceneManager } = createUIOrThrow(text);
247
+ * document.getElementById('app')!.appendChild(root);
248
+ * ```
249
+ */
250
+ export declare function createUIOrThrow(text: string, options?: RenderOptions): RenderResult & {
251
+ ast: AST;
252
+ };
253
+ export declare const version: string;
254
+ export declare const implementation: string;
255
+ declare const _default: {
256
+ parse: typeof parse;
257
+ parseOrThrow: typeof parseOrThrow;
258
+ parseWireframe: typeof parseWireframe;
259
+ parseInteractions: typeof parseInteractions;
260
+ render: typeof render;
261
+ createUI: typeof createUI;
262
+ createUIOrThrow: typeof createUIOrThrow;
263
+ version: string;
264
+ implementation: string;
265
+ };
266
+ export default _default;
267
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js ADDED
@@ -0,0 +1,195 @@
1
+ /**
2
+ * Wyreframe - ASCII Wireframe to HTML/UI Converter
3
+ *
4
+ * This module provides a TypeScript-friendly API wrapper
5
+ * around the ReScript parser implementation.
6
+ */
7
+ // Note: These imports use relative paths that work when compiled to dist/
8
+ // The ReScript .mjs files remain in src/parser/, so dist/index.js imports ../src/parser/
9
+ // @ts-ignore - ReScript generated module
10
+ import * as Parser from '../src/parser/Parser.mjs';
11
+ // @ts-ignore - ReScript generated module
12
+ import * as Renderer from '../src/renderer/Renderer.mjs';
13
+ // ============================================================================
14
+ // API Functions
15
+ // ============================================================================
16
+ /**
17
+ * Parse mixed text containing wireframe and interactions.
18
+ *
19
+ * @param text - Text containing ASCII wireframe and/or interaction DSL
20
+ * @returns Parse result with success flag
21
+ *
22
+ * @example
23
+ * ```typescript
24
+ * const result = parse(text);
25
+ * if (result.success) {
26
+ * const { root, sceneManager } = render(result.ast);
27
+ * document.body.appendChild(root);
28
+ * } else {
29
+ * console.error(result.errors);
30
+ * }
31
+ * ```
32
+ */
33
+ export function parse(text) {
34
+ const result = Parser.parse(text);
35
+ if (result.TAG === 'Ok') {
36
+ return { success: true, ast: result._0 };
37
+ }
38
+ else {
39
+ return { success: false, errors: result._0 };
40
+ }
41
+ }
42
+ /**
43
+ * Parse text and throw on error.
44
+ * Use this for simpler code when you expect parsing to succeed.
45
+ *
46
+ * @param text - Text containing ASCII wireframe and/or interaction DSL
47
+ * @returns Parsed AST
48
+ * @throws Error if parsing fails
49
+ *
50
+ * @example
51
+ * ```typescript
52
+ * try {
53
+ * const ast = parseOrThrow(text);
54
+ * const { root } = render(ast);
55
+ * document.body.appendChild(root);
56
+ * } catch (error) {
57
+ * console.error('Parse failed:', error.message);
58
+ * }
59
+ * ```
60
+ */
61
+ export function parseOrThrow(text) {
62
+ const result = parse(text);
63
+ if (result.success) {
64
+ return result.ast;
65
+ }
66
+ else {
67
+ const errorMessages = result.errors
68
+ .map((e) => e.message || JSON.stringify(e))
69
+ .join('\n');
70
+ throw new Error(`Parse failed:\n${errorMessages}`);
71
+ }
72
+ }
73
+ /**
74
+ * Parse only the wireframe structure (no interactions).
75
+ *
76
+ * @param wireframe - ASCII wireframe string
77
+ * @returns Parse result with success flag
78
+ */
79
+ export function parseWireframe(wireframe) {
80
+ const result = Parser.parseWireframe(wireframe);
81
+ if (result.TAG === 'Ok') {
82
+ return { success: true, ast: result._0 };
83
+ }
84
+ else {
85
+ return { success: false, errors: result._0 };
86
+ }
87
+ }
88
+ /**
89
+ * Parse only the interaction DSL.
90
+ *
91
+ * @param dsl - Interaction DSL string
92
+ * @returns Interaction result with success flag
93
+ */
94
+ export function parseInteractions(dsl) {
95
+ const result = Parser.parseInteractions(dsl);
96
+ if (result.TAG === 'Ok') {
97
+ return { success: true, interactions: result._0 };
98
+ }
99
+ else {
100
+ return { success: false, errors: result._0 };
101
+ }
102
+ }
103
+ /**
104
+ * Render AST to DOM elements.
105
+ *
106
+ * @param ast - Parsed AST from parse()
107
+ * @param options - Render options
108
+ * @returns Render result with root element and scene manager
109
+ *
110
+ * @example
111
+ * ```typescript
112
+ * const { root, sceneManager } = render(ast);
113
+ * document.getElementById('app')!.appendChild(root);
114
+ *
115
+ * // Navigate between scenes
116
+ * sceneManager.goto('dashboard');
117
+ * ```
118
+ */
119
+ export function render(ast, options) {
120
+ // Pass undefined if no options, so ReScript uses its defaults
121
+ const result = Renderer.render(ast, options);
122
+ return {
123
+ root: result.root,
124
+ sceneManager: {
125
+ goto: result.sceneManager.goto,
126
+ getCurrentScene: result.sceneManager.getCurrentScene,
127
+ getSceneIds: result.sceneManager.getSceneIds,
128
+ },
129
+ };
130
+ }
131
+ /**
132
+ * Parse and render in one step.
133
+ * Convenience function that combines parse() and render().
134
+ *
135
+ * @param text - Text containing ASCII wireframe and/or interaction DSL
136
+ * @param options - Render options
137
+ * @returns Create UI result with success flag
138
+ *
139
+ * @example
140
+ * ```typescript
141
+ * const result = createUI(text);
142
+ * if (result.success) {
143
+ * document.getElementById('app')!.appendChild(result.root);
144
+ * result.sceneManager.goto('login');
145
+ * }
146
+ * ```
147
+ */
148
+ export function createUI(text, options) {
149
+ const parseResult = parse(text);
150
+ if (!parseResult.success) {
151
+ return parseResult;
152
+ }
153
+ const { root, sceneManager } = render(parseResult.ast, options);
154
+ return {
155
+ success: true,
156
+ root,
157
+ sceneManager,
158
+ ast: parseResult.ast,
159
+ };
160
+ }
161
+ /**
162
+ * Parse and render, throwing on error.
163
+ *
164
+ * @param text - Text containing ASCII wireframe and/or interaction DSL
165
+ * @param options - Render options
166
+ * @returns Render result with root element, scene manager, and AST
167
+ * @throws Error if parsing fails
168
+ *
169
+ * @example
170
+ * ```typescript
171
+ * const { root, sceneManager } = createUIOrThrow(text);
172
+ * document.getElementById('app')!.appendChild(root);
173
+ * ```
174
+ */
175
+ export function createUIOrThrow(text, options) {
176
+ const ast = parseOrThrow(text);
177
+ const { root, sceneManager } = render(ast, options);
178
+ return { root, sceneManager, ast };
179
+ }
180
+ // Version info
181
+ export const version = Parser.version;
182
+ export const implementation = Parser.implementation;
183
+ // Default export for convenience
184
+ export default {
185
+ parse,
186
+ parseOrThrow,
187
+ parseWireframe,
188
+ parseInteractions,
189
+ render,
190
+ createUI,
191
+ createUIOrThrow,
192
+ version,
193
+ implementation,
194
+ };
195
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,63 @@
1
+ {
2
+ "name": "wyreframe",
3
+ "version": "0.1.0",
4
+ "description": "ASCII wireframe + interaction DSL to HTML converter with scene transitions",
5
+ "author": "wickedev",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "https://github.com/wickedev/wyreframe.git"
9
+ },
10
+ "type": "module",
11
+ "main": "dist/index.js",
12
+ "module": "dist/index.js",
13
+ "types": "dist/index.d.ts",
14
+ "files": [
15
+ "dist",
16
+ "src/parser",
17
+ "src/renderer",
18
+ "README.md"
19
+ ],
20
+ "exports": {
21
+ ".": {
22
+ "types": "./dist/index.d.ts",
23
+ "import": "./dist/index.js",
24
+ "default": "./dist/index.js"
25
+ },
26
+ "./parser": {
27
+ "import": "./src/parser/Parser.mjs"
28
+ },
29
+ "./renderer": {
30
+ "import": "./src/renderer/Renderer.mjs"
31
+ }
32
+ },
33
+ "scripts": {
34
+ "dev": "npx serve .",
35
+ "build": "npm run res:build && npm run ts:build",
36
+ "ts:build": "tsc",
37
+ "ts:watch": "tsc --watch",
38
+ "test": "vitest run",
39
+ "test:watch": "vitest",
40
+ "test:coverage": "vitest run --coverage",
41
+ "res:build": "rescript",
42
+ "res:watch": "rescript build -w",
43
+ "res:clean": "rescript clean",
44
+ "prepublishOnly": "npm run build"
45
+ },
46
+ "keywords": [
47
+ "wireframe",
48
+ "ascii",
49
+ "dsl",
50
+ "html",
51
+ "prototype"
52
+ ],
53
+ "license": "MIT",
54
+ "dependencies": {
55
+ "@rescript/core": "^1.6.1",
56
+ "rescript": "12",
57
+ "vitest": "^3.2.4"
58
+ },
59
+ "devDependencies": {
60
+ "rescript-vitest": "^2.1.1",
61
+ "typescript": "^5.9.3"
62
+ }
63
+ }