UNPKG

@t7/utils

Version:

Utility methods for T7 components.

305 lines (203 loc) 6.06 kB
# @t7/utils ``` npm install @t7/utils --save ``` https://www.npmjs.com/package/@t7/utils T7's "utils" is a collection of utilities that have been curated from multiple projects to perform simple targeted tasks. The entire library can be imported… ``` import utils from '@t7/utils' ``` Or, individual utilities can be imported as needed to keep the production code base as small as possible… ``` import { exists } from '@t7/utils' ``` ## Available utilities: ### `utils.bind` A helper to bind React `class` methods, rather than typing `this.foo = this.foo.bind(this)` repeatedly. ``` constructor (props) { super(props) // Bind context. utils.bind(this) } ``` --- ### `utils.contentOnChange` Handles an `onChange` event in `[contenteditable="true"]`, normalizing browser inconsistencies in the HTML. --- ### `utils.contentOnFocus` Handles an `onFocus` event in `[contenteditable="true"]`, clearing out `placeholder="…"` content. --- ### `utils.contentOnPaste` Handles an `onPaste` event in `[contenteditable="true"]`, changes pasted text into `<br>` separated new lines. --- ### `utils.contentToMarkup` Used within `utils.contentOnChange` to sanitize HTML content into a simpler `<textarea>` textual format. --- ### `utils.contentToText` Used within `utils.contentOnChange` to strip "rich text" formatting, and ensure consistent HTML output. --- ### `utils.exists` Used to ensure that a variable exists. For example: `''` and `0` pass, but `undefined` and `null` do not. ``` // Yields: `true`. utils.exists(0) // Yields: `true`. utils.exists('') // Yields: `true`. utils.exists(false) // Yields: `false`. utils.exists(null) // Yields: `false`. utils.exists(undefined) ``` --- ### `utils.navigate` This will take parameters, or an array, and redirect to a URL hash. ``` // Redirects to: "#/users/A1B2C3". utils.navigate('users', userID) ``` --- ### `utils.path` This will take parameters, or an array, and return a URL hash. It is used internally by `utils.navigate`. ``` // Yields string: "#/users/A1B2C3". utils.path('users', userID) ``` --- ### `utils.parseFormData` This will harvest all inputs in a `<form>` by their `name="…"` and return an array of objects representing their data. It will skip elements that are `disabled`. ``` const formData = utils.parseFormData(form) /* [ { name: 'input_id', value: 'text here' }, { name: 'checkbox_id', value: 'checkbox value', checked: true } ] */ console.log(formData) ``` --- ### `utils.regex` Helper function to "escape" a string or an array of strings, so that one need not memorize all special character cases. ``` const r = utils.regex('Hello world. What?') // Yields: /Hello world\. What\?/g console.log(r) ``` --- ### `utils.save` Allows you to save data to a `*.json` file that would otherwise be cumbersome to traverse via `console.log`. ``` const data = { foo: 1, bar: 1 } // Causes a file download. utils.save(data, 'file_name.json') ``` --- ### `utils.stop` This will call `*.preventDefault` and `*.stopPropagation` on an event, if they exist. ``` handleClick (e) { utils.stop(e) // Etc. } ``` --- ### `utils.storage` This provides a proxy to `localStorage` and falls back to an in-memory object if it's not supported. For instance, older versions of Safari in private browing mode would report support for `localStorage` but wouldn't actually work correctly in practice. By contrast, `utils.storage.get` works regardless. It also retrieves data as the correct type, whereas getting and setting directly with `localStorage` only uses strings. ``` // Setting a number `1`. localStorage.setItem('foo', 1) // Returns a string of "1". localStorage.getItem('foo') // Setting a number `1`. utils.storage.set('foo', 1) // Returns a number `1`. utils.storage.get('foo') ``` Functionally, the `clear` and `remove` methods are the same. ``` // Functionally identical. localStorage.removeItem('foo') utils.storage.remove('foo') ``` ``` // Functionally identical. localStorage.clear() utils.storage.clear() ``` --- ### `utils.title` This dynamically sets the page title. This can be helpful in React apps, where the `<head>` of a parent page is not directly in the React render tree. It will optionally read from `<title data-suffix="…">` to append a site name, etc. ``` // With this HTML: <title data-suffix="ACME Inc."></title> // Running this: utils.title('About Us') // Yields this: <title data-suffix="ACME Inc."> About Us | ACME Inc. </title> ``` --- ### `utils.today` This method returns "today" in milliseconds, if called without an argument. If a non-zero number is passed, it will provide an offset from today. ``` // Today. utils.today() // Also today. utils.today(0) // Yesterday. utils.today(-1) // Tomorrow. utils.today(+1) ``` --- ### `utils.trim` This method will do a typical `string.trim()` but will also replace continuous spaces with a single space. This is helpful for cleaning up strings that are going into markup, where more than one space is treated as a single space anyway. ``` // Yields: "FOO BAR". utils.trim(' FOO BAR ') ``` --- ### `utils.trimMultiLine` This method will trim a multi-line string, as one might encounter within a `<textarea>`. It will remove unnecessary spaces, but will preserve up to two new line `\n\n` characters. This allows for a visual "paragraph" to be retained. ``` // Yields: "FOO \n\n BAR". utils.trimMultiLine(' FOO \n \n BAR ') ``` --- ### `utils.unique` This generates a unique string. It can be helpful when attempting to have a matching `<label for="…">` and `<input id="…">` where the actual string doesn't matter, as long as the two are correlated for accessibility. ``` render () { // Yields: "1536711203446_28184486614563675" const id = utils.unique() return ( <p> <label htmlFor={id}> First name </label> <input id={id} type='text' name='firstName' value={firstName} /> </p> ) } ```