1<!DOCTYPE html><html lang="en" data-theme="" data-testid="document" data-search-expanded="false" data-fullscreen="false"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><meta content="yes" name="apple-mobile-web-app-capable"/><meta content="black-transparent" name="apple-mobile-web-app-status-bar-style"/><meta content="Codsen" name="apple-mobile-web-app-title"/><meta content="telephone=no" name="format-detection"/><meta content="yes" name="mobile-web-app-capable"/><meta content="en" property="og:locale"/><meta content="Codsen" property="og:site_name"/><meta content="website" property="og:type"/><meta content="#000" name="theme-color"/><meta content="IE=edge,chrome=1" name="X-UA-Compatible"/><meta content="@revelto" name="twitter:site"/><meta content="@revelto" name="twitter:creator"/><meta content="Roy Revelt" name="author"/><meta content="True" name="HandheldFriendly"/><meta content="en" name="language"/><meta content="320" name="MobileOptimized"/><meta content="Codsen" name="pagename"/><meta content="index, follow" name="robots"/><meta property="og:url" content="https://codsen.com/os"/><meta property="twitter:url" content="https://codsen.com/os"/><meta property="twitter:domain" content="codsen.com"/><title>Open Source | Codsen</title><meta name="description" content="The list of 94 Codsen Open Source packages: programs, CLIs, scripts, ESLint, Gulp and other plugins and whatnot."/><meta property="og:title" content="Open Source | Codsen"/><meta property="og:description" content="The list of 94 Codsen Open Source packages: programs, CLIs, scripts, ESLint, Gulp and other plugins and whatnot."/><meta name="twitter:title" content="Open Source | Codsen"/><meta name="twitter:description" content="The list of 94 Codsen Open Source packages: programs, CLIs, scripts, ESLint, Gulp and other plugins and whatnot."/><meta name="color-scheme" content="dark light"/><link rel="preload" as="font" href="/fonts/outfit-var.ttf" type="font/ttf" crossorigin="anonymous"/><link rel="icon" href="/favicon.ico" sizes="any"/><link rel="icon" href="/icon.svg" type="image/svg+xml"/><link rel="apple-touch-icon" href="/apple-touch-icon.png"/><link rel="manifest" href="/manifest.webmanifest"/><link rel="modulepreload" href="/assets/entry.client-CHdVadI0.js"/><link rel="modulepreload" href="/assets/jsx-runtime-zmKt4aoE.js"/><link rel="modulepreload" href="/assets/root-DYlThwII.js"/><link rel="modulepreload" href="/assets/root-A6zJdrKV.js"/><link rel="modulepreload" href="/assets/clsx-DB0hHKMi.js"/><link rel="modulepreload" href="/assets/dist-BUa6A5X7.js"/><link rel="modulepreload" href="/assets/test-id-CCF4HlWb.js"/><link rel="modulepreload" href="/assets/link-MT-5P0oH.js"/><link rel="modulepreload" href="/assets/various-CoWjMWv6.js"/><link rel="modulepreload" href="/assets/misc-2Gdz-dJz.js"/><link rel="modulepreload" href="/assets/meta-CTym7bQO.js"/><link rel="modulepreload" href="/assets/icon-new-tab-CzzTuToe.js"/><link rel="modulepreload" href="/assets/os-CjR-8Jr5.js"/><link rel="modulepreload" href="/assets/generated.package-count-BqPP0ceP.js"/><link rel="modulepreload" href="/assets/prep-label-CDgKtHj9.js"/><link rel="modulepreload" href="/assets/breadcrumb-uNd5oBlz.js"/><link rel="modulepreload" href="/assets/li-aside-CCGCdsx4.js"/><link rel="modulepreload" href="/assets/generated.static-D4FcgSk8.js"/><link rel="modulepreload" href="/assets/back-to-top-BkxArSV_.js"/><link rel="modulepreload" href="/assets/readme-preamble-Bl_cNVsj.js"/><link rel="modulepreload" href="/assets/package-documentation-CDysXQuT.js"/><link rel="modulepreload" href="/assets/retired-packages-DqN8lV23.js"/><link rel="modulepreload" href="/assets/package-helpers-DhgPX9m-.js"/><link rel="modulepreload" href="/assets/codsen-places-6hSsTllx.js"/><link rel="modulepreload" href="/assets/string-left-right.esm-BChGptOY.js"/><link rel="modulepreload" href="/assets/numbered-CBTeoJxo.js"/><link rel="modulepreload" href="/assets/extlink-0cUuay5D.js"/><link rel="modulepreload" href="/assets/dts-CO6EHg1B.js"/>
1<link rel="modulepreload" href="/assets/hash-sum-BGEHAkff.js"/><link rel="modulepreload" href="/assets/dist-8UUBwVbB.js"/><link rel="modulepreload" href="/assets/highlight-C68Rq9ut.js"/><link rel="modulepreload" href="/assets/marked.esm-HaWzKJJ6.js"/><link rel="modulepreload" href="/assets/heading-C1XHWg0h.js"/><link rel="modulepreload" href="/assets/index-DpjK8DEZ.js"/><link rel="modulepreload" href="/assets/stickers-M2t7kBf-.js"/><link rel="modulepreload" href="/assets/monorepo-stats-DEZzG0HQ.js"/><link rel="modulepreload" href="/assets/codsen-handshake-CbI2ikCn.js"/><link rel="stylesheet" href="/assets/root-bwS5jJci.css"/></head><body id="page-top" data-testid="document-body" class="paper-surface"><div class="remix-app" data-testid="app-container"><a class="skiplink skiplink-fn" id="skiplink-top" data-testid="skip-to-content-link" href="/os#skiplink-content" data-discover="true">Skip to Content</a><div class="remix-app__container page-os page-os-exactly" data-testid="page-container"><header class="remix-app__header" data-testid="site-header"><div class="container remix-app__header-content" data-testid="site-header-content"><div class="remix-app__theme-toggle" data-testid="theme-toggle-container"><button aria-label="toggle theme" data-testid="theme-toggle-button" type="button" tabindex="0"><svg aria-hidden="true" class="svg-toggle-theme" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 44 44" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path class="svg-feather-moon icon-toggle-appear" d="M30.84,22.36c-0.46,4.95-4.84,8.59-9.79,8.13c-4.95-0.46-8.59-4.84-8.13-9.79c0.4-4.32,3.82-7.73,8.13-8.13 2c-2.3,3.11-1.64,7.49,1.47,9.79C24.99,24.19,28.36,24.19,30.84,22.36z"></path><path d="M18.38,3.66C9.05,7.05,3,14.99,3,23.39c0,0.81,0.13,9.17,6.73,14.09c8.25,6.16,22.98,4.21,28.84-5.64 3c4.49-7.53,2.5-17.52-3.85-23.49C26.5,0.6,15.09,3.51,14.54,3.66" stroke-width="5" pathLength="1" class="svg-outline-theme" stroke="var(--c-color-semantic-link-hover-bg)"></path></svg></button></div><nav aria-label="Global navigation" class="remix-app__nav remix-app__header-global-nav" data-testid="global-navigation"><ul data-testid="global-navigation-list"><li data-testid="global-navigation-website-item"><a data-testid="global-navigation-website-link" class="active" href="/" data-discover="true"><span>Website</span></a></li></ul></nav><div class="remix-app__header-home-link-container" data-testid="header-home-link-container"><a class="remix-app__header-home-link" data-testid="header-home-link" href="/" data-discover="true"><svg class="codsen-logo" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 329 70" aria-labelledby="codsen-logo-title" role="img"><title id="codsen-logo-title">Codsen</title><g><g><path id="underline-base" d="M113.51,66.38c-3.08,.08-15.8-.27-19.12,.41-3.49,.72-17.45,.52-20.9,1.76-1.68,.61-3.54,.07-5.27-.53-.44-.15-.65-.65-.8-1.33-.79-3.57-1.05-7.27-.7-11.07,.18-1.95,.97-2.87,2.17-3.2,8.39-2.3,16.8-2.41,25.22-2.42,7.58,0,23.29,.8,23.57,.88,2.1-.4,16.69-.26,20.05-.15,8.46,.26,42.91-.61,51.67-.32,4.6,.15,25.68-1.06,28.2-1.36,4.7-.56,29.38-.89,33.79-1.34,.93-.1,1.88-.25,2.79-.04,.72,.17,1.76,.37,1.14,2.44-.16,.15-.32,.23-.5,.23-3.12,.14-4.55,4.28-2.92,8.62,.52,1.39,.62,3.06,1.23,4.34-.5,2.51-1.39,3.52-3.07,2.89-1.13-.42-5.56-.3-7.14-.66-1.28,.48-10.16-.14-12.99-.13-5.9,.02-5.88,.38-12.48,.52-2.63,.06-11.63,.97-14.32,.65-3.41-.41-5.69-.03-9.11-.14-2.43-.08-16.59,.75-18.84,.76-.6,0-8.24,.15-10.49-.13-2.56-.31-12.39,.08-17.18-.45-1.29-.14-5.63,.52-19.03-.33-2.91-.19-12.77,.13-14.98,.11" fill="var(--c-color-semantic-codsen-underline)"></path><path id="underline-spot1" d="M253.13,63.29c-1.96-1.88-2.93-8.94-1.57-11.85,1.01-2.16,2.32-2.48,3.76-1.34-.48,4.5-1.31,8.85-2.19,13.19" fill="var(--c-color-semantic-codsen-spot1)"></path><path id="underline-spot2" d="M192.79,64.84c-.75,.46-.85-.68-.83-1.18,.03-.83,.6-1.21,1.02-1.08,.42,.13,.86,.74,.83,1.58-.05,1.22-.64,.68-1.02,.68" fill="var(--c-color-semantic-codsen-spot2)"></path><path id="letter-c" d="M97.78,33.72h-8.99c-.09-.71-.27-1.38-.54-2-.27-.58-.63-1.11-1.08-1.56-.49-.4-1.08-.76-1.75-.98-.67-.27-1.39-.36-2.25-.36-1.53,0-2.79,.36-3.77,1.07-1.03,.71-1.84,1.73-2.34,3.07-.54,1.33-.81,2.94-.81,4.8,0,2,.27,3.65,.81,4.98,.54,1.33,1.3,2.31,2.34,3.02,1.03,.67,2.25,.98,3.68,.98,.81,0,1.57-.09,2.2-.31,.67-.18,1.21-.49,1.71-.89,.45-.4,.85-.84,1.17-1.42,.31-.53,.49-1.16,.63-1.87l8.99,.09c-.13,1.33-.49,2.76-1.17,4.18-.67,1.38-1.62,2.71-2.83,3.91-1.26,1.2-2.79,2.13-4.58,2.85-1.8,.76-3.91,1.11-6.29,1.11-3.01,0-
35.71-.62-8.09-1.91s-4.22-3.16-5.62-5.6c-1.39-2.49-2.07-5.51-2.07-9.12s.72-6.63,2.11-9.07c1.39-2.49,3.28-4.36,5.66-5.6,2.38-1.29,5.08-1.91,8-1.91,2.07,0,3.95,.27,5.71,.84,1.71,.53,3.24,1.33,4.54,2.4s2.38,2.4,3.19,3.96c.76,1.56,1.26,3.34,1.44,5.34Z" fill="var(--c-color-semantic-codsen-letters)"></path><path id="letter-o" d="M131.58,37.77c0,3.6-.67,6.67-2.11,9.12-1.39,2.49-3.32,4.36-5.71,5.6-2.43,1.29-5.08,1.91-8.04,1.91s-5.66-.62-8.09-1.91c-2.38-1.29-4.31-3.16-5.71-5.65-1.39-2.45-2.11-5.47-2.11-9.07s.72-6.63,2.11-9.07c1.39-2.49,3.32-4.36,5.71-5.6,2.43-1.29,5.08-1.91,8.09-1.91s5.62,.62,8.04,1.91c2.38,1.25,4.31,3.11,5.71,5.6,1.44,2.45,2.11,5.47,2.11,9.07Zm-9.12,0c0-1.91-.22-3.56-.76-4.89-.49-1.33-1.26-2.36-2.29-3.02-.99-.71-2.25-1.02-3.68-1.02s-2.7,.31-3.73,1.02c-.99,.67-1.75,1.69-2.29,3.02-.49,1.33-.76,2.98-.76,4.89s.27,3.6,.76,4.94c.54,1.33,1.3,2.31,2.29,3.02,1.03,.67,2.25,1.02,3.73,1.02s2.7-.36,3.68-1.02c1.03-.71,1.8-1.69,2.29-3.02,.54-1.33,.76-2.98,.76-4.94Z" fill="var(--c-color-semantic-codsen-letters)"></path><path id="letter-d" d="M146.74,53.96h-12.58V21.62h12.45c3.37,0,6.25,.62,8.72,1.91,2.47,1.29,4.36,3.16,5.66,5.56,1.35,2.45,2.02,5.34,2.02,8.67s-.67,6.27-1.98,8.67c-1.35,2.45-3.24,4.27-5.66,5.56-2.43,1.29-5.3,1.96-8.63,1.96Zm-3.73-7.47h3.41c1.62,0,2.97-.22,4.13-.76,1.12-.53,2.02-1.42,2.61-2.67,.58-1.25,.9-3.02,.9-5.29s-.31-4-.9-5.25c-.63-1.29-1.53-2.18-2.7-2.67-1.17-.53-2.61-.8-4.31-.8h-3.15v17.43Z" fill="var(--c-color-semantic-codsen-letters)"></path><path id="letter-s" d="M184.06,31.72c-.09-1.07-.49-1.87-1.21-2.45-.67-.62-1.75-.89-3.19-.89-.9,0-1.66,.09-2.25,.31-.58,.22-.99,.49-1.3,.89-.27,.36-.4,.76-.4,1.25-.04,.4,.04,.76,.22,1.07,.13,.31,.4,.58,.76,.84,.36,.22,.85,.44,1.39,.67,.58,.18,1.26,.36,2.02,.53l2.7,.53c1.8,.4,3.32,.89,4.63,1.51,1.26,.62,2.34,1.38,3.15,2.18,.81,.84,1.44,1.78,1.8,2.85,.4,1.02,.63,2.18,.63,3.42,0,2.09-.54,3.91-1.62,5.38-1.08,1.47-2.61,2.58-4.54,3.38-1.98,.76-4.36,1.16-7.14,1.16s-5.3-.44-7.41-1.29c-2.11-.8-3.73-2.09-4.9-3.82-1.17-1.73-1.75-3.96-1.8-6.67h8.45c.04,1.02,.31,1.82,.76,2.49,.45,.71,1.08,1.2,1.89,1.56,.81,.36,1.75,.53,2.88,.53,.99,0,1.75-.13,2.38-.36,.67-.22,1.12-.58,1.48-.98,.31-.4,.49-.89,.49-1.38,0-.53-.18-.93-.49-1.33-.31-.36-.81-.71-1.53-1.02-.72-.27-1.66-.58-2.88-.84l-3.28-.67c-2.88-.62-5.17-1.65-6.83-3.11-1.66-1.47-2.47-3.47-2.47-6,0-2.05,.54-3.82,1.66-5.38s2.7-2.76,4.67-3.6c1.98-.89,4.27-1.29,6.87-1.29s4.9,.44,6.83,1.29c1.93,.89,3.41,2.13,4.49,3.69,1.03,1.6,1.57,3.42,1.57,5.56h-8.49Z" fill="var(--c-color-semantic-codsen-letters)"></path><polygon id="letter-e" points="195.11 53.96 195.11 21.62 218.65 21.62 218.65 28.7 203.96 28.7 203.96 34.25 217.44 34.25 217.44 41.33 203.96 41.33 203.96 46.88 218.61 46.88 218.61 53.96 195.11 53.96" fill="var(--c-color-semantic-codsen-letters)"></polygon><polygon id="letter-n" points="250.24 21.62 250.24 53.96 242.82 53.96 231.05 36.97 230.83 36.97 230.83 53.96 221.98 53.96 221.98 21.62 229.48 21.62 241.12 38.52 241.39 38.52 241.39 21.62 250.24 21.62" fill="var(--c-color-semantic-codsen-letters)"></polygon></g></g>
3<g id="roundel"><path id="roundel-surface" d="M263.84,14.68c-.32-1.03-.41-2.23-.07-3.65,.33-1.35,.9-2.79,2.24-3.5,7.44-3.98,23.03-5.03,26.81-5.29,14.14-1,25.89,1.32,29.77,3.36,4.88,2.57,5.46,6.35,5.66,8.47,.34,3.69-1.37,7.76-3.53,10.64-5.5,7.35-17.06,10.55-23.98,11.1-2.55,.2-13.19,.35-16.96-.07-14.15-1.54-21.56-5.97-21.56-5.97-1.87-1.69-2.93-6.93-2.93-9.61s1.95-4.95,4.55-5.48Z" fill="var(--c-color-semantic-codsen-roundel-bg)"></path><path class="roundel-spot" id="roundel-spot1" d="M275.29,20s2.46,4.05,8,5c-1.96-1.74-1.5-3.15-1.5-3.15-1.55,1.29-6.5-1.85-6.5-1.85Z" fill="var(--c-color-semantic-codsen-roundel-fg)"></path><path class="roundel-spot" id="roundel-spot2" d="M312.29,13s8.68,.36,3.17,7c.82-5.19-3.17-7-3.17-7Z" fill="var(--c-color-semantic-codsen-roundel-fg)"></path></g><path id="roundel-letters" d="M277.82,15l1.81-4.12h.08l.44,4.12h1.92l2.87-6.55h-1.83l-1.73,4.37h-.06l-.34-4.37h-1.8l-1.79,4.4h-.06l-.28-4.4h-1.84l.69,6.55h1.92Zm9.8,.13c.54,0,1.03-.08,1.47-.25s.81-.4,1.13-.7,.55-.65,.7-1.05h0l-1.66-.11c-.09,.17-.2,.31-.34,.42-.14,.11-.3,.2-.48,.25-.18,.06-.37,.09-.57,.09-.31,0-.57-.06-.77-.17-.2-.11-.34-.28-.42-.51-.08-.23-.09-.51-.04-.86h0v-.05h4.47l.08-.5c.09-.56,.09-1.04,0-1.46-.09-.41-.25-.76-.48-1.04s-.52-.48-.88-.62c-.35-.14-.74-.21-1.17-.21-.64,0-1.22,.14-1.75,.43-.52,.28-.96,.68-1.3,1.19s-.57,1.1-.69,1.77c-.12,.69-.09,1.29,.09,1.79,.18,.5,.49,.89,.93,1.17,.44,.27,1,.41,1.67,.41Zm-.74-4.15c.05-.19,.14-.37,.27-.54,.16-.21,.35-.38,.59-.51,.23-.13,.48-.2,.75-.2s.48,.06,.66,.17c.18,.12,.31,.27,.38,.48s.09,.43,.05,.69h-2.72l.02-.09Zm8.7,4.13c.5,0,.97-.13,1.41-.39,.44-.26,.83-.64,1.15-1.14,.32-.5,.54-1.12,.66-1.85,.12-.75,.11-1.37-.05-1.87-.16-.5-.42-.87-.78-1.12s-.78-.37-1.26-.37c-.37,0-.68,.06-.95,.19s-.49,.28-.68,.46c-.18,.18-.33,.36-.44,.54h-.05l.54-3.28h-1.82l-1.45,8.73h1.79l.17-1.05h.09c.05,.18,.14,.36,.27,.54,.12,.18,.3,.32,.53,.44,.23,.12,.51,.17,.87,.17Zm-.33-1.44c-.29,0-.52-.08-.7-.24-.18-.16-.3-.39-.36-.68-.06-.29-.06-.63,0-1.02,.06-.39,.17-.73,.33-1.01s.35-.51,.58-.66c.23-.16,.49-.23,.79-.23s.54,.08,.72,.24c.18,.16,.29,.39,.35,.67,.06,.29,.06,.62,0,1-.06,.38-.17,.72-.32,1.01-.15,.29-.35,.52-.58,.68-.23,.16-.5,.25-.79,.25Zm9.65,1.47c.39,0,.79-.06,1.21-.18,.42-.12,.81-.31,1.17-.56l-.04,.03,.43,.59h1.89l-1.06-1.5,.02-.02h0l.16-.18c.26-.32,.48-.69,.66-1.11,.18-.43,.32-.91,.4-1.44h-1.5c-.07,.43-.21,.83-.42,1.19-.04,.07-.08,.14-.13,.21l-.08,.11-1.16-1.65,.57-.37c.33-.21,.61-.45,.84-.7l.16-.2c.26-.33,.42-.7,.49-1.12,.07-.37,.03-.71-.1-1.02-.13-.31-.35-.56-.66-.75-.31-.19-.7-.28-1.17-.28s-.91,.1-1.3,.3c-.39,.2-.71,.47-.96,.8-.25,.34-.41,.72-.49,1.14-.06,.38-.05,.72,.05,1.04,.1,.32,.23,.62,.41,.9h0l.04,.06-.22,.14c-.17,.11-.33,.22-.48,.33l-.22,.17c-.28,.22-.51,.46-.69,.73-.18,.26-.3,.57-.35,.91-.07,.46-.02,.87,.15,1.24s.46,.66,.86,.88,.9,.32,1.5,.32Zm.87-5.57l-.09-.14c-.09-.15-.16-.3-.22-.44-.07-.19-.1-.37-.07-.56,.02-.15,.08-.29,.17-.41,.09-.12,.21-.22,.35-.29s.29-.11,.46-.11c.26,0,.45,.07,.56,.22,.12,.15,.16,.31,.13,.48-.03,.18-.11,.35-.24,.5-.12,.15-.31,.3-.55,.44h0l-.5,.3Zm-.54,4.11c-.25,0-.47-.
305-.64-.14-.17-.1-.3-.23-.37-.39s-.1-.35-.07-.56c.03-.16,.12-.34,.26-.52,.15-.18,.36-.37,.62-.54h0l.06-.04,1.35,1.84-.08,.05h0l-.19,.09c-.32,.14-.64,.21-.94,.21Zm-39.4,15.46c.54,0,1.03-.08,1.47-.25s.81-.4,1.13-.7,.55-.65,.7-1.05h0l-1.66-.11c-.09,.17-.2,.31-.34,.42-.14,.11-.3,.2-.48,.25-.18,.06-.37,.09-.57,.09-.31,0-.57-.06-.77-.17-.2-.11-.34-.28-.42-.51-.08-.23-.09-.51-.04-.86h0v-.05h4.47l.08-.5c.09-.56,.09-1.04,0-1.46-.09-.41-.25-.76-.48-1.04-.23-.28-.52-.48-.88-.62-.35-.14-.74-.21-1.17-.21-.64,0-1.22,.14-1.75,.43-.52,.28-.96,.68-1.3,1.19s-.57,1.1-.69,1.77c-.12,.69-.09,1.29,.09,1.79,.18,.5,.49,.89,.93,1.17,.44,.27,1,.41,1.67,.41Zm-.74-4.15c.05-.19,.14-.37,.27-.54,.16-.21,.35-.38,.59-.51s.48-.2,.75-.2,.48,.06,.66,.17c.18,.12,.31,.27,.38,.48,.08,.2,.09,.43,.05,.69h-2.72l.02-.09Zm6.77,4.02l.66-3.93c.04-.24,.12-.45,.24-.63,.12-.18,.27-.32,.45-.42,.18-.1,.37-.15,.56-.15,.3,0,.53,.09,.68,.28s.2,.45,.16,.77h0l-.69,4.08h1.76l.68-4c.05-.34,.19-.62,.4-.82s.49-.31,.82-.31c.29,0,.52,.09,.68,.27,.16,.18,.22,.45,.16,.82h0l-.68,4.04h1.82l.73-4.4c.12-.71,.02-1.26-.3-1.64-.32-.39-.78-.58-1.39-.58-.48,0-.91,.11-1.3,.34-.39,.23-.68,.53-.87,.9h-.07c-.04-.38-.2-.68-.48-.91-.28-.22-.64-.33-1.08-.33s-.85,.11-1.2,.33c-.36,.22-.63,.52-.83,.91h-.07l.19-1.15h-1.73l-1.09,6.55h1.81Zm10.97,.12c.32,0,.62-.04,.88-.13,.26-.09,.49-.21,.69-.36,.2-.15,.37-.33,.51-.54h.05l-.15,.91h1.72l.74-4.41c.06-.39,.04-.72-.06-1-.1-.28-.27-.51-.5-.69-.23-.18-.51-.31-.82-.4-.32-.09-.66-.13-1.02-.13-.53,0-1,.08-1.42,.24s-.78,.38-1.08,.67-.52,.64-.67,1.03h0l1.65,.14c.1-.22,.26-.4,.48-.54,.23-.14,.5-.21,.82-.21,.31,0,.53,.07,.67,.22,.14,.15,.19,.36,.15,.62h0v.03c-.03,.14-.1,.24-.22,.31-.12,.07-.3,.12-.54,.16-.24,.04-.55,.08-.93,.12-.33,.03-.65,.08-.96,.16s-.59,.19-.84,.35c-.25,.15-.47,.35-.64,.59s-.29,.55-.36,.91c-.07,.43-.04,.79,.11,1.08,.14,.29,.36,.51,.67,.65,.3,.15,.66,.22,1.08,.22Zm.73-1.25c-.28,0-.5-.06-.66-.19-.16-.13-.22-.32-.18-.56,.03-.17,.09-.31,.2-.43s.25-.21,.42-.27c.17-.07,.37-.12,.59-.15,.1-.02,.21-.03,.34-.05,.12-.02,.25-.04,.37-.06,.12-.02,.24-.05,.35-.08,.11-.03,.19-.06,.25-.1h0l-.11,.69c-.04,.23-.13,.44-.28,.62-.15,.18-.33,.33-.55,.43s-.47,.16-.73,.16Zm6.57-6.27c.27,0,.51-.09,.73-.27,.21-.18,.33-.4,.36-.65,.03-.25-.04-.47-.21-.65-.17-.18-.39-.27-.66-.27s-.51,.09-.72,.27c-.21,.18-.34,.39-.37,.65-.03,.25,.04,.47,.21,.65,.17,.18,.39,.27,.66,.27Zm-.37,7.4l1.09-6.55h-1.82l-1.09,6.55h1.82Zm3.27,0l1.45-8.73h-1.82l-1.45,8.73h1.82Zm6.64,.11c.35,0,.66-.06,.92-.17,.26-.12,.49-.26,.67-.44,.19-.18,.34-.36,.45-.54h.08l-.17,1.05h1.79l1.45-8.73h-1.82l-.55,3.28h-.06c-.05-.18-.14-.36-.26-.54-.12-.18-.29-.34-.52-.46-.23-.12-.52-.19-.88-.19-.48,0-.94,.12-1.38,.37-.44,.25-.83,.62-1.15,1.12-.32,.5-.55,1.12-.67,1.87-.12,.73-.11,1.35,.04,1.85,.15,.5,.41,.88,.77,1.14s.79,.39,1.29,.39Zm.8-1.44c-.3,0-.53-.08-.71-.25-.18-.16-.29-.39-.35-.68-.06-.29-.05-.63,.01-1.01,.06-.38,.17-.71,.32-1,.15-.29,.34-.51,.57-.67,.23-.16,.49-.24,.79-.24s.53,.08,.71,.23c.18,.16,.3,.38,.36,.66s.06,.62,0,1.01c-.06,.39-.17,.73-.33,1.02-.16,.29-.36,.51-.59,.68-.23,.16-.5,.24-.79,.24Zm7.39,1.47c.54,0,1.03-.08,1.47-.25s.81-.4,1.13-.7,.55-.65,.7-1.05h0l-1.66-.11c-.09,.17-.2,.31-.34,.42-.14,.11-.3,.2-.48,.25-.18,.06-.37,.09-.57,.09-.31,0-.57-.06-.77-.17-.2-.11-.34-.28-.42-.51-.08-.23-.09-.51-.04-.86h0v-.05h4.47l.08-.5c.09-.56,.09-1.04,0-1.46-.09-.41-.25-.76-.48-1.04-.23-.28-.52-.48-.88-.62-.35-.14-.74-.21-1.17-.21-.64,0-1.22,.14-1.75,.43-.52,.28-.96,.68-1.3,1.19s-.57,1.1-.69,1.77c-.12,.69-.09,1.29,.09,1.79,.18,.5,.49,.89,.93,1.17,.44,.27,1,.41,1.67,.41Zm-.74-4.15c.05-.19,.14-.37,.27-.54,.16-.21,.35-.38,.59-.51s.48-.2,.75-.2,.48,.06,.66,.17,.31,.27,.38,.48c.08,.2,.09,.43,.05,.69h-2.72l.02-.09Zm8.58,4.02l3.38-6.55h-1.99l-2.13,4.68h-.07l-.58-4.68h-1.85l1.2,6.55h2.05Zm3.95,.11c.18,0,.35-.05,.51-.14,.16-.09,.3-.22,.4-.37s.17-.33,.18-.51c.02-.28-.06-.52-.25-.71-.19-.2-.42-.29-.69-.29s-.53,.1-.75,.29c-.22,.19-.34,.43-.36,.71-.02,.28,.07,.53,.25,.72,.18,.2,.42,.3,.71,.3Z" fill="#000000" fill-rule="nonzero"></path></svg></a></div><nav aria-label="Main navigation" class="remix-app__nav remix-app__header-nav" data-testid="main-navigation"><ul data-testid="main-navigation-list"><li data-testid="main-navigation-home-item"><a data-testid="main-navigation-home-link" href="/" data-discover="true"><span>Home</span></a></li><li data-testid="main-navigation-open-source-item"><a data-testid="main-navigation-open-source-link" class="active" href="/os" data-discover="true"><span>Open Source</span></a></li><li data-testid="main-navigation-articles-item"><a data-testid="main-navigation-articles-link" href="/articles" data-discover="true"><span>Articles</span></a></li><li data-testid="main-navigation-about-item"><a data-testid="main-navigation-about-link" href="/about" data-discover="true"><span>About</span></a></li><li class="lh0" data-testid="main-navigation-search-item"><button id="search-button" data-testid="search-toggle-button" class="search-toggle" aria-label="toggle search" aria-expanded="false" type="button" tabindex="0"><svg aria-hidden="true" class="svg-toggle-search" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 44 44" width="44" height="44" fill="none" stroke="var(--c-color-semantic-codsen-nav)" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><g class="svg-magnify icon-toggle-appear"><circle class="svg-magnify-circle" cx="20.46" cy="19.26" r="4.26"></circle><line class="svg-magnify-handle" x1="23.8" y1="22.8" x2="29" y2="28"></line></g><path d="M25.62,3.66c9.33,3.39,15.38,11.33,15.38,19.73,0,.81-.13,9.17-6.73,14.09-8.25,6.16-22.98,4.21-28.84-5.64C.94,24.31,2.93,14.33,9.27,8.35,17.5,.6,28.91,3.51,29.46,3.66" stroke-width="5" pathLength="1" class="svg-outline-search" stroke="var(--c-color-semantic-link-hover-bg)"></path></svg><svg aria-hidden="true" id="codsen-cmd-k" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 50.48 24.65" fill="var(--c-color-semantic-aside-link-default)" height="20"><path id="b" d="M8.19,19.15c-.52,0-.99-.13-1.43-.38s-.77-.6-1.03-1.03c-.25-.43-.38-.91-.38-1.43s.13-1,.38-1.43c.26-.43,.6-.78,1.03-1.03,.43-.26,.91-.39,1.43-.39h1.52v-2.63h-1.52c-.52,0-.99-.13-1.43-.38-.43-.25-.77-.6-1.03-1.03-.25-.43-.38-.91-.38-1.43s.13-1,.38-1.43c.26-.43,.6-.77,1.03-1.03,.43-.26,.91-.38,1.43-.38s1,.13,1.43,.38c.43,.25,.78,.6,1.03,1.03,.26,.43,.39,.91,.39,1.43v1.5h2.63v-1.5c0-.52,.13-1,.38-1.43,.25-.43,.6-.77,1.03-1.03,.43-.26,.91-.38,1.43-.38s1,.13,1.43,.38c.43,.25,.77,.6,1.03,1.03,.25,.43,.38,.91,.38,1.43s-.13,1-.38,1.43-.6,.77-1.03,1.03c-.43,.26-.91,.38-1.43,.38h-1.5v2.63h1.5c.52,0,1,.13,1.43,.39,.43,.26,.77,.6,1.03,1.03s.38,.91,.38,1.43-.13,.99-.38,1.43-.6,.78-1.
303,1.03-.91,.38-1.43,.38-1-.13-1.43-.38-.77-.6-1.03-1.03-.38-.91-.38-1.43v-1.52h-2.63v1.52c0,.52-.13,.99-.39,1.43-.26,.43-.6,.78-1.03,1.03s-.91,.38-1.43,.38Zm0-9.66h1.52v-1.5c0-.28-.07-.53-.21-.76-.14-.23-.32-.41-.55-.54s-.48-.2-.76-.2-.53,.07-.76,.2-.41,.32-.55,.54c-.14,.23-.2,.48-.2,.76s.07,.53,.2,.76c.13,.23,.32,.41,.55,.54,.23,.13,.48,.2,.76,.2Zm0,8.32c.28,0,.53-.07,.76-.2s.41-.32,.55-.55c.14-.23,.21-.48,.21-.76v-1.52h-1.52c-.27,0-.53,.07-.76,.21s-.41,.32-.55,.55c-.14,.23-.2,.48-.2,.76s.07,.53,.2,.76c.13,.23,.32,.41,.55,.55s.48,.2,.76,.2Zm2.85-4.36h2.63v-2.63h-2.63v2.63Zm3.96-3.97h1.5c.28,0,.53-.07,.76-.2,.23-.13,.41-.31,.54-.54,.13-.23,.2-.48,.2-.76s-.07-.53-.2-.76c-.14-.23-.32-.41-.54-.54s-.48-.2-.76-.2-.53,.07-.76,.2c-.23,.13-.41,.32-.54,.54s-.2,.48-.2,.76v1.5Zm1.5,8.32c.28,0,.53-.07,.76-.2s.41-.32,.54-.55c.13-.23,.2-.48,.2-.76s-.07-.53-.2-.76c-.14-.23-.32-.41-.54-.55s-.48-.21-.76-.21h-1.5v1.52c0,.27,.07,.53,.2,.76s.31,.41,.54,.55c.23,.13,.48,.2,.76,.2Z"></path><path id="c" d="M33.35,19.15V5.15h1.52v14h-1.52Zm3.24-7.32l7.76,7.32h-2.07l-7.68-7.31,7.52-6.69h2.03l-7.55,6.68Z"></path><path id="d" d="M19.35,23.65H5.35c-2.48,0-4.5-2.02-4.5-4.5V5.15C.85,2.66,2.87,.65,5.35,.65h14c2.48,0,4.5,2.02,4.5,4.5v14c0,2.48-2.02,4.5-4.5,4.5ZM5.35,1.65c-1.93,0-3.5,1.57-3.5,3.5v14c0,1.93,1.57,3.5,3.5,3.5h14c1.93,0,3.5-1.57,3.5-3.5V5.15c0-1.93-1.57-3.5-3.5-3.5H5.35Z"></path><path id="e" d="M45.35,23.65h-14c-2.48,0-4.5-2.02-4.5-4.5V5.15c0-2.48,2.02-4.5,4.5-4.5h14c2.48,0,4.5,2.02,4.5,4.5v14c0,2.48-2.02,4.5-4.5,4.5ZM31.35,1.65c-1.93,0-3.5,1.57-3.5,3.5v14c0,1.93,1.57,3.5,3.5,3.5h14c1.93,0,3.5-1.57,3.5-3.5V5.15c0-1.93-1.57-3.5-3.5-3.5h-14Z"></path></svg></button></li></ul></nav></div></header><hr class="mt0 mb0 noshort"/><div class="remix-app__main" id="skiplink-content" data-testid="main-content-container" tabindex="-1"><div class="container remix-app__main-content" data-testid="route-content-container"><div class="breadcrumb" data-testid="breadcrumb-container"><span class="placeholder"></span><span class="breadcrumb-container" data-testid="breadcrumb-path"><span class="breadcrumb-filler"> </span></span><span class="placeholder"></span></div><h1 class="pt0">Our npm packages</h1><div class="os-intro" data-testid="os-intro"><p class="larger">We have been publishing to npm for <!-- -->10.8<!-- --> years now:<!-- --> <!-- -->156<!-- --> packages in that time, roughly <!-- -->14.3<!-- --> a year, with <!-- -->101<!-- --> in our monorepo and <!-- -->33<!-- --> retired. Among the<!-- --> <!-- -->123<!-- --> packages that have not been retired, the oldest two are<!-- --> <a data-testid="os-intro-detergent-link" href="/os/detergent" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <!-- -->detergent</a> and <a data-testid="os-intro-object-boolean-combinations-link" href="/os/object-boolean-combinations" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <!-- -->object-boolean-combinations</a>, both from <!-- -->2015<!-- -->. At the other end sit <a data-testid="os-intro-html-entity-codec-link" href="/os/html-entity-codec" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <!-- -->html-entity-codec</a> and <a data-testid="os-intro-string-typo-match-link" href="/os/string-typo-match" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <!-- -->string-typo-match</a>, both from <!-- -->2026<!-- -->.</p><p class="larger">Our speciality is non-parsing code processing â algorithms which read the source as a string and never build a syntax tree, so broken and templated input stays workable. It is not an HTML-only habit:<!-- --> <a data-testid="os-intro-html-crush-link" href="/os/html-crush" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <!-- -->html-crush</a> applies it to HTML, <a data-testid="os-intro-email-comb-link" href="/os/email-comb" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <!-- -->email-comb</a> to CSS,<!-- --> <a data-testid="os-intro-json-comb-link" href="/os/json-comb" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <!-- -->json-comb</a> to JSON, and <a data-testid="os-intro-csv-sort-link" href="/os/csv-sort" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <!-- -->csv-sort</a> to the awkward CSV that banks export.</p><p class="larger">The shapes vary more than the subject matter suggests. That same scannerless approach turns up over<!-- --> <a data-testid="os-intro-edit-package-json-link" href="/os/edit-package-json" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <!-- -->package.json</a>,<!-- --> <a data-testid="os-intro-tsd-extract-link" href="/os/tsd-extract" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <!-- -->TypeScript declarations</a>,<!-- --> <a data-testid="os-intro-csv-split-easy-link" href="/os/csv-split-easy" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <!-- -->CSV</a>,<!-- --> <a data-testid="os-intro-is-language-code-link" href="/os/is-language-code" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <!-- -->IANA language codes</a>,<!-- --> <a data-testid="os-intro-lerna-clean-changelogs-link" href="/os/lerna-clean-changelogs" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <!-- -->Commitizen changelogs</a> and<!-- --> <a data-testid="os-intro-string-apostrophes-link" href="/os/string-apostrophes" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <!-- -->plain English prose</a>. The APIs run from classes (<a data-testid="os-intro-ranges-push-link" href="/os/ranges-push" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <!-- -->ranges-push</a>) through callback-only traversal (<a data-testid="os-intro-ast-monkey-link" href="/os/ast-monkey" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <!-- -->ast-monkey</a>) to a dozen command-line apps (<a data-testid="os-intro-csv-sort-cli-link" href="/os/csv-sort-cli" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <!-- -->csv-sort-cli</a>), and there is a <a data-testid="os-intro-codsen-tokenizer-link" href="/os/codsen-tokenizer" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <!-- -->
3tokeniser</a> and a<!-- --> <a data-testid="os-intro-codsen-parser-link" href="/os/codsen-parser" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <!-- -->parser</a> producing our own AST design,<!-- --> <a data-testid="os-intro-ast-monkey-link" href="/os/ast-monkey" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <!-- -->a monkey</a> to walk it, a linter built on Nodeâs <code>EventEmitter</code> (<a data-testid="os-intro-emlint-link" href="/os/emlint" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <!-- -->emlint</a>), a <a data-testid="os-intro-gulp-email-remove-unused-css-link" href="/os/gulp-email-remove-unused-css" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <!-- -->Gulp plugin</a> and an<!-- --> <a data-testid="os-intro-eslint-plugin-row-num-link" href="/os/eslint-plugin-row-num" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <!-- -->ESLint one</a>.</p><p class="larger">Then the oddities: a string uglifier built on cryptographic principles (<a data-testid="os-intro-string-uglify-link" href="/os/string-uglify" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <!-- -->string-uglify</a>), a program which reverse-engineers Bitbucketâs slug algorithm (<a data-testid="os-intro-bitbucket-slug-link" href="/os/bitbucket-slug" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <!-- -->bitbucket-slug</a>), one which generates all 2<sup>n</sup> boolean combinations of an options object so the unit tests can cover every one of them (<a data-testid="os-intro-test-mixer-link" href="/os/test-mixer" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <!-- -->test-mixer</a>), and a mock program whose only job is to normalise everybody elseâs benchmark scores (<a data-testid="os-intro-perf-ref-link" href="/os/perf-ref" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <!-- -->perf-ref</a>).</p><p class="larger">Everything below is grouped by what it operates on:<!-- --> <a data-testid="os-intro-html-libraries-link" href="#html-libraries">HTML and CSS</a>, <a data-testid="os-intro-range-libraries-link" href="#range-libraries">ranges</a>, <a data-testid="os-intro-string-libraries-link" href="#string-libraries">strings</a>, <a data-testid="os-intro-object-libraries-link" href="#object-libraries">plain objects and arrays</a>, <a data-testid="os-intro-ast-libraries-link" href="#ast-libraries">ASTs</a>, <a data-testid="os-intro-lerna-libraries-link" href="#lerna-libraries">monorepo tooling</a>, <a data-testid="os-intro-cli-libraries-link" href="#cli-libraries">the command line</a> and <a data-testid="os-intro-miscellaneous-libraries-link" href="#miscellaneous-libraries">everything that fits nowhere else</a> <!-- -->â with the four<!-- --> <a data-testid="os-intro-flagship-libraries-link" href="#flagship-libraries">flagship libraries</a> <!-- -->up front.</p><p class="larger">Of the <!-- -->95<!-- --> packages in the monorepo, <!-- -->21<!-- --> (<!-- -->22<!-- -->%) declare no dependencies at all,<!-- --> <!-- -->78<!-- --> (<!-- -->82<!-- -->%) never reach outside Codsen code however deep you follow them, and another <!-- -->7<!-- --> <!-- -->bottom out at exactly one outside library. The lot pulls in<!-- --> <!-- -->18<!-- --> distinct third-party packages, while our own<!-- --> <a data-testid="os-intro-codsen-utils-link" href="/os/codsen-utils" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <!-- -->codsen-utils</a> is used by<!-- --> <!-- -->69<!-- --> of them.</p><p class="larger">Every one of those <!-- -->95<!-- --> is gated at<!-- --> <!-- -->100<!-- -->% line coverage, and<!-- --> <!-- -->31<!-- --> of them at 100% branches, functions and statements as well â a package which slips below its threshold fails the build instead of shipping.<!-- --> <!-- -->Benchmarks are checked in for <!-- -->84<!-- --> of them,<!-- --> <!-- -->924<!-- --> recorded runs so far, and a release more than <!-- -->10<!-- -->
3% slower than its own baseline fails the build too.<!-- --> <!-- -->There are<!-- --> <a data-testid="os-intro-examples-link" href="/os/examples" data-discover="true">771<!-- --> runnable examples</a> <!-- -->across <!-- -->86<!-- --> of the packages, all automatically tested, and <!-- -->10,133<!-- --> commits behind the lot.</p></div><section class="os-charts" aria-labelledby="os-charts-heading" data-testid="os-charts"><h2 id="os-charts-heading"><a class="header-anchor" data-testid="os-charts-anchor" href="#os-charts-heading">Downloads and dependencies</a></h2><p>See how downloads are shared across our packages and how the libraries fit together. The download window is printed on each chart.</p><figure class="os-charts__figure"><img data-testid="os-download-concentration" src="/statistics/charts/download-concentration.svg" alt="Cumulative npm download share as non-retired Codsen packages are added from most to least downloaded" width="960" height="730" loading="lazy" decoding="async"/><figcaption>Counts include dependency and automated installs. They measure package downloads, not unique people.<!-- --> <a data-testid="os-download-concentration-link" href="/statistics/charts/download-concentration.svg">Open the download chart at full size</a>.</figcaption></figure><details class="os-charts__details" data-testid="os-topology-details"><summary data-testid="os-topology-toggle">Follow the connections between Codsen packages</summary><p>Arrows lead from a package to its dependency. Each package name links to its documentation. Dashed boxes mark packages whose outgoing dependencies are unknown. This map shows only Codsen dependencies.</p><p><a data-testid="os-topology-link" href="/statistics/charts/dependency-topology-narrow.svg">Open the dependency map at full size</a> <!-- -->to zoom into the labels on a small screen.</p><object class="os-charts__topology" data-testid="os-dependency-topology" data="/statistics/charts/dependency-topology-narrow.svg" type="image/svg+xml" aria-label="Codsen package dependency topology with links to package documentation" width="682"><a data-testid="os-topology-fallback-link" href="/statistics/charts/dependency-topology-narrow.svg">Open the Codsen package dependency map</a></object></details><details class="os-charts__details" data-testid="os-molecule-details"><summary data-testid="os-molecule-toggle">Explore one packageâs dependencies in 3D</summary><p>Choose a package, then rotate or zoom its dependency graph. This snapshot includes resolved production and optional dependencies, including third-party packages; a fresh install can resolve different versions.</p><p><a data-testid="os-molecule-link" href="/statistics/charts/dependency-molecule.html#string-strip-html">Open the dependency explorer on its own page</a>. The explorer also includes a linked text list of the dependencies.</p><iframe class="os-charts__molecule" data-testid="os-dependency-molecule" src="/statistics/charts/dependency-molecule.html#string-strip-html" title="Interactive Codsen package dependency explorer" loading="lazy" width="100%" height="1000"></iframe></details><p class="os-charts__links"><a data-testid="os-chart-gallery-link" href="/statistics/charts/index.html">View all charts, rankings and download history</a> <!-- -->or<!-- --> <a data-testid="os-chart-data-link" href="/statistics/charts/summary.json">inspect the chart data</a>.</p></section><br/><h2 id="flagship-libraries"><a class="header-anchor" data-testid="flagship-libraries-anchor" href="#flagship-libraries">Flagship Libraries</a></h2><div class="four-col" data-testid="flagship-packages"><div data-testid="flagship-packages-column-1"><div class="content-row__package" data-testid="package-string-strip-html-item"><div class="content-row__package-main content-row__package-main-larger" data-testid="package-string-strip-html-content"><a data-testid="package-string-strip-html-readme-link" href="/os/string-strip-html" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <span class="content-row__name">string-strip-html</span> <sup>13.7.4</sup><div class="content-row__package__description" data-testid="package-string-strip-html-description">Strip HTML tags from strings. No parser, accepts mixed sources.</div></a></div><a data-testid="package-string-strip-html-playground-link" href="/os/string-strip-html/play" data-discover="true"><span class="content-row__package-playground"><span class="button">open playground</span></span></a></div><div class="content-row__package" data-testid="package-email-comb-item"><div class="content-row__package-main content-row__package-main-larger" data-testid="package-email-comb-content"><a data-testid="package-email-comb-readme-link" href="/os/email-comb" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <span class="content-row__name">email-comb</span> <sup>7.4.3</sup><div class="content-row__package__description" data-testid="package-email-comb-description">Remove unused CSS from email templates</div></a></div><a data-testid="package-email-comb-playground-link" href="/os/email-comb/play" data-discover="true"><span class="content-row__package-playground"><span class="button">open playground</span></span></a></div></div><div data-testid="flagship-packages-column-2"><div class="content-row__package" data-testid="package-html-crush-item"><div class="content-row__package-main content-row__package-main-larger" data-testid="package-html-crush-content"><a data-testid="package-html-crush-readme-link" href="/os/html-crush" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <span class="content-row__name">html-crush</span> <sup>6.3.3</sup><div class="content-row__package__description" data-testid="package-html-crush-description">Minify email templates</div></a></div><a data-testid="package-html-crush-playground-link" href="/os/html-crush/play" data-discover="true"><span class="content-row__package-playground"><span class="button">open playground</span></span></a></div><div class="content-row__package" data-testid="package-detergent-item"><div class="content-row__package-main content-row__package-main-larger" data-testid="package-detergent-content"><a data-testid="package-detergent-readme-link" href="/os/detergent" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <span class="content-row__name">detergent</span> <sup>9.4.9</sup><div class="content-row__package__description" data-testid="package-detergent-description">Extract, clean, encode text and fix English style</div></a></div><a data-testid="package-detergent-playground-link" href="/os/detergent/play" data-discover="true"><span class="content-row__package-playground"><span class="button">open playground</span></span></a></div></div></div><div class="back-to-top" data-testid="flagship-back-to-top-container"><a data-testid="flagship-back-to-top-link" href="#page-top">â back to top</a></div><div class="separator" role="presentation" data-testid="os-separator-a"><svg aria-hidden="true" class="codsen-diskette" width="78" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 78 82"><path class="svg-outline" d="M69.25 80.5H8.17c-4.19 0-7.6-3.41-7.6-7.6V8.99c0-4.2 3.41-7.61 7.6-7.61
3h61.54l7.14 7.26V72.9c0 4.19-3.41 7.6-7.6 7.6Z"></path><path class="svg-green" d="M67.19 7.38H64.4v.3h-5.81l-1.06 1.03h-3.6l-28.04-.95H12.92v-.38H8.17c-.89 0-1.6.72-1.6 1.6V72.9c0 .89.72 1.6 1.6 1.6h61.08c.89 0 1.6-.72 1.6-1.6V11.1l-3.66-3.72Z"></path><path class="svg-black-fill" d="M69.25 75.5H8.17c-1.43 0-2.6-1.17-2.6-2.6V8.99c0-1.44 1.17-2.6 2.6-2.6h5.75v.37h11.96l28.07.95h3.16l1.06-1.03h5.22v-.3h4.21l4.24 4.31V72.9c0 1.44-1.17 2.6-2.6 2.6ZM8.17 8.38c-.33 0-.6.27-.6.6V72.9c0 .33.27.6.6.6h61.08c.33 0 .6-.27.6-.6V11.51l-3.08-3.13H65.4v.3h-6.41l-1.06 1.03h-4l-28.07-.95H11.92v-.38H8.17Z"></path><path class="svg-blue" d="M21.81 6.98v20.68c0 1.15.93 2.08 2.08 2.08H53.6c1.15 0 2.08-.93 2.08-2.08V6.98H21.81Zm28.63 18.98c0 .43-.39.78-.86.78h-7.06c-.48 0-.86-.35-.86-.78v-14.8c0-.43.39-.78.86-.78h7.06c.48 0 .86.35.86.78v14.79Z"></path><path class="svg-black-fill" d="M53.61 30.74H23.89c-1.7 0-3.08-1.38-3.08-3.08V5.98h35.88v21.68c0 1.7-1.38 3.08-3.08 3.08ZM22.81 7.98v19.68c0 .6.49 1.08 1.08 1.08H53.6c.6 0 1.08-.48 1.08-1.08V7.98H22.81Zm26.77 19.77h-7.06c-1.03 0-1.86-.8-1.86-1.78V11.16c0-.98.83-1.78 1.86-1.78h7.06c1.03 0 1.86.8 1.86 1.78v14.79c0 .98-.83 1.78-1.86 1.78Zm-6.92-2h6.78V11.38h-6.78v14.36Z"></path><rect class="svg-black-fill" x="13.34" y="35.92" width="50.23" height="31.68" rx="1.5" ry="1.5"></rect><path class="svg-black-fill" d="M8.94 66.8h3.18v2.91H8.94zM65.51 66.8h3.18v2.91h-3.18z"></path><path class="svg-yellow" d="M27.08 47.72c0-5.62 9.28-7.07 11.25-.01.04.14.25.14.3 0 2.07-7.08 11.25-5.58 11.25 0 0 5.08-11.63 14.73-11.63 14.73s-11.16-8.89-11.16-14.73Z"></path></svg></div><h2 id="html-libraries"><a class="header-anchor" data-testid="html-libraries-anchor" href="#html-libraries">HTML Processing Libraries</a> <sup title="13 HTML Processing Libraries in total">Σ=<!-- -->13</sup></h2><div class="content-row__container" data-testid="package-group-all-named-html-entities-13"><div class="content-row__description drop-cap drop-cap-small" data-testid="package-group-all-named-html-entities-13-description"><p>They all process HTML and CSS. Our speciality is non-parsing algorithms â we donât parse and then work on AST and then render. We aim to work on the source code directly while traversing it as a string.</p><p>The idea is, if you donât parse the HTML, you can support broken or mixed code. Unless you write your parser, it becomes a bottleneck â parser throws here and there, and you can do nothing about it.</p><p>It is vital to support broken code because this allows us to make broken code-fixing programs.</p><p>Also, we often aim to support the processing of HTML mixed with other, known or unknown, source code (typically, programming or templating languages).</p></div><div class="content-row__packages" data-testid="package-group-all-named-html-entities-13-items"><div class="content-row__package" data-testid="package-all-named-html-entities-item"><div class="content-row__package-main" data-testid="package-all-named-html-entities-content"><a data-testid="package-all-named-html-entities-readme-link" href="/os/all-named-html-entities" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <span class="content-row__name">all-named-html-entities</span> <sup>3.2.1</sup><div class="content-row__package__description" data-testid="package-all-named-html-entities-description">List of all named HTML entities</div></a></div></div><div class="content-row__package" data-testid="package-charcode-is-valid-xml-name-character-item"><div class="content-row__package-main" data-testid="package-charcode-is-valid-xml-name-character-content"><a data-testid="package-charcode-is-valid-xml-name-character-readme-link" href="/os/charcode-is-valid-xml-name-character" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <span class="content-row__name">charcode-is-valid-xml-name-character</span> <sup>3.2.2</sup><div class="content-row__package__description" data-testid="package-charcode-is-valid-xml-name-character-description">Does a given character belong to XML specâs âProduction 4 OR 4aâ type (is acceptable for XML elementâs name)</div></a></div></div><div class="content-row__package" data-testid="package-color-shorthand-hex-to-six-digit-item"><div class="content-row__package-main" data-testid="package-color-shorthand-hex-to-six-digit-content"><a data-testid="package-color-shorthand-hex-to-six-digit-readme-link" href="/os/color-shorthand-hex-to-six-digit" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <span class="content-row__name">color-shorthand-hex-to-six-digit</span> <sup>5.2.4</sup><div class="content-row__package__description" data-testid="package-color-shorthand-hex-to-six-digit-description">Convert shorthand hex color codes into full</div></a></div></div><div class="content-row__package" data-testid="package-generate-atomic-css-item"><div class="content-row__package-main" data-testid="package-generate-atomic-css-content"><a data-testid="package-generate-atomic-css-readme-link" href="/os/generate-atomic-css" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <span class="content-row__name">generate-atomic-css</span> <sup>3.2.4</sup><div class="content-row__package__description" data-testid="package-generate-atomic-css-description">Generate Atomic CSS</div></a></div></div><div class="content-row__package" data-testid="package-html-all-known-attributes-item"><div class="content-row__package-main" data-testid="package-html-all-known-attributes-content"><a data-testid="package-html-all-known-attributes-readme-link" href="/os/html-all-known-attributes" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <span class="content-row__name">html-all-known-attributes</span> <sup>6.2.1</sup><div class="content-row__package__description" data-testid="package-html-all-known-attributes-description">All HTML attributes known to the Humanity</div></a></div></div><div class="content-row__package" data-testid="package-html-entities-not-email-friendly-item"><div class="content-row__package-main" data-testid="package-html-entities-not-email-friendly-content"><a data-testid="package-html-entities-not-email-friendly-readme-link" href="/os/html-entities-not-email-friendly" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <span class="content-row__name">html-entities-not-email-friendly</span> <sup>0.10.1</sup><div class="content-row__package__description" data-testid="package-html-entities-not-email-friendly-description">All HTML entities which are not email template friendly</div></a></div></div><div class="content-row__package" data-testid="package-html-entity-codec-item"><div class="content-row__package-main" data-testid="package-html-entity-codec-content"><a data-testid="package-html-entity-codec-readme-link" href="/os/html-entity-codec" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <span class="content-row__name">html-entity-codec</span> <sup>1.1.0</sup><div class="content-row__package__description" data-testid="package-html-entity-codec-description">Decode, encode, and escape HTML character references</div></a></div></div><div class="content-row__package" data-testid="package-is-char-suitable-for-html-attr-name-item"><div class="content-row__package-main" data-testid="package-is-char-suitable-for-html-attr-name-content"><a data-testid="package-is-char-suitable-for-html-attr-name-readme-link" href="/os/is-char-suitable-for-html-attr-name" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <span class="content-row__name">is-char-suitable-for-html-attr-name</span> <sup>4.2.3</sup><div class="content-row__package__description" data-testid="package-is-char-suitable-for-html-attr-name-description">Is given character suitable to be in an HTML attributeâs name?</div></a></div></div><div class="content-row__package" data-testid="package-is-html-attribute-closing-item"><div class="content-row__package-main" data-testid="package-is-html-attribute-closing-content"><a data-testid="package-is-html-attribute-closing-readme-link" href="/os/is-html-attribute-closing" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <span class="content-row__name">is-html-attribute-closing</span> <sup>4.2.5</sup><div class="content-row__package__description" data-testid="package-is-html-attribute-closing-description">Is a character on a given index a closing of an HTML attribute?</div></a></div></div><div class="content-row__package" data-testid="package-is-html-tag-opening-item"><div class="content-row__package-main" data-testid="package-is-html-tag-opening-content"><a data-testid="package-is-html-tag-opening-readme-link" href="/os/is-html-tag-opening" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <span class="content-row__name">is-html-tag-opening</span> <sup>4.2.5</sup><div class="content-row__package__description" data-testid="package-is-html-tag-opening-description">Does an HTML tag start at given position?</div></a></div></div><div class="content-row__package" data-testid="package-is-language-code-item"><div class="content-row__package-main" data-testid="package-is-language-code-content"><a data-testid="package-is-language-code-readme-link" href="/os/is-language-code" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <span class="content-row__name">is-language-code</span> <sup>5.2.2</sup><div class="content-row__package__description" data-testid="package-is-language-code-description">Is given string a language code (as per IANA)</div></a></div><a data-testid="package-is-language-code-playground-link" href="/os/is-language-code/play" data-discover="true"><span class="content-row__package-playground"><span class="button">open playground</span></span></a></div><div class="content-row__package" data-testid="package-is-media-descriptor-item"><div class="content-row__package-main" data-testid="package-is-media-descriptor-content"><a data-testid="package-is-media-descriptor-readme-link" href="/os/is-media-descriptor" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <span class="content-row__name">is-media-descriptor</span> <sup>5.2.5</sup><div class="content-row__package__description" data-testid="package-is-media-descriptor-description">Is given string a valid media descriptor (including media query)?</div></a></div></div><div class="content-row__package" data-testid="package-is-relative-uri-item"><div class="content-row__package-main" data-testid="package-is-relative-uri-content"><a data-testid="package-is-relative-uri-readme-link" href="/os/is-relative-uri" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <span class="content-row__name">is-relative-uri</span> <sup>5.2.1</sup><div class="content-row__package__description" data-testid="package-is-relative-uri-description">Is given string a relative URI?</div></a></div></div></div></div><div class="back-to-top" data-testid="html-libraries-back-to-top-container"><a data-testid="html-libraries-back-to-top-link" href="#page-top">â back to top</a></div><div class="separator" role="presentation" data-testid="os-separator-b"><svg class="codsen-4" width="106" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 106 62" role="presentation"><path class="svg-outline" d="M91.15 60.4c-3.34 0-6.31-2.38-6.98-5.58-2.26-6.82-7.15-11.74-14.54-14.64-13.23-5.2-30.46-2.4-40 2.87-5.17 3.32-5.68 4.68-6.77 7.62-.5 1.33-1.11 2.99-2.23 5.1-1.46 3.18-4.67 4.64-8.21 3.72-3.09-.8-6.19-3.45-6.21-6.87C2.5 40.56-.33 20.85 1.66 7.61l.28-1.88 1.89-.2c19.06-1.98 48.1-3.52 70.03-2.5l.22.02c.53.07 3.23.28 6.09.49 9.32.71 17.94 1.39 21 1.99l1.87.36.11 1.9c.08 1.34.2 2.9.33 4.62 1.17 15.08 3.12 40.32-11.16 47.7l-.52.27H91.15Z"></path><path class="svg-blue" d="M96.49 12.37c-44-7.52-87.71-.6-87.71-.6-2.75 13.09-.21 27.18 5.49 41.87 3.18-13.05 14.48-19.95 29.8-21.76 26.79-3.16 43.58 8.38 46.45 21.81 3.79 1.38 10.94-27.27 5.97-41.32ZM46.4 18.39l-6.4 3.6-5.71-6.88 6.82-4.19 5.3 7.48Z"></path><path class="svg-black-fill" d="m98.03 11.4-.16-.76c-3.87-.55-7.82-.99-12.15-1.35s-.31-.03-.31-.03l-3.96-.33.05.03c-1.86-.12-3.76-.23-5.7-.33-.54-.03-1.74-.08-2.27-.1-18.49-1.39-67.42 1.85-65.75 2.14l-.93.1c-1.34 11.61 1.5 30.5 4.77 40.7.33 1.34.59 2.71 2.17 2.86.79.08 1.56-.31 1.9-1 1.06-2.14 1.73-3.82 2.26-5.17 1.5-3.8 2.13-5.37 8.8-9.81 17.66-11.06 57.36-8.56 62.8 15.23.24 1.46 2.38 1.8 3.06.47 2.4-4.29 4.17-9.21 5.28-14.61 2.07-5.68 1.17-26.07.15-28.04Zm-24.98 6.05c.79-2.18 1.5-4.39 2.14-6.62 3.28.15 6.47.35 9.49.59.54 2.01-.03 4.13-.49 6.11-1.75.13-6.67.33-11.31.37.05-.15.11-.3.17-.45Zm10.48 2.36c-.54 1.67-1.17 3.32-1.84 4.95-1.3.12-6.99.59-11.26-.18.59-1.47 1.13-2.95 1.63-4.45 4.19-.01 8.99-.17 11.47-.32Zm-42.5-8.2c.97 1.27 3.38 4.65 4.44 6.91-1.89.36-4.12 1.01-5.49 2.63-1.33-2.02-4.02-5.05-4.79-5.74 1.92-2.01 5.83-3.81 5.83-3.81ZM16.88 44.96c-1.05 2.31-1.58 4.08-2.88 6.76-3.16-9.76-6.08-27.66-5.06-38.93 3.18-.31 14.15-1.3 28.34-1.88-4.09 2.69-6.64 5.92-9.88 10.96-4.16-.52-6.76-.13-8.21.28.24-2.56.62-4.32.63-4.37-.54-.12-1.63-.37-2.17-.49-.08.35-1.93 8.76 0 16.18l2.15-.56c-.73-2.78-.87-5.77-.78-8.35 1.99-.75 3.8-.84 7.11-.6-3.19 5.55-6.31 12.61-9.27 20.99Zm8.64-8.46c-1.77 1.18-3.16 2.19-4.27 3.1 3.6-8.88 6.99-16.13 12.42-22.56 1.45 1.44 6.63 6.93 8.51 13.6-6.5 1.01-12.36 3-16.66 5.85Zm25.84-6.6c-2.36.03-4.69.18-6.96.45-.7-2.61-1.85-5.02-3.06-7.07.92-2.41 5.11-2.67 7.07-2.82-.43-3.07-3.94-7.98-5.27-9.74 2.08-.07 4.22-.13 6.39-.17 1.13.98 5.2 5.01 6.81 9.82.83 3.04-2.74 7.37-4.97 9.53Zm15.68-3.06c-.67 1.45-1.39 2.87-2.13 4.29-3.44-.68-6.99-1.08-10.52-1.
319 1.54-1.72 2.67-3.38 3.38-4.95 1.16.28 2.12.53 3.35.64-.48 1.08-1.07 2.28-1.62 3.17l1.89 1.16c1.24-2.03 2.19-4.4 2.99-6.45-2.05.04-4.19-.13-5.9-.64.95-4.84-3.75-9.92-5.84-12.36 6.58-.08 13.44-.02 20.26.24-.71 2.41-1.5 4.82-2.4 7.17-2.64-.02-4.2-.1-5.12-.19.39-2.08.13-3.37-.38-6.16l-2.18.45c.68 3.28.8 4.89-.41 7.33 2.41.63 1.1.6 7.14.79-.02.04-.04.09-.06.13l.14.07a69.03 69.03 0 0 1-2.61 6.51Zm11.64 4.55c-.6 1.23-1.23 2.46-1.86 3.68-2.84-1.43-6.08-2.59-9.66-3.45.84-1.61 1.64-3.25 2.38-4.91s.01-.02.01-.02c2.61.61 7.89.68 11.14.39-.65 1.45-1.32 2.88-2.02 4.31Zm18.35-5.66c-.05 9.08-1.7 18.21-5.67 25.94-.8-2.83-2.62-7.01-6.68-11.02 3.39-3.14 3.46-6.89 3.86-13.24l-2.22-.06c-.24 8.95-2.05 10.97-3.33 11.76a31.76 31.76 0 0 0-4.22-2.99c3.2-6.42 8.99-17.38 8.25-24.5 6.88-.08 6.4 9.68 4.69 15.46l2.14.58c1.42-5.47 2.12-11.06-.93-15.44 1.04.12 2.07.25 3.07.39.32 1.83 1.07 6.8 1.03 13.11Z"></path><path class="svg-black-fill" d="m34.33 30.95 2.18-.41c-.32-1.72-1.5-3.13-1.63-3.29l-1.69 1.44s.92 1.1 1.14 2.26ZM47.09 24.7s.92 1.1 1.14 2.26l2.18-.41c-.32-1.72-1.5-3.13-1.63-3.29l-1.69 1.44Z"></path></svg> <svg class="codsen-star-small" height="43" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 18.09 23.02" role="presentation"><path data-name="GREY OUTLINE" class="svg-outline" d="M9,22.47c-2.4,0-2.63-2.5-2.71-3.43-.11-1.19-.36-4-1.49-4.67a3.65,3.65,0,0,0-1.17-.31C1.2,13.68.84,12.2.84,11.35S1.22,9,3.66,8.66a3.47,3.47,0,0,0,1.16-.3c.93-.58,1.25-3.14,1.39-4.23S6.68.57,9.05.55,11.73,3,11.86,4.16s.42,3.63,1.33,4.21a3.47,3.47,0,0,0,1.21.3c2.46.3,2.84,1.79,2.85,2.65S16.9,13.68,14.4,14a3.65,3.65,0,0,0-1.3.34C12,15.1,11.8,17.83,11.73,19c-.06.95-.22,3.46-2.68,3.47H9ZM8.91,11.34l.06.07.1-.1L9,11.22Z"></path><path data-name="BLACK STROKE" d="M9,20.31c-.43,0-.47-.43-.56-1.47C8.32,17.07,8,13.78,6,12.53a5.29,5.29,0,0,0-2-.6c-.56-.08-1-.15-1-.57s.43-.48,1-.56a5.25,5.25,0,0,0,2-.61c1.8-1.12,2.17-4,2.39-5.79.15-1.16.22-1.69.69-1.69H9c.48,0,.54.53.68,1.69.2,1.74.53,4.66,2.31,5.79a5,5,0,0,0,2.11.62c.51.06.95.12.95.53s-.44.48-1,.56a5.53,5.53,0,0,0-2.16.66c-2.06,1.31-2.26,4.56-2.37,6.31-.06,1-.09,1.44-.52,1.44H9Z"></path><path class="svg-yellow" d="M9,4.48v0c-.24,1.87-.63,5-2.71,6.28a4.62,4.62,0,0,1-1.59.59,5,5,0,0,1,1.59.58c1.84,1.12,2.43,3.51,2.69,5.4.2-1.87.75-4.2,2.56-5.36a4.75,4.75,0,0,1,1.63-.62,4.6,4.6,0,0,1-1.54-.59C9.61,9.46,9.25,6.34,9,4.48Z"></path></svg></div><h2 id="range-libraries"><a class="header-anchor" data-testid="range-libraries-anchor" href="#range-libraries">Range Libraries</a> <sup title="9 Range Libraries in total">Σ=<!-- -->9</sup></h2><div class="content-row__container" data-testid="package-group-ranges-apply-9"><div class="content-row__description drop-cap drop-cap-small" data-testid="package-group-ranges-apply-9-description"><p>We needed a way to compose multiple string amendment operations. We started to mark each operation as an array, for example,<!-- --> <code>[1, 5]</code> means âdelete from string index 1 to 5â.</p><p>If you wish to put something after deletion as well, it goes as the third element in the array.</p><p>All these packages process arrays of range arrays in various ways.</p></div><div class="content-row__packages" data-testid="package-group-ranges-apply-9-items"><div class="content-row__package" data-testid="package-ranges-apply-item"><div class="content-row__package-main" data-testid="package-ranges-apply-content"><a data-testid="package-ranges-apply-readme-link" href="/os/ranges-apply" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <span class="content-row__name">ranges-apply</span> <sup>7.2.5</sup><div class="content-row__package__description" data-testid="package-ranges-apply-description">Take an array of string index ranges, delete/replace the string according to them</div></a></div></div><div class="content-row__package" data-testid="package-ranges-crop-item"><div class="content-row__package-main" data-testid="package-ranges-crop-content"><a data-testid="package-ranges-crop-readme-link" href="/os/ranges-crop" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <span class="content-row__name">ranges-crop</span> <sup>6.2.5</sup><div class="content-row__package__description" data-testid="package-ranges-crop-description">Crop array of ranges when they go beyond the reference stringâs length</div></a></div></div><div class="content-row__package" data-testid="package-ranges-invert-item"><div class="content-row__package-main" data-testid="package-ranges-invert-content"><a data-testid="package-ranges-invert-readme-link" href="/os/ranges-invert" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <span class="content-row__name">ranges-invert</span> <sup>6.2.5</sup><div class="content-row__package__description" data-testid="package-ranges-invert-description">Invert string index ranges</div></a></div></div><div class="content-row__package" data-testid="package-ranges-is-index-within-item"><div class="content-row__package-main" data-testid="package-ranges-is-index-within-content"><a data-testid="package-ranges-is-index-within-readme-link" href="/os/ranges-is-index-within" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <span class="content-row__name">ranges-is-index-within</span> <sup>4.2.1</sup><div class="content-row__package__description" data-testid="package-ranges-is-index-within-description">Checks if index is within any of the given string index ranges</div></a></div></div><div class="content-row__package" data-testid="package-ranges-merge-item"><div class="content-row__package-main" data-testid="package-ranges-merge-content"><a data-testid="package-ranges-merge-readme-link" href="/os/ranges-merge" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <span class="content-row__name">ranges-merge</span> <sup>9.2.5</sup><div class="content-row__package__description" data-testid="package-ranges-merge-description">Merge and sort string index ranges</div></a></div></div><div class="content-row__package" data-testid="package-ranges-process-outside-item"><div class="content-row__package-main" data-testid="package-ranges-process-outside-content"><a data-testid="package-ranges-process-outside-readme-link" href="/os/ranges-process-outside" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <span class="content-row__name">ranges-process-outside</span> <sup>6.2.5</sup><div class="content-row__package__description" data-testid="package-ranges-process-outside-description">Iterate string considering ranges, as if they were already applied</div></a></div></div><div class="content-row__package" data-testid="package-ranges-push-item"><div class="content-row__package-main" data-testid="package-ranges-push-content"><a data-testid="package-ranges-push-readme-link" href="/os/ranges-push" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <span class="content-row__name">ranges-push</span> <sup>7.3.2</sup><div class="content-row__package__description" data-testid="package-ranges-push-description">Gather string index ranges</div></a></div></div><div class="content-row__package" data-testid="package-ranges-sort-item"><div class="content-row__package-main" data-testid="package-ranges-sort-content"><a data-testid="package-ranges-sort-readme-link" href="/os/ranges-sort" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <span class="content-row__name">
3ranges-sort</span> <sup>6.2.4</sup><div class="content-row__package__description" data-testid="package-ranges-sort-description">Sort string index ranges</div></a></div></div><div class="content-row__package" data-testid="package-string-range-expander-item"><div class="content-row__package-main" data-testid="package-string-range-expander-content"><a data-testid="package-string-range-expander-readme-link" href="/os/string-range-expander" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <span class="content-row__name">string-range-expander</span> <sup>4.2.5</sup><div class="content-row__package__description" data-testid="package-string-range-expander-description">Expands string index ranges within whitespace boundaries until letters are met</div></a></div></div></div></div><div class="back-to-top" data-testid="range-libraries-back-to-top-container"><a data-testid="range-libraries-back-to-top-link" href="#page-top">â back to top</a></div><div class="separator" role="presentation" data-testid="os-separator-c"><svg class="codsen-star-small" height="43" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 18.09 23.02" role="presentation"><path data-name="GREY OUTLINE" class="svg-outline" d="M9,22.47c-2.4,0-2.63-2.5-2.71-3.43-.11-1.19-.36-4-1.49-4.67a3.65,3.65,0,0,0-1.17-.31C1.2,13.68.84,12.2.84,11.35S1.22,9,3.66,8.66a3.47,3.47,0,0,0,1.16-.3c.93-.58,1.25-3.14,1.39-4.23S6.68.57,9.05.55,11.73,3,11.86,4.16s.42,3.63,1.33,4.21a3.47,3.47,0,0,0,1.21.3c2.46.3,2.84,1.79,2.85,2.65S16.9,13.68,14.4,14a3.65,3.65,0,0,0-1.3.34C12,15.1,11.8,17.83,11.73,19c-.06.95-.22,3.46-2.68,3.47H9ZM8.91,11.34l.06.07.1-.1L9,11.22Z"></path><path data-name="BLACK STROKE" d="M9,20.31c-.43,0-.47-.43-.56-1.47C8.32,17.07,8,13.78,6,12.53a5.29,5.29,0,0,0-2-.6c-.56-.08-1-.15-1-.57s.43-.48,1-.56a5.25,5.25,0,0,0,2-.61c1.8-1.12,2.17-4,2.39-5.79.15-1.16.22-1.69.69-1.69H9c.48,0,.54.53.68,1.69.2,1.74.53,4.66,2.31,5.79a5,5,0,0,0,2.11.62c.51.06.95.12.95.53s-.44.48-1,.56a5.53,5.53,0,0,0-2.16.66c-2.06,1.31-2.26,4.56-2.37,6.31-.06,1-.09,1.44-.52,1.44H9Z"></path><path class="svg-yellow" d="M9,4.48v0c-.24,1.87-.63,5-2.71,6.28a4.62,4.62,0,0,1-1.59.59,5,5,0,0,1,1.59.58c1.84,1.12,2.43,3.51,2.69,5.4.2-1.87.75-4.2,2.56-5.36a4.75,4.75,0,0,1,1.63-.62,4.6,4.6,0,0,1-1.54-.59C9.61,9.46,9.25,6.34,9,4.48Z"></path></svg> <svg class="codsen-2" width="120" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 69.78 44.43" role="presentation"><path class="svg-outline" d="M67.28,14.69c-.21-5.92-2-9.68-7-9.15a4.46,4.46,0,0,0-5.3.59c-2.83-2.47-6.3-1.88-10.27,3a6.13,6.13,0,0,0-.81-.41c2.07-4-1.37-8.62-6.21-6.73C35.28,4.7,34,8,32.53,11.16a9.72,9.72,0,0,0-7.43,2.93c-3.11-1.91-6.64.31-8.54,3.13-1.59-4.36-5.49-6.63-10.8-2C1.92,21.93-.07,32.12,4.15,36A4.7,4.7,0,0,0,8.8,42.86c6.76-.59,12.62-4.75,18.87-7,9.22-3.88,18.95-7.74,28.58-9.46a8.25,8.25,0,0,0,2.84-.84,4.27,4.27,0,0,0,3.29,0,4.3,4.3,0,0,0,2.45-2.67,5,5,0,0,0,.24-1.35,3,3,0,0,0,.45-.2C66.45,20.92,69.2,18.77,67.28,14.69Z"></path><path class="svg-black-fill" d="M33.44,22.91c-2.78,3.82-4.59,3.71-5.46,3.24-1.3-.69-1.6-2.64-.91-5.35a5.12,5.12,0,0,0-2,2c-.46,3.34-4.18,7.94-7.13,7.86a2.93,2.93,0,0,1-2.7-2.13Q10.91,35,7.82,35a2.82,2.82,0,0,1-1.43-.39C3.16,32.75,3.8,23.82,7.65,16.93l.08-.15.13-.11c2.29-2,3.91-1.51,4.67-1,1.78,1.1,2.28,4,1.73,6.08a3,3,0,0,1-2.62,2.49h-.21l-.19-.07a2.25,2.25,0,0,1-1.28-3c-1,2.68-1.89,7.48-1.64,9.38a33.74,33.74,0,0,0,5-6.5c.54-.81,1.09-1.65,1.65-2.45A1.94,1.94,0,0,1,17,20.17a2.48,2.48,0,0,1,.67.12c1-2,2.95-4.39,4.93-4.41a2.6,2.6,0,0,1,2.37,1.67c.38-.31.8-.67,1.2-1,1.58-1.41,3.35-3,5-2.69a2.85,2.85,0,0,1,2.63.33c.68-1.18,1.25-2.48,1.82-3.75A27.72,27.72,0,0,1,38.85,4.5l.22-.28.34-.08a1.94,1.94,0,0,1,2.19.72,3.34,3.34,0,0,1-.34,3.4c-.57,1.36-1.18,2.8-1.77,4.29.84-1.06,1.73-1.74,2.81-1.65s2.07,1,2.93,2.9a9,9,0,0,0,.53-1.23A6.67,6.67,0,0,1,47,10.18C48.86,8,50.76,6.93,52.22,7.34a2.24,2.24,0,0,1,1.6,1.93,4,4,0,0,1-.13,1.58c2.13-2.33,3.55-3.84,5-3.33a1.69,1.69,0,0,1,.93.91,3,3,0,0,1,2.78-.26c2.14,1,2.44,4.75,2.43,6.91a3.49,3.49,0,0,0,.26.74c.31.71,1,2.39-.68,3.29l-.23.12h-.25c-3,0-3.16-3.32-3.27-5.49,0-.32,0-.64,0-1a12,12,0,0,0-1.38,2A10.91,10.91,0,0,1,57,17.69a2.44,2.44,0,0,1-2.74.42,1.91,1.91,0,0,1-.93-1,8.34,8.34,0,0,1-5,2.21,3.89,3.89,0,0,1-2-.6,5.3,5.3,0,0,1-2.36,3.58,2.39,2.39,0,0,1-3.07-.7l-.22-.26,0-.34a2.54,2.54,0,0,1,1.27-2.4c.38-.28.75-.54,0-2.22l-.5.85c-2.23,3.88-4.11,6.83-6.27,6.65A2.12,2.12,0,0,1,34,23.44m21.15-7.06Z"></path><path class="svg-black-fill" d="M8.8,40.36H8.6l-.28,0a4.74,4.74,0,0,1-.84-.16,2,2,0,0,1-1.45-2,2,2,0,0,1,1.45-1.9,2,2,0,0,1,.92-.05,3.94,3.94,0,0,0,1.82-.12,21.46,21.46,0,0,0,3.3-1.23l3.71-1.62C20.09,32,23,30.72,26,29.48c4.44-1.9,9-3.69,13.64-5.31,2.31-.82,5.37-1.86,8.5-2.66,1.52-.38,3.06-.72,4.56-1.05l1-.21c.62-.14,1.25-.26,1.88-.38l.79-.15a2,2,0,0,1,2.24,3,2.05,2.05,0,0,1-1.28.92c-.5.12-1,.21-1.47.29a95.13,95.13,0,0,0-14.43,3.89c-4.87,1.72-9.81,3.64-14.68,5.73C24,34.7,21.27,35.9,18.63,37.06l-3.56,1.55A25,25,0,0,1,11.21,40,10.27,10.27,0,0,1,8.8,40.36Z"></path><path class="svg-black-fill" d="M60.73,23.38a1.84,1.84,0,0,1-.85-.21,2.08,2.08,0,0,1-1.05-2.23,1.94,1.94,0,0,1,1.93-1.48h0a1.79,1.79,0,0,1,1.82,1.86,3.05,3.05,0,0,1-.14.81,1.81,1.81,0,0,1-1,1.11A1.9,1.9,0,0,1,60.73,23.38Z"></path><path class="svg-blue" d="M58.88,10.14c4.14-3.6,4.92,1.73,4.9,4.93,0,1.05,1.47,2.44.11,3.16-3,0-1.84-5.15-2.63-7.2-2.44,1.15-3,4.26-5,5.91-.75.76-2.34.49-2.11-.84.18-.8.79-1.42,1-2.18-2.15,2.16-6.35,6.39-9.24,3.26l-.71.05c.5,1.92-1.84,5.88-3.69,3.69-.13-2.49,3.66-.57.4-6.59C40.36,16.27,35.8,27.15,33.53,21c-4.83,7.61-7.67,4.48-4.44-2.91-1.51,1.49-4.3,2.48-5,4.44-.5,4.35-7.8,11.56-8.38,3.36C4.93,43.72,2.5,28.18,8.52,17.42c5.33-4.67,6.34,5.68,3.09,5.79-2-.81.52-3.15-.34-4.65-2.36-2.12-5.55,14.28-3,13.34C11.51,29.26,13.58,25.34,16,22a1,1,0,0,1,2.05.13c.64-2.8,5.14-8.32,6.42-3,1.91-.91,4.88-5,6.85-4.2a2,2,0,0,1,2.72.87c2.21-3.31,3.26-7.6,5.64-10.64,1.79-.41,1.44,1.71.75,2.65a113.1,113.1,0,0,0-4.64,12.5c3-3,5.78-13.91,9.06-4.86,1.87-.58,1.69-3.23,3-4.57,5.16-6.26,8.2.16,0,5.27C51.26,18,58.71,3.62,58.88,10.14ZM17.83,25.87a4.1,4.1,0,0,0,.35,1.78c1.84-.82,3-2.81,3.65-4.63A4.11,4.11,0,0,1,20,22.76C19.36,23.82,19.5,26.07,17.83,25.87Zm12.06-3.49.06,0a26.75,26.75,0,0,0,3.18-4.25,12.65,12.65,0,0,0-1-1.41C30.88,18.38,30.46,20.44,29.89,22.38Zm-7.55-3.3-.1,0c-.43.47-1.53,1.23-.91,1.91A1.11,1.11,0,0,0,22.34,19.08Zm25.87-5.29c.7,0,2.93-2.23,2.7-3.6A7.13,7.13,0,0,0,48.21,13.79Z"></path><path class="svg-blue" d="M8.75,39.36a8.7,8.7,0,0,1-1-.17,1,1,0,0,1-.72-1,1,1,0,0,1,.73-1,.89.89,0,0,1,.43,0,5,5,0,0,0,2.27-.13,23,23,0,0,0,3.45-1.28c4.15-1.8,8.28-3.63,12.44-5.4q6.7-2.87,13.58-5.29c2.77-1,5.57-1.9,8.42-2.63,1.82-.46,3.67-.85,5.5-1.26.88-.19,1.77-.35,2.66-.52a1,1,0,0,1,1.29.73A1,1,0,0,1,57,22.66c-.49.12-1,.21-1.46.3A93.73,93.73,0,0,0,41,26.88c-5,1.75-9.89,3.68-14.74,5.75C22.41,34.29,18.55,36,14.67,37.7A25.74,25.74,0,0,1,11,39.06,9.2,9.2,0,0,1,8.75,39.36Z"></path><path class="svg-blue" d="M60.77,20.26a1,1,0,0,1,1,1,2,2,0,0,1-.1.59,1,1,0,0,1-1.43.58,1.3,1.3,0,0,1-.64-1.34A1.16,1.16,0,0,1,60.77,20.26Z"></path></svg></div><h2 id="string-libraries"><a class="header-anchor" data-testid="string-libraries-anchor" href="#string-libraries">String Processing Libraries</a> <sup title="24 String Processing Libraries in total">Σ=<!-- -->24</sup></h2><div class="content-row__container" data-testid="package-group-arrayiffy-if-string-24"><div class="content-row__description drop-cap drop-cap-small" data-testid="package-group-arrayiffy-if-string-24-description"><p>They process string inputs, which might be text, code or something else as long as it is of a string-type.</p></div><div class="content-row__packages" data-testid="package-group-arrayiffy-if-string-24-items"><div class="content-row__package" data-testid="package-arrayiffy-if-string-item"><div class="content-row__package-main" data-testid="package-arrayiffy-if-string-content"><a data-testid="package-arrayiffy-if-string-readme-link" href="/os/arrayiffy-if-string" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <span class="content-row__name">arrayiffy-if-string</span> <sup>
35.2.3</sup><div class="content-row__package__description" data-testid="package-arrayiffy-if-string-description">Put non-empty strings into arrays, turn empty-ones into empty arrays. Bypass everything else.</div></a></div></div><div class="content-row__package" data-testid="package-edit-package-json-item"><div class="content-row__package-main" data-testid="package-edit-package-json-content"><a data-testid="package-edit-package-json-readme-link" href="/os/edit-package-json" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <span class="content-row__name">edit-package-json</span> <sup>0.10.7</sup><div class="content-row__package__description" data-testid="package-edit-package-json-description">Edit package.json without parsing, as string, to keep the formatting intact</div></a></div></div><div class="content-row__package" data-testid="package-email-all-chars-within-ascii-item"><div class="content-row__package-main" data-testid="package-email-all-chars-within-ascii-content"><a data-testid="package-email-all-chars-within-ascii-readme-link" href="/os/email-all-chars-within-ascii" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <span class="content-row__name">email-all-chars-within-ascii</span> <sup>5.2.5</sup><div class="content-row__package__description" data-testid="package-email-all-chars-within-ascii-description">Scans all characters within a string and checks are they within ASCII range</div></a></div></div><div class="content-row__package" data-testid="package-js-row-num-item"><div class="content-row__package-main" data-testid="package-js-row-num-content"><a data-testid="package-js-row-num-readme-link" href="/os/js-row-num" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <span class="content-row__name">js-row-num</span> <sup>7.2.5</sup><div class="content-row__package__description" data-testid="package-js-row-num-description">Update all row numbers in all console.logs in JS code</div></a></div></div><div class="content-row__package" data-testid="package-str-indexes-of-plus-item"><div class="content-row__package-main" data-testid="package-str-indexes-of-plus-content"><a data-testid="package-str-indexes-of-plus-readme-link" href="/os/str-indexes-of-plus" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <span class="content-row__name">str-indexes-of-plus</span> <sup>5.2.2</sup><div class="content-row__package__description" data-testid="package-str-indexes-of-plus-description">Like indexOf but returns array and counts per-grapheme</div></a></div></div><div class="content-row__package" data-testid="package-string-apostrophes-item"><div class="content-row__package-main" data-testid="package-string-apostrophes-content"><a data-testid="package-string-apostrophes-readme-link" href="/os/string-apostrophes" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <span class="content-row__name">string-apostrophes</span> <sup>4.2.6</sup><div class="content-row__package__description" data-testid="package-string-apostrophes-description">Comprehensive, HTML-entities-aware tool to typographically-correct the apostrophes and single/double quotes</div></a></div></div><div class="content-row__package" data-testid="package-string-character-is-astral-surrogate-item"><div class="content-row__package-main" data-testid="package-string-character-is-astral-surrogate-content"><a data-testid="package-string-character-is-astral-surrogate-readme-link" href="/os/string-character-is-astral-surrogate" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <span class="content-row__name">string-character-is-astral-surrogate</span> <sup>3.2.2</sup><div class="content-row__package__description" data-testid="package-string-character-is-astral-surrogate-description">Tells, is given character a part of astral character, specifically, a high and low surrogate</div></a></div></div><div class="content-row__package" data-testid="package-string-collapse-leading-whitespace-item"><div class="content-row__package-main" data-testid="package-string-collapse-leading-whitespace-content"><a data-testid="package-string-collapse-leading-whitespace-readme-link" href="/os/string-collapse-leading-whitespace" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <span class="content-row__name">string-collapse-leading-whitespace</span> <sup>7.3.1</sup><div class="content-row__package__description" data-testid="package-string-collapse-leading-whitespace-description">Collapse the leading and trailing whitespace of a string</div></a></div></div><div class="content-row__package" data-testid="package-string-collapse-white-space-item"><div class="content-row__package-main" data-testid="package-string-collapse-white-space-content"><a data-testid="package-string-collapse-white-space-readme-link" href="/os/string-collapse-white-space" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <span class="content-row__name">string-collapse-white-space</span> <sup>11.2.6</sup><div class="content-row__package__description" data-testid="package-string-collapse-white-space-description">
3Replace chunks of whitespace with a single spaces</div></a></div></div><div class="content-row__package" data-testid="package-string-dashes-item"><div class="content-row__package-main" data-testid="package-string-dashes-content"><a data-testid="package-string-dashes-readme-link" href="/os/string-dashes" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <span class="content-row__name">string-dashes</span> <sup>1.4.6</sup><div class="content-row__package__description" data-testid="package-string-dashes-description">Comprehensive, HTML-entities-aware tool to typographically-correct the dashes and hyphens</div></a></div></div><div class="content-row__package" data-testid="package-string-extract-class-names-item"><div class="content-row__package-main" data-testid="package-string-extract-class-names-content"><a data-testid="package-string-extract-class-names-readme-link" href="/os/string-extract-class-names" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <span class="content-row__name">string-extract-class-names</span> <sup>8.4.0</sup><div class="content-row__package__description" data-testid="package-string-extract-class-names-description">Extracts class and ID names from isolated CSS selector fragments</div></a></div></div><div class="content-row__package" data-testid="package-string-find-heads-tails-item"><div class="content-row__package-main" data-testid="package-string-find-heads-tails-content"><a data-testid="package-string-find-heads-tails-readme-link" href="/os/string-find-heads-tails" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <span class="content-row__name">string-find-heads-tails</span> <sup>6.2.5</sup><div class="content-row__package__description" data-testid="package-string-find-heads-tails-description">Finds where are arbitrary templating marker heads and tails located</div></a></div></div><div class="content-row__package" data-testid="package-string-find-malformed-item"><div class="content-row__package-main" data-testid="package-string-find-malformed-content"><a data-testid="package-string-find-malformed-readme-link" href="/os/string-find-malformed" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <span class="content-row__name">string-find-malformed</span> <sup>4.2.5</sup><div class="content-row__package__description" data-testid="package-string-find-malformed-description">Search for a malformed string. Think of Levenshtein distance but in search.</div></a></div></div><div class="content-row__package" data-testid="package-string-fix-broken-named-entities-item"><div class="content-row__package-main" data-testid="package-string-fix-broken-named-entities-content"><a data-testid="package-string-fix-broken-named-entities-readme-link" href="/os/string-fix-broken-named-entities" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <span class="content-row__name">string-fix-broken-named-entities</span> <sup>7.2.5</sup><div class="content-row__package__description" data-testid="package-string-fix-broken-named-entities-description">Finds and fixes common and not so common broken named HTML entities, returns ranges array of fixes</div></a></div></div><div class="content-row__package" data-testid="package-string-left-right-item"><div class="content-row__package-main" data-testid="package-string-left-right-content"><a data-testid="package-string-left-right-readme-link" href="/os/string-left-right" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <span class="content-row__name">string-left-right</span> <sup>6.2.4</sup><div class="content-row__package__description" data-testid="package-string-left-right-description">Looks up the first non-whitespace character to the left/right of a given index</div></a></div></div><div class="content-row__package" data-testid="package-string-match-left-right-item"><div class="content-row__package-main" data-testid="package-string-match-left-right-content"><a data-testid="package-string-match-left-right-readme-link" href="/os/string-match-left-right" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <span class="content-row__name">string-match-left-right</span> <sup>9.2.5</sup><div class="content-row__package__description" data-testid="package-string-match-left-right-description">Match substrings on the left or right of a given index, ignoring whitespace</div></a></div></div><div class="content-row__package" data-testid="package-string-process-comma-separated-item"><div class="content-row__package-main" data-testid="package-string-process-comma-separated-content"><a data-testid="package-string-process-comma-separated-readme-link" href="/os/string-process-comma-separated" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <span class="content-row__name">string-process-comma-separated</span> <sup>4.3.4</sup><div class="content-row__package__description" data-testid="package-string-process-comma-separated-description">Extracts chunks from possibly comma or whatever-separated string</div></a></div></div><div class="content-row__package" data-testid="package-string-remove-duplicate-heads-tails-item"><div class="content-row__package-main" data-testid="package-string-remove-duplicate-heads-tails-content"><a data-testid="package-string-remove-duplicate-heads-tails-readme-link" href="/os/string-remove-duplicate-heads-tails" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <span class="content-row__name">string-remove-duplicate-heads-tails</span> <sup>7.2.5</sup><div class="content-row__package__description" data-testid="package-string-remove-duplicate-heads-tails-description">Detect and (recursively) remove head and tail wrappings around the input string</div></a></div></div><div class="content-row__package" data-testid="package-string-remove-thousand-separators-item"><div class="content-row__package-main" data-testid="package-string-remove-thousand-separators-content"><a data-testid="package-string-remove-thousand-separators-readme-link" href="/os/string-remove-thousand-separators" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <span class="content-row__name">string-remove-thousand-separators</span> <sup>7.2.5</sup><div class="content-row__package__description" data-testid="package-string-remove-thousand-separators-description">Detects and removes thousand separators (dot/comma/quote/space) from string-type digits</div></a></div></div><div class="content-row__package" data-testid="package-string-remove-widows-item"><div class="content-row__package-main" data-testid="package-string-remove-widows-content"><a data-testid="package-string-remove-widows-readme-link" href="/os/string-remove-widows" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <span class="content-row__name">string-remove-widows</span> <sup>4.2.7</sup><div class="content-row__package__description" data-testid="package-string-remove-widows-description">Helps to prevent widow words in a text</div></a></div></div><div class="content-row__package" data-testid="package-string-trim-spaces-only-item"><div class="content-row__package-main" data-testid="package-string-trim-spaces-only-content"><a data-testid="package-string-trim-spaces-only-readme-link" href="/os/string-trim-spaces-only" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <span class="content-row__name">string-trim-spaces-only</span> <sup>5.3.1</sup><div class="content-row__package__description" data-testid="package-string-trim-spaces-only-description">Like String.trim() but you can choose granularly what to trim</div></a></div></div><div class="content-row__package" data-testid="package-string-typo-match-item"><div class="content-row__package-main" data-testid="package-string-typo-match-content"><a data-testid="package-string-typo-match-readme-link" href="/os/string-typo-match" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <span class="content-row__name">string-typo-match</span> <sup>1.1.0</sup><div class="content-row__package__description" data-testid="package-string-typo-match-description">Match typing errors against candidate strings with weighted omissions, swaps, and explainable ambiguity</div></a></div></div><div class="content-row__package" data-testid="package-string-uglify-item"><div class="content-row__package-main" data-testid="package-string-uglify-content"><a data-testid="package-string-uglify-readme-link" href="/os/string-uglify" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <span class="content-row__name">string-uglify</span> <sup>3.2.2</sup><div class="content-row__package__description" data-testid="package-string-uglify-description">Shorten sets of strings deterministically</div></a></div></div><div class="content-row__package" data-testid="package-string-unfancy-item"><div class="content-row__package-main" data-testid="package-string-unfancy-content"><a data-testid="package-string-unfancy-readme-link" href="/os/string-unfancy" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <span class="content-row__name">string-unfancy</span> <sup>6.3.0</sup><div class="content-row__package__description" data-testid="package-string-unfancy-description">Replace all n/m dashes, curly quotes with their simpler equivalents</div></a></div></div></div></div><div class="back-to-top" data-testid="string-libraries-back-to-top-container"><a data-testid="string-libraries-back-to-top-link" href="#page-top">â back to top</a></div><div class="separator" role="presentation" data-testid="os-separator-d"><svg class="codsen-5" width="186" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 186 28" role="presentation"><path class="svg-outline" d="M185.04 26.52h-14.85V15.84h-7.71v10.68l-44.18-.03c-.24.02-.48.03-.73.03l-28.63-.03c-.25.02-.5.03-.76.03l-28.6-.03c-.25.02-.5.03-.76.03H38.98c-.24 0-.49 0-.73-.03v.03H9.62c-1.07 0-2.13-.19-3.15-.57-1.07-.4-2.05-1-2.89-1.79-.85-.79-1.53-1.77-2.02-2.89a9.09 9.09 0 0 1-.71-3.59V10c0-1.28.24-2.49.71-3.59a8.605 8.605 0 0 1 2.02-2.9c.84-.79 1.81-1.39 2.88-1.79
31.01-.38 2.07-.57 3.15-.57l28.63.03c.24-.02.48-.03.73-.03h19.84c.25 0 .51.01.76.03v-.03h28.6c1.11 0 2.2.21 3.25.63.52.21 1.01.46 1.47.75.49-.32 1.01-.58 1.56-.79 1.01-.39 2.09-.59 3.21-.59h78.59c1.07 0 2.13.19 3.14.57 1.08.4 2.04 1 2.88 1.78.84.79 1.51 1.73 2 2.8.52 1.15.77 2.39.77 3.7v16.52ZM118.26 14.9Z"></path><path d="M97.67 5.13c-.62 0-1.21.11-1.77.32-.57.22-1.08.55-1.53.97-.44.42-.79.94-1.05 1.54-.24.55-.35 1.17-.37 1.84-.02-.66-.15-1.28-.4-1.83-.27-.59-.63-1.11-1.08-1.53-.44-.41-.95-.74-1.52-.96a4.72 4.72 0 0 0-1.77-.34h-24.6v4.51c-.04-.59-.15-1.16-.38-1.67-.27-.59-.63-1.11-1.08-1.53-.44-.41-.95-.74-1.52-.96a4.72 4.72 0 0 0-1.77-.34H38.99c-.59 0-1.18.11-1.74.32-.58.22-1.1.54-1.55.96-.46.43-.82.95-1.08 1.56-.21.49-.31 1.05-.35 1.63V5.13H9.62c-.59 0-1.18.11-1.74.32-.58.22-1.1.54-1.55.96-.46.43-.82.95-1.08 1.56-.26.6-.39 1.28-.39 2.01v7.68c0 .73.13 1.41.39 2.01.26.61.62 1.13 1.08 1.56.45.42.97.75 1.55.96.56.21 1.15.32 1.74.32h24.63v-4.47c.04.58.14 1.14.35 1.63.26.61.62 1.13 1.08 1.56.45.42.97.75 1.55.96.56.21 1.15.32 1.74.32h19.84c.59 0 1.18-.11 1.74-.32.58-.22 1.1-.54 1.55-.96.45-.42.81-.93 1.08-1.53.23-.51.34-1.08.38-1.69v4.5h24.6c.59 0 1.18-.11 1.74-.32.58-.22 1.1-.54 1.55-.96.45-.42.81-.93 1.08-1.53.23-.51.34-1.08.38-1.69v4.5h24.63c.61 0 1.21-.11 1.77-.32.59-.22 1.11-.55 1.55-.98.44-.42.79-.94 1.05-1.54.21-.5.32-1.05.35-1.64v4.48h36.18V11.84h15.71v10.68H181V9.99c0-.75-.14-1.43-.42-2.04-.27-.59-.63-1.11-1.08-1.53a4.69 4.69 0 0 0-1.55-.96c-.56-.21-1.15-.32-1.74-.32H97.67Zm-85.98 6.71h22.53v3.97H11.69v-3.97Zm29.36 3.97v-3.97h15.71v3.97H41.05Zm45.07 0H70.41v-3.97h15.71v3.97Zm6.85 0V12.7c.04.59.14 1.15.35 1.64.24.57.57 1.06.97 1.47h-1.33Zm28.97-2.47c-.24-.57-.58-1.08-.99-1.5h1.34v3.12c-.04-.58-.14-1.13-.35-1.62Z"></path><path class="svg-blue" d="M32.75 17.31v3.71H9.62c-.42 0-.82-.07-1.22-.22s-.75-.37-1.05-.65c-.31-.29-.55-.64-.73-1.05a3.56 3.56 0 0 1-.27-1.42V10c0-.53.09-1.01.27-1.42.18-.42.42-.77.73-1.05.31-.29.66-.5 1.05-.65s.8-.22 1.22-.22h23.13v3.71H10.87c-.26 0-.44.08-.53.25-.1.17-.15.39-.15.67v5.13c0 .28.06.5.18.67.12.17.27.25.44.25h21.94ZM58.82 6.63c.41 0 .82.08 1.22.24.39.16.75.38 1.05.67.31.29.55.64.74 1.05.19.42.28.88.28 1.39v7.68c0 .53-.09 1.01-.28 1.42-.19.42-.44.77-.74 1.05-.31.29-.66.5-1.05.65-.4.15-.8.22-1.22.22H38.98c-.42 0-.82-.07-1.22-.22s-.75-.37-1.05-.65c-.31-.29-.55-.64-.73-1.05a3.56 3.56 0 0 1-.27-1.42V9.98c0-.53.09-1.01.27-1.42.18-.42.42-.77.73-1.05.31-.29.66-.5 1.05-.65s.8-.22 1.22-.22h19.84Zm-1.27 10.68c.2 0 .37-.08.5-.25.14-.17.21-.39.21-.67v-5.13c0-.28-.05-.5-.16-.67-.11-.17-.28-.25-.52-.25H40.23c-.26 0-.44.08-.53.25-.1.17-.15.39-.15.67v5.13c0 .28.06.5.18.67.12.17.27.25.44.25h17.38ZM88.18 6.63c.42 0 .82.08 1.22.24.39.16.75.38 1.05.67.31.29.55.64.74 1.05.19.42.28.88.28 1.39v7.68c0 .53-.09 1.01-.28 1.42-.19.42-.44.77-.74 1.05-.31.29-.66.5-1.05.65-.4.15-.8.22-1.22.22h-23.1V6.63h23.1ZM68.9 10.34v6.97h18c.2 0 .37-.08.5-.25.14-.17.21-.39.21-.67v-5.13c0-.28-.05-.5-.16-.67-.11-.17-.28-.25-.52-.25H68.9ZM116.26 17.31c.2 0 .37-.05.5-.16.14-.11.21-.29.21-.55v-.27c0-.26-.05-.43-.16-.52-.11-.09-.28-.13-.52-.13H97.67c-.44 0-.85-.07-1.23-.22-.39-.15-.73-.37-1.02-.65-.3-.29-.53-.64-.71-1.05s-.27-.89-.27-1.42V10c0-.53.09-1.01.27-1.42s.42-.77.71-1.05c.3-.29.64-.5 1.02-.65.38-.15.79-.22 1.23-.22h23.16v3.71H98.95c-.22 0-.39.04-.5.13-.12.09-.18.26-.18.52v.27c0 .26.07.43.21.53.14.1.31.15.5.15h18.59c.43 0 .85.08 1.25.24s.74.39 1.04.68.53.65.71 1.07c.18.42.27.88.27 1.39v2.34c0 .53-.09 1.01-.27 1.42-.18.42-.42.77-.71 1.05-.3.29-.64.5-1.04.65-.4.15-.81.22-1.25.22H94.44v-3.71h21.83ZM127.62 15.68v1.63h22.57v3.71H123.8V6.63h26.39v3.71h-22.57v1.6h22.57v3.74h-22.57ZM156.98 10.34v10.68h-3.83V6.63h23.1c.42 0 .82.07 1.22.22.39.15.75.37 1.05.65.31.29.55.64.74 1.05.19.42.28.89.28 1.42V21h-3.85v-9.74c0-.28-.07-.5-.21-.67a.629.629 0 0 0-.5-.25h-18Z"></path></svg></div><h2 id="object-libraries"><a class="header-anchor" data-testid="object-libraries-anchor" href="#object-libraries">Plain Object or Array Libraries</a> <sup title="14 Plain Object or Array Libraries in total">Σ=<!-- -->14</sup></h2><div class="content-row__container" data-testid="package-group-array-includes-with-glob-14"><div class="content-row__description drop-cap drop-cap-small" data-testid="package-group-array-includes-with-glob-14-description"><p>Usually, plain objects come from JSON files, and often they are deeply nested. The following libraries help us to traverse them, set and delete keys and compare objects.</p><p>Array-processing libraries deal with tasks like sorting, deletion or conversion to other structures.</p></div><div class="content-row__packages" data-testid="package-group-array-includes-with-glob-14-items"><div class="content-row__package" data-testid="package-array-includes-with-glob-item"><div class="content-row__package-main" data-testid="package-array-includes-with-glob-content"><a data-testid="package-array-includes-with-glob-readme-link" href="/os/array-includes-with-glob" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <span class="content-row__name">array-includes-with-glob</span> <sup>5.2.4</sup><div class="content-row__package__description" data-testid="package-array-includes-with-glob-description">Check strings against whole-string wildcard patterns</div></a></div></div><div class="content-row__package" data-testid="package-array-pull-all-with-glob-item"><div class="content-row__package-main" data-testid="package-array-pull-all-with-glob-content"><a data-testid="package-array-pull-all-with-glob-readme-link" href="/os/array-pull-all-with-glob" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <span class="content-row__name">array-pull-all-with-glob</span> <sup>7.2.4</sup><div class="content-row__package__description" data-testid="package-array-pull-all-with-glob-description">Remove array entries using whole-string wildcard patterns</div></a></div></div><div class="content-row__package" data-testid="package-json-comb-core-item"><div class="content-row__package-main" data-testid="package-json-comb-core-content"><a data-testid="package-json-comb-core-readme-link" href="/os/json-comb-core" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <span class="content-row__name">json-comb-core</span> <sup>8.2.6</sup><div class="content-row__package__description" data-testid="package-json-comb-core-description">The inner core of json-comb</div></a></div></div><div class="content-row__package" data-testid="package-json-variables-item"><div class="content-row__package-main" data-testid="package-json-variables-content"><a data-testid="package-json-variables-readme-link" href="/os/json-variables" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <span class="content-row__name">json-variables</span> <sup>12.2.6</sup><div class="content-row__package__description" data-testid="package-json-variables-description">Resolves custom-marked, cross-referenced paths in parsed JSON</div></a></div></div><div class="content-row__package" data-testid="package-object-all-values-equal-to-item"><div class="content-row__package-main" data-testid="package-object-all-values-equal-to-content"><a data-testid="package-object-all-values-equal-to-readme-link" href="/os/object-all-values-equal-to" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <span class="content-row__name">object-all-values-equal-to</span> <sup>4.2.4</sup><div class="content-row__package__description" data-testid="package-object-all-values-equal-to-description">Does the AST/nested-plain-object/array/whatever contain only one kind of value?</div></a></div></div><div class="content-row__package" data-testid="package-object-boolean-combinations-item"><div class="content-row__package-main" data-testid="package-object-boolean-combinations-content"><a data-testid="package-object-boolean-combinations-readme-link" href="/os/object-boolean-combinations" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <span class="content-row__name">object-boolean-combinations</span> <sup>6.3.4</sup><div class="content-row__package__description" data-testid="package-object-boolean-combinations-description">Consumes a defaults object with booleans, generates all possible variations of it</div></a></div></div><div class="content-row__package" data-testid="package-object-delete-key-item"><div class="content-row__package-main" data-testid="package-object-delete-key-content"><a data-testid="package-object-delete-key-readme-link" href="/os/object-delete-key" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <span class="content-row__name">object-delete-key</span> <sup>4.2.6</sup><div class="content-row__package__description" data-testid="package-object-delete-key-description">Delete keys from all arrays or plain objects, nested within anything, by key or by value or by both, and clean up afterwards. Accepts wildcards.</div></a></div></div><div class="content-row__package" data-testid="package-object-fill-missing-keys-item"><div class="content-row__package-main" data-testid="package-object-fill-missing-keys-content"><a data-testid="package-object-fill-missing-keys-readme-link" href="/os/object-fill-missing-keys" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <span class="content-row__name">object-fill-missing-keys</span> <sup>11.2.5</sup><div class="content-row__package__description" data-testid="package-object-fill-missing-keys-description">Add missing keys into plain objects, according to a reference object</div></a></div></div><div class="content-row__package" data-testid="package-object-flatten-all-arrays-item"><div class="content-row__package-main" data-testid="package-object-flatten-all-arrays-content"><a data-testid="package-object-flatten-all-arrays-readme-link" href="/os/object-flatten-all-arrays" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <span class="content-row__name">object-flatten-all-arrays</span> <sup>7.2.4</sup><div class="content-row__package__description" data-testid="package-object-flatten-all-arrays-description">Merge and flatten any arrays found in all values within plain objects</div></a></div></div><div class="content-row__package" data-testid="package-object-flatten-referencing-item"><div class="content-row__package-main" data-testid="package-object-flatten-referencing-content"><a data-testid="package-object-flatten-referencing-readme-link" href="/os/object-flatten-referencing" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <span class="content-row__name">object-flatten-referencing</span> <sup>7.2.5</sup><div class="content-row__package__description" data-testid="package-object-flatten-referencing-description">Flatten complex nested objects according to a reference objects</div></a></div></div><div class="content-row__package" data-testid="package-object-merge-advanced-item"><div class="content-row__package-main" data-testid="package-object-merge-advanced-content"><a data-testid="package-object-merge-advanced-readme-link" href="/os/object-merge-advanced" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <span class="content-row__name">object-merge-advanced</span> <sup>14.2.4</sup><div class="content-row__package__description" data-testid="package-object-merge-advanced-description">Deeply merge JSON-like data structures</div></a></div></div><div class="content-row__package" data-testid="package-object-no-new-keys-item"><div class="content-row__package-main" data-testid="package-object-no-new-keys-content"><a data-testid="package-object-no-new-keys-readme-link" href="/os/object-no-new-keys" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <span class="content-row__name">object-no-new-keys</span> <sup>5.3.4</sup><div class="content-row__package__description" data-testid="package-object-no-new-keys-description">Check, does a plain object (AST/JSON) has any unique keys, not present in a reference object (another AST/JSON)</div></a></div></div><div class="content-row__package" data-testid="package-object-set-all-values-to-item"><div class="content-row__package-main" data-testid="package-object-set-all-values-to-content"><a data-testid="package-object-set-all-values-to-readme-link" href="/os/object-set-all-values-to" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <span class="content-row__name">object-set-all-values-to</span> <sup>6.2.5</sup><div class="content-row__package__description" data-testid="package-object-set-all-values-to-description">Recursively walk the input and set all found values in plain objects to something</div></a></div></div><div class="content-row__package" data-testid="package-test-mixer-item"><div class="content-row__package-main" data-testid="package-test-mixer-content"><a data-testid="package-test-mixer-readme-link" href="/os/test-mixer" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <span class="content-row__name">test-mixer</span> <sup>4.4.2</sup><div class="content-row__package__description" data-testid="package-test-mixer-description">Test helper to generate function opts object variations</div></a></div></div></div></div><div class="back-to-top" data-testid="object-libraries-back-to-top-container"><a data-testid="object-libraries-back-to-top-link" href="#page-top">â back to top</a></div><div class="separator" role="presentation" data-testid="os-separator-e"><svg class="codsen-3" width="128" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 66" role="presentation"><path class="svg-outline" d="M95.46 44.5c-2.78 1.12-6.13 1.27-8.85.08-1.76 5.86-12.62 6.94-13.21 4.47-2.73 2.88-6.95 4.06-10.61 2.91-3.83 3.72-9.94 4.73-14.27 1.68-4.68 6.53-9.4 7.02-14.58 5.67-13.75 13.62-32.06-.56-31.89-17.89-3.58-33.18 38.72-50.48 39.8-16 1.6.14 3.19.68 4.64 1.6.68-.92 1.43-1.76 2.24-2.49-3.76-7.73 2.8-17.78 11.49-15.71 5.34-10.9 22.62-7.84 19.82 5.21 1.5.17 2.89.62 4.12 1.3 3.22-3.81 8.48-5.91 13.26-4.53 2.48-3.02 5.83-3.09 9.09-2.77 8.12-6.99 19.66 1.3 15.66 11.51 10.46 8.09-3 24.51-13.24 18.66-1.79 4.64-9.53 4.7
35-13.47 6.32Zm-73.39-4.86c.14 5.49 1.68 7.86 2.55 8.61.28-.35.6-.85.89-1.45-.22-2.01-.13-4.21.22-6.28-1.27-.09-2.51-.39-3.66-.88Z"></path><path class="svg-black-fill" d="M21.5 60.7c-24.71-2.29-16.57-48.2 2.47-49.76C35.13 8.36 41.29 21.98 36.21 30.6c4.03-2.26 8.96-1.53 11.19 3.45 1.32-4.11 3.86-7.14 7.01-8.44-6.92-5.33.77-17.88 7.62-11.21 5.58-15.73 21.44-6.92 10.57 6.11 3.54-3.59 9.94-3.48 12.3 1.02 2.32-5.84 9.97-9.97 14.73-4.87-.18-4.73 4.81-5.87 7.89-4 7.93-8.41 14.4.86 9.64 9.4 3.16.22 4.93 1.62 4.67 6.02-2.59 11.63-17.77 7.83-14.61-3.56-1.8 3.33-.5 12.16-3.24 13.36-2.82.74-4.15 1.95-6.29.45-3.34 3.35-8.74 4.47-11.98.76-2.96 5.14-8.91 8.85-13.29 4.68-2.01 4.04-7.03 6.28-10.54 3.13-3.82 6.08-11.84 6.21-14.38-1.03-3.06 10.15-8.86 12.2-14.59 8.21-3.56 5.26-7.03 6.38-11.4 6.61Zm-2.58-30.64c-2.02 5.87-.17 20.4 3.11 21.23 3.45 2.9 5.96.23 7.59-3.94-.68-3.92.22-8.98 2.17-12.22-4.93 3.15-11.69.87-12.88-5.06ZM39.07 48.9Zm-.35-6.66c-.63 2.57-.59 5.95.29 6.64.58-.28 1.92-2.23 2.62-5.19a7.32 7.32 0 0 1-2.91-1.45Zm19.76-9.79c-2.12-.31-4.52 10.58-2.6 11.72 1.96-.91 4.01-9.12 2.6-11.72Zm8.48 6.87Zm.72-14.17c-1.13 9.54-.74 12.77-.33 13.86 4.8-4.17.79-12.32 4.12-17.18-1.41 1.54-2.75 2.61-3.79 3.31Zm24.39 6.74c.48 3.27 2.61 1.45 4.51-1.45-1.29.82-2.8 1.31-4.51 1.45Zm-10.39-.15c.37.42.73.87 1.06 1.35.37-.71.32-1.24.29-1.96-.41.25-.86.46-1.36.61Zm-52.73-6.61c-1.19 1.06-1.99 2.88-1.71 4.17.76-.64 1.44-2.06 1.71-4.17Zm86.62 3.46Zm-20.48-6.37c-.55.39-1.5 1.56-2.42 3.84 1.56-.63 2.48-2.8 2.42-3.84Zm.38-.14Zm-69.86-2.35c1.01 0 1.83.26 2.48.64-.81-1.63-2.58-1.43-3.9-.46.48-.13.94-.18 1.42-.18Zm77.4-3.57Z"></path><path class="svg-blue" d="M96.12 20.17c3.18 1.94-1.68 9.89-6.05 7.95.47-3.22 2.97-8.84 6.05-7.95Zm-40.51 26c-4.8-.98-1.86-16.43 3.27-15.74 4.46 1.8 1.2 15.83-3.27 15.74ZM71.5 11.6c1.62.63-1.44 6.79-5.32 9.58 1.01-5.94 3.83-10.16 5.32-9.58ZM38.75 50.86c-3.85-.66-2.48-9.69-.61-12.99.5 1.97 2.79 4.31 5.83 4.04-.31 3.29-2.52 9.36-5.22 8.95Zm3.31-16.01c1.38.12 2.09 2.17 2.06 4.93-2.76.25-3.9-2.63-3.74-4.51.49-.26 1.11-.47 1.68-.42Zm74.42-10.66c.65 1.18-.09 5.96-2.08 5.73-.7-.11-.92-.98-.85-2.01.16-2.34 2.19-7.7 2.92-10.27.88-3.1.25-5.66-2.24-6.11-4.05-.45-6.07 3.16-8 7.06.36-1.99.4-3.4.23-4.02-.74-1.29-2.85-.59-4.03-.35-.48.14-.64 1.77-.64 1.77-.94 4.39-1.54 8.85-2.51 13.23-2.64 7.88-9.93 8.65-9.34.51 6.61 2.11 12.91-8.65 6.85-12.82-5.1-2.23-10.16 2.79-11.3 9.4-.71 4.38.17 7.68-3.17 11.15-.42-3.78-3.42-5.26-5.58-8.15-2.14-2.47-.49-6.54 2.64-5.71 2.65 1.64.32 4.55-1.62 4.12.78 4.7 6.95 1.21 6.14-2.56-1.49-10.56-15.73-3.27-11.35 5.35-.69 6.03-3.44 10.66-5.31 10.76-3.62.19-2.1-11.99-1.44-17.31 19.66-14.51-.36-26.69-3.91-1.18-4.5.09-3.64-6.03-1.01-6.41-.1-.28-.82-2.12-3.42-1.74-6.94 1.83-3.57 12.5 3.97 10.79a93.73 93.73 0 0 0-.38 2.65c-5.58-3.94-11.65 2.46-12.47 9.8-.57.62-1.23 1-2.12 1.41-1.54-16.21-17.89-5.02-14.78 8.19-4.21 12.14-15.87 8.44-15.6-9.72.35-13.35 5.06-19.71 9.43-20.56 7.63-1.2 6.47 14.64 1.18 14.26-2.67-.72-1.41-6.49 1.38-8.19.06-.09-.53-1.62-2.68-1.55-6.4.56-6.3 13 1.37 12.82 12.59-.22 12.58-24.32-2.41-21.64-18.23 1.64-24.54 47.25-.84 45.62 2.94-.54 6.69-2.39 9.08-8.21 5.27 8.84 13.17.49 13.73-8.81.9-.31 1.62-.75 2.16-1.17.04 10.93 9.69 12.05 13.14 2.75.8 1.91 2.33 3.72 4.91 3.24 4.75-.87 6.6-9.66 7.22-13.76 1.07 1.26 3.41 4.15 3.61 5.46.12 3.42-3.38 2.2-3.61.19-3.74 5.63 6.92 9.46 11.89-3.3 2.39 7.78 10.73 4.13 13.28-1.51-.31 4.8.09 3.91 4.37 2.62.4-.58.36-3.34.55-4.49.54-4.46 1.19-8.49 3.84-12.72.68-1.4 3.93-5.37 3.49-1.29-.37 1.59-2.72 6.6-2 11.71.99 6.56 9.98 4.4 10.68-1.38.42-3.23-1.68-4.14-3.36-3.63Z"></path></svg></div><h2 id="ast-libraries"><a class="header-anchor" data-testid="ast-libraries-anchor" href="#ast-libraries">AST Libraries</a> <sup title="7 AST Libraries in total">Σ=<!-- -->7</sup></h2><div class="content-row__container" data-testid="package-group-ast-compare-7"><div class="content-row__description drop-cap drop-cap-small" data-testid="package-group-ast-compare-7-description"><p>AST stands for Abstract Syntax Tree, itâs a fancy name for nested output of a parser. Typically, itâs an array or a plain object with many layers of nested elements.</p></div><div class="content-row__packages" data-testid="package-group-ast-compare-7-items"><div class="content-row__package" data-testid="package-ast-compare-item"><div class="content-row__package-main" data-testid="package-ast-compare-content"><a data-testid="package-ast-compare-readme-link" href="/os/ast-compare" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <span class="content-row__name">ast-compare</span> <sup>4.2.6</sup><div class="content-row__package__description" data-testid="package-ast-compare-description">Compare anything: AST, objects, arrays, strings and nested thereof</div></a></div></div><div class="content-row__package" data-testid="package-ast-contains-only-empty-space-item"><div class="content-row__package-main" data-testid="package-ast-contains-only-empty-space-content"><a data-testid="package-ast-contains-only-empty-space-readme-link" href="/os/ast-contains-only-empty-space" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <span class="content-row__name">ast-contains-only-empty-space</span> <sup>4.2.2</sup><div class="content-row__package__description" data-testid="package-ast-contains-only-empty-space-description">Does AST contain only empty space?</div></a></div></div><div class="content-row__package" data-testid="package-ast-deep-contains-item"><div class="content-row__package-main" data-testid="package-ast-deep-contains-content"><a data-testid="package-ast-deep-contains-readme-link" href="/os/ast-deep-contains" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <span class="content-row__name">ast-deep-contains</span> <sup>5.2.5</sup><div class="content-row__package__description" data-testid="package-ast-deep-contains-description">Like t.same assert on array of objects, where element order doesnât matter.</div></a></div></div><div class="content-row__package" data-testid="package-ast-get-values-by-key-item"><div class="content-row__package-main" data-testid="package-ast-get-values-by-key-content"><a data-testid="package-ast-get-values-by-key-readme-link" href="/os/ast-get-values-by-key" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <span class="content-row__name">ast-get-values-by-key</span> <sup>5.2.6</sup><div class="content-row__package__description" data-testid="package-ast-get-values-by-key-description">Extract values and paths from AST by keys OR set them by keys</div></a></div></div><div class="content-row__package" data-testid="package-ast-is-empty-item"><div class="content-row__package-main" data-testid="package-ast-is-empty-content"><a data-testid="package-ast-is-empty-readme-link" href="/os/ast-is-empty" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <span class="content-row__name">ast-is-empty</span> <sup>4.2.4</sup><div class="content-row__package__description" data-testid="package-ast-is-empty-description">Find out, is nested array/object/string/AST tree is empty</div></a></div></div><div class="content-row__package" data-testid="package-ast-monkey-item"><div class="content-row__package-main" data-testid="package-ast-monkey-content"><a data-testid="package-ast-monkey-readme-link" href="/os/ast-monkey" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <span class="content-row__name">ast-monkey</span> <sup>10.0.0</sup><div class="content-row__package__description" data-testid="package-ast-monkey-description">Traverse and edit AST</div></a></div></div><div class="content-row__package" data-testid="package-ast-monkey-util-item"><div class="content-row__package-main" data-testid="package-ast-monkey-util-content"><a data-testid="package-ast-monkey-util-readme-link" href="/os/ast-monkey-util" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <span class="content-row__name">
3ast-monkey-util</span> <sup>3.3.1</sup><div class="content-row__package__description" data-testid="package-ast-monkey-util-description">Utility library of AST helper functions</div></a></div></div></div></div><div class="back-to-top" data-testid="ast-libraries-back-to-top-container"><a data-testid="ast-libraries-back-to-top-link" href="#page-top">â back to top</a></div><div class="separator" role="presentation" data-testid="os-separator-f"><svg class="codsen-1" width="150" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 81.74 24.2" role="presentation"><path data-name="GREY OUTLINE" class="svg-outline" d="M8.19,23.29C-9.15,22.1,9.11.39,18.56,9.75,21.47,8.36,26.48,6.67,30,9.28a10.91,10.91,0,0,1,5.9-.93c1.92-5.07,12.79-12.57,13.48-2a6.55,6.55,0,0,1,4.84,1.61c2.49-2.95,8.22-5.59,10.91-1,2.2-2.23,6.42-2.41,7.79.71C78,7,82.89,14.4,79.6,18.38c-2.18,2.3-6.46,1.56-7.43-1.62-2.36,1.1-5.22,2.76-7.75.82-2.79,1.15-5.67,2.33-8.88,1.22-3.29,2.12-7.72,2.43-11.28,2.44-2.78,2.05-5.84.4-8.18-2.22-2.78,1.17-6.14-.07-9,.92-6.38,2.12-8.94,1.66-9.78,1.34C16.5,22.06,11.08,23.47,8.19,23.29Z"></path><path data-name="BLACK STROKE 1" class="svg-black-fill" d="M8.6,21.36c-14.66-1,3.14-18.3,9.63-9.19,3.25-1.75,8.67-3.91,11.39-.43,2.15-1.29,5-2,7.28-1C38.33,8,40.9,4.13,44.05,3c3.64-.74,4.2,3.81,2,5.9,3-1,6.84-1.06,8,2.38l-.89.11c7.7,5.62-5.07,8.85-9.62,7.7-2,2.68-5.75-.42-6.75-2.73-2.68,1.45-7,4-9.69,1.31-2.9,1.44-6.94,2.48-10,1.31A17.44,17.44,0,0,1,8.6,21.36Zm6.15-9c-2.59-.05-5.14,2.31-6.57,4.3a29.85,29.85,0,0,0,6.09-1.34,12.22,12.22,0,0,1,2.95-2.55A19.57,19.57,0,0,0,14.75,12.38ZM41,13.5a1.49,1.49,0,0,0,.77,1.75,2.36,2.36,0,0,1,.26-.36v-.07l0,0a2.38,2.38,0,0,1,3.17-.25l.93-.07c-1.42-.25-3.1-1-3.18-2.63C42.42,12.41,41.77,12.93,41,13.5Z"></path><path data-name="BLACK STROKE 2" class="svg-black-fill" d="M76.36,17.79c-2,.05-2.34-2.07-3-3.47-2.74.13-6.31,4.2-8.46.84-4.75,3.23-14.27,2.83-9.86-4.91,1.42-4.18,10.59-5.39,8.22.48,2.39-1.35,7.59-6.63,8.07-.8a5.18,5.18,0,0,1,6.88,3.81C79.26,15.37,78.52,17.79,76.36,17.79Z"></path><path data-name="BLUE 1" class="svg-blue" d="M5.29,14.55c1.1-1.93,7.66-5.83,10.77-3-2.57-1.92-11.74,5.6-8.49,6.13a14,14,0,0,0,10.18-4c3-1.81,9.68-5.06,11.38-.37a8.23,8.23,0,0,1,8-1.48c2.26-2.54,3.67-6.46,7.16-7.8,2.23-.48,2.62,2.21,1.49,3.6-1.76,3.13-9.65,6.35-3.27,9.23a1.37,1.37,0,0,1,2.29-1.29,19.24,19.24,0,0,0,6.53-.93c-14.48-1.58-3.81-7.74,1.13-4.1-1.51-1-3.35,0-4.8.72,2.69-.19,9.05,1.66,6.15,5.18-3,1.29-7.95,3-10.88,1.07-.37,4-5.58-.28-5.55-2.61-2.62,1.39-7.85,5.19-9.91,1.41-2.93,1.82-7.13,3.07-10.42,1.59C13.47,20.82-.08,22.53,5.29,14.55Zm21-.87c-3.15-.34-6.24,1.46-8.59,3.4A14.15,14.15,0,0,0,26.28,13.68Zm10.1-1.4c-2.18-.18-4.26,1.26-5.7,2.79A20.67,20.67,0,0,0,36.38,12.28Z"></path><path data-name="BLUE 2" class="svg-blue" d="M77.73,15.62a1.37,1.37,0,0,1-2.61.32c-.5-.85-.51-2.61-1.77-2.62-2.39-.24-7.13,4.7-7.73.35-3.58,2.77-13.77,4.46-9.7-2.91,4.84-6.69,11.51-1.54,1.77,2.72,3.87,0,7.51-2.48,10.34-5,2.23-1.38,2.92,1.64,1.61,3.08C73.33,9.38,77.39,11.27,77.73,15.62ZM60.63,9.8a5,5,0,0,0-2.48,2.52A9.9,9.9,0,0,0,60.63,9.8Z"></path></svg></div><h2 id="lerna-libraries"><a class="header-anchor" data-testid="lerna-libraries-anchor" href="#lerna-libraries">Lerna Libraries</a> <sup title="3 Lerna Libraries in total">Σ=<!-- -->3</sup></h2><div class="content-row__container" data-testid="package-group-lerna-clean-changelogs-3"><div class="content-row__description drop-cap drop-cap-small" data-testid="package-group-lerna-clean-changelogs-3-description"><p>While maintaining our monorepo we found that some essential tools were missing, so we created them!</p></div><div class="content-row__packages" data-testid="package-group-lerna-clean-changelogs-3-items"><div class="content-row__package" data-testid="package-lerna-clean-changelogs-item"><div class="content-row__package-main" data-testid="package-lerna-clean-changelogs-content"><a data-testid="package-lerna-clean-changelogs-readme-link" href="/os/lerna-clean-changelogs" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <span class="content-row__name">lerna-clean-changelogs</span> <sup>5.2.5</sup><div class="content-row__package__description" data-testid="package-lerna-clean-changelogs-description">Removes frivolous entries from commitizen generated changelogs</div></a></div></div><div class="content-row__package" data-testid="package-lerna-clean-changelogs-cli-item"><div class="content-row__package-main" data-testid="package-lerna-clean-changelogs-cli-content"><a data-testid="package-lerna-clean-changelogs-cli-readme-link" href="/os/lerna-clean-changelogs-cli" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <span class="content-row__name">lerna-clean-changelogs-cli</span> <sup>4.2.6</sup><div class="content-row__package__description" data-testid="package-lerna-clean-changelogs-cli-description">CLI application to cleanse the lerna/commitizen-generated changelogs</div></a></div></div><div class="content-row__package" data-testid="package-update-versions-item"><div class="content-row__package-main" data-testid="package-update-versions-content"><a data-testid="package-update-versions-readme-link" href="/os/update-versions" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <span class="content-row__name">update-versions</span> <sup>7.2.7</sup><div class="content-row__package__description" data-testid="package-update-versions-description">Like npm-check-updates but supports Lerna monorepos and enforces strict semver values</div></a></div></div></div></div><div class="back-to-top" data-testid="lerna-libraries-back-to-top-container"><a data-testid="lerna-libraries-back-to-top-link" href="#page-top">â back to top</a></div><div class="separator" role="presentation" data-testid="os-separator-g"><svg class="codsen-star-small" height="43" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 18.09 23.02" role="presentation"><path data-name="GREY OUTLINE" class="svg-outline" d="M9,22.47c-2.4,0-2.63-2.5-2.71-3.43-.11-1.19-.36-4-1.49-4.67a3.65,3.65,0,0,0-1.17-.31C1.2,13.68.84,12.2.84,11.35S1.22,9,3.66,8.66a3.47,3.47,0,0,0,1.16-.3c.93-.58,1.25-3.14,1.39-4.23S6.68.57,9.05.55,11.73,3,11.86,4.16s.42,3.63,1.33,4.21a3.47,3.47,0,0,0,1.21.3c2.46.3,2.84,1.79,2.85,2.65S16.9,13.68,14.4,14a3.65,3.65,0,0,0-1.3.34C12,15.1,11.8,17.83,11.73,19c-.06.95-.22,3.46-2.68,3.47H9ZM8.91,11.34l.06.07.1-.1L9,11.22Z"></path><path data-name="BLACK STROKE" d="M9,20.31c-.43,0-.47-.43-.56-1.47C8.32,17.07,8,13.78,6,12.53a5.29,5.29,0,0,0-2-.6c-.56-.08-1-.15-1-.57s.43-.48,1-.56a5.25,5.25,0,0,0,2-.61c1.8-1.12,2.17-4,2.39-5.79.15-1.16.22-1.69.69-1.69H9c.48,0,.54.53.68,1.69.2,1.74.53,4.66,2.31,5.79a5,5,0,0,0,2.11.62c.51.06.95.12.95.53s-.44.48-1,.56a5.53,5.53,0,0,0-2.16.66c-2.06,1.31-2.26,4.56-2.37,6.31-.06,1-.09,1.44-.52,1.44H9Z"></path><path class="svg-yellow" d="M9,4.48v0c-.24,1.87-.63,5-2.71,6.28a4.62,4.62,0,0,1-1.59.59,5,5,0,0,1,1.59.58c1.84,1.12,2.43,3.51,2.69,5.4.2-1.87.75-4.2,2.56-5.36a4.75,4.75,0,0,1,1.63-.62,4.6,4.6,0,0,1-1.54-.59C9.61,9.46,9.25,6.34,9,4.48Z"></path></svg> <svg class="codsen-handshake" width="88" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 88.75 51.14" role="presentation"><path class="svg-outline" d="M47.71,51.57a8.75,8.75,0,0,1-3.29-.67,8.26,8.26,0,0,1-6.91-.25,8.13,8.13,0,0,1-5.81-.86,8.19,8.19,0,0,1-5.87-1.13,8,8,0,0,1-8.12-4.77C0,61.09-8,1.44,14,11,22.7,5.33,28.34.69,40.54,1.57c12.63-4.1,22.67,3.74,31.68,9.49C92.42-3.77,96.57,57.56,75,43.61a51.92,51.92,0,0,0-5.25,1.63c-1.61,3.06-4,5.53-9.75,4.5-2.15,1.5-4.45,2.42-8.4.87A8.63,8.63,0,0,1,47.71,51.57Z" transform="translate(-0.62 -0.43)"></path><path class="svg-yellow" d="M13.25,37.8s-5.39-6.08-2.71-18.88a41.26,41.26,0,0,0,13.3-7.55C30.13,6,43.58,7.57,43.58,7.57L68.44,29.91,64.6,41.16c.86,1.48-1.49,5.35-6.5,1.31,0,0-.12,0-.11.05.32,1.51-2.92,6.21-7.54-.23,1.18,2.36-3.56,6.15-6.38.66C41.41,37.79,13.25,37.8,13.25,37.8Z" transform="translate(-0.62 -0.43)"></path><path class="svg-black-fill" d="M47.67,46.46c-1.4,0-3-.82-4.21-3.19-1-1.92-9.83-4.78-30.1-4.78h-.42l-.21-.23C12.5,38,7.15,31.77,9.86,18.78l.09-.4.39-.12a40.66,40.66,0,0,0,13.05-7.41c6.44-5.55,19.71-4,20.27-4l.21,0,25.37,22.8-3.9,11.42a2.87,2.87,0,0,1-1,3c-.71.61-2.63,1.69-5.84-.49A4.13,4.13,0,0,1,56.4,46c-1,.44-2.93.69-5.3-1.82a3.72,3.72,0,0,1-1.78,1.88A3.59,3.59,0,0,1,47.67,46.46ZM13.58,37.12c4.15,0,28.41.3,31.1,5.52,1.08,2.11,2.59,2.93,4,2.2,1-.49,1.49-1.53,1.13-2.24L51,41.89c1.75,2.44,3.47,3.45,4.84,2.85a2.49,2.49,0,0,0,1.47-2.08l-.1-.48.44-.3a.77.77,0,0,1,.87.06c2,1.64,3.88,2.07,4.94,1.16A1.48,1.48,0,0,0,64,41.51l-.16-.27,3.8-11.12L43.28,8.23c-1.72-.17-13.43-1.13-19,3.66a41.82,41.82,0,0,1-13.15,7.56C9,30.17,12.7,35.93,13.58,37.12Z" transform="translate(-0.62 -0.43)"></path><rect class="svg-black-fill" x="47.7" y="32.82" width="1.38" height="9.93" transform="translate(-11.95 23.11) rotate(-24.57)"></rect><rect class="svg-black-fill" x="54.31" y="28.58" width="1.37" height="14.69" transform="translate(-10.65 26.13) rotate(-24.95)"></rect><path class="svg-yellow" d="M78.69,36.85C82.38,23,75.75,16.7,75.75,16.7s-2.94,2.72-8.66-1.9-10.85-7.42-19-8.56c-4-.55-8.59,1.9-10.93,3.36S27,16.49,36.34,16.06c4.22-.19,8.59-3.61,8.59-3.61S45.61,17,52.69,18c0,0-.38,3.81,5.58,7.1,0,0,6.08,14.62,6.33,15.94a.06.06,0,0,0,.09,0C65.39,40.75,69.89,38.54,78.69,36.85Z" transform="translate(-0.62 -0.43)"></path><path class="svg-black-fill" d="M64.71,41.88l-.38-.15a.77.77,0,0,1-.41-.52c-.17-.92-3.76-9.74-6.19-15.6C53,23,52.17,19.92,52,18.61c-5-.93-6.84-3.58-7.46-5-1.49,1-4.85,3-8.2,3.19-3.12.14-4.75-.35-5.12-1.54C30.66,13.33,34,10.8,36.81,9,39.28,7.47,44,5,48.19,5.56,56.81,6.77,62,9.78,67.52,14.26c5.13,4.15,7.67,2,7.77,1.93l.47-.42.46.43c.29.27,6.89,6.72,3.13,20.83l-.11.42-.42.08c-8.64,1.65-13,3.78-13.81,4.19ZM45.44,11.18l.17,1.17c0,.16.74,4,7.19,5l.65.1-.07.65c0,.13-.21,3.43,5.22,6.43l.21.11.1.22c.56,1.35,5,12.14,6.13,15.32a58.37,58.37,0,0,1,13.09-3.92C81,25.11,76.91,19.13,75.64,17.6c-1.2.66-4.25,1.55-9-2.27C61.3,11,56.31,8.08,48,6.92c-3.72-.52-8.15,1.82-10.46,3.26-3.32,2.07-5.17,4-5,4.63,0,0,.27.72,3.75.57,3.95-.18,8.16-3.44,8.2-3.47Z" transform="translate(-0.62 -0.43)"></path><path class="svg-green" d="M75.75,16.7c-.68-1.33,2-3.62,3.85-1.33,2.21,2.68,3.51,6.78,3.78,11.71a41.64,41.64,0,0,1-1,10.91c-.58,2.71-4.7,2.81-4-1.2,1-5.13,1.32-5.81,1-10.23A21.47,21.47,0,0,0,75.75,16.7Z" transform="translate(-0.62 -0.43)"></path><path class="svg-black-fill" d="M80.18,40.62a2.63,2.63,0,0,1-.49,0c-1.17-.24-2.37-1.4-1.9-3.91.15-.81.29-1.52.41-2.15a22.59,22.59,0,0,0,.58-7.9A21.07,21.07,0,0,0,75.2,17.1L75.14,17a2.29,2.29,0,0,1,1-2.82,2.87,2.87,0,0,1,3.94.74c2.29,2.77,3.65,7,3.94,12.11a42.09,42.09,0,0,1-1,11.1A3,3,0,0,1,80.18,40.62ZM76.35,16.35a21.88,21.88,0,0,1,3.8,10.16,23.74,23.74,0,0,1-.6,8.27c-.12.62-.26,1.32-.41,2.14-.24,1.27.08,2.15.82,2.3a1.61,1.61,0,0,0,1.78-1.37,41.69,41.69,0,0,0,1-10.74c-.28-4.85-1.53-8.76-3.63-11.31a1.51,1.51,0,0,0-2.13-.46C76.48,15.65,76.26,16.11,76.35,16.35Z" transform="translate(-0.62 -0.43)"></path><path class="svg-blue" d="M12.21,17.65c.42-1.41-2.62-3.31-4-.8C6.49,19.8,6,24,6.65,28.92a43.44,43.44,0,0,0,3,10.64c1.09,2.6,5.17,2.15,3.67-1.72-1.93-4.93-2.41-5.55-2.94-10A20.49,20.49,0,0,1,12.21,17.65Z" transform="translate(-0.62 -0.43)"></path><path class="svg-black-fill" d="M12,41.88a3.24,3.24,0,0,1-2.94-2.05A43.89,43.89,0,0,1,6,29c-.69-5.13-.14-9.45,1.6-12.5a2.78,2.78,0,0,1,3.67-1.32,2.36,2.36,0,0,1,1.63,2.65l0,.11A20.07,20.07,0,0,0,11.1,27.8a23.66,23.66,0,0,0,2.08,7.73L14,37.59c.91,2.35,0,3.68-1.07,4.11A2.37,2.37,0,0,1,12,41.88ZM10.07,16.31a1.49,1.49,0,0,0-1.31.88C7.18,20,6.68,24,7.34,28.82a42,42,0,0,0,3,10.48,1.76,1.76,0,0,0,2.09,1.13c.65-.27.76-1.14.3-2.34L11.9,36A24.52,24.52,0,0,1,9.74,28a21.09,21.09,0,0,1,1.82-10.55c0-.26-.31-.73-.86-1A1.63,1.63,0,0,0,10.07,16.31Z" transform="translate(-0.62 -0.43)"></path><path class="svg-yellow" d="M27.14,37.59c-.48-3.06,3.88-3.54,4.4-.25l.66,4.17c.52,3.28-3.88,3.56-4.36.49Z" transform="translate(-0.62 -0.43)"></path><path class="svg-black-fill" d="M30.2,44.83a3.05,3.05,0,0,1-3-2.72l-.7-4.41a2.81,2.81,0,0,1,.93-2.7,2.84,2.84,0,0,1,2.83-.41,3.24,3.24,0,0,1,2,2.65l.66,4.17a2.75,2.75,0,0,1-2.22,3.39A3.55,3.55,0,0,1,30.2,44.83Zm-2.38-7.34.7,4.4a1.69,1.69,0,0,0,1.92,1.55c.65-.1,1.27-.64,1.08-1.82l-.66-4.17a1.87,1.87,0,0,0-1.13-1.58,1.55,1.55,0,0,0-1.48.19A1.44,1.44,0,0,0,27.82,37.49Z" transform="translate(-0.62 -0.43)"></path><path class="svg-yellow" d="M32.68,38.52c-.49-3.06,3.87-3.54,4.39-.25l.66,4.17c.52,3.28-3.87,3.56-4.36.49Z" transform="translate(-0.62 -0.43)"></path><path class="svg-black-fill" d="M35.73,45.76a3,3,0,0,1-1.09-.2,3.11,3.11,0,0,1-2-2.52L32,38.63a2.7,2.7,0,0,1,2.22-3.27,3.12,3.12,0,0,1,3.53,2.81l.66,4.17a2.87,2.87,0,0,1-.93,2.82A2.75,2.75,0,0,1,35.73,45.76Zm-2.38-7.34.7,4.4a1.75,1.75,0,0,0,1.09,1.46,1.5,1.5,0,0,0,1.47-.19,1.54,1.54,0,0,0,.44-1.54l-.66-4.17a1.75,1.75,0,0,0-2-1.67,1.33,1.33,0,0,0-1.09,1.71Z" transform="translate(-0.62 -0.43)"></path><path class="svg-yellow" d="M38.26,39.53c-.47-2.92,3.89-3.4,4.39-.26l.63,4c.49,3.13-3.9,3.41-4.36.49Z" transform="translate(-0.62 -0.43)"></path><path class="svg-black-fill" d="M41.24,46.46a3,3,0,0,1-3-2.62l-.66-4.2a2.65,2.65,0,0,1,2.24-3.17,3.06,3.06,0,0,1,3.51,2.69l.63,4A2.76,2.76,0,0,1,43,45.85,2.86,2.86,0,0,1,41.24,46.46Zm-2.31-7,.67,4.21a1.64,1.64,0,0,0,2.58,1.15,1.44,1.44,0,0,0,.42-1.42l-.63-4A1.68,1.68,0,0,0,40,37.83a1.27,1.27,0,0,0-1.1,1.59Z" transform="translate(-0.62 -0.43)"></path><path class="svg-yellow" d="M22.94,37.49c0-2.45,4.08-2.44,4.08.19V41c0,2.62-4.08,2.45-4.08,0Z" transform="translate(-0.62 -0.43)"></path><path class="svg-black-fill" d="M25,43.6A2.64,2.64,0,0,1,22.25,41V37.49A2.51,2.51,0,0,1,24.92,35a2.87,2.87,0,0,1,1.88.66,2.58,2.58,0,0,1,.91,2V41a2.44,2.44,0,0,1-.87,2A2.77,2.77,0,0,1,25,43.6Zm-.11-7.24c-.13,0-1.29,0-1.29,1.13V41A1.28,1.28,0,0,0,25,42.22a1.48,1.48,0,0,0,.93-.3,1.13,1.13,0,0,0,.37-.91V37.68a1.22,1.22,0,0,0-.41-1A1.61,1.61,0,0,0,24.92,36.36Z" transform="translate(-0.62 -0.43)"></path></svg> <svg class="codsen-star-small" height="43" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 18.09 23.02" role="presentation"><path data-name="GREY OUTLINE" class="svg-outline" d="M9,22.47c-2.4,0-2.63-2.5-2.71-3.43-.11-1.19-.36-4-1.49-4.67a3.65,3.65,0,0,0-1.17-.31C1.2,13.68.84,12.2.84,11.35S1.22,9,3.66,8.66a3.47,3.47,0,0,0,1.16-.3c.93-.58,1.25-3.14,1.39-4.23S6.68.57,9.05.55,11.73,3,11.86,4.16s.42,3.63,1.33,4.21a3.47,3.47,0,0,0,1.21.3c2.46.3,2.84,1.79,2.85,2.65S16.9,13.68,14.4,14a3.65,3.65,0,0,0-1.3.34C12,15.1,11.8,17.83,11.73,19c-.06.95-.22,3.46-2.68,3.47H9ZM8.91,11.34l.06.07.1-.1L9,11.22Z"></path><path data-name="BLACK STROKE" d="M9,20.31c-.43,0-.47-.43-.56-1.47C8.32,17.07,8,13.78,6,12.53a5.29,5.29,0,0,0-2-.6c-.56-.08-1-.15-1-.57s.43-.48,1-.56a5.25,5.25,0,0,0,2-.61c1.8-1.12,2.17-4,2.39-5.79.15-1.16.22-1.69.69-1.69H9c.48,0,.54.53.68,1.69.2,1.74.53,4.66,2.31,5.79a5,5,0,0,0,2.11.62c.51.06.95.12.95.53s-.44.48-1,.56a5.53,5.53,0,0,0-2.16.66c-2.06,1.31-2.26,4.56-2.37,6.31-.06,1-.09,1.44-.52,1.44H9Z"></path><path class="svg-yellow" d="M9,4.48v0c-.24,1.87-.63,5-2.71,6.28a4.62,4.62,0,0,1-1.59.59,5,5,0,0,1,1.59.58c1.84,1.12,2.43,3.51,2.69,5.4.2-1.87.75-4.2,2.56-5.36a4.75,4.75,0,0,1,1.63-.62,4.6,4.6,0,0,1-1.54-.59C9.61,9.46,9.25,6.34,9,4.48Z"></path></svg> <svg class="codsen-star-large" height="60" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 22.89 30.89" role="presentation"><path data-name="GREY OUTLINE" class="svg-outline" d="M11.44,30.28c-2.46,0-2.68-2.48-2.81-4-.19-2.07-.58-6.38-2.72-7.69A6.38,6.38,0,0,0,3.77,18C3,17.92.61,17.55.62,15.21c0-1.54,1.06-2.48,3.13-2.79a5.48,5.48,0,0,0,2.13-.6c1.82-1.13,2.31-4.95,2.57-7C8.68,3,9,.61,11.44.61h0c2.49,0,2.77,2.45,3,4.24.24,2,.67,5.85,2.46,7a5.89,5.89,0,0,0,2.24.6c2.08.25,3.14,1.18,3.15,2.74,0,2.36-2.38,2.71-3.17,2.82a6.18,6.18,0,0,0-2.35.66c-2.14,1.36-2.4,5.6-2.53,7.64-.09,1.39-.25,4-2.76,4h0Z"></path><path data-name="BLACK STROKE" d="M11.44,28.28c-.63,0-.69-.63-.82-2.14C10.39,23.56,10,18.76,7,16.93a7.75,7.75,0,0,0-2.87-.87c-.82-.13-1.46-.22-1.46-.84s.63-.7,1.42-.82a7.36,7.36,0,0,0,2.9-.88c2.63-1.64,3.17-5.9,3.49-8.44.22-1.7.32-2.47,1-2.47h0c.7,0,.79.77,1,2.46.29,2.55.77,6.8,3.37,8.45a7.28,7.28,0,0,0,3.07.9c.74.09,1.39.17,1.39.78s-.63.7-1.45.82a7.92,7.92,0,0,0-3.15.95c-3,1.91-3.29,6.66-3.45,9.21-.09,1.48-.13,2.1-.77,2.1Z"></path><path class="svg-yellow" d="M11.43,5.19s0,0,0,0c-.34,2.73-.92,7.28-3.95,9.17a6.87,6.87,0,0,1-2.32.86,7.41,7.41,0,0,1,2.32.84C10
3.15,17.71,11,21.19,11.39,24c.3-2.72,1.09-6.13,3.73-7.82a7.15,7.15,0,0,1,2.38-.91,6.59,6.59,0,0,1-2.24-.85C12.27,12.46,11.74,7.91,11.43,5.19Z"></path></svg></div><h2 id="cli-libraries"><a class="header-anchor" data-testid="cli-libraries-anchor" href="#cli-libraries">CLI Apps</a> <sup title="6 CLI Apps in total">Σ=<!-- -->6</sup></h2><div class="content-row__container" data-testid="package-group-csv-sort-cli-6"><div class="content-row__description drop-cap drop-cap-small" data-testid="package-group-csv-sort-cli-6-description"><p>All the following libraries are command-line applications. You install them using <code>-g</code> flag via npm, for example,<!-- --> <code>npm i -g json-sort-cli</code>. Often a package/library/program would have its CLI counterpart: you can use a package programmatically, inside your programs, or you can use its CLI in the terminal, as a standalone program.</p><p>For example, <code>csv-sort</code> package is string-in, string-out function. Itâs meant to be used by websites, CLIs and Node programs.<code>csv-sort-cli</code> âtaps itâ and adds file I/O layer and lets you read/write/sort files directly, via a command line.</p></div><div class="content-row__packages" data-testid="package-group-csv-sort-cli-6-items"><div class="content-row__package" data-testid="package-csv-sort-cli-item"><div class="content-row__package-main" data-testid="package-csv-sort-cli-content"><a data-testid="package-csv-sort-cli-readme-link" href="/os/csv-sort-cli" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <span class="content-row__name">csv-sort-cli</span> <sup>4.2.6</sup><div class="content-row__package__description" data-testid="package-csv-sort-cli-description">Command line app to sort double-entry CSVs coming from internet banking statements</div></a></div></div><div class="content-row__package" data-testid="package-email-all-chars-within-ascii-cli-item"><div class="content-row__package-main" data-testid="package-email-all-chars-within-ascii-cli-content"><a data-testid="package-email-all-chars-within-ascii-cli-readme-link" href="/os/email-all-chars-within-ascii-cli" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <span class="content-row__name">email-all-chars-within-ascii-cli</span> <sup>4.2.6</sup><div class="content-row__package__description" data-testid="package-email-all-chars-within-ascii-cli-description">Command line app to scan email templates, are all their characters within ASCII range</div></a></div></div><div class="content-row__package" data-testid="package-generate-atomic-css-cli-item"><div class="content-row__package-main" data-testid="package-generate-atomic-css-cli-content"><a data-testid="package-generate-atomic-css-cli-readme-link" href="/os/generate-atomic-css-cli" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <span class="content-row__name">generate-atomic-css-cli</span> <sup>4.2.6</sup><div class="content-row__package__description" data-testid="package-generate-atomic-css-cli-description">Generates and updates all HTML templatesâ atomic CSS</div></a></div></div><div class="content-row__package" data-testid="package-js-row-num-cli-item"><div class="content-row__package-main" data-testid="package-js-row-num-cli-content"><a data-testid="package-js-row-num-cli-readme-link" href="/os/js-row-num-cli" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <span class="content-row__name">js-row-num-cli</span> <sup>4.2.6</sup><div class="content-row__package__description" data-testid="package-js-row-num-cli-description">Update all row numbers in all console.logs in given files</div></a></div></div><div class="content-row__package" data-testid="package-json-comb-item"><div class="content-row__package-main" data-testid="package-json-comb-content"><a data-testid="package-json-comb-readme-link" href="/os/json-comb" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <span class="content-row__name">json-comb</span> <sup>0.11.6</sup><div class="content-row__package__description" data-testid="package-json-comb-description">Command line app to manage sets of JSON files</div></a></div></div><div class="content-row__package" data-testid="package-json-sort-cli-item"><div class="content-row__package-main" data-testid="package-json-sort-cli-content"><a data-testid="package-json-sort-cli-readme-link" href="/os/json-sort-cli" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <span class="content-row__name">json-sort-cli</span> <sup>4.3.1</sup><div class="content-row__package__description" data-testid="package-json-sort-cli-description">Deep-sort JSON files or standard input; package.json retains its special key order</div></a></div></div></div></div><div class="back-to-top" data-testid="cli-libraries-back-to-top-container"><a data-testid="cli-libraries-back-to-top-link" href="#page-top">â back to top</a></div><div class="separator" role="presentation" data-testid="os-separator-h"><svg class="codsen-star-large" height="60" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 22.89 30.89" role="presentation"><path data-name="GREY OUTLINE" class="svg-outline" d="M11.44,30.28c-2.46,0-2.68-2.48-2.81-4-.19-2.07-.58-6.38-2.72-7.69A6.38,6.38,0,0,0,3.77,18C3,17.92.61,17.55.62,15.21c0-1.54,1.06-2.48,3.13-2.79a5.48,5.48,0,0,0,2.13-.6c1.82-1.13,2.31-4.95,2.57-7C8.68,3,9,.61,11.44.61h0c2.49,0,2.77,2.45,3,4.24.24,2,.67,5.85,2.46,7a5.89,5.89,0,0,0,2.24.6c2.08.25,3.14,1.18,3.15,2.74,0,2.36-2.38,2.71-3.17,2.82a6.18,6.18,0,0,0-2.35.66c-2.14,1.36-2.4,5.6-2.53,7.64-.09,1.39-.25,4-2.76,4h0Z"></path><path data-name="BLACK STROKE" d="M11.44,28.28c-.63,0-.69-.63-.82-2.14C10.39,23.56,10,18.76,7,16.93a7.75,7.75,0,0,0-2.87-.87c-.82-.13-1.46-.22-1.46-.84s.63-.7,1.42-.82a7.36,7.36,0,0,0,2.9-.88c2.63-1.64,3.17-5.9,3.49-8.44.22-1.7.32-2.47,1-2.47h0c.7,0,.79.77,1,2.46.29,2.55.77,6.8,3.37,8.45a7.28,7.28,0,0,0,3.07.9c.74.09,1.39.17,1.39.78s-.63.7-1.45.82a7.92,7.92,0,0,0-3.15.95c-3,1.91-3.29,6.66-3.45,9.21-.09,1.48-.13,2.1-.77,2.1Z"></path><path class="svg-yellow" d="M11.43,5.19s0,0,0,0c-.34,2.73-.92,7.28-3.95,9.17a6.87,6.87,0,0,1-2.32.86,7.41,7.41,0,0,1,2.32.84C10.15,17.71,
311,21.19,11.39,24c.3-2.72,1.09-6.13,3.73-7.82a7.15,7.15,0,0,1,2.38-.91,6.59,6.59,0,0,1-2.24-.85C12.27,12.46,11.74,7.91,11.43,5.19Z"></path></svg></div><h2 id="miscellaneous-libraries"><a class="header-anchor" data-testid="miscellaneous-libraries-anchor" href="#miscellaneous-libraries">Miscellaneous Libraries</a> <sup title="14 Miscellaneous Libraries in total">Σ=<!-- -->14</sup></h2><div class="content-row__container" data-testid="package-group-check-types-mini-14"><div class="content-row__description drop-cap drop-cap-small" data-testid="package-group-check-types-mini-14-description"><p>Thatâs all programs which donât belong to any of the categories above. Here we have programs doing everything, from CSV sorting to Tap output parsing; from regexes to converting colour hex codes.</p></div><div class="content-row__packages" data-testid="package-group-check-types-mini-14-items"><div class="content-row__package" data-testid="package-check-types-mini-item"><div class="content-row__package-main" data-testid="package-check-types-mini-content"><a data-testid="package-check-types-mini-readme-link" href="/os/check-types-mini" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <span class="content-row__name">check-types-mini</span> <sup>8.2.4</sup><div class="content-row__package__description" data-testid="package-check-types-mini-description">Validate options object</div></a></div></div><div class="content-row__package" data-testid="package-codsen-format-diagnostic-value-item"><div class="content-row__package-main" data-testid="package-codsen-format-diagnostic-value-content"><a data-testid="package-codsen-format-diagnostic-value-readme-link" href="/os/codsen-format-diagnostic-value" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <span class="content-row__name">codsen-format-diagnostic-value</span> <sup>1.1.1</sup><div class="content-row__package__description" data-testid="package-codsen-format-diagnostic-value-description">Safely format untrusted JavaScript values for diagnostics</div></a></div></div><div class="content-row__package" data-testid="package-codsen-glob-item"><div class="content-row__package-main" data-testid="package-codsen-glob-content"><a data-testid="package-codsen-glob-readme-link" href="/os/codsen-glob" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <span class="content-row__name">codsen-glob</span> <sup>1.1.2</sup><div class="content-row__package__description" data-testid="package-codsen-glob-description">Fast file globbing</div></a></div></div><div class="content-row__package" data-testid="package-codsen-utils-item"><div class="content-row__package-main" data-testid="package-codsen-utils-content"><a data-testid="package-codsen-utils-readme-link" href="/os/codsen-utils" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <span class="content-row__name">codsen-utils</span> <sup>1.10.2</sup><div class="content-row__package__description" data-testid="package-codsen-utils-description">Various utility functions</div></a></div></div><div class="content-row__package" data-testid="package-csv-sort-item"><div class="content-row__package-main" data-testid="package-csv-sort-content"><a data-testid="package-csv-sort-readme-link" href="/os/csv-sort" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <span class="content-row__name">csv-sort</span> <sup>7.2.5</sup><div class="content-row__package__description" data-testid="package-csv-sort-description">Sort double-entry bookkeeping CSV from internet banking</div></a></div></div><div class="content-row__package" data-testid="package-csv-split-easy-item"><div class="content-row__package-main" data-testid="package-csv-split-easy-content"><a data-testid="package-csv-split-easy-readme-link" href="/os/csv-split-easy" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <span class="content-row__name">csv-split-easy</span> <sup>7.2.5</sup><div class="content-row__package__description" data-testid="package-csv-split-easy-description">Splits the CSV string into array of arrays, each representing a row of columns</div></a></div></div><div class="content-row__package" data-testid="package-extract-search-index-item"><div class="content-row__package-main" data-testid="package-extract-search-index-content"><a data-testid="package-extract-search-index-readme-link" href="/os/extract-search-index" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <span class="content-row__name">extract-search-index</span> <sup>2.2.7</sup><div class="content-row__package__description" data-testid="package-extract-search-index-description">
3Extract unique keyword input list string for search</div></a></div></div><div class="content-row__package" data-testid="package-regex-empty-conditional-comments-item"><div class="content-row__package-main" data-testid="package-regex-empty-conditional-comments-content"><a data-testid="package-regex-empty-conditional-comments-readme-link" href="/os/regex-empty-conditional-comments" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <span class="content-row__name">regex-empty-conditional-comments</span> <sup>3.2.3</sup><div class="content-row__package__description" data-testid="package-regex-empty-conditional-comments-description">Regular expression for matching HTML empty conditional comments</div></a></div></div><div class="content-row__package" data-testid="package-rehype-responsive-tables-item"><div class="content-row__package-main" data-testid="package-rehype-responsive-tables-content"><a data-testid="package-rehype-responsive-tables-readme-link" href="/os/rehype-responsive-tables" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <span class="content-row__name">rehype-responsive-tables</span> <sup>2.2.3</sup><div class="content-row__package__description" data-testid="package-rehype-responsive-tables-description">Rehype plugin to stack the first column cells above their rows.</div></a></div></div><div class="content-row__package" data-testid="package-remark-conventional-commit-changelog-timeline-item"><div class="content-row__package-main" data-testid="package-remark-conventional-commit-changelog-timeline-content"><a data-testid="package-remark-conventional-commit-changelog-timeline-readme-link" href="/os/remark-conventional-commit-changelog-timeline" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <span class="content-row__name">remark-conventional-commit-changelog-timeline</span> <sup>4.0.0</sup><div class="content-row__package__description" data-testid="package-remark-conventional-commit-changelog-timeline-description">Render Codsen Conventional Commits changelogs as timeline HTML.</div></a></div></div><div class="content-row__package" data-testid="package-remark-typography-item"><div class="content-row__package-main" data-testid="package-remark-typography-content"><a data-testid="package-remark-typography-readme-link" href="/os/remark-typography" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <span class="content-row__name">remark-typography</span> <sup>0.8.7</sup><div class="content-row__package__description" data-testid="package-remark-typography-description">Remark plugin to fix typography: quotes, dashes and so on.</div></a></div></div><div class="content-row__package" data-testid="package-tsd-extract-item"><div class="content-row__package-main" data-testid="package-tsd-extract-content"><a data-testid="package-tsd-extract-readme-link" href="/os/tsd-extract" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <span class="content-row__name">tsd-extract</span> <sup>0.10.6</sup><div class="content-row__package__description" data-testid="package-tsd-extract-description">Extract any definition from TS definitions file string</div></a></div></div><div class="content-row__package" data-testid="package-util-array-object-or-both-item"><div class="content-row__package-main" data-testid="package-util-array-object-or-both-content"><a data-testid="package-util-array-object-or-both-readme-link" href="/os/util-array-object-or-both" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <span class="content-row__name">util-array-object-or-both</span> <sup>5.2.2</sup><div class="content-row__package__description" data-testid="package-util-array-object-or-both-description">Validate and normalise user choice: array, object or both?</div></a></div></div><div class="content-row__package" data-testid="package-util-nonempty-item"><div class="content-row__package-main" data-testid="package-util-nonempty-content"><a data-testid="package-util-nonempty-readme-link" href="/os/util-nonempty" data-discover="true"><span class="emoji" aria-hidden="true">ð¦</span> <span class="content-row__name">util-nonempty</span> <sup>
35.2.3</sup><div class="content-row__package__description" data-testid="package-util-nonempty-description">Is the input (plain object, array, string or whatever) not empty?</div></a></div></div></div></div><div class="back-to-top" data-testid="miscellaneous-libraries-back-to-top-container"><a data-testid="miscellaneous-libraries-back-to-top-link" href="#page-top">â back to top</a></div><div class="separator" role="presentation" data-testid="os-separator-i"><svg aria-hidden="true" class="codsen-diskette" width="78" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 78 82"><path class="svg-outline" d="M69.25 80.5H8.17c-4.19 0-7.6-3.41-7.6-7.6V8.99c0-4.2 3.41-7.61 7.6-7.61h61.54l7.14 7.26V72.9c0 4.19-3.41 7.6-7.6 7.6Z"></path><path class="svg-green" d="M67.19 7.38H64.4v.3h-5.81l-1.06 1.03h-3.6l-28.04-.95H12.92v-.38H8.17c-.89 0-1.6.72-1.6 1.6V72.9c0 .89.72 1.6 1.6 1.6h61.08c.89 0 1.6-.72 1.6-1.6V11.1l-3.66-3.72Z"></path><path class="svg-black-fill" d="M69.25 75.5H8.17c-1.43 0-2.6-1.17-2.6-2.6V8.99c0-1.44 1.17-2.6 2.6-2.6h5.75v.37h11.96l28.07.95h3.16l1.06-1.03h5.22v-.3h4.21l4.24 4.31V72.9c0 1.44-1.17 2.6-2.6 2.6ZM8.17 8.38c-.33 0-.6.27-.6.6V72.9c0 .33.27.6.6.6h61.08c.33 0 .6-.27.6-.6V11.51l-3.08-3.13H65.4v.3h-6.41l-1.06 1.03h-4l-28.07-.95H11.92v-.38H8.17Z"></path><path class="svg-blue" d="M21.81 6.98v20.68c0 1.15.93 2.08 2.08 2.08H53.6c1.15 0 2.08-.93 2.08-2.08V6.98H21.81Zm28.63 18.98c0 .43-.39.78-.86.78h-7.06c-.48 0-.86-.35-.86-.78v-14.8c0-.43.39-.78.86-.78h7.06c.48 0 .86.35.86.78v14.79Z"></path><path class="svg-black-fill" d="M53.61 30.74H23.89c-1.7 0-3.08-1.38-3.08-3.08V5.98h35.88v21.68c0 1.7-1.38 3.08-3.08 3.08ZM22.81 7.98v19.68c0 .6.49 1.08 1.08 1.08H53.6c.6 0 1.08-.48 1.08-1.08V7.98H22.81Zm26.77 19.77h-7.06c-1.03 0-1.86-.8-1.86-1.78V11.16c0-.98.83-1.78 1.86-1.78h7.06c1.03 0 1.86.8 1.86 1.78v14.79c0 .98-.83 1.78-1.86 1.78Zm-6.92-2h6.78V11.38h-6.78v14.36Z"></path><rect class="svg-black-fill" x="13.34" y="35.92" width="50.23" height="31.68" rx="1.5" ry="1.5"></rect><path class="svg-black-fill" d="M8.94 66.8h3.18v2.91H8.94zM65.51 66.8h3.18v2.91h-3.18z"></path><path class="svg-yellow" d="M27.08 47.72c0-5.62 9.28-7.07 11.25-.01.04.14.25.14.3 0 2.07-7.08 11.25-5.58 11.25 0 0 5.08-11.63 14.73-11.63 14.73s-11.16-8.89-11.16-14.73Z"></path></svg></div><h2>Links</h2><ul data-testid="os-related-links-list"><li data-testid="os-playgrounds-link-item"><a data-testid="os-playgrounds-link" href="/os/play" data-discover="true">List of all playgrounds</a></li><li data-testid="os-article-tags-link-item"><a data-testid="os-article-tags-link" href="/articles/tag/all" data-discover="true">List of all article tags</a></li><li data-testid="os-examples-link-item"><a data-testid="os-examples-link" href="/os/examples" data-discover="true">List of all program examples</a></li></ul></div></div></div><footer class="remix-app__footer footer-big" data-testid="site-footer"><section data-testid="footer-copyright-section"><h3 class="h4">Copyright</h3><p>All rights reserved © Roy Revelt<!-- --> <span>2026</span><br/>All our<!-- --> <a data-testid="footer-open-source-link" href="/os">open source</a> <!-- -->packages are under <a data-testid="mit-licence-link" href="https://github.com/codsen/codsen/blob/main/LICENSE" rel="noreferrer" target="_blank">MIT licence<svg aria-hidden="true" class="ext-link" height="10" viewBox="0 0 100 100" width="10" xmlns="http://www.w3.org/2000/svg"><path d="m38 30h-38v60h60v-38m-20-52v10l10 10-30 30 20 20 30-30 10 10h10v-50z" fill="none" stroke="currentColor" stroke-width="10" transform="translate(5 5)"></path><title>opens in a new tab</title></svg></a></p></section><section data-testid="footer-activities-section"><h3 class="h4">Activities</h3><p><span class="emoji">ð</span> See a bug?<!-- --> <a data-testid="report-issue-link" target="_blank" href="https://github.com/codsen/codsen/issues/new/choose" rel="noreferrer">Raise an issue<svg aria-hidden="true" class="ext-link" height="10" viewBox="0 0 100 100" width="10" xmlns="http://www.w3.org/2000/svg"><path d="m38 30h-38v60h60v-38m-20-52v10l10 10-30 30 20 20 30-30 10 10h10v-50z" fill="none" stroke="currentColor" stroke-width="10" transform="translate(5 5)"></path><title>opens in a new tab</title></svg></a><br/>
3<span class="emoji">ð</span> Check out the<!-- --> <a data-testid="footer-indieweb-link" href="https://indieweb.org/principles" target="_blank" rel="noopener noreferrer">Indieweb<svg aria-hidden="true" class="ext-link" height="10" viewBox="0 0 100 100" width="10" xmlns="http://www.w3.org/2000/svg"><path d="m38 30h-38v60h60v-38m-20-52v10l10 10-30 30 20 20 30-30 10 10h10v-50z" fill="none" stroke="currentColor" stroke-width="10" transform="translate(5 5)"></path><title>opens in a new tab</title></svg></a> <!-- -->and<!-- --> <a data-testid="footer-libera-manifesto-link" href="https://liberamanifesto.com/" target="_blank" rel="noopener noreferrer">Libera manifesto<svg aria-hidden="true" class="ext-link" height="10" viewBox="0 0 100 100" width="10" xmlns="http://www.w3.org/2000/svg"><path d="m38 30h-38v60h60v-38m-20-52v10l10 10-30 30 20 20 30-30 10 10h10v-50z" fill="none" stroke="currentColor" stroke-width="10" transform="translate(5 5)"></path><title>opens in a new tab</title></svg></a><br/></p></section></footer></div>
3<script>((storageKey2, restoreKey) => { 4 if (!window.history.state || !window.history.state.key) { 5 let key = Math.random().toString(32).slice(2); 6 window.history.replaceState({ key }, ""); 7 } 8 try { 9 let positions = JSON.parse(sessionStorage.getItem(storageKey2) || "{}"); 10 let storedY = positions[restoreKey || window.history.state.key]; 11 if (typeof storedY === "number") { 12 window.scrollTo(0, storedY); 13 } 14 } catch (error) { 15 console.error(error); 16 sessionStorage.removeItem(storageKey2); 17 } 18 })("react-router-scroll-positions", null)</script>
18<script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"v8_passThroughRequests":true,"v8_trailingSlashAwareDataRequests":true,"unstable_previewServerPrerendering":false,"v8_middleware":true,"v8_splitRouteModules":true,"v8_viteEnvironmentApi":true},"routeDiscovery":{"mode":"lazy","manifestPath":"/__manifest"},"ssr":true,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamController = controller;}}).pipeThrough(new TextEncoderStream());</script>
18<script type="module" async="">; 19import * as route0 from "/assets/root-DYlThwII.js"; 20import * as route1 from "/assets/os-CjR-8Jr5.js"; 21import * as route2 from "/assets/index-DpjK8DEZ.js"; 22 window.__reactRouterManifest = { 23 "entry": { 24 "module": "/assets/entry.client-CHdVadI0.js", 25 "imports": [ 26 "/assets/jsx-runtime-zmKt4aoE.js" 27 ], 28 "css": [] 29 }, 30 "routes": { 31 "root": { 32 "id": "root", 33 "path": "", 34 "hasAction": false, 35 "hasLoader": true, 36 "hasClientAction": false, 37 "hasClientLoader": false, 38 "hasClientMiddleware": false, 39 "hasDefaultExport": true, 40 "hasErrorBoundary": true, 41 "module": "/assets/root-DYlThwII.js", 42 "imports": [ 43 "/assets/jsx-runtime-zmKt4aoE.js", 44 "/assets/root-A6zJdrKV.js", 45 "/assets/clsx-DB0hHKMi.js", 46 "/assets/dist-BUa6A5X7.js", 47 "/assets/test-id-CCF4HlWb.js", 48 "/assets/link-MT-5P0oH.js", 49 "/assets/various-CoWjMWv6.js", 50 "/assets/misc-2Gdz-dJz.js", 51 "/assets/meta-CTym7bQO.js", 52 "/assets/icon-new-tab-CzzTuToe.js" 53 ], 54 "css": [ 55 "/assets/root-bwS5jJci.css" 56 ] 57 }, 58 "routes/os": { 59 "id": "routes/os", 60 "parentId": "root", 61 "path": "os", 62 "hasAction": false, 63 "hasLoader": false, 64 "hasClientAction": false, 65 "hasClientLoader": false, 66 "hasClientMiddleware": false, 67 "hasDefaultExport": true, 68 "hasErrorBoundary": false, 69 "module": "/assets/os-CjR-8Jr5.js", 70 "imports": [ 71 "/assets/jsx-runtime-zmKt4aoE.js", 72 "/assets/dist-BUa6A5X7.js", 73 "/assets/misc-2Gdz-dJz.js", 74 "/assets/meta-CTym7bQO.js", 75 "/assets/generated.package-count-BqPP0ceP.js", 76 "/assets/prep-label-CDgKtHj9.js", 77 "/assets/breadcrumb-uNd5oBlz.js", 78 "/assets/li-aside-CCGCdsx4.js", 79 "/assets/generated.static-D4FcgSk8.js", 80 "/assets/back-to-top-BkxArSV_.js", 81 "/assets/readme-preamble-Bl_cNVsj.js", 82 "/assets/package-documentation-CDysXQuT.js", 83 "/assets/retired-packages-DqN8lV23.js", 84 "/assets/package-helpers-DhgPX9m-.js", 85 "/assets/codsen-places-6hSsTllx.js", 86 "/assets/string-left-right.esm-BChGptOY.js", 87 "/assets/test-id-CCF4HlWb.js", 88 "/assets/link-MT-5P0oH.js", 89 "/assets/numbered-CBTeoJxo.js", 90 "/assets/extlink-0cUuay5D.js", 91 "/assets/dts-CO6EHg1B.js", 92 "/assets/hash-sum-BGEHAkff.js", 93 "/assets/dist-8UUBwVbB.js", 94 "/assets/highlight-C68Rq9ut.js", 95 "/assets/marked.esm-HaWzKJJ6.js", 96 "/assets/heading-C1XHWg0h.js", 97 "/assets/icon-new-tab-CzzTuToe.js" 98 ], 99 "css": [] 100 }, 101 "routes/os/index": { 102 "id": "routes/os/index", 103 "parentId": "routes/os", 104 "index": true, 105 "hasAction": false, 106 "hasLoader": false, 107 "hasClientAction": false, 108 "hasClientLoader": false, 109 "hasClientMiddleware": false, 110 "hasDefaultExport": true, 111 "hasErrorBoundary": false, 112 "module": "/assets/index-DpjK8DEZ.js", 113 "imports": [ 114 "/assets/jsx-runtime-zmKt4aoE.js", 115 "/assets/clsx-DB0hHKMi.js", 116 "/assets/test-id-CCF4HlWb.js", 117 "/assets/meta-CTym7bQO.js", 118 "/assets/breadcrumb-uNd5oBlz.js", 119 "/assets/stickers-M2t7kBf-.js", 120 "/assets/dist-8UUBwVbB.js", 121 "/assets/back-to-top-BkxArSV_.js", 122 "/assets/retired-packages-DqN8lV23.js", 123 "/assets/package-helpers-DhgPX9m-.js", 124 "/assets/monorepo-stats-DEZzG0HQ.js", 125 "/assets/misc-2Gdz-dJz.js", 126 "/assets/hash-sum-BGEHAkff.js", 127 "/assets/codsen-handshake-CbI2ikCn.js", 128 "/assets/generated.static-D4FcgSk8.js", 129 "/assets/package-documentation-CDysXQuT.js" 130 ], 131 "css": [] 132 }, 133 "routes/index": { 134 "id": "routes/index", 135 "parentId": "root", 136 "index": true, 137 "hasAction": false, 138 "hasLoader": false, 139 "hasClientAction": false, 140 "hasClientLoader": false, 141 "hasClientMiddleware": false, 142 "hasDefaultExport": true, 143 "hasErrorBoundary": false, 144 "module": "/assets/index-DtNgoGmm.js", 145 "imports": [ 146 "/assets/jsx-runtime-zmKt4aoE.js", 147 "/assets/numbered-CBTeoJxo.js", 148 "/assets/extlink-0cUuay5D.js", 149 "/assets/generated.package-count-BqPP0ceP.js", 150 "/assets/test-id-CCF4HlWb.js", 151 "/assets/icon-new-tab-CzzTuToe.js" 152 ], 153 "css": [] 154 } 155 }, 156 "url": "/assets/manifest-3c85c4f2.js", 157 "version": "3c85c4f2" 158}; 159 window.__reactRouterRouteModules = {"root":route0,"routes/os":route1,"routes/os/index":route2}; 160 161import("/assets/entry.client-CHdVadI0.js");</script>
161<!--$-->
161<script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_3\":-5,\"_4\":-5},\"loaderData\",{\"_5\":6},\"actionData\",\"errors\",\"root\",{\"_7\":8,\"_9\":10,\"_11\":-5},\"analyticsEnabled\",true,\"requestInfo\",{\"_12\":13,\"_14\":15,\"_16\":17},\"isFullscreen\",\"origin\",\"https://codsen.com\",\"path\",\"/os\",\"session\",{\"_18\":-5},\"theme\"]\n");</script>
161<!--$-->
161<script>window.__reactRouterContext.streamController.close();</script>
161<!--/$--><!--/$--></body></html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.