UNPKG

@rws-framework/client

Version:

This package provides the core client-side framework for Realtime Web Suit (RWS), enabling modular, asynchronous web components, state management, and integration with backend services. It is located in `.dev/client`.

96 lines (81 loc) 3.12 kB
import sass from 'sass-embedded'; import path from 'path'; import chalk from 'chalk'; import emojiRegex from 'emoji-regex'; import _scss_fonts_builder from './_fonts'; let _scss_fonts: any = null; import _scss_import_builder from './_import'; let _scss_import: any = null; async function compileScssCode(scssCode: string, fileRootDir: string, minify: boolean = false): Promise<{ code: string, dependencies: string[] }> { _scss_fonts = _scss_fonts_builder(this); _scss_import = _scss_import_builder(this); const [scssImports] = _scss_import.extractScssImports(scssCode, fileRootDir); const dependencies = scssImports.map((item) => item[2]); if (scssImports && scssImports.length) { scssCode = _scss_import.replaceImports(_scss_import.processImports(scssImports, fileRootDir), scssCode); } const uses = _scss_import.extractScssUses(scssCode)[0]; let scssUses = ''; uses.forEach(scssUse => { const useLine = scssUse[1]; if(scssCode.indexOf(useLine) === -1){ scssUses += useLine + '\n'; scssCode = scssCode.replace(useLine + '\n', ''); } }); scssCode = removeComments(scssUses + scssCode); try { const result: sass.CompileResult = await sass.compileStringAsync(scssCode, { loadPaths: [fileRootDir], style: minify ? "compressed" : "expanded", sourceMap: false }); let compiledCode = result.css.toString(); compiledCode = _scss_fonts.replaceFontUrlWithBase64(compiledCode); compiledCode = replaceEmojisWithQuestionMark(compiledCode, fileRootDir); return { code: compiledCode, dependencies }; } catch (err) { console.error('SASS Error in', fileRootDir); console.error(err); throw err; } } function checkForImporterType(_module, checkTypeExt) { let importingFileExtension = ''; if (_module && _module.issuer && _module.issuer.resource) { importingFileExtension = path.extname(_module.issuer.resource); if (importingFileExtension === ('.' + checkTypeExt)) { return true; } } else { return false; } return false } function replaceEmojisWithQuestionMark(code, componentDir) { const regex = emojiRegex(); let hasEmoji = false; const result = code.replace(regex, (match) => { hasEmoji = true; return '?'; }); if (hasEmoji) { console.log(chalk.yellow(`Emojis in css detected and replaced with "?" in "${path.dirname(componentDir)}" component`)); } return result; } function removeComments(code) { code = code.replace(/\/\/.*$/gm, ''); code = code.replace(/\/\*[\s\S]*?\*\//g, ''); code = code.replace(/^\s*$(?:\r\n?|\n)/gm, ''); return code; } export default function(element) { return { checkForImporterType: checkForImporterType.bind(element), compileScssCode: compileScssCode.bind(element) }; };