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`.

100 lines (77 loc) 3.13 kB
const sass = require('sass'); const path = require('path'); const chalk = require('chalk'); const emojiRegex = require('emoji-regex'); const _scss_fonts_builder = require('./_fonts'); let _scss_fonts = null; const _scss_import_builder = require('./_import'); let _scss_import = null; function compileScssCode(scssCode, fileRootDir, rwsWorkspaceDir, appRoot, pubDir = null) { _scss_fonts = _scss_fonts_builder(this); _scss_import = _scss_import_builder(this); const [scssImports] = _scss_import.extractScssImports(scssCode, rwsWorkspaceDir, appRoot, fileRootDir, pubDir); // console.log({scssImports}); const dependencies = scssImports.map((item) => item[2]); if (scssImports && scssImports.length) { scssCode = _scss_import.replaceImports(_scss_import.processImports(scssImports, rwsWorkspaceDir, fileRootDir, {}, false, pubDir), 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.compileString(scssCode, { loadPaths: [fileRootDir]}); let compiledCode = result.css.toString(); // console.log({rwsWorkspaceDir, appRoot}); compiledCode = _scss_fonts.replaceFontUrlWithBase64(compiledCode, rwsWorkspaceDir, appRoot, pubDir); compiledCode = replaceEmojisWithQuestionMark(compiledCode, fileRootDir); return { code: compiledCode, dependencies}; } catch (err) { console.error('SASS Error in', fileRootDir); console.error(err); throw err; return ''; }; } 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; } module.exports = function(element, publicDir = null) { return { checkForImporterType: checkForImporterType.bind(element), compileScssCode: compileScssCode.bind(element) }; };