@llui/vite-plugin 0.0.1

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.
@@ -0,0 +1,533 @@
1
+ import ts from 'typescript';
2
+ const INTERACTIVE_ELEMENTS = new Set([
3
+ 'button',
4
+ 'a',
5
+ 'input',
6
+ 'select',
7
+ 'textarea',
8
+ 'details',
9
+ 'summary',
10
+ ]);
11
+ const ELEMENT_HELPERS = new Set([
12
+ 'a',
13
+ 'abbr',
14
+ 'article',
15
+ 'aside',
16
+ 'b',
17
+ 'blockquote',
18
+ 'br',
19
+ 'button',
20
+ 'canvas',
21
+ 'code',
22
+ 'dd',
23
+ 'details',
24
+ 'dialog',
25
+ 'div',
26
+ 'dl',
27
+ 'dt',
28
+ 'em',
29
+ 'fieldset',
30
+ 'figcaption',
31
+ 'figure',
32
+ 'footer',
33
+ 'form',
34
+ 'h1',
35
+ 'h2',
36
+ 'h3',
37
+ 'h4',
38
+ 'h5',
39
+ 'h6',
40
+ 'header',
41
+ 'hr',
42
+ 'i',
43
+ 'iframe',
44
+ 'img',
45
+ 'input',
46
+ 'label',
47
+ 'legend',
48
+ 'li',
49
+ 'main',
50
+ 'mark',
51
+ 'nav',
52
+ 'ol',
53
+ 'optgroup',
54
+ 'option',
55
+ 'output',
56
+ 'p',
57
+ 'pre',
58
+ 'progress',
59
+ 'section',
60
+ 'select',
61
+ 'small',
62
+ 'span',
63
+ 'strong',
64
+ 'sub',
65
+ 'summary',
66
+ 'sup',
67
+ 'table',
68
+ 'tbody',
69
+ 'td',
70
+ 'textarea',
71
+ 'tfoot',
72
+ 'th',
73
+ 'thead',
74
+ 'time',
75
+ 'tr',
76
+ 'ul',
77
+ 'video',
78
+ ]);
79
+ export function diagnose(source) {
80
+ const sf = ts.createSourceFile('input.ts', source, ts.ScriptTarget.Latest, true);
81
+ const diagnostics = [];
82
+ // Collect Msg type variants for exhaustive update() check
83
+ const msgVariants = collectMsgVariants(sf);
84
+ // Collect state access paths for bitmask warning
85
+ const statePaths = collectStatePaths(sf);
86
+ function visit(node) {
87
+ checkMapOnState(node, sf, diagnostics);
88
+ checkExhaustiveUpdate(node, sf, diagnostics, msgVariants);
89
+ checkAccessibility(node, sf, diagnostics);
90
+ checkControlledInput(node, sf, diagnostics);
91
+ checkChildStaticProps(node, sf, diagnostics);
92
+ checkBitmaskOverflow(node, sf, diagnostics, statePaths);
93
+ checkNamespaceImport(node, sf, diagnostics);
94
+ checkSpreadChildren(node, sf, diagnostics);
95
+ checkEmptyProps(node, sf, diagnostics);
96
+ ts.forEachChild(node, visit);
97
+ }
98
+ visit(sf);
99
+ return diagnostics;
100
+ }
101
+ // ── "Almost-optimized" diagnostics ───────────────────────────────
102
+ // Warns when a user writes `import * as L from '@llui/dom'` — the compiler
103
+ // can only recognize named-import helpers, so namespace imports disable
104
+ // template cloning/elSplit for every element call in the file.
105
+ function checkNamespaceImport(node, sf, diagnostics) {
106
+ if (!ts.isImportDeclaration(node))
107
+ return;
108
+ if (!ts.isStringLiteral(node.moduleSpecifier))
109
+ return;
110
+ if (node.moduleSpecifier.text !== '@llui/dom')
111
+ return;
112
+ const clause = node.importClause;
113
+ if (!clause?.namedBindings)
114
+ return;
115
+ if (!ts.isNamespaceImport(clause.namedBindings))
116
+ return;
117
+ const name = clause.namedBindings.name.text;
118
+ const { line, column } = pos(clause.namedBindings, sf);
119
+ diagnostics.push({
120
+ message: `Namespace import '${name}' from '@llui/dom' at line ${line} disables compiler optimizations. Use named imports instead: import { div, text, ... } from '@llui/dom'.`,
121
+ line,
122
+ column,
123
+ });
124
+ }
125
+ // Warns when a children array contains a spread — the compiler can't
126
+ // analyze variable-length children, so it bails on template cloning and
127
+ // falls back to runtime elSplit. Not fatal, but silent.
128
+ function checkSpreadChildren(node, sf, diagnostics) {
129
+ if (!ts.isCallExpression(node))
130
+ return;
131
+ if (!ts.isIdentifier(node.expression))
132
+ return;
133
+ if (!ELEMENT_HELPERS.has(node.expression.text))
134
+ return;
135
+ // Children could be at arguments[0] (children-only overload) or arguments[1]
136
+ for (const arg of node.arguments) {
137
+ if (!ts.isArrayLiteralExpression(arg))
138
+ continue;
139
+ // Look for "suspicious" spreads — ones that aren't obviously returning
140
+ // Node[] from a structural primitive or user-defined view helper.
141
+ for (const el of arg.elements) {
142
+ if (!ts.isSpreadElement(el))
143
+ continue;
144
+ if (isStructuralSpread(el.expression))
145
+ continue;
146
+ const { line, column } = pos(arg, sf);
147
+ diagnostics.push({
148
+ message: `Spread in children array of '${node.expression.text}()' at line ${line} disables template-clone compilation. For dynamic child counts, use each() instead.`,
149
+ line,
150
+ column,
151
+ });
152
+ return;
153
+ }
154
+ }
155
+ }
156
+ // Array iteration methods whose result spreads are the red flag we want
157
+ // to catch — users should use each() instead. Function calls generally
158
+ // return Node[] from structural primitives or user view helpers and are
159
+ // the legitimate way to compose output.
160
+ const ARRAY_ITERATION_METHODS = new Set([
161
+ 'map',
162
+ 'filter',
163
+ 'flatMap',
164
+ 'slice',
165
+ 'concat',
166
+ 'reverse',
167
+ 'sort',
168
+ ]);
169
+ function isStructuralSpread(expr) {
170
+ // Only keep the warning for suspect patterns: identifier spreads and
171
+ // array-iteration method calls. Everything else is presumed to be a
172
+ // structural primitive or user helper returning Node[].
173
+ if (ts.isCallExpression(expr)) {
174
+ const callee = expr.expression;
175
+ if (ts.isPropertyAccessExpression(callee) && ts.isIdentifier(callee.name)) {
176
+ // `...arr.map(...)`, `...arr.filter(...)` — suspect
177
+ return !ARRAY_ITERATION_METHODS.has(callee.name.text);
178
+ }
179
+ // Plain function call `...fn()` — presume structural/helper
180
+ return true;
181
+ }
182
+ // Identifier spread (`...arr`) — suspect
183
+ return false;
184
+ }
185
+ // Warns when an element helper is called with an empty props object — the
186
+ // attrs argument is optional, so `h1({}, [...])` should be `h1([...])`.
187
+ function checkEmptyProps(node, sf, diagnostics) {
188
+ if (!ts.isCallExpression(node))
189
+ return;
190
+ if (!ts.isIdentifier(node.expression))
191
+ return;
192
+ if (!ELEMENT_HELPERS.has(node.expression.text))
193
+ return;
194
+ const firstArg = node.arguments[0];
195
+ if (!firstArg || !ts.isObjectLiteralExpression(firstArg))
196
+ return;
197
+ if (firstArg.properties.length !== 0)
198
+ return;
199
+ const { line, column } = pos(firstArg, sf);
200
+ diagnostics.push({
201
+ message: `Empty props object passed to '${node.expression.text}()' at line ${line}. The attrs argument is optional — omit it: ${node.expression.text}([...]).`,
202
+ line,
203
+ column,
204
+ });
205
+ }
206
+ function pos(node, sf) {
207
+ const { line, character } = sf.getLineAndCharacterOfPosition(node.getStart(sf));
208
+ return { line: line + 1, column: character + 1 };
209
+ }
210
+ function _isInsideEachRender(node) {
211
+ let current = node.parent;
212
+ while (current) {
213
+ if ((ts.isArrowFunction(current) || ts.isFunctionExpression(current)) &&
214
+ current.parameters.length >= 1) {
215
+ const param = current.parameters[0];
216
+ // Options bag: ({ item, ... }) => ...
217
+ const hasItemParam = ts.isObjectBindingPattern(param.name) &&
218
+ param.name.elements.some((el) => ts.isBindingElement(el) && ts.isIdentifier(el.name) && el.name.text === 'item');
219
+ if (hasItemParam) {
220
+ const propAssign = current.parent;
221
+ if (ts.isPropertyAssignment(propAssign) &&
222
+ ts.isIdentifier(propAssign.name) &&
223
+ propAssign.name.text === 'render') {
224
+ return true;
225
+ }
226
+ }
227
+ }
228
+ current = current.parent;
229
+ }
230
+ return false;
231
+ }
232
+ // ── .map() on state arrays ───────────────────────────────────────
233
+ function checkMapOnState(node, sf, diagnostics) {
234
+ if (!ts.isCallExpression(node))
235
+ return;
236
+ if (!ts.isPropertyAccessExpression(node.expression))
237
+ return;
238
+ if (node.expression.name.text !== 'map')
239
+ return;
240
+ // Check if receiver involves a state parameter reference
241
+ if (!referencesStateParam(node.expression.expression))
242
+ return;
243
+ // Check if we're inside a view function
244
+ if (!isInsideViewFunction(node))
245
+ return;
246
+ const { line, column } = pos(node, sf);
247
+ diagnostics.push({
248
+ message: `Array .map() on state-derived value at line ${line}. Use each() for reactive lists that update when the array changes.`,
249
+ line,
250
+ column,
251
+ });
252
+ }
253
+ function referencesStateParam(node) {
254
+ if (ts.isPropertyAccessExpression(node)) {
255
+ return referencesStateParam(node.expression);
256
+ }
257
+ if (ts.isIdentifier(node)) {
258
+ // Check if the identifier is a parameter named 'state' or 's' or matches common patterns
259
+ // Simple heuristic: check if it's a parameter of the view function
260
+ const name = node.text;
261
+ return name === 'state' || name === 's' || name === '_state';
262
+ }
263
+ return false;
264
+ }
265
+ function isInsideViewFunction(node) {
266
+ let current = node.parent;
267
+ while (current) {
268
+ if (ts.isPropertyAssignment(current)) {
269
+ if (ts.isIdentifier(current.name) && current.name.text === 'view') {
270
+ return true;
271
+ }
272
+ }
273
+ current = current.parent;
274
+ }
275
+ return false;
276
+ }
277
+ // ── Exhaustive update() ──────────────────────────────────────────
278
+ function collectMsgVariants(sf) {
279
+ const variants = new Set();
280
+ for (const stmt of sf.statements) {
281
+ if (!ts.isTypeAliasDeclaration(stmt))
282
+ continue;
283
+ if (stmt.name.text !== 'Msg')
284
+ continue;
285
+ // Walk the union to find { type: 'literal' } members
286
+ collectUnionVariants(stmt.type, variants);
287
+ }
288
+ return variants;
289
+ }
290
+ function collectUnionVariants(type, variants) {
291
+ if (ts.isUnionTypeNode(type)) {
292
+ for (const member of type.types) {
293
+ collectUnionVariants(member, variants);
294
+ }
295
+ return;
296
+ }
297
+ if (ts.isTypeLiteralNode(type)) {
298
+ for (const member of type.members) {
299
+ if (!ts.isPropertySignature(member))
300
+ continue;
301
+ if (!ts.isIdentifier(member.name) || member.name.text !== 'type')
302
+ continue;
303
+ if (member.type && ts.isLiteralTypeNode(member.type)) {
304
+ if (ts.isStringLiteral(member.type.literal)) {
305
+ variants.add(member.type.literal.text);
306
+ }
307
+ }
308
+ }
309
+ }
310
+ }
311
+ function checkExhaustiveUpdate(node, sf, diagnostics, msgVariants) {
312
+ if (msgVariants.size === 0)
313
+ return;
314
+ if (!ts.isPropertyAssignment(node))
315
+ return;
316
+ if (!ts.isIdentifier(node.name) || node.name.text !== 'update')
317
+ return;
318
+ // Find the switch statement in the update body
319
+ const fn = node.initializer;
320
+ if (!ts.isArrowFunction(fn) && !ts.isFunctionExpression(fn))
321
+ return;
322
+ const body = ts.isBlock(fn.body) ? fn.body : null;
323
+ if (!body)
324
+ return;
325
+ const handledCases = new Set();
326
+ let hasDefault = false;
327
+ function findSwitch(n) {
328
+ if (ts.isSwitchStatement(n)) {
329
+ for (const clause of n.caseBlock.clauses) {
330
+ if (ts.isDefaultClause(clause)) {
331
+ hasDefault = true;
332
+ }
333
+ else if (ts.isCaseClause(clause) && ts.isStringLiteral(clause.expression)) {
334
+ handledCases.add(clause.expression.text);
335
+ }
336
+ }
337
+ }
338
+ ts.forEachChild(n, findSwitch);
339
+ }
340
+ findSwitch(body);
341
+ if (hasDefault)
342
+ return;
343
+ const missing = [...msgVariants].filter((v) => !handledCases.has(v));
344
+ if (missing.length === 0)
345
+ return;
346
+ const { line, column } = pos(node, sf);
347
+ diagnostics.push({
348
+ message: `update() does not handle message type${missing.length > 1 ? 's' : ''} ${missing.map((m) => `'${m}'`).join(', ')} at line ${line}.`,
349
+ line,
350
+ column,
351
+ });
352
+ }
353
+ // ── Accessibility ────────────────────────────────────────────────
354
+ function checkAccessibility(node, sf, diagnostics) {
355
+ if (!ts.isCallExpression(node))
356
+ return;
357
+ if (!ts.isIdentifier(node.expression))
358
+ return;
359
+ const tag = node.expression.text;
360
+ if (!ELEMENT_HELPERS.has(tag))
361
+ return;
362
+ const propsArg = node.arguments[0];
363
+ if (!propsArg || !ts.isObjectLiteralExpression(propsArg))
364
+ return;
365
+ const props = getStaticPropKeys(propsArg);
366
+ // img without alt
367
+ if (tag === 'img' && !props.has('alt')) {
368
+ const { line, column } = pos(node, sf);
369
+ diagnostics.push({
370
+ message: `<img> at line ${line} has no 'alt' attribute. Add alt text for screen readers, or alt='' for decorative images.`,
371
+ line,
372
+ column,
373
+ });
374
+ }
375
+ // onClick on non-interactive element without role
376
+ if (props.has('onClick') && !INTERACTIVE_ELEMENTS.has(tag) && !props.has('role')) {
377
+ const { line, column } = pos(node, sf);
378
+ diagnostics.push({
379
+ message: `onClick on <${tag}> at line ${line} without role and tabIndex. Non-interactive elements with click handlers are not keyboard-accessible. Add role='button' and tabIndex={0}, or use <button>.`,
380
+ line,
381
+ column,
382
+ });
383
+ }
384
+ }
385
+ // ── Controlled input ─────────────────────────────────────────────
386
+ function checkControlledInput(node, sf, diagnostics) {
387
+ if (!ts.isCallExpression(node))
388
+ return;
389
+ if (!ts.isIdentifier(node.expression))
390
+ return;
391
+ const tag = node.expression.text;
392
+ if (tag !== 'input' && tag !== 'textarea')
393
+ return;
394
+ const propsArg = node.arguments[0];
395
+ if (!propsArg || !ts.isObjectLiteralExpression(propsArg))
396
+ return;
397
+ const props = getProps(propsArg);
398
+ // Check if value is a reactive binding (arrow function)
399
+ const valueProp = props.get('value');
400
+ if (!valueProp)
401
+ return;
402
+ if (!ts.isArrowFunction(valueProp) && !ts.isFunctionExpression(valueProp))
403
+ return;
404
+ // Must have onInput
405
+ if (!props.has('onInput') && !props.has('onChange')) {
406
+ const { line, column } = pos(node, sf);
407
+ diagnostics.push({
408
+ message: `Controlled input at line ${line}: reactive 'value' binding without 'onInput' handler. The binding will overwrite user input on every state update.`,
409
+ line,
410
+ column,
411
+ });
412
+ }
413
+ }
414
+ function getStaticPropKeys(obj) {
415
+ const keys = new Set();
416
+ for (const prop of obj.properties) {
417
+ if (ts.isPropertyAssignment(prop) && ts.isIdentifier(prop.name)) {
418
+ keys.add(prop.name.text);
419
+ }
420
+ }
421
+ return keys;
422
+ }
423
+ function getProps(obj) {
424
+ const map = new Map();
425
+ for (const prop of obj.properties) {
426
+ if (ts.isPropertyAssignment(prop) && ts.isIdentifier(prop.name)) {
427
+ map.set(prop.name.text, prop.initializer);
428
+ }
429
+ }
430
+ return map;
431
+ }
432
+ // ── child() static props ────────────────────────────────────────
433
+ function checkChildStaticProps(node, sf, diagnostics) {
434
+ if (!ts.isCallExpression(node))
435
+ return;
436
+ if (!ts.isIdentifier(node.expression) || node.expression.text !== 'child')
437
+ return;
438
+ const arg = node.arguments[0];
439
+ if (!arg || !ts.isObjectLiteralExpression(arg))
440
+ return;
441
+ for (const prop of arg.properties) {
442
+ if (!ts.isPropertyAssignment(prop))
443
+ continue;
444
+ if (!ts.isIdentifier(prop.name) || prop.name.text !== 'props')
445
+ continue;
446
+ // props must be a function, not an object literal
447
+ if (ts.isObjectLiteralExpression(prop.initializer)) {
448
+ const { line, column } = pos(node, sf);
449
+ diagnostics.push({
450
+ message: `child() at line ${line}: 'props' is a static object literal. It must be a reactive accessor function (s => ({ ... })) so props update when parent state changes.`,
451
+ line,
452
+ column,
453
+ });
454
+ }
455
+ }
456
+ }
457
+ // ── Bitmask overflow warning ────────────────────────────────────
458
+ function collectStatePaths(sf) {
459
+ const paths = new Set();
460
+ function visit(node) {
461
+ if ((ts.isArrowFunction(node) || ts.isFunctionExpression(node)) &&
462
+ node.parameters.length === 1) {
463
+ const param = node.parameters[0].name;
464
+ if (ts.isIdentifier(param)) {
465
+ // Check if this looks like a reactive accessor
466
+ const parent = node.parent;
467
+ if (ts.isPropertyAssignment(parent)) {
468
+ const key = parent.name;
469
+ if (ts.isIdentifier(key) && !/^on[A-Z]/.test(key.text)) {
470
+ extractAccessPaths(node.body, param.text, paths);
471
+ }
472
+ }
473
+ else if (ts.isCallExpression(parent) && parent.arguments[0] === node) {
474
+ extractAccessPaths(node.body, param.text, paths);
475
+ }
476
+ }
477
+ }
478
+ ts.forEachChild(node, visit);
479
+ }
480
+ visit(sf);
481
+ return paths;
482
+ }
483
+ function extractAccessPaths(node, paramName, paths) {
484
+ if (ts.isPropertyAccessExpression(node)) {
485
+ const chain = resolveSimpleChain(node, paramName);
486
+ if (chain)
487
+ paths.add(chain);
488
+ }
489
+ ts.forEachChild(node, (child) => extractAccessPaths(child, paramName, paths));
490
+ }
491
+ function resolveSimpleChain(node, paramName) {
492
+ const parts = [];
493
+ let current = node;
494
+ while (ts.isPropertyAccessExpression(current)) {
495
+ parts.unshift(current.name.text);
496
+ current = current.expression;
497
+ }
498
+ if (!ts.isIdentifier(current) || current.text !== paramName)
499
+ return null;
500
+ if (parts.length > 2)
501
+ return parts.slice(0, 2).join('.');
502
+ return parts.join('.');
503
+ }
504
+ function checkBitmaskOverflow(node, sf, diagnostics, paths) {
505
+ // Only emit once, on the component() call
506
+ if (!ts.isCallExpression(node))
507
+ return;
508
+ if (!ts.isIdentifier(node.expression) || node.expression.text !== 'component')
509
+ return;
510
+ const pathCount = paths.size;
511
+ if (pathCount <= 31)
512
+ return;
513
+ const overflow = pathCount - 31;
514
+ const { line, column } = pos(node, sf);
515
+ // Group paths by top-level field so authors know which slice to extract.
516
+ // `resolveSimpleChain` already truncates to depth 2 (e.g. "user.name"),
517
+ // so splitting on "." gives us the top-level field.
518
+ const byTopLevel = new Map();
519
+ for (const p of paths) {
520
+ const top = p.split('.', 1)[0];
521
+ byTopLevel.set(top, (byTopLevel.get(top) ?? 0) + 1);
522
+ }
523
+ const breakdown = [...byTopLevel.entries()]
524
+ .sort((a, b) => b[1] - a[1])
525
+ .map(([field, n]) => `${field} (${n})`)
526
+ .join(', ');
527
+ diagnostics.push({
528
+ message: `Component at line ${line} has ${pathCount} unique state access paths (${overflow} past the 31-path limit). Paths 32..${pathCount} fall back to FULL_MASK — their changes re-evaluate every binding in the component. Top-level fields by path count: ${breakdown}. Extract the largest fields into child components or slice handlers.`,
529
+ line,
530
+ column,
531
+ });
532
+ }
533
+ //# sourceMappingURL=diagnostics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../src/diagnostics.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { Plugin } from 'vite';
2
+ export interface LluiPluginOptions {
3
+ /**
4
+ * Port for the MCP debug bridge. In dev mode, the runtime relay connects
5
+ * to `ws://127.0.0.1:<port>` so an external `llui-mcp` server can forward
6
+ * tool calls into the running app.
7
+ *
8
+ * Set to `false` to disable the relay injection entirely.
9
+ * Default: 5200.
10
+ */
11
+ mcpPort?: number | false;
12
+ }
13
+ export default function llui(options?: LluiPluginOptions): Plugin;
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAA;AAKlC,MAAM,WAAW,iBAAiB;IAChC;;;;;;;OAOG;IACH,OAAO,CAAC,EAAE,MAAM,GAAG,KAAK,CAAA;CACzB;AAED,MAAM,CAAC,OAAO,UAAU,IAAI,CAAC,OAAO,GAAE,iBAAsB,GAAG,MAAM,CAyCpE"}
package/dist/index.js ADDED
@@ -0,0 +1,44 @@
1
+ import MagicString from 'magic-string';
2
+ import { transformLlui } from './transform.js';
3
+ import { diagnose } from './diagnostics.js';
4
+ export default function llui(options = {}) {
5
+ let devMode = false;
6
+ const mcpPort = options.mcpPort === false ? null : (options.mcpPort ?? 5200);
7
+ return {
8
+ name: 'llui',
9
+ enforce: 'pre',
10
+ configResolved(config) {
11
+ devMode = config.command === 'serve' || config.mode === 'development';
12
+ },
13
+ transform(code, id) {
14
+ if (!id.endsWith('.ts') && !id.endsWith('.tsx'))
15
+ return;
16
+ for (const d of diagnose(code)) {
17
+ this.warn(d.message, { line: d.line, column: d.column });
18
+ }
19
+ const result = transformLlui(code, id, devMode, mcpPort);
20
+ if (!result)
21
+ return undefined;
22
+ // Apply per-statement edits via MagicString for accurate source maps.
23
+ // Untouched statements keep their original positions.
24
+ const s = new MagicString(code);
25
+ for (const edit of result.edits) {
26
+ if (edit.start === edit.end) {
27
+ // Insert at position — appendRight for middle, append for end-of-file
28
+ if (edit.start === code.length)
29
+ s.append(edit.replacement);
30
+ else
31
+ s.appendRight(edit.start, edit.replacement);
32
+ }
33
+ else {
34
+ s.overwrite(edit.start, edit.end, edit.replacement);
35
+ }
36
+ }
37
+ return {
38
+ code: s.toString(),
39
+ map: s.generateMap({ source: id, includeContent: true, hires: true }),
40
+ };
41
+ },
42
+ };
43
+ }
44
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,WAAW,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAc3C,MAAM,CAAC,OAAO,UAAU,IAAI,CAAC,UAA6B,EAAE;IAC1D,IAAI,OAAO,GAAG,KAAK,CAAA;IACnB,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,IAAI,IAAI,CAAC,CAAA;IAE5E,OAAO;QACL,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,KAAK;QAEd,cAAc,CAAC,MAAM;YACnB,OAAO,GAAG,MAAM,CAAC,OAAO,KAAK,OAAO,IAAI,MAAM,CAAC,IAAI,KAAK,aAAa,CAAA;QACvE,CAAC;QAED,SAAS,CAAC,IAAI,EAAE,EAAE;YAChB,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAAE,OAAM;YAEvD,KAAK,MAAM,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC/B,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAA;YAC1D,CAAC;YAED,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,CAAA;YACxD,IAAI,CAAC,MAAM;gBAAE,OAAO,SAAS,CAAA;YAE7B,sEAAsE;YACtE,sDAAsD;YACtD,MAAM,CAAC,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,CAAA;YAC/B,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;gBAChC,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,GAAG,EAAE,CAAC;oBAC5B,sEAAsE;oBACtE,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,MAAM;wBAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;;wBACrD,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,CAAA;gBAClD,CAAC;qBAAM,CAAC;oBACN,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,WAAW,CAAC,CAAA;gBACrD,CAAC;YACH,CAAC;YAED,OAAO;gBACL,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE;gBAClB,GAAG,EAAE,CAAC,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;aACtE,CAAA;QACH,CAAC;KACF,CAAA;AACH,CAAC"}
@@ -0,0 +1,9 @@
1
+ export interface MsgSchema {
2
+ discriminant: string;
3
+ variants: Record<string, Record<string, string | {
4
+ enum: string[];
5
+ }>>;
6
+ }
7
+ export declare function extractMsgSchema(source: string): MsgSchema | null;
8
+ export declare function extractEffectSchema(source: string): MsgSchema | null;
9
+ //# sourceMappingURL=msg-schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"msg-schema.d.ts","sourceRoot":"","sources":["../src/msg-schema.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,SAAS;IACxB,YAAY,EAAE,MAAM,CAAA;IACpB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG;QAAE,IAAI,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC,CAAA;CACtE;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAEjE;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAEpE"}