- web/: Vue 3 + Vite + UnoCSS + Pinia, dark tactical theme (amber/#0d1117) - AppNav, ListingCard, SearchView with filters/sort, composables (useSnipeMode, useKonamiCode, useMotion), Pinia search store - Steal shimmer, auction countdown, Snipe Mode easter egg all native in Vue - docker/web/: nginx + multi-stage Dockerfile (node build → nginx serve) - compose.yml: api (8510) + web (8509) services - Dockerfile CMD updated to uvicorn for upcoming FastAPI layer - Clean build: 0 TS errors, 380 modules
41 lines
1 KiB
JavaScript
41 lines
1 KiB
JavaScript
import { createRequire } from "node:module";
|
|
|
|
// Lazy-loaded when first construct a `Visitor`
|
|
let walkProgram = null,
|
|
addVisitorToCompiled,
|
|
createCompiledVisitor,
|
|
finalizeCompiledVisitor;
|
|
|
|
/**
|
|
* Visitor class for traversing AST.
|
|
*/
|
|
export class Visitor {
|
|
#compiledVisitor = null;
|
|
|
|
constructor(visitor) {
|
|
if (walkProgram === null) {
|
|
const require = createRequire(import.meta.url);
|
|
({ walkProgram } = require("../generated/visit/walk.js"));
|
|
({
|
|
addVisitorToCompiled,
|
|
createCompiledVisitor,
|
|
finalizeCompiledVisitor,
|
|
} = require("./visitor.js"));
|
|
}
|
|
|
|
const compiledVisitor = createCompiledVisitor();
|
|
addVisitorToCompiled(visitor);
|
|
const needsVisit = finalizeCompiledVisitor();
|
|
if (needsVisit) this.#compiledVisitor = compiledVisitor;
|
|
}
|
|
|
|
/**
|
|
* Visit AST.
|
|
* @param program - The AST to visit.
|
|
* @returns {undefined}
|
|
*/
|
|
visit(program) {
|
|
const compiledVisitor = this.#compiledVisitor;
|
|
if (compiledVisitor !== null) walkProgram(program, compiledVisitor);
|
|
}
|
|
}
|