UNPKG

sass-extract

Version:

Extract structured variables from sass files. Fast and accurate.

101 lines (80 loc) 3.48 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.parseFiles = parseFiles; exports.processFiles = processFiles; var _inject = require('./inject'); var _parse = require('./parse'); var _pluggable = require('./pluggable'); function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } /** * Get a string id for a filename */ function getFileId(filename) { return new Buffer.from(filename).toString('base64').replace(/=/g, ''); } function parseFile(filename, data) { return (0, _parse.parseDeclarations)(data); } function getDependentDeclarations(filename, declarations) { var fileId = getFileId(filename); var dependentDeclarations = []; declarations.explicitGlobals.forEach(function (declaration) { if (Object.keys(declaration.deps).length > 0) { dependentDeclarations.push({ filename: filename, declaration: declaration, decFileId: fileId }); } }); return dependentDeclarations; } /** * Process a single sass files to get declarations, injected source and functions */ function processFile(idx, count, filename, data, parsedDeclarations, pluggable, sass) { var declarations = parsedDeclarations.files[filename]; // Inject dependent declaration extraction to last file var dependentDeclarations = idx === count - 1 ? parsedDeclarations.dependentDeclarations : []; var variables = { global: {} }; var globalDeclarationResultHandler = function globalDeclarationResultHandler(declaration, value, sassValue) { if (!variables.global[declaration.declaration]) { variables.global[declaration.declaration] = []; } var variableValue = pluggable.run(_pluggable.Pluggable.POST_VALUE, { value: value, sassValue: sassValue, sass: sass }).value; variables.global[declaration.declaration].push({ declaration: declaration, value: variableValue }); }; var fileId = getFileId(filename); var injection = (0, _inject.injectExtractionFunctions)(fileId, declarations, dependentDeclarations, { globalDeclarationResultHandler: globalDeclarationResultHandler }, sass); var injectedData = data + '\n\n' + injection.injectedData; var injectedFunctions = injection.injectedFunctions; return { fileId: fileId, declarations: declarations, variables: variables, injectedData: injectedData, injectedFunctions: injectedFunctions }; } function parseFiles(files) { var parsedDeclarations = { files: {}, dependentDeclarations: [] }; Object.keys(files).map(function (filename) { var _parsedDeclarations$d; var fileDeclarations = parseFile(filename, files[filename]); parsedDeclarations.files[filename] = fileDeclarations; (_parsedDeclarations$d = parsedDeclarations.dependentDeclarations).push.apply(_parsedDeclarations$d, _toConsumableArray(getDependentDeclarations(filename, fileDeclarations))); }); return parsedDeclarations; } /** * Process a set of sass files to get declarations, injected source and functions * Files are provided in a map of filename -> key entries */ function processFiles(orderedFiles, files, parsedDeclarations, pluggable, sass) { var extractions = {}; orderedFiles.forEach(function (filename, idx) { extractions[filename] = processFile(idx, orderedFiles.length, filename, files[filename], parsedDeclarations, pluggable, sass); }); return extractions; }