✅ COMPLETED: 1. Dockerfile uses port 80 (astro preview) 2. BaseLayout imports globals.css 3. globals.css with Tailwind v4 @theme syntax 4. index.astro has Header, Footer, FixedContact 5. All image references fixed to existing files 6. Hero uses hdpe_pipe_main.jpg 7. Product cards use hdpe001.jpg 8. pt-20 on main for fixed header ✅ TESTED LOCALLY: - Build: 15 pages in 1.27s - Docker build successful - Port 80 working - Images load - CSS works Ready for Easypanel deployment.
67 lines
1.6 KiB
JavaScript
67 lines
1.6 KiB
JavaScript
export function getTrace(node) {
|
|
function shouldPutToTrace(syntax) {
|
|
if (syntax === null) {
|
|
return false;
|
|
}
|
|
|
|
return (
|
|
syntax.type === 'Type' ||
|
|
syntax.type === 'Property' ||
|
|
syntax.type === 'Keyword'
|
|
);
|
|
}
|
|
|
|
function hasMatch(matchNode) {
|
|
if (Array.isArray(matchNode.match)) {
|
|
// use for-loop for better perfomance
|
|
for (let i = 0; i < matchNode.match.length; i++) {
|
|
if (hasMatch(matchNode.match[i])) {
|
|
if (shouldPutToTrace(matchNode.syntax)) {
|
|
result.unshift(matchNode.syntax);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
}
|
|
} else if (matchNode.node === node) {
|
|
result = shouldPutToTrace(matchNode.syntax)
|
|
? [matchNode.syntax]
|
|
: [];
|
|
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
let result = null;
|
|
|
|
if (this.matched !== null) {
|
|
hasMatch(this.matched);
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
export function isType(node, type) {
|
|
return testNode(this, node, match => match.type === 'Type' && match.name === type);
|
|
}
|
|
|
|
export function isProperty(node, property) {
|
|
return testNode(this, node, match => match.type === 'Property' && match.name === property);
|
|
}
|
|
|
|
export function isKeyword(node) {
|
|
return testNode(this, node, match => match.type === 'Keyword');
|
|
}
|
|
|
|
function testNode(match, node, fn) {
|
|
const trace = getTrace.call(match, node);
|
|
|
|
if (trace === null) {
|
|
return false;
|
|
}
|
|
|
|
return trace.some(fn);
|
|
}
|