Attempts to get the path to the file that called the function that called this function.
npm i gist:b82256d70c5d9bed769b94a8d72bb38a| (function() { | |
| if (typeof URL != 'function') { | |
| rewriteURL(); | |
| } else if (!('searchParams' in new URL(window.location))) { | |
| rewriteURL(); | |
| } | |
| function rewriteURL() { | |
| // Overwrite URL if no searchParams property exists. |
| @mixin grid($cols, $rowGap: 0, $colGap: 0, $flexGrow: false) { | |
| display: flex; | |
| gap: #{$rowGap}px #{$colGap}px; | |
| flex-wrap: wrap; | |
| .col { | |
| flex-basis: calc((100% - #{$colGap}px * (#{$cols} - 1)) / #{$cols}); | |
| @if $flexGrow == true { | |
| flex-grow: 1; | |
| } |
| function groupStrings(strings) { | |
| return Object.values(strings.sort().reduce((a, str) => { | |
| const s = str.toLowerCase(); | |
| const f = s[0]; | |
| a[f] = a[f] ? [...a[f], s] : [s]; | |
| return a; | |
| }, {})); | |
| } |
| /** | |
| * Format bytes as human-readable text. | |
| * @param {number} bytes Number of bytes. | |
| * @param {number} decimalPlaces Number of decimal places to display. | |
| * @param {number} baseQuantity Number of bytes in a kilobyte. | |
| * @param {string[]} sizes The unites to use for each power of the baseQuantity. | |
| * @return {string} Formatted byte size. | |
| */ | |
| export const formatBytes = ( | |
| bytes, |
| /** | |
| * Recursively converts a type to a new type. The `predicateFn` is | |
| * used to determine if the `converterFn` should be run on the value. | |
| * | |
| * The function first checks the value itself, if the `predicateFn` returns | |
| * false and the value is an array or object, the function will recursively | |
| * check each item in the array or object. | |
| * | |
| * @param value - The value to convert primitive types in. | |
| * @param predicateFn - A function that returns true if the `converterFn` should |
| /** | |
| * Construct a type based off T where TDefinedField is defined when | |
| * T matches TDefinedState. | |
| * | |
| * @example | |
| * ```ts | |
| * type Payload = DefinedWhen< | |
| * { | |
| * isFetched: boolean; | |
| * hasError: boolean; |
| /** | |
| * Conducts a binary search on a sorted array of items to find the index of a | |
| * specific target. If the target is not found, it returns the nearest index | |
| * based on the comparator function. | |
| * | |
| * @param items - The sorted array of items to search within. | |
| * @param compare - A comparator function that returns: | |
| * - a negative number if `item` is less than the target, | |
| * - a positive number if `item` is greater than the target, | |
| * - and 0 if `item` is equal to the target. |
| import os from "node:os"; | |
| import path from "node:path"; | |
| /** | |
| * Get the path to an app specific config directory based on operating system | |
| * standards. | |
| * @param projectName | |
| * @returns | |
| */ | |
| export function getOSConfigDir(projectName: string): string { |
| /** | |
| * Converts a hyphenated string to camel case. | |
| * | |
| * @example | |
| * camelCase('foo-bar') // 'fooBar' | |
| */ | |
| export function camelCase<S>(str: S): CamelCase<S> { | |
| return ( | |
| typeof str === 'string' | |
| ? str.toLowerCase().replace(/-+([^-])/g, (_, c) => c.toUpperCase()) |