@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.
- package/LICENSE +21 -0
- package/README.md +19 -0
- package/dist/collect-deps.d.ts +7 -0
- package/dist/collect-deps.d.ts.map +1 -0
- package/dist/collect-deps.js +267 -0
- package/dist/collect-deps.js.map +1 -0
- package/dist/diagnostics.d.ts +7 -0
- package/dist/diagnostics.d.ts.map +1 -0
- package/dist/diagnostics.js +533 -0
- package/dist/diagnostics.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +44 -0
- package/dist/index.js.map +1 -0
- package/dist/msg-schema.d.ts +9 -0
- package/dist/msg-schema.d.ts.map +1 -0
- package/dist/msg-schema.js +83 -0
- package/dist/msg-schema.js.map +1 -0
- package/dist/state-schema.d.ts +28 -0
- package/dist/state-schema.d.ts.map +1 -0
- package/dist/state-schema.js +108 -0
- package/dist/state-schema.js.map +1 -0
- package/dist/transform.d.ts +14 -0
- package/dist/transform.d.ts.map +1 -0
- package/dist/transform.js +1930 -0
- package/dist/transform.js.map +1 -0
- package/package.json +49 -0
|
@@ -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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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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"}
|