updates
This commit is contained in:
91
client/uikit/build/scope.js
Normal file
91
client/uikit/build/scope.js
Normal file
@@ -0,0 +1,91 @@
|
||||
import {args, glob, minify, read, renderLess, replaceInFile, validClassName} from './util.js';
|
||||
|
||||
if (args.h || args.help) {
|
||||
console.log(`
|
||||
usage:
|
||||
|
||||
scope.js [-s{cope}=your_great_new_scope_name][cleanup]
|
||||
|
||||
example:
|
||||
|
||||
scope.js // will scope with uk-scope
|
||||
scope.js -s "my-scope" // will replace any existing scope with my-scope
|
||||
scope.js cleanup // will remove current scope
|
||||
|
||||
`);
|
||||
process.exit(0);
|
||||
}
|
||||
const currentScopeRe = /\/\* scoped: ([^*]*) \*\/\n/;
|
||||
const currentScopeLegacyRe = /\.(uk-scope)/;
|
||||
|
||||
const files = await glob('dist/**/!(*.min).css');
|
||||
const prevScope = await getScope(files);
|
||||
|
||||
if (args.cleanup && prevScope) {
|
||||
await cleanup(files, prevScope);
|
||||
} else if (prevScope) {
|
||||
const newScope = getNewScope();
|
||||
|
||||
if (prevScope === newScope) {
|
||||
console.warn(`Already scoped with: ${prevScope}`);
|
||||
process.exit(0);
|
||||
}
|
||||
|
||||
await cleanup(files, prevScope);
|
||||
await scope(files, newScope);
|
||||
|
||||
} else {
|
||||
await scope(files, getNewScope());
|
||||
}
|
||||
|
||||
async function getScope(files) {
|
||||
for (const file of files) {
|
||||
const data = await read(file);
|
||||
const [, scope] = (data.match(currentScopeRe) || data.match(currentScopeLegacyRe) || []);
|
||||
if (scope) {
|
||||
return scope;
|
||||
}
|
||||
}
|
||||
return '';
|
||||
}
|
||||
|
||||
function getNewScope() {
|
||||
|
||||
const scopeFromInput = args.scope || args.s || 'uk-scope';
|
||||
|
||||
if (validClassName.test(scopeFromInput)) {
|
||||
return scopeFromInput;
|
||||
} else {
|
||||
throw `Illegal scope-name: ${scopeFromInput}`;
|
||||
}
|
||||
}
|
||||
|
||||
async function scope(files, scope) {
|
||||
for (const file of files) {
|
||||
await replaceInFile(file, async data => {
|
||||
const output = await renderLess(`.${scope} {\n${stripComments(data)}\n}`);
|
||||
return `/* scoped: ${scope} */\n${
|
||||
output.replace(new RegExp(`.${scope}\\s((\\.(uk-(drag|modal-page|offcanvas-page|offcanvas-flip)))|html|:root)`, 'g'), '$1') // unescape
|
||||
}`;
|
||||
});
|
||||
await minify(file);
|
||||
}
|
||||
}
|
||||
|
||||
async function cleanup(files, scope) {
|
||||
const string = scope.split(' ').map(scope => `.${scope}`).join(' ');
|
||||
for (const file of files) {
|
||||
await replaceInFile(file, data => data
|
||||
.replace(currentScopeRe, '') // remove scope comment
|
||||
.replace(new RegExp(` *${string} ({[\\s\\S]*?})?`, 'g'), '') // replace classes
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
function stripComments(input) {
|
||||
return input
|
||||
.replace(/\/\*(.|\n)*?\*\//gm, '')
|
||||
.split('\n')
|
||||
.filter(line => line.trim().substr(0, 2) !== '//')
|
||||
.join('\n');
|
||||
}
|
||||
Reference in New Issue
Block a user