UNPKG

@lipemat/js-boilerplate

Version:

Dependencies and scripts for a no config JavaScript app

107 lines (106 loc) 3.38 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getLocalIdent = exports.ALPHABET = exports.SHORT_ALPHABET = void 0; exports.usingShortCssClasses = usingShortCssClasses; exports.resetCounters = resetCounters; exports.getNextClass = getNextClass; const package_config_1 = require("./package-config"); exports.SHORT_ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; exports.ALPHABET = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; const classes = {}; let counters = [-1]; /** * Check if short CSS classes are enabled. * * Using a helper function to allow for future enhancements. * * @since 4.6.0 */ function usingShortCssClasses() { return Boolean((0, package_config_1.getPackageConfig)().shortCssClasses); } /** * Reset all counters. * * @notice Mostly here for unit tests. */ function resetCounters() { counters = [-1]; } /** * Get the next class is sequence based on: * 1. Single character from SHORT_ALPHABET (prevent conflicts with JS boilerplate). * 2. Incremented character from the `ALPHABET`. * 1. Used once require 2+ characters. * 2. Grows to 3+ characters as needed. * * @return {string} */ function getNextClass() { const last = counters.length - 1; let totalLetters = exports.ALPHABET.length - 1; // First level uses the SHORT_ALPHABET. if (0 === last) { totalLetters = exports.SHORT_ALPHABET.length - 1; } if (counters[last] < totalLetters) { counters[last]++; } else { incrementParent(); } return counters.map((counter, i) => { return 0 === i ? exports.SHORT_ALPHABET[counter] : exports.ALPHABET[counter]; }).join(''); } /** * When we run out of characters on the current level: * 1. Increment the parent level. * 2. Reset current level and all child levels back to 0. * * If we are out of characters on the parent level or have * no parent level: * 1. Add a new child level. * 2. Reset all levels back to 0. * */ function incrementParent() { let parent = counters.length - 2; let totalLetters = exports.ALPHABET.length - 1; while (counters[parent] !== undefined) { // First level uses the SHORT_ALPHABET. if (0 === parent) { totalLetters = exports.SHORT_ALPHABET.length - 1; } if (counters[parent] < totalLetters) { counters[parent]++; // Reset all child levels to 0. while (counters[parent + 1] !== undefined) { counters[parent + 1] = 0; parent++; } return; } parent--; } // Add a new level and reset all existing levels. counters.forEach((_, i) => counters[i] = 0); counters.push(0); } /** * Return a single character unique CSS class name based on WebPack * css-loader's `getLocalIdentName` callback. * * Tracks CSS classes per each file so duplicate uses of the * same class in a file receive the same result. * * @notice Only enabled if the `package.json` has `shortCssClasses` set to true. * * @link https://webpack.js.org/loaders/css-loader/#getlocalident */ const getLocalIdent = ({ resourcePath }, _, localName) => { classes[resourcePath] ||= {}; classes[resourcePath][localName] ||= getNextClass(); return classes[resourcePath][localName]; }; exports.getLocalIdent = getLocalIdent;