@aura3d/cli 5.0.2 → 5.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 (52) hide show
  1. package/data/aura.exports.json +20 -0
  2. package/dist/commands/registry.d.ts +1 -0
  3. package/dist/commands/registry.d.ts.map +1 -1
  4. package/dist/commands/registry.js +1 -0
  5. package/dist/commands/registry.js.map +1 -1
  6. package/dist/commands/verify/index.d.ts +2 -0
  7. package/dist/commands/verify/index.d.ts.map +1 -0
  8. package/dist/commands/verify/index.js +11 -0
  9. package/dist/commands/verify/index.js.map +1 -0
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +2 -0
  12. package/dist/index.js.map +1 -1
  13. package/dist/look-hdri-check.d.ts +7 -0
  14. package/dist/look-hdri-check.d.ts.map +1 -0
  15. package/dist/look-hdri-check.js +88 -0
  16. package/dist/look-hdri-check.js.map +1 -0
  17. package/dist/verify/cdp.d.ts +69 -0
  18. package/dist/verify/cdp.d.ts.map +1 -0
  19. package/dist/verify/cdp.js +223 -0
  20. package/dist/verify/cdp.js.map +1 -0
  21. package/dist/verify/codes.d.ts +17 -0
  22. package/dist/verify/codes.d.ts.map +1 -0
  23. package/dist/verify/codes.js +64 -0
  24. package/dist/verify/codes.js.map +1 -0
  25. package/dist/verify/command.d.ts +12 -0
  26. package/dist/verify/command.d.ts.map +1 -0
  27. package/dist/verify/command.js +101 -0
  28. package/dist/verify/command.js.map +1 -0
  29. package/dist/verify/frame.d.ts +46 -0
  30. package/dist/verify/frame.d.ts.map +1 -0
  31. package/dist/verify/frame.js +190 -0
  32. package/dist/verify/frame.js.map +1 -0
  33. package/dist/verify/index.d.ts +7 -0
  34. package/dist/verify/index.d.ts.map +1 -0
  35. package/dist/verify/index.js +7 -0
  36. package/dist/verify/index.js.map +1 -0
  37. package/dist/verify/lint.d.ts +43 -0
  38. package/dist/verify/lint.d.ts.map +1 -0
  39. package/dist/verify/lint.js +548 -0
  40. package/dist/verify/lint.js.map +1 -0
  41. package/dist/verify/run.d.ts +90 -0
  42. package/dist/verify/run.d.ts.map +1 -0
  43. package/dist/verify/run.js +317 -0
  44. package/dist/verify/run.js.map +1 -0
  45. package/package.json +6 -6
  46. package/skills/agent-docs/api-signatures.md +27 -4
  47. package/skills/agent-docs/recipes.md +4 -3
  48. package/skills/agent-docs/threejs-to-aura3d.md +1 -1
  49. package/skills/agent-files/AGENTS.md +1 -1
  50. package/skills/aura3d-materials-environments/SKILL.md +1 -1
  51. package/skills/aura3d-materials-environments/references/visual-helpers.md +20 -0
  52. package/skills/llms.txt +158 -29
@@ -0,0 +1,548 @@
1
+ // Static lint for silent no-ops: things that type-check, build and mount, and then do nothing (or hide the scene).
2
+ // Each rule reads the TypeScript AST of the project sources (no engine import, no browser), so it runs in milliseconds and is unit-testable.
3
+ // Rules are deliberately conservative: a rule fires only on literal evidence in source, never on a guess about values it cannot see.
4
+ import { existsSync, readdirSync, readFileSync, statSync } from "node:fs";
5
+ import { join, relative, resolve } from "node:path";
6
+ import ts from "typescript";
7
+ /** Names the generated GLSL prelude owns. Mirrors RESERVED_UNIFORM_NAMES in packages/engine/src/agent-api/compiler/customMaterial.ts (a parity test guards drift). */
8
+ export const RESERVED_UNIFORM_NAMES = [
9
+ "uTime", "u_time", "uResolution", "u_resolution", "cameraPosition", "u_cameraPosition",
10
+ "modelMatrix", "u_modelMatrix", "viewMatrix", "u_viewMatrix", "projectionMatrix", "u_projectionMatrix",
11
+ "modelViewMatrix", "modelViewProjectionMatrix", "u_modelViewProjection", "normalMatrix", "u_normalMatrix",
12
+ "position", "normal", "uv", "gl_Position", "gl_FragCoord", "gl_FragColor"
13
+ ];
14
+ /** Keys `effects.fog` reads. Mirrors FOG_OPTION_KEYS in packages/engine/src/agent-api/nodes/effects.ts (a parity test guards drift). Anything else is OPTION_IGNORED. */
15
+ export const FOG_VALID_OPTIONS = [
16
+ "name", "mode", "color", "density", "heightDensity", "heightFalloff", "heightReference", "start", "maxOpacity",
17
+ "near", "far", "absorption", "sunInscatter", "anisotropy", "ambientScale", "affectsBackground",
18
+ "backgroundDistance", "transitionSeconds", "legacyOpacityCap", "intensity"
19
+ ];
20
+ /** `instances.model` options the runtime accepts and does not apply (UNAPPLIED_INSTANCED_MODEL_OPTIONS in nodes/instances.ts; emitted as OPTION_IGNORED). */
21
+ export const INSTANCES_MODEL_UNAPPLIED_OPTIONS = ["lod", "maxInstancesPerDraw", "static", "chunkSize", "shadowLod", "impostor"];
22
+ /**
23
+ * Builder option tables for LINT_EFFECT_OPTION_IGNORED. `valid`: any other key is ignored. `ignored`: these keys are ignored.
24
+ * `effects.particles` has no row: every defined particle option rides to lowering, so there is no list of ignored particle options to lint against
25
+ * (the runtime still reports any that appear, see RUNTIME_OPTION_IGNORED).
26
+ */
27
+ export const IGNORED_OPTION_RULES = [
28
+ { builder: "effects.fog", valid: FOG_VALID_OPTIONS },
29
+ { builder: "instances.model", ignored: INSTANCES_MODEL_UNAPPLIED_OPTIONS }
30
+ ];
31
+ const SKIP_DIRS = new Set(["node_modules", "dist", ".git", ".vite", "coverage", "tests", "test", ".turbo"]);
32
+ const SOURCE_EXT = /\.(ts|tsx|js|jsx|mjs|mts)$/;
33
+ /** Source files of a project: `src/` if present, else the root (config files excluded). */
34
+ export function collectLintSources(projectDir) {
35
+ const root = resolve(projectDir);
36
+ const start = existsSync(join(root, "src")) ? join(root, "src") : root;
37
+ const out = [];
38
+ const walk = (dir, depth) => {
39
+ if (depth > 8)
40
+ return;
41
+ for (const name of readdirSync(dir)) {
42
+ const full = join(dir, name);
43
+ let stat;
44
+ try {
45
+ stat = statSync(full);
46
+ }
47
+ catch {
48
+ continue;
49
+ }
50
+ if (stat.isDirectory()) {
51
+ if (!SKIP_DIRS.has(name) && !name.startsWith("."))
52
+ walk(full, depth + 1);
53
+ continue;
54
+ }
55
+ if (!SOURCE_EXT.test(name) || name.endsWith(".d.ts") || /\.(test|spec)\./.test(name) || /^(vite|vitest|playwright|eslint)\.config\./.test(name))
56
+ continue;
57
+ out.push({ path: relative(root, full).split("\\").join("/"), text: readFileSync(full, "utf8") });
58
+ }
59
+ };
60
+ walk(start, 0);
61
+ return out.sort((a, b) => a.path.localeCompare(b.path));
62
+ }
63
+ const SCRIPT_KIND = (path) => (path.endsWith(".tsx") ? ts.ScriptKind.TSX : path.endsWith(".jsx") ? ts.ScriptKind.JSX : path.endsWith(".js") || path.endsWith(".mjs") ? ts.ScriptKind.JS : ts.ScriptKind.TS);
64
+ function loc(file, node) {
65
+ const { line, character } = file.sf.getLineAndCharacterOfPosition(node.getStart(file.sf));
66
+ return { file: file.path, line: line + 1, column: character + 1 };
67
+ }
68
+ const isObject = (node) => !!node && ts.isObjectLiteralExpression(node);
69
+ const unwrap = (node) => {
70
+ let current = node;
71
+ while (ts.isParenthesizedExpression(current) || ts.isAsExpression(current) || ts.isSatisfiesExpression(current) || ts.isNonNullExpression(current))
72
+ current = current.expression;
73
+ return current;
74
+ };
75
+ function propName(name) {
76
+ if (ts.isIdentifier(name) || ts.isStringLiteral(name) || ts.isNumericLiteral(name) || ts.isNoSubstitutionTemplateLiteral(name))
77
+ return name.text;
78
+ return undefined;
79
+ }
80
+ /** Property initializer (or the shorthand identifier) by name. */
81
+ function getProp(obj, name) {
82
+ for (const p of obj.properties) {
83
+ if (ts.isPropertyAssignment(p) && propName(p.name) === name)
84
+ return p.initializer;
85
+ if (ts.isShorthandPropertyAssignment(p) && p.name.text === name)
86
+ return p.name;
87
+ }
88
+ return undefined;
89
+ }
90
+ function objectKeys(obj) {
91
+ const keys = [];
92
+ for (const p of obj.properties) {
93
+ if (ts.isPropertyAssignment(p)) {
94
+ const key = propName(p.name);
95
+ if (key !== undefined)
96
+ keys.push({ key, node: p.name, value: p.initializer });
97
+ }
98
+ else if (ts.isShorthandPropertyAssignment(p))
99
+ keys.push({ key: p.name.text, node: p.name, value: p.name });
100
+ else if (ts.isMethodDeclaration(p)) {
101
+ const key = propName(p.name);
102
+ if (key !== undefined)
103
+ keys.push({ key, node: p.name });
104
+ }
105
+ }
106
+ return keys;
107
+ }
108
+ const isFalsyLiteral = (node) => {
109
+ const e = unwrap(node);
110
+ return e.kind === ts.SyntaxKind.FalseKeyword || (ts.isIdentifier(e) && e.text === "undefined") || e.kind === ts.SyntaxKind.NullKeyword;
111
+ };
112
+ /** A constant-ish string value: literal, template (substitutions become blanks), `a + b`, or an identifier bound to one const in the same file. */
113
+ function resolveText(file, node, depth = 0) {
114
+ if (!node || depth > 4)
115
+ return undefined;
116
+ const e = unwrap(node);
117
+ if (ts.isStringLiteral(e) || ts.isNoSubstitutionTemplateLiteral(e))
118
+ return e.text;
119
+ if (ts.isTemplateExpression(e))
120
+ return e.head.text + e.templateSpans.map((s) => " " + s.literal.text).join("");
121
+ if (ts.isBinaryExpression(e) && e.operatorToken.kind === ts.SyntaxKind.PlusToken) {
122
+ const a = resolveText(file, e.left, depth + 1), b = resolveText(file, e.right, depth + 1);
123
+ return a !== undefined && b !== undefined ? a + b : undefined;
124
+ }
125
+ if (ts.isIdentifier(e)) {
126
+ let found;
127
+ const visit = (n) => {
128
+ if (found)
129
+ return;
130
+ if (ts.isVariableDeclaration(n) && ts.isIdentifier(n.name) && n.name.text === e.text && n.initializer)
131
+ found = n.initializer;
132
+ else
133
+ ts.forEachChild(n, visit);
134
+ };
135
+ visit(file.sf);
136
+ return resolveText(file, found, depth + 1);
137
+ }
138
+ return undefined;
139
+ }
140
+ /** The call expression a node is, or the const-bound call an identifier points at (same file). */
141
+ function resolveCall(file, node, depth = 0) {
142
+ const e = unwrap(node);
143
+ if (ts.isCallExpression(e))
144
+ return e;
145
+ if (!ts.isIdentifier(e) || depth > 3)
146
+ return undefined;
147
+ let found;
148
+ const visit = (n) => {
149
+ if (found)
150
+ return;
151
+ if (ts.isVariableDeclaration(n) && ts.isIdentifier(n.name) && n.name.text === e.text && n.initializer)
152
+ found = n.initializer;
153
+ else
154
+ ts.forEachChild(n, visit);
155
+ };
156
+ visit(file.sf);
157
+ return found ? resolveCall(file, found, depth + 1) : undefined;
158
+ }
159
+ function numberOf(node) {
160
+ if (!node)
161
+ return undefined;
162
+ const e = unwrap(node);
163
+ if (ts.isNumericLiteral(e))
164
+ return Number(e.text);
165
+ if (ts.isPrefixUnaryExpression(e) && e.operator === ts.SyntaxKind.MinusToken && ts.isNumericLiteral(e.operand))
166
+ return -Number(e.operand.text);
167
+ return undefined;
168
+ }
169
+ function numberTuple(node) {
170
+ if (!node)
171
+ return undefined;
172
+ const e = unwrap(node);
173
+ if (!ts.isArrayLiteralExpression(e))
174
+ return undefined;
175
+ const values = e.elements.map((el) => numberOf(el));
176
+ return values.every((v) => v !== undefined) ? values : undefined;
177
+ }
178
+ function calleeText(call) {
179
+ return call.expression.getText().replace(/\s+/g, "").replace(/\?\./g, ".");
180
+ }
181
+ function collectCalls(files) {
182
+ const calls = [];
183
+ for (const file of files) {
184
+ const visit = (node) => {
185
+ if (ts.isCallExpression(node))
186
+ calls.push({ file, node, callee: calleeText(node) });
187
+ ts.forEachChild(node, visit);
188
+ };
189
+ visit(file.sf);
190
+ }
191
+ return calls;
192
+ }
193
+ const endsWithBuilder = (callee, builder) => callee === builder || callee.endsWith(`.${builder}`);
194
+ /** Root call of a method chain such as `primitives.sphere({..}).position(..).scale(..)`. */
195
+ function chainRoot(call) {
196
+ let current = call;
197
+ for (;;) {
198
+ const e = unwrap(current);
199
+ if (ts.isCallExpression(e) && ts.isPropertyAccessExpression(e.expression)) {
200
+ const inner = unwrap(e.expression.expression);
201
+ if (ts.isCallExpression(inner)) {
202
+ current = inner;
203
+ continue;
204
+ }
205
+ }
206
+ return ts.isCallExpression(e) ? e : call;
207
+ }
208
+ }
209
+ /** Chain calls from root outward, e.g. [primitives.sphere, position, scale]. */
210
+ function chainCalls(outer) {
211
+ const list = [outer];
212
+ let current = outer;
213
+ for (;;) {
214
+ const e = unwrap(current);
215
+ if (ts.isCallExpression(e) && ts.isPropertyAccessExpression(e.expression)) {
216
+ const inner = unwrap(e.expression.expression);
217
+ if (ts.isCallExpression(inner)) {
218
+ list.unshift(inner);
219
+ current = inner;
220
+ continue;
221
+ }
222
+ }
223
+ return list;
224
+ }
225
+ }
226
+ function unwrapParent(node) {
227
+ let parent = node.parent;
228
+ while (parent && (ts.isAwaitExpression(parent) || ts.isParenthesizedExpression(parent) || ts.isAsExpression(parent)))
229
+ parent = parent.parent;
230
+ return parent;
231
+ }
232
+ const finding = (file, node, code, message) => ({ code, message, location: loc(file, node) });
233
+ function shaderTexts(site) {
234
+ const arg = site.node.arguments[0];
235
+ const spec = arg && isObject(unwrap(arg)) ? unwrap(arg) : undefined;
236
+ const glsl = spec ? getProp(spec, "glsl") : undefined;
237
+ const glslObj = glsl && isObject(unwrap(glsl)) ? unwrap(glsl) : undefined;
238
+ if (!glslObj)
239
+ return { resolved: false };
240
+ const parts = [];
241
+ let resolved = true;
242
+ for (const stage of ["vertex", "fragment"]) {
243
+ const node = getProp(glslObj, stage);
244
+ if (!node)
245
+ continue;
246
+ const text = resolveText(site.file, node);
247
+ if (text === undefined)
248
+ resolved = false;
249
+ else
250
+ parts.push(text);
251
+ }
252
+ return { text: parts.join("\n"), resolved };
253
+ }
254
+ function lintAssets(files, calls, options) {
255
+ const out = [];
256
+ // Typed asset keys, from `defineAuraAssets({ key: {...} })`.
257
+ const typedKeys = new Set();
258
+ let hasTypedAssets = false;
259
+ for (const call of calls) {
260
+ if (endsWithBuilder(call.callee, "defineAuraAssets")) {
261
+ const arg = call.node.arguments[0];
262
+ if (arg && isObject(unwrap(arg))) {
263
+ hasTypedAssets = true;
264
+ for (const { key, value } of objectKeys(unwrap(arg))) {
265
+ typedKeys.add(key);
266
+ // A typed asset whose file is not in the project is a hand-written entry, not an admitted one: the URL was invented.
267
+ const entryObj = value && isObject(unwrap(value)) ? unwrap(value) : undefined;
268
+ const urlNode = entryObj ? getProp(entryObj, "url") : undefined;
269
+ const url = resolveText(call.file, urlNode);
270
+ if (urlNode && url !== undefined && !/^(https?:)?\/\//i.test(url) && !(options.fileExists?.(url) ?? false)) {
271
+ out.push(finding(call.file, urlNode, "ASSET_PATH_INVENTED", `assets.${key} points at "${url}", but no such file exists under public/ in the project. Admit a real file with \`aura3d assets add\` or \`assets resolve\` instead of writing the entry by hand.`));
272
+ }
273
+ }
274
+ }
275
+ }
276
+ }
277
+ for (const call of calls) {
278
+ // model("/models/robot.glb"): a string where a typed asset belongs.
279
+ if (call.callee === "model" || endsWithBuilder(call.callee, "model")) {
280
+ const first = call.node.arguments[0];
281
+ const text = first ? resolveText(call.file, first) : undefined;
282
+ if (text !== undefined && /\.(glb|gltf)(\?.*)?$/i.test(text)) {
283
+ const exists = options.fileExists?.(text) ?? false;
284
+ out.push(finding(call.file, first, "ASSET_PATH_INVENTED", `model("${text}") passes a string path${exists ? " (the file exists, but it is not a typed asset)" : " and no file with that path exists in the project"}. Use model(assets.<key>) from src/aura-assets.ts.`));
285
+ }
286
+ }
287
+ }
288
+ if (hasTypedAssets) {
289
+ for (const file of files) {
290
+ const visit = (node) => {
291
+ if (ts.isPropertyAccessExpression(node) && ts.isIdentifier(node.expression) && node.expression.text === "assets") {
292
+ const key = node.name.text;
293
+ if (!typedKeys.has(key) && !/^(get|has|keys|values|entries|resolve)$/.test(key))
294
+ out.push(finding(file, node.name, "ASSET_KEY_UNKNOWN", `assets.${key} is not defined in src/aura-assets.ts (defined: ${[...typedKeys].join(", ") || "none"}).`));
295
+ }
296
+ ts.forEachChild(node, visit);
297
+ };
298
+ visit(file.sf);
299
+ }
300
+ }
301
+ return out;
302
+ }
303
+ function lintScene(files, calls) {
304
+ const out = [];
305
+ // --- shadow with no receiver -------------------------------------------------------------------------------------
306
+ // Primitives and models receive shadows by default; a `material.custom` node does not (it must opt in with receiveShadow: true).
307
+ // So a shadow light is a no-op only when every surface builder we can see is receiver-off. No visible builders = no evidence = no finding.
308
+ const surfaceCalls = calls.filter((c) => /(^|\.)primitives\.\w+$/.test(c.callee) || /(^|\.)model$/.test(c.callee));
309
+ const receivesShadow = (site) => {
310
+ const obj = site.node.arguments.map((a) => unwrap(a)).find(isObject);
311
+ if (!obj)
312
+ return true;
313
+ const explicit = getProp(obj, "receiveShadow");
314
+ if (explicit)
315
+ return !isFalsyLiteral(explicit);
316
+ const materialNode = getProp(obj, "material");
317
+ const materialCall = materialNode ? resolveCall(site.file, materialNode) : undefined;
318
+ if (materialCall && /(^|\.)material\.custom$/.test(calleeText(materialCall))) {
319
+ const spec = materialCall.arguments[0] ? unwrap(materialCall.arguments[0]) : undefined;
320
+ const flag = spec && isObject(spec) ? getProp(spec, "receiveShadow") : undefined;
321
+ return !!flag && !isFalsyLiteral(flag);
322
+ }
323
+ return true;
324
+ };
325
+ const noReceivers = surfaceCalls.length > 0 && surfaceCalls.every((c) => !receivesShadow(c));
326
+ for (const call of calls) {
327
+ if (!/(^|\.)lights\.(directional|point|spot|sun)$/.test(call.callee))
328
+ continue;
329
+ const arg = call.node.arguments[0];
330
+ const obj = arg && isObject(unwrap(arg)) ? unwrap(arg) : undefined;
331
+ const shadow = obj ? getProp(obj, "shadow") : undefined;
332
+ if (shadow && !isFalsyLiteral(shadow) && noReceivers) {
333
+ out.push(finding(call.file, shadow, "LINT_SHADOW_NO_RECEIVER", `${call.callee} sets shadow, but none of the ${surfaceCalls.length} surface node(s) in the project can receive it (receiveShadow false, or material.custom without receiveShadow: true), so no shadow can appear.`));
334
+ }
335
+ }
336
+ // --- sky + background --------------------------------------------------------------------------------------------
337
+ for (const file of files) {
338
+ const fileCalls = calls.filter((c) => c.file === file);
339
+ const skyCall = fileCalls.find((c) => /(^|\.)sky\.(preetham|gradient|hdri|dayNight)$/.test(c.callee));
340
+ if (!skyCall)
341
+ continue;
342
+ let backgroundNode;
343
+ for (const c of fileCalls) {
344
+ if (/(^|\.)background$/.test(c.callee) && c.node.arguments[0]) {
345
+ const text = c.node.arguments[0].getText();
346
+ if (!/background|sky/i.test(text))
347
+ backgroundNode = c.node;
348
+ }
349
+ if (/(^|\.)scene$/.test(c.callee)) {
350
+ const arg = c.node.arguments[0];
351
+ const obj = arg && isObject(unwrap(arg)) ? unwrap(arg) : undefined;
352
+ const bg = obj ? getProp(obj, "background") : undefined;
353
+ if (bg && !isFalsyLiteral(bg) && !/background|sky/i.test(bg.getText()))
354
+ backgroundNode = bg;
355
+ }
356
+ }
357
+ if (backgroundNode)
358
+ out.push(finding(file, skyCall.node, "LINT_SKY_HIDES_BACKGROUND", `${skyCall.callee} draws over the scene background set at line ${file.sf.getLineAndCharacterOfPosition(backgroundNode.getStart(file.sf)).line + 1}, so that background is never visible.`));
359
+ }
360
+ // --- custom shaders: uniforms, reserved names, uTime, attributes -------------------------------------------------
361
+ const shaderSites = calls.filter((c) => /(^|\.)material\.custom$/.test(c.callee));
362
+ const allShaderText = [];
363
+ let allResolved = true;
364
+ let readsTime;
365
+ for (const site of shaderSites) {
366
+ const info = shaderTexts(site);
367
+ if (info.text !== undefined)
368
+ allShaderText.push(info.text);
369
+ if (!info.resolved)
370
+ allResolved = false;
371
+ const arg = site.node.arguments[0];
372
+ const spec = arg && isObject(unwrap(arg)) ? unwrap(arg) : undefined;
373
+ if (!spec)
374
+ continue;
375
+ const uniformsNode = getProp(spec, "uniforms");
376
+ const aliasesNode = getProp(spec, "uniformAliases");
377
+ const aliases = new Map();
378
+ if (aliasesNode && isObject(unwrap(aliasesNode)))
379
+ for (const { key, value } of objectKeys(unwrap(aliasesNode))) {
380
+ const v = resolveText(site.file, value);
381
+ if (v)
382
+ aliases.set(key, v);
383
+ }
384
+ if (uniformsNode && isObject(unwrap(uniformsNode))) {
385
+ for (const { key, node } of objectKeys(unwrap(uniformsNode))) {
386
+ if (RESERVED_UNIFORM_NAMES.includes(key)) {
387
+ out.push(finding(site.file, node, "LINT_UNIFORM_RESERVED", `Uniform "${key}" is reserved for a generated built-in; material.custom rejects it and the draw is skipped.`));
388
+ continue;
389
+ }
390
+ if (info.resolved && info.text !== undefined) {
391
+ const names = [key, aliases.get(key)].filter((n) => !!n);
392
+ const read = names.some((n) => new RegExp(`(?<![A-Za-z0-9_])${n.replace(/[$]/g, "\\$")}(?![A-Za-z0-9_])`).test(info.text));
393
+ if (!read)
394
+ out.push(finding(site.file, node, "LINT_SHADER_UNIFORM_UNREAD", `Uniform "${key}" is declared but the GLSL never reads it.`));
395
+ }
396
+ }
397
+ }
398
+ if (info.text !== undefined && /(?<![A-Za-z0-9_])(uTime|u_time)(?![A-Za-z0-9_])/.test(info.text) && !readsTime)
399
+ readsTime = { site };
400
+ }
401
+ if (readsTime) {
402
+ const drivesTime = files.some((f) => /\bonFrame\s*\(/.test(f.sf.text)) && files.some((f) => /\bmutable\s*:\s*true\b/.test(f.sf.text));
403
+ if (!drivesTime)
404
+ out.push(finding(readsTime.site.file, readsTime.site.node, "LINT_UTIME_NOT_ANIMATED", "The shader reads uTime, but the project has no app.onFrame together with a .runtime({ mutable: true }) node, so nothing drives time and uTime stays at its initial value."));
405
+ }
406
+ // Attributes supplied by geometry that no shader reads.
407
+ const geometryCalls = calls.filter((c) => /(^|\.)geometry\.\w+$/.test(c.callee));
408
+ for (const g of geometryCalls) {
409
+ const visit = (node) => {
410
+ if (ts.isPropertyAssignment(node) && propName(node.name) === "attributes" && isObject(unwrap(node.initializer))) {
411
+ for (const { key, node: keyNode } of objectKeys(unwrap(node.initializer))) {
412
+ if (allResolved && !allShaderText.some((t) => new RegExp(`(?<![A-Za-z0-9_])${key}(?![A-Za-z0-9_])`).test(t))) {
413
+ out.push(finding(g.file, keyNode, "LINT_SHADER_ATTRIBUTE_UNREAD", `Attribute "${key}" is supplied but no custom shader in the project reads it.`));
414
+ }
415
+ }
416
+ }
417
+ ts.forEachChild(node, visit);
418
+ };
419
+ visit(g.node);
420
+ }
421
+ // --- options the lowering ignores --------------------------------------------------------------------------------
422
+ for (const call of calls) {
423
+ const rule = IGNORED_OPTION_RULES.find((r) => endsWithBuilder(call.callee, r.builder));
424
+ if (!rule)
425
+ continue;
426
+ const objArg = call.node.arguments.map((a) => unwrap(a)).find(isObject);
427
+ const obj = objArg;
428
+ if (!obj)
429
+ continue;
430
+ const bad = objectKeys(obj).filter(({ key, value }) => value !== undefined && !(ts.isIdentifier(unwrap(value)) && unwrap(value).text === "undefined") && (rule.valid ? !rule.valid.includes(key) : rule.ignored.includes(key)));
431
+ for (const { key, node } of bad) {
432
+ out.push(finding(call.file, node, "LINT_EFFECT_OPTION_IGNORED", `${rule.builder} does not read option "${key}" (the runtime reports OPTION_IGNORED), so it has no effect.${rule.valid ? ` Valid options: ${rule.valid.join(", ")}.` : ""}`));
433
+ }
434
+ }
435
+ // --- app.ready() not awaited -------------------------------------------------------------------------------------
436
+ // Only when the handle is kept (`const app = createAuraApp(...)`): a discarded handle cannot be awaited, and templates that do
437
+ // that report readiness through body[data-aura3d-ready] instead.
438
+ const keptCreates = calls.filter((c) => endsWithBuilder(c.callee, "createAuraApp") && ts.isVariableDeclaration(unwrapParent(c.node)));
439
+ if (keptCreates.length) {
440
+ const readyHandled = files.some((f) => {
441
+ let handled = false;
442
+ const visit = (node) => {
443
+ if (ts.isCallExpression(node) && ts.isPropertyAccessExpression(node.expression) && node.expression.name.text === "ready" && !ts.isExpressionStatement(node.parent))
444
+ handled = true;
445
+ ts.forEachChild(node, visit);
446
+ };
447
+ visit(f.sf);
448
+ return handled;
449
+ });
450
+ if (!readyHandled)
451
+ out.push(finding(keptCreates[0].file, keptCreates[0].node, "LINT_READY_NOT_AWAITED", "createAuraApp(...) is kept in a variable but app.ready() is never awaited or chained, so mount errors are never observed."));
452
+ }
453
+ // --- module-level `await app.ready()` -----------------------------------------------------------------------------
454
+ for (const file of files) {
455
+ const visit = (node, inFunction) => {
456
+ const fn = ts.isFunctionLike(node);
457
+ if (!inFunction && ts.isAwaitExpression(node)) {
458
+ const target = unwrap(node.expression);
459
+ if (ts.isCallExpression(target) && ts.isPropertyAccessExpression(target.expression) && target.expression.name.text === "ready") {
460
+ out.push(finding(file, node, "LINT_TOP_LEVEL_AWAIT_READY", "Module-level await on app.ready() can deadlock a single-entry Vite bundle. Wrap the app in an async function."));
461
+ }
462
+ }
463
+ ts.forEachChild(node, (child) => visit(child, inFunction || fn));
464
+ };
465
+ visit(file.sf, false);
466
+ }
467
+ // --- scale off by orders of magnitude / camera inside an object --------------------------------------------------
468
+ const EXCLUDED_NAME = /plane|ground|floor|terrain|sky|water|dome|ocean|backdrop|stage|grid/i;
469
+ const boxes = [];
470
+ const seenRoots = new Set();
471
+ for (const call of calls) {
472
+ if (!/\.scale$/.test(call.callee))
473
+ continue;
474
+ const chain = chainCalls(call.node);
475
+ const root = chain[0];
476
+ if (seenRoots.has(root))
477
+ continue;
478
+ const rootName = calleeText(root);
479
+ const rootArg = root.arguments[0];
480
+ const rootObj = rootArg && isObject(unwrap(rootArg)) ? unwrap(rootArg) : undefined;
481
+ const nameText = rootObj ? resolveText(call.file, getProp(rootObj, "name")) ?? "" : "";
482
+ if (!/(^|\.)(primitives\.\w+|model)$/.test(rootName))
483
+ continue;
484
+ if (EXCLUDED_NAME.test(rootName) || EXCLUDED_NAME.test(nameText))
485
+ continue;
486
+ seenRoots.add(root);
487
+ const scaleCall = chain.find((c) => /\.scale$/.test(calleeText(c)));
488
+ const sArgs = scaleCall.arguments.map((a) => numberOf(a) ?? numberTuple(a));
489
+ const scalars = sArgs.flatMap((v) => (typeof v === "number" ? [v] : Array.isArray(v) ? v : []));
490
+ if (!scalars.length)
491
+ continue;
492
+ const maxScale = Math.max(...scalars.map(Math.abs));
493
+ const minScale = Math.min(...scalars.map(Math.abs));
494
+ if (maxScale >= 50 || (minScale > 0 && minScale <= 0.02)) {
495
+ out.push(finding(call.file, scaleCall, "LINT_SCALE_EXTREME", `.scale(${scaleCall.arguments.map((a) => a.getText()).join(", ")}) on ${rootName}(...) is ${maxScale >= 50 ? "very large" : "very small"}; 1 unit is 1 metre, so this is likely a unit mix-up.`));
496
+ }
497
+ const posCall = chain.find((c) => /\.position$/.test(calleeText(c)));
498
+ const posNums = posCall ? posCall.arguments.map((a) => numberOf(a)) : [];
499
+ const center = posCall ? (posNums.length === 3 && posNums.every((n) => n !== undefined) ? posNums : posCall.arguments.length === 1 ? numberTuple(posCall.arguments[0]) : undefined) : [0, 0, 0];
500
+ const sizeText = rootObj ? numberOf(getProp(rootObj, "size")) : undefined;
501
+ if (center)
502
+ boxes.push({ file: call.file, node: scaleCall, center, half: ((sizeText ?? 1) * maxScale) / 2 });
503
+ }
504
+ for (const call of calls) {
505
+ if (!/(^|\.)camera\.(orbit|perspective)$/.test(call.callee))
506
+ continue;
507
+ const arg = call.node.arguments[0];
508
+ const obj = arg && isObject(unwrap(arg)) ? unwrap(arg) : undefined;
509
+ if (!obj)
510
+ continue;
511
+ const target = numberTuple(getProp(obj, "target")) ?? [0, 0, 0];
512
+ const position = numberTuple(getProp(obj, "position"));
513
+ const distance = numberOf(getProp(obj, "distance"));
514
+ for (const box of boxes) {
515
+ let inside = false;
516
+ if (position)
517
+ inside = Math.hypot(position[0] - box.center[0], position[1] - box.center[1], position[2] - box.center[2]) < box.half;
518
+ else if (distance !== undefined)
519
+ inside = Math.hypot(target[0] - box.center[0], target[1] - box.center[1], target[2] - box.center[2]) < 1e-6 + box.half && distance < box.half;
520
+ if (inside) {
521
+ out.push(finding(call.file, call.node, "LINT_CAMERA_INSIDE_OBJECT", `The camera starts inside a node scaled to about ${(box.half * 2).toFixed(0)} units (${box.file.path}:${box.file.sf.getLineAndCharacterOfPosition(box.node.getStart(box.file.sf)).line + 1}); only back faces or nothing will draw.`));
522
+ break;
523
+ }
524
+ }
525
+ }
526
+ return out;
527
+ }
528
+ /** Run the lint rules over in-memory sources. Pure: no file system, no engine import. */
529
+ export function lintSources(sources, options = {}) {
530
+ const files = sources.map((s) => ({ path: s.path, sf: ts.createSourceFile(s.path, s.text, ts.ScriptTarget.Latest, true, SCRIPT_KIND(s.path)) }));
531
+ const calls = collectCalls(files);
532
+ const out = [];
533
+ if (!options.group || options.group === "assets")
534
+ out.push(...lintAssets(files, calls, options));
535
+ if (!options.group || options.group === "scene")
536
+ out.push(...lintScene(files, calls));
537
+ return out.sort((a, b) => a.location.file.localeCompare(b.location.file) || a.location.line - b.location.line || a.code.localeCompare(b.code));
538
+ }
539
+ /** Project-level convenience: collect sources, resolve `fileExists` against `public/` and the project root. */
540
+ export function lintProject(projectDir, options = {}) {
541
+ const root = resolve(projectDir);
542
+ const fileExists = options.fileExists ?? ((url) => {
543
+ const clean = url.replace(/^\//, "").replace(/\?.*$/, "");
544
+ return existsSync(join(root, "public", clean)) || existsSync(join(root, clean)) || existsSync(join(root, "src", clean));
545
+ });
546
+ return lintSources(collectLintSources(root), { ...options, fileExists });
547
+ }
548
+ //# sourceMappingURL=lint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lint.js","sourceRoot":"","sources":["../../src/verify/lint.ts"],"names":[],"mappings":"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"}