ksk-core
Version:
Core design system components and styles for Kickstart projects
162 lines (126 loc) • 5.96 kB
JavaScript
import { rollup } from 'rollup';
import { nodeResolve } from '@rollup/plugin-node-resolve';
import path from 'path';
import fs from 'fs';
async function buildMainJS() {
try {
console.log('Building main.js bundle...');
// Create rollup bundle
const bundle = await rollup({
input: './src/assets/main.js',
plugins: [
nodeResolve({
browser: true,
preferBuiltins: false
})
]
});
// Generate the bundle
const { output } = await bundle.generate({
format: 'es',
file: 'main.js'
});
// Ensure dist directory exists
if (!fs.existsSync('./dist')) {
fs.mkdirSync('./dist', { recursive: true });
}
// Write the bundle to dist/main.js
for (const chunkOrAsset of output) {
if (chunkOrAsset.type === 'chunk') {
let code = chunkOrAsset.code;
// Process the JavaScript for class prefixing
console.log('Processing JavaScript for class prefixing...');
// Process JS function
const processJS = (js) => {
let result = js
let changeCount = 0
// Function to check if a class should be prefixed
function shouldPrefixClass(className) {
const prefix = 'ast-'
const ignoreClasses = ['swiper']
const ignorePatterns = [/^astro-/]
if (className.startsWith(prefix)) return false
if (ignoreClasses.includes(className)) return false
if (ignorePatterns.some(pattern => pattern.test(className))) return false
return true
}
// Function to prefix a class name
function prefixClass(className) {
return shouldPrefixClass(className) ? `ast-${className}` : className
}
console.log(`[build-main-js] Processing JavaScript content...`)
// Process querySelector and querySelectorAll calls with class selectors
// Handle single quotes
result = result.replace(/(querySelector(?:All)?)\('([^']*)'/g, (match, method, selectorString) => {
const processedSelector = selectorString.replace(/\.([a-zA-Z][a-zA-Z0-9_-]*(?:__[a-zA-Z0-9_-]+)*(?:--[a-zA-Z0-9_-]+)*)/g, (classMatch, className) => {
const prefixedClassName = prefixClass(className)
return `.${prefixedClassName}`
})
const newMatch = `${method}('${processedSelector}'`
if (processedSelector !== selectorString) {
changeCount++
}
return newMatch
})
// Handle double quotes
result = result.replace(/(querySelector(?:All)?)\("([^"]*)"/g, (match, method, selectorString) => {
const processedSelector = selectorString.replace(/\.([a-zA-Z][a-zA-Z0-9_-]*(?:__[a-zA-Z0-9_-]+)*(?:--[a-zA-Z0-9_-]+)*)/g, (classMatch, className) => {
const prefixedClassName = prefixClass(className)
return `.${prefixedClassName}`
})
const newMatch = `${method}("${processedSelector}"`
if (processedSelector !== selectorString) {
changeCount++
}
return newMatch
})
// Handle template literals (backticks) - only process simple class selectors, avoid complex template expressions
result = result.replace(/(querySelector(?:All)?)\(`([^`${}]*\.[a-zA-Z][a-zA-Z0-9_-]*(?:__[a-zA-Z0-9_-]+)*(?:--[a-zA-Z0-9_-]+)*[^`${}]*)`/g, (match, method, selectorString) => {
// Only process if this doesn't contain template literal expressions ${...}
if (selectorString.includes('${')) {
return match // Don't modify template literals with expressions
}
const processedSelector = selectorString.replace(/\.([a-zA-Z][a-zA-Z0-9_-]*(?:__[a-zA-Z0-9_-]+)*(?:--[a-zA-Z0-9_-]+)*)/g, (classMatch, className) => {
const prefixedClassName = prefixClass(className)
return `.${prefixedClassName}`
})
const newMatch = `${method}(\`${processedSelector}\``
if (processedSelector !== selectorString) {
changeCount++
}
return newMatch
})
// Process classList operations - handle different quote types
// Handle single quotes
result = result.replace(/(classList\.(add|remove|toggle|contains))\('([a-zA-Z][a-zA-Z0-9_-]*(?:__[a-zA-Z0-9_-]+)*(?:--[a-zA-Z0-9_-]+)*)'/g, (match, method, operation, className) => {
const prefixedClassName = prefixClass(className)
const newMatch = `${method}('${prefixedClassName}'`
if (prefixedClassName !== className) {
changeCount++
}
return newMatch
})
// Handle double quotes
result = result.replace(/(classList\.(add|remove|toggle|contains))\("([a-zA-Z][a-zA-Z0-9_-]*(?:__[a-zA-Z0-9_-]+)*(?:--[a-zA-Z0-9_-]+)*)"/g, (match, method, operation, className) => {
const prefixedClassName = prefixClass(className)
const newMatch = `${method}("${prefixedClassName}"`
if (prefixedClassName !== className) {
changeCount++
}
return newMatch
})
console.log(`[build-main-js] JavaScript processing complete. Made ${changeCount} changes.`)
return result
}
code = processJS(code);
fs.writeFileSync('./dist/main.js', code);
console.log('✓ main.js built and processed successfully');
}
}
await bundle.close();
} catch (error) {
console.error('Error building main.js:', error);
process.exit(1);
}
}
buildMainJS();