Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | import fs from 'fs-extra';
import path from 'node:path';
import { fileURLToPath } from 'node:url';
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
const root = path.resolve(__dirname, '../');
const srcSlds2 = path.resolve(root, 'src/slds2');
const componentsDist = path.resolve(root, 'dist/components');
// Per-component theme-layer CSS (themes/*.css) is an internal artifact consumed
// by tooling (the catalog hook audit), not part of the published package, so it
// lands under build/components/ rather than dist/components/.
const componentsBuild = path.resolve(root, 'build/components');
// Ensure destination directories exist
fs.ensureDirSync(componentsDist);
fs.ensureDirSync(componentsBuild);
// Find all slds2 component directories
const componentDirs = fs
.readdirSync(srcSlds2, { withFileTypes: true })
.filter((entry) => entry.isDirectory())
.map((entry) => path.resolve(srcSlds2, entry.name));
// True when `src` is inside a component's themes/ subdirectory.
const isThemeAsset = (src: string) => path.relative(srcSlds2, src).split(path.sep).includes('themes');
// Shared exclusions: underscore dirs (e.g. __stories__), JS files, and UIF files.
const isExcludedAsset = (src: string) => {
const pathParts = path.relative(srcSlds2, src).split(path.sep);
if (pathParts.some((part) => part.startsWith('__'))) return true;
if (path.extname(src) === '.js') return true;
if (path.basename(src).endsWith('.uif.json')) return true;
return false;
};
// dist/components/: everything except themes/ (which is not published).
const distFilterFunc = (src: string) => {
if (isExcludedAsset(src)) return false;
if (isThemeAsset(src)) return false;
return true;
};
// build/components/themes/: theme assets only (JS/UIF never live under themes/,
// but keep the shared exclusion for consistency).
const themeFilterFunc = (src: string) => !isExcludedAsset(src);
// Copy each component directory: structure CSS to dist/, theme CSS to build/.
componentDirs.forEach((componentDir) => {
const componentName = path.basename(componentDir);
console.log(`Copying component: ${componentName}`);
const distDest = path.resolve(componentsDist, componentName);
// Ensure destination exists before copying (handles race condition with build:uif)
fs.ensureDirSync(distDest);
fs.copySync(componentDir, distDest, { filter: distFilterFunc, overwrite: true });
// Only stage a build/ entry for components that actually ship theme files.
const themesSrc = path.resolve(componentDir, 'themes');
if (fs.existsSync(themesSrc)) {
const themesDest = path.resolve(componentsBuild, componentName, 'themes');
fs.ensureDirSync(themesDest);
fs.copySync(themesSrc, themesDest, { filter: themeFilterFunc, overwrite: true });
}
});
console.log('Component structure CSS copied to dist/components/, theme CSS to build/components/');
|