diff --git a/.husky/pre-commit b/.husky/pre-commit index 47156192..eadaa672 100644 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -1,7 +1,6 @@ #!/usr/bin/env sh . "$(dirname -- "$0")/_/husky.sh" -git add . && npm run lint diff --git a/.husky/pre-push b/.husky/pre-push index dbd71066..f43af809 100644 --- a/.husky/pre-push +++ b/.husky/pre-push @@ -2,4 +2,4 @@ . "$(dirname -- "$0")/_/husky.sh" # We cant push code that doesn't build. - npm test && npm run format +# npm run format diff --git a/CHANGELOG.md b/CHANGELOG.md index df920632..6977b46c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -32,25 +32,39 @@ All utilities guarded to convert all input to hex Added better type definitions for richer IntelliSense in the editor Changed docs to docsify -### 1.8.0 (stable) +### 1.7.9 (unstable) - Fully treeshakable - Core-utils directory was split to submodules. - Added the `load()` utility to create read-manipulate-output chain with all the utilities that take a collection of colos as first input. The chain is lazy. -- Added the Color class which is aliased as `color()` which has all the utilities that take a color as the first argument bound to its prototype as methods. Calling color() simply calls `new IColor()` under the hood. -- Added the `toHex` utility which parses all known color tokens similar to chroma-js +- Added the Color class which is aliased as `color()` which has all the utilities that take a color as the first argument bound to its prototype as methods. Calling color() simply calls `new Color()` under the hood. +- Added the `toHex` utility which parses all known color tokens similar to chroma-js `chroma()` constructor. - Eliminated dependancy on lodash. - Used treeshaken Culori modules to reduce bundle size. Only 20KB when minified! - Created the `fp` directory with helper functions used in the library grouped by input type. - More modular codebase - Simplified code to make it more readable and easier to understand for other developers who may want to contribute Over 50 utilities in the API now! -- All palette functions have easings for internal computations +- All palette functions (generators) have easing function support. Updated the docs! -- Improved the accuracy of temperature based utilities. -- Rewrote the type declarations to make them simpler and more generic. - All palette functions now take an optional overrides object to fine tune parameters like easing methods, fixups etc. -- Temperature utilities are marked as experiental until a more effecient way of predicting color temperature is discovered - Rewrote the README and CONTRIBUTING. Added missing licenses for borrowed code. +### 1.79.91 (stable) +- Deprecated temperature based utilities due to inconsistent results. +- Rewrote the type declarations to make them simpler and more generic. +- Lightness and chroma channels are now normalized against passed in extremums in the filtering utilities. +- `toHex` now supports RGB channel in the [0,255] range and [0,1] as well. Values above 1 are normalized using a simple formula. `ch / 255`. +- Removed unnecessary submodules and joined them into grouped modules +- Added Typedoc as the documentation generator of choice. +- New simpler docs writen in GFM. +- Added `getNearestColor` which uses the differenceHyab metric to get the nearest color against a collection. +- Collection based utilities that took arrays of colors are now generic! If an object is passed its keys are passsed as an index and the values are treated as valid color tokens. Objects can only have a depth of 1 ie nested properties are not supported (yet). +- Added color vision deficiency simulation support (stable) +- Added a ColorArray class that has all collection based methods on its prototype as methods. The chain is lazy and requires `output()` to be called to retun the final result. Its aliased as `load()` which simply wraps around the class and invoking a new instance under the hood. +-Added some notes to the docs explaining how some of the utilities work as well as other behaviours of the library. +- Slimmer bundle size. +- Fixed import errors. The library is now fully ESM with a UMD build for CDN and minified version for browser. +- Added support for more uniform colorspaces in hueShift. Jch is currently unsupported because of lightness mapping issues. Support is coming soon though. +- Removed cyclic dependencies that caused a stackoverflow error. diff --git a/README.md b/README.md index bdb359ac..df96afe5 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ TypeScript library for general purpose color manipulations and generating custom ### Node -The library🧾 is available on npm as a package📦 for use in Node: +The library🧾 is on npm as a package📦 for use in NodeJS: ```bash npm i huetiful-js @@ -29,342 +29,9 @@ Or load the library as a UMD glabal (`huetiful`) in your HTML file using a ` ``` -#### What's a color 🤔? +## Quickstart -A color can be defined using different data types(arrays, strings, numbers plain objects). This allows us to work with color in almost any format and flexibility in how we want to define our color. Below are some examples listing all the supported formats of passing in color values and their respective conversion functions: - -```js -import { num2rgb, toHex } from 'huetiful-js' - -let cssNamedColor = 'pink' -let colorNumber = 5000 -let colorObject = { l: 50, c: 20, h: 40, mode: 'lch' } -let colorObjectWithAlpha = { l: 50, c: 20, h: 40, alpha: 0.5, mode: 'lch' } -let arrColor = ['rgb', 120, 80, 50] -let arrColorWithAlpha = ['rgb', 120, 80, 50, 0.1] - - -// Converting CSS named colors to hex -console.log(toHex(cssNamedColor)) -// #ffc0cb - -// Converting a number to an RGB object -console.log(num2rgb(colorNumber, true)) -// #001388 - -// Converting a color object to a 6 character hex (without the alpha value) -console.log(toHex(colorObject)) -// #956d62 - -// Converting a color object with an alpha property to an 8 character hex code (including the alpha channel) -console.log(toHex(colorObjectWithAlpha)) -// #956d6280 - -// Converting an array of channel values to a 6 character hex code. -console.log(toHex(arrColor)) -// #785032 - -// Converting an array of channel values (including the alpha channel) to an 8 character hex -console.log(toHex(arrColorWithAlpha)) -//#7850321a - - -``` - -> ℹ️ [See here](https://culorijs.org/color-spaces -) and the expected channel ranges or [more on converter functions](https://prjctimg.github.io/huetiful/modules/converters.html) page 🔗. - -#### TailwindCSS colors🎨 - -As a starting point the library comes along with the default TailwindCSS palette included. This helps you get started easier when you're using [palette functions](https://prjctimg.github.io/huetiful/modules/generators.html) such as `hueShift()` and `earthtone()` - -The Tailwind colors can be accessed from two wrapper functions, `tailwindColors` and `colors` , that both take the same parameters but `colors` takes both parameters at once while `tailwindColors` is curried. Here's an example showing the differences between the two functions: - -```js - import { tailwindColors , colors } from "huetiful-js"; - -// We pass in red as the target hue. -// It returns a function that can be called with an optional value parameter -let red = tailwindColors("red"); -console.log(red()); -// [ - '#fef2f2', '#fee2e2', - '#fecaca', '#fca5a5', - '#f87171', '#ef4444', - '#dc2626', '#b91c1c', - '#991b1b', '#7f1d1d' -] - - -console.log(red(100)); -// '#fee2e2' - -console.log(red('900')); -// '#7f1d1d' - - ////// example for colors() ////// - -// colors() has a builtin parameter called 'all' that returns all colors at the specified value -let all300 = colors("all", 300); - -console.log(all300) -//[ - '#cbd5e1', '#d1d5db', '#d4d4d8', - '#d4d4d4', '#d6d3d1', '#fca5a5', - '#fdba74', '#fcd34d', '#fde047', - '#bef264', '#86efac', '#6ee7b7', - '#5eead4', '#7dd3fc', '#93c5fd', - '#c4b5fd', '#d8b4fe', '#f0abfc', - '#f9a8d4', '#fda4af' -] - -let red = colors("red"); -console.log(red); - -// [ - '#fef2f2', '#fee2e2', - '#fecaca', '#fca5a5', - '#f87171', '#ef4444', - '#dc2626', '#b91c1c', - '#991b1b', '#7f1d1d' -] - -let red100 = colors("red", 100); - -console.log(red100) -// #fee2e2 - -``` - -### Working with arrays of color🎨 - -We can sort and filter colors using their property or channel values values like saturation,lightness and even contrast! -Here are some example using the filtering and sorting functions on an array of colors: - -#### Sorting colors - -An example of sorting colors by the relative luminance as defined by the WCAG 2.0 formula - -```js -import { sortByLuminance } from "huetiful-js"; -let sample = [ - "#00ffdc", - "#00ff78", - "#00c000", - "#007e00", - "#164100", - "#ffff00", - "#310000", - "#3e0000", - "#4e0000", - "#600000", - "#720000", -]; - - - -let sorted = sortByLuminance(sample) -console.log(sorted) -// [ - '#310000', '#3e0000', - '#4e0000', '#600000', - '#720000', '#164100', - '#007e00', '#00c000', - '#00ff78', '#00ffdc', - '#ffff00' -] - -// Note that you can specify the order as either ascending (`asc`) or descending (`desc`). The default is ascending. : - -let sortedDescending = sortByLuminance(sample, "desc"); -console.log(sortedDescending) -// [ - '#ffff00', '#00ffdc', - '#00ff78', '#00c000', - '#007e00', '#164100', - '#720000', '#600000', - '#4e0000', '#3e0000', - '#310000' -] - - -``` - -#### Filtering colors - -An example of filtering colors by the value of the hue angle. The function uses the Jch colorspace because of its perceptual uniformity. [George Francis explains this phenomena in detail here.](https://tympanus.net/codrops/2021/12/07/coloring-with-code-a-programmatic-approach-to-design/) - -```js - let sample = [ - '#00ffdc', - '#00ff78', - '#00c000', - '#007e00', - '#164100', - '#ffff00', - '#310000', - '#3e0000', - '#4e0000', - '#600000', - '#720000', -] - -filterByHue(sample, 20, 80) - -// [ '#310000', '#3e0000', '#4e0000', '#600000', '#720000' ] - - // We can even use expressions as the condition e.g '>=50' which means return the colors with a hue angle greater than or equal to 50 - - // Here are some examples -console.log(filterByHue(sample, '>100') -) -// [ '#00ffdc', '#00ff78', '#00c000', '#007e00', '#164100' ] - -console.log(filterByHue(sample, '<=100') -) -// [ '#ffff00', '#310000', '#3e0000', '#4e0000', '#600000', '#720000' ] - -``` - -[See more about the parameter types and other filtering functions](https://prjctimg.github.io/huetiful/modules/sortBy.html) - -### Palette generators - -A few simple palette generator functions are included in the library. One of my favourites is `hueShift` (as a color becomes lighter, its hue shifts up and darker when its hue shifts down. ) . - -```js -import { hueShift } from "huetiful-js"; - -let hueShiftedPalette = hueShift("#3e0000", {}, true); - -console.log(hueShiftedPalette); - -// [ - '#ffffe1', '#ffdca5', - '#ca9a70', '#935c40', - '#5c2418', '#3e0000', - '#310000', '#34000f', - '#38001e', '#3b002c', - '#3b0c3a' -] - - - -``` - -[See more palette generator functions](https://prjctimg.github.io/huetiful/modules/generators.html) - -### Predicates⚖️ - -Is this color cool🥶 or warm 🥵, is it achromatic (grayscale) or chromatic? Though its easy to tell colors apart visually when they're displayed on the screen📺 it can be a bit confusing to tell colors apart using code🔢. Below is an example showing how to determine if a color is gray or not: - -```js - -import { isAchromatic } from "huetiful-js"; -import { formatHex8, interpolate, samples } from "culori" - - -isAchromatic('pink') -// false - -let sample = [ - "#164100", - "#ffff00", - "#310000", - 'pink' -]; - -console.log(map(sample, isAchromatic)); - -// [false, false, false,false] - -isAchromatic('gray') -// true - - - -// Here are using some of Culori's functions to demonstrate this example -// we create an interpolation using black and white -let f = interpolate(["black", "white"]); - -//We then create 12 evenly spaced samples and pass them to f as the `t` param required by an interpolating function. -// Lastly we convert the color to hex for brevity for this example (otherwise color objects work fine too.) -let grays = map(samples(12), (c) => formatHex8(f(c))); -console.log(map(grays, isAchromatic)); - -// The last two colors are false because we can't categorize black and white as achromatic. - -// - [ false, true, true, - true, true, true, - true, true, true, - true, true, false -] - -``` - -Here's an example🎆 showing how we can check if a color is cool using one of the predicate functions: - -```js -import { isCool } from 'huetiful-js' - -let sample = [ - "#00ffdc", - "#00ff78", - "#00c000" -]; - - -console.log(isCool(sample[0])); -// false - -console.log(map(sample, isCool)); - -// [ true, false, true] - - -``` - -Another use👷 case would be passing the predicate to an array method like `filter` to filter a collection of colors removing colors that return false for the passed in predicate. In the following example we use is `isWarm` to only return warm colors: - -```js -import { isWarm } from 'huetiful-js' - -let sample = [ - "#00ffdc", - "#00ff78", - "#00c000" -]; - -console.log(sample.filter(isWarm)) -// [ '#00ff78' ] - - -``` - -Or maybe we want to know which color has the furthest hue distance in our sample collection against our target color 🤔: - -```js - -import { getFarthestHue } from 'huetiful-js' -let sample = [ - '#00ffdc', - '#00ff78', - '#00c000', - '#007e00', - '#164100', - '#ffff00', - '#310000', - '#3e0000', - '#4e0000', - '#600000', - '#720000', -] - -console.log(getFarthestHue('lime', sample, 'lch')) -// 112.60431681589854 - -``` +[See the Quickstart page](https://prjctimg.github.io/huetiful/notes/quickstart.html) to see some examples and demonstrations of the library. ## What's next🤷🏽‍♂️ @@ -383,6 +50,10 @@ Would like to join the chat🗣️ and share ideas💡 and suggestions💭 ? [Se This project is fully open source so contributions are welcome! Help make this project better by suggesting improvements or features and patching bugs🐛. See🔍 the [CONTRIBUTING](./CONTRIBUTING.md) file for more information on how to get started. +## Donating + +This project is completely free and will remain so forever. But if you wish to support the development of this project or just buy the developer a coffee, please feel free. + ## References🔗 [Coloring with code: A programmatic approach by George Francis](https://tympanus.net/codrops/2021/12/07/coloring-with-code-a-programmatic-approach-to-design/) diff --git a/build.cjs b/build.cjs index 01db54d0..21a40f04 100644 --- a/build.cjs +++ b/build.cjs @@ -14,19 +14,19 @@ const sharedConfig = { }; // commonJS import -build({ - format: 'cjs', - ...sharedConfig, - outfile: './lib/huetiful.cjs', - external: Object.keys(dependencies) -}); +// build({ +// format: 'cjs', +// ...sharedConfig, +// outfile: './lib/huetiful.cjs', +// external: Object.keys(dependencies) +// }); //Bundled ESM build({ ...sharedConfig, - platform: 'neutral', + platform: 'browser', format: 'esm', - outfile: './lib/huetiful.esm.mjs' + outfile: './lib/huetiful.esm.min.mjs' }); //Bundled IIFE @@ -36,5 +36,15 @@ build({ format: 'iife', outfile: './lib/huetiful.umd.js', globalName: 'huetiful', - minifySyntax: true + minifySyntax: true, + minify: true }); + +// ESM no bundle +build({ + ...sharedConfig, + platform: 'node', + format: 'esm', + outfile: './lib/huetiful.esm.mjs', + external: Object.keys(dependencies) +}); \ No newline at end of file diff --git a/docs.js b/docs.js new file mode 100644 index 00000000..a7cd7406 --- /dev/null +++ b/docs.js @@ -0,0 +1,149 @@ +#!/usr/bin / env node +/* eslint-disable no-console */ +/* eslint-disable no-undef */ +/* eslint-disable @typescript-eslint/no-var-requires */ + +import { + readFileSync, + writeFileSync, + renameSync, + rmSync, + readdirSync, + writeFile +} from 'fs'; +import { stringOf } from 'github-emoji'; +import { log } from 'console'; + +//// Refactor +// 1 change folder final output output to webapp. Pick up templates from docs site +// change path segments +// Add typedoc deps +// Inject actual emojis. + +////// Documentation generator script +///// Each subdir in src is an .md file +///// Start and end tags in the files in docs will guide the md injection + +var rootDir = './docs'; +var mainIndex = fileContents(rootDir, 'modules'); +var pathToMainIndex = String(rootDir + '/modules.md'); + +const pathSegments = [ + 'helpers', + 'colors', + 'filterBy', + 'converters', + 'utils', + 'generators', + 'sortBy', + 'types' +]; +function fileContents(rootDir, filenameSegment, extension = 'md') { + return readFileSync(`${rootDir}/${filenameSegment}.${extension}`, 'utf8'); +} + +const markdownHeadingEmojiMap = { + '### Functions': 'toolbox', + '## Module:': 'package', + 'Module:': 'package', + '## Table of contents': 'scroll', + '### Parameters': 'abacus', + '#### Returns': 'back', + '#### Defined in': 'memo', + '### Modules': 'package', + '### Constructors': 'hammer_and_wrench', + '### Properties': 'microscope', + '# Class:': 'card_file_box', + '### Methods': 'wrench', + '## Constructors': 'hammer_and_wrench', + '### constructor': 'hammer_and_wrench', + '### Classes': 'card_file_box' +}; +// webapp\data\api +//const reHtmlComment = /()[\s\S]*?()$/gm; +//const replace = (data) => `\n${data}\n`; +const re = (pattern) => new RegExp(pattern, 'gi'); +const generateDocs = (filenameSegment) => { + let typeDocMarkdownOutput = fileContents( + rootDir + `/modules`, + filenameSegment, + `md` + ); + // let templateMarkdownFile = fileContents("templates", filenameSegment, `mdx`); + + console.log(`[info] Adding utf8 emojis in ${filenameSegment}.md`); + + for (const heading of Object.keys(markdownHeadingEmojiMap)) { + typeDocMarkdownOutput = typeDocMarkdownOutput.replace( + re(heading), + `${heading}${stringOf(markdownHeadingEmojiMap[heading])}` + ); + } + typeDocMarkdownOutput = typeDocMarkdownOutput.replace( + /\*\*`Description`\*\*/g, + `**\`Description\`** ${stringOf('information_source')}` + ); + + typeDocMarkdownOutput = typeDocMarkdownOutput.replace( + /\*\*`Example`\*\*/g, + `**\`Example\`** ${stringOf('clipboard')}` + ); + + typeDocMarkdownOutput = typeDocMarkdownOutput.replace( + /\*\*`Function`\*\*/g, + '' + ); + + writeFileSync(`./docs/modules/${filenameSegment}.md`, typeDocMarkdownOutput); +}; + +for (const pathSeg of pathSegments) { + generateDocs(pathSeg); +} + +for (const heading of Object.keys(markdownHeadingEmojiMap)) { + writeFileSync( + pathToMainIndex, + fileContents(rootDir, 'modules').replace( + re(heading), + `${heading}${stringOf(markdownHeadingEmojiMap[heading])}` + ) + ); +} +for (const i of ['Color.ColorArray', 'Color.Color']) { + for (const heading of Object.keys(markdownHeadingEmojiMap)) { + writeFileSync( + `./docs/classes/${i}.md`, + fileContents('docs', 'modules').replace( + re(heading), + `${heading}${stringOf(markdownHeadingEmojiMap[heading])}` + ) + ); + } + log(`Added utf8 emojis to ` + i); +} + + +// Insert logo image and parse the emojis +writeFileSync( + pathToMainIndex, + mainIndex.replace('# huetiful-js', `![Logo](./huetiful-logo.png)`) +); +// writeFileSync(pathToMainIndex, rawGfmToGfm('/modules.md')); + +renameSync(`${rootDir}/modules.md`, `${rootDir}/index.md`); + +// Convert all the markdown files to html +// Remove the md version. +// Inject the generated html into the template file +// for (const pathSeg of pathSegments) { +// // read the contents of thr template file. +// writeFileSync( +// `./docs/modules/${pathSeg}.html`, +// micromark(fileContents(`${rootDir}/modules`, pathSeg),) +// ); + +// rmSync(`./docs/modules/${pathSeg}.md`); +// } + +// console.log(`Done`); diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 00000000..f4d0b076 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,66 @@ +huetiful-js / [Modules](modules.md) + +![Logo](./huetiful-logo.png) +TypeScript library for general purpose color manipulations and generating custom color scales. + +## Getting started⛳ + +### Node + +The library🧾 is on npm as a package📦 for use in NodeJS: + +```bash +npm i huetiful-js +``` + +You can use a CDN in this example, jsdelivr to load the library remotely: + +```js +import {...} from 'https://cdn.jsdelivr.net/npm/huetiful-js/lib/huetiful.esm.mjs' + +``` + +### Browser + +Or load the library as a UMD glabal (`huetiful`) in your HTML file using a ` +``` + +## Quickstart + +[See the Quickstart page](https://prjctimg.github.io/huetiful/notes/quickstart.html) to see some examples and demonstrations of the library. + +## What's next🤷🏽‍♂️ + +> The possibilities are limited by the imagination🤯 of the user._ +> ~ me :smile: + +[See the full docs here📜](https:prjctimg.github.io/huetiful) + +## Need help😣 ? + +See some unexpected results😖? [Check the issue tracker](https://github.com/prjctimg/huetiful/issues) to open an issue or search for the problem to see if your issue already exists or has been resolved. + +Would like to join the chat🗣️ and share ideas💡 and suggestions💭 ? [See the discussions and just say hi, or share a coding meme(whatever breaks the ice🏔️)](https://github.com/prjctimg/huetiful/discussions) + +## Contributing👐🏾 + +This project is fully open source so contributions are welcome! Help make this project better by suggesting improvements or features and patching bugs🐛. See🔍 the [CONTRIBUTING](./CONTRIBUTING.md) file for more information on how to get started. + +## Donating + +This project is completely free and will remain so forever. But if you wish to support the development of this project or just buy the developer a coffee, please feel free. + +## References🔗 + +[Coloring with code: A programmatic approach by George Francis](https://tympanus.net/codrops/2021/12/07/coloring-with-code-a-programmatic-approach-to-design/) + +> ###### License +> +> Copyright (c) 2023, +> Dean Tarisai and contributors +> huetiful-js is released under the [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0) license. diff --git a/docs/assets/highlight.css b/docs/assets/highlight.css deleted file mode 100644 index 521f4ecb..00000000 --- a/docs/assets/highlight.css +++ /dev/null @@ -1,120 +0,0 @@ -:root { - --light-hl-0: #795E26; - --dark-hl-0: #DCDCAA; - --light-hl-1: #000000; - --dark-hl-1: #D4D4D4; - --light-hl-2: #A31515; - --dark-hl-2: #CE9178; - --light-hl-3: #AF00DB; - --dark-hl-3: #C586C0; - --light-hl-4: #800000; - --dark-hl-4: #808080; - --light-hl-5: #800000; - --dark-hl-5: #569CD6; - --light-hl-6: #000000FF; - --dark-hl-6: #D4D4D4; - --light-hl-7: #E50000; - --dark-hl-7: #9CDCFE; - --light-hl-8: #0000FF; - --dark-hl-8: #CE9178; - --light-hl-9: #001080; - --dark-hl-9: #9CDCFE; - --light-hl-10: #0000FF; - --dark-hl-10: #569CD6; - --light-hl-11: #098658; - --dark-hl-11: #B5CEA8; - --light-hl-12: #008000; - --dark-hl-12: #6A9955; - --light-hl-13: #CD3131; - --dark-hl-13: #F44747; - --light-code-background: #FFFFFF; - --dark-code-background: #1E1E1E; -} - -@media (prefers-color-scheme: light) { :root { - --hl-0: var(--light-hl-0); - --hl-1: var(--light-hl-1); - --hl-2: var(--light-hl-2); - --hl-3: var(--light-hl-3); - --hl-4: var(--light-hl-4); - --hl-5: var(--light-hl-5); - --hl-6: var(--light-hl-6); - --hl-7: var(--light-hl-7); - --hl-8: var(--light-hl-8); - --hl-9: var(--light-hl-9); - --hl-10: var(--light-hl-10); - --hl-11: var(--light-hl-11); - --hl-12: var(--light-hl-12); - --hl-13: var(--light-hl-13); - --code-background: var(--light-code-background); -} } - -@media (prefers-color-scheme: dark) { :root { - --hl-0: var(--dark-hl-0); - --hl-1: var(--dark-hl-1); - --hl-2: var(--dark-hl-2); - --hl-3: var(--dark-hl-3); - --hl-4: var(--dark-hl-4); - --hl-5: var(--dark-hl-5); - --hl-6: var(--dark-hl-6); - --hl-7: var(--dark-hl-7); - --hl-8: var(--dark-hl-8); - --hl-9: var(--dark-hl-9); - --hl-10: var(--dark-hl-10); - --hl-11: var(--dark-hl-11); - --hl-12: var(--dark-hl-12); - --hl-13: var(--dark-hl-13); - --code-background: var(--dark-code-background); -} } - -:root[data-theme='light'] { - --hl-0: var(--light-hl-0); - --hl-1: var(--light-hl-1); - --hl-2: var(--light-hl-2); - --hl-3: var(--light-hl-3); - --hl-4: var(--light-hl-4); - --hl-5: var(--light-hl-5); - --hl-6: var(--light-hl-6); - --hl-7: var(--light-hl-7); - --hl-8: var(--light-hl-8); - --hl-9: var(--light-hl-9); - --hl-10: var(--light-hl-10); - --hl-11: var(--light-hl-11); - --hl-12: var(--light-hl-12); - --hl-13: var(--light-hl-13); - --code-background: var(--light-code-background); -} - -:root[data-theme='dark'] { - --hl-0: var(--dark-hl-0); - --hl-1: var(--dark-hl-1); - --hl-2: var(--dark-hl-2); - --hl-3: var(--dark-hl-3); - --hl-4: var(--dark-hl-4); - --hl-5: var(--dark-hl-5); - --hl-6: var(--dark-hl-6); - --hl-7: var(--dark-hl-7); - --hl-8: var(--dark-hl-8); - --hl-9: var(--dark-hl-9); - --hl-10: var(--dark-hl-10); - --hl-11: var(--dark-hl-11); - --hl-12: var(--dark-hl-12); - --hl-13: var(--dark-hl-13); - --code-background: var(--dark-code-background); -} - -.hl-0 { color: var(--hl-0); } -.hl-1 { color: var(--hl-1); } -.hl-2 { color: var(--hl-2); } -.hl-3 { color: var(--hl-3); } -.hl-4 { color: var(--hl-4); } -.hl-5 { color: var(--hl-5); } -.hl-6 { color: var(--hl-6); } -.hl-7 { color: var(--hl-7); } -.hl-8 { color: var(--hl-8); } -.hl-9 { color: var(--hl-9); } -.hl-10 { color: var(--hl-10); } -.hl-11 { color: var(--hl-11); } -.hl-12 { color: var(--hl-12); } -.hl-13 { color: var(--hl-13); } -pre, code { background: var(--code-background); } diff --git a/docs/assets/main.js b/docs/assets/main.js deleted file mode 100644 index d0aa8d5f..00000000 --- a/docs/assets/main.js +++ /dev/null @@ -1,59 +0,0 @@ -"use strict"; -"use strict";(()=>{var Pe=Object.create;var ne=Object.defineProperty;var Ie=Object.getOwnPropertyDescriptor;var Oe=Object.getOwnPropertyNames;var _e=Object.getPrototypeOf,Re=Object.prototype.hasOwnProperty;var Me=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports);var Fe=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of Oe(e))!Re.call(t,i)&&i!==n&&ne(t,i,{get:()=>e[i],enumerable:!(r=Ie(e,i))||r.enumerable});return t};var De=(t,e,n)=>(n=t!=null?Pe(_e(t)):{},Fe(e||!t||!t.__esModule?ne(n,"default",{value:t,enumerable:!0}):n,t));var ae=Me((se,oe)=>{(function(){var t=function(e){var n=new t.Builder;return n.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),n.searchPipeline.add(t.stemmer),e.call(n,n),n.build()};t.version="2.3.9";t.utils={},t.utils.warn=function(e){return function(n){e.console&&console.warn&&console.warn(n)}}(this),t.utils.asString=function(e){return e==null?"":e.toString()},t.utils.clone=function(e){if(e==null)return e;for(var n=Object.create(null),r=Object.keys(e),i=0;i0){var d=t.utils.clone(n)||{};d.position=[a,u],d.index=s.length,s.push(new t.Token(r.slice(a,o),d))}a=o+1}}return s},t.tokenizer.separator=/[\s\-]+/;t.Pipeline=function(){this._stack=[]},t.Pipeline.registeredFunctions=Object.create(null),t.Pipeline.registerFunction=function(e,n){n in this.registeredFunctions&&t.utils.warn("Overwriting existing registered function: "+n),e.label=n,t.Pipeline.registeredFunctions[e.label]=e},t.Pipeline.warnIfFunctionNotRegistered=function(e){var n=e.label&&e.label in this.registeredFunctions;n||t.utils.warn(`Function is not registered with pipeline. This may cause problems when serialising the index. -`,e)},t.Pipeline.load=function(e){var n=new t.Pipeline;return e.forEach(function(r){var i=t.Pipeline.registeredFunctions[r];if(i)n.add(i);else throw new Error("Cannot load unregistered function: "+r)}),n},t.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(n){t.Pipeline.warnIfFunctionNotRegistered(n),this._stack.push(n)},this)},t.Pipeline.prototype.after=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var r=this._stack.indexOf(e);if(r==-1)throw new Error("Cannot find existingFn");r=r+1,this._stack.splice(r,0,n)},t.Pipeline.prototype.before=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var r=this._stack.indexOf(e);if(r==-1)throw new Error("Cannot find existingFn");this._stack.splice(r,0,n)},t.Pipeline.prototype.remove=function(e){var n=this._stack.indexOf(e);n!=-1&&this._stack.splice(n,1)},t.Pipeline.prototype.run=function(e){for(var n=this._stack.length,r=0;r1&&(oe&&(r=s),o!=e);)i=r-n,s=n+Math.floor(i/2),o=this.elements[s*2];if(o==e||o>e)return s*2;if(ol?d+=2:a==l&&(n+=r[u+1]*i[d+1],u+=2,d+=2);return n},t.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},t.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),n=1,r=0;n0){var o=s.str.charAt(0),a;o in s.node.edges?a=s.node.edges[o]:(a=new t.TokenSet,s.node.edges[o]=a),s.str.length==1&&(a.final=!0),i.push({node:a,editsRemaining:s.editsRemaining,str:s.str.slice(1)})}if(s.editsRemaining!=0){if("*"in s.node.edges)var l=s.node.edges["*"];else{var l=new t.TokenSet;s.node.edges["*"]=l}if(s.str.length==0&&(l.final=!0),i.push({node:l,editsRemaining:s.editsRemaining-1,str:s.str}),s.str.length>1&&i.push({node:s.node,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)}),s.str.length==1&&(s.node.final=!0),s.str.length>=1){if("*"in s.node.edges)var u=s.node.edges["*"];else{var u=new t.TokenSet;s.node.edges["*"]=u}s.str.length==1&&(u.final=!0),i.push({node:u,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)})}if(s.str.length>1){var d=s.str.charAt(0),v=s.str.charAt(1),f;v in s.node.edges?f=s.node.edges[v]:(f=new t.TokenSet,s.node.edges[v]=f),s.str.length==1&&(f.final=!0),i.push({node:f,editsRemaining:s.editsRemaining-1,str:d+s.str.slice(2)})}}}return r},t.TokenSet.fromString=function(e){for(var n=new t.TokenSet,r=n,i=0,s=e.length;i=e;n--){var r=this.uncheckedNodes[n],i=r.child.toString();i in this.minimizedNodes?r.parent.edges[r.char]=this.minimizedNodes[i]:(r.child._str=i,this.minimizedNodes[i]=r.child),this.uncheckedNodes.pop()}};t.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},t.Index.prototype.search=function(e){return this.query(function(n){var r=new t.QueryParser(e,n);r.parse()})},t.Index.prototype.query=function(e){for(var n=new t.Query(this.fields),r=Object.create(null),i=Object.create(null),s=Object.create(null),o=Object.create(null),a=Object.create(null),l=0;l1?this._b=1:this._b=e},t.Builder.prototype.k1=function(e){this._k1=e},t.Builder.prototype.add=function(e,n){var r=e[this._ref],i=Object.keys(this._fields);this._documents[r]=n||{},this.documentCount+=1;for(var s=0;s=this.length)return t.QueryLexer.EOS;var e=this.str.charAt(this.pos);return this.pos+=1,e},t.QueryLexer.prototype.width=function(){return this.pos-this.start},t.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},t.QueryLexer.prototype.backup=function(){this.pos-=1},t.QueryLexer.prototype.acceptDigitRun=function(){var e,n;do e=this.next(),n=e.charCodeAt(0);while(n>47&&n<58);e!=t.QueryLexer.EOS&&this.backup()},t.QueryLexer.prototype.more=function(){return this.pos1&&(e.backup(),e.emit(t.QueryLexer.TERM)),e.ignore(),e.more())return t.QueryLexer.lexText},t.QueryLexer.lexEditDistance=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(t.QueryLexer.EDIT_DISTANCE),t.QueryLexer.lexText},t.QueryLexer.lexBoost=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(t.QueryLexer.BOOST),t.QueryLexer.lexText},t.QueryLexer.lexEOS=function(e){e.width()>0&&e.emit(t.QueryLexer.TERM)},t.QueryLexer.termSeparator=t.tokenizer.separator,t.QueryLexer.lexText=function(e){for(;;){var n=e.next();if(n==t.QueryLexer.EOS)return t.QueryLexer.lexEOS;if(n.charCodeAt(0)==92){e.escapeCharacter();continue}if(n==":")return t.QueryLexer.lexField;if(n=="~")return e.backup(),e.width()>0&&e.emit(t.QueryLexer.TERM),t.QueryLexer.lexEditDistance;if(n=="^")return e.backup(),e.width()>0&&e.emit(t.QueryLexer.TERM),t.QueryLexer.lexBoost;if(n=="+"&&e.width()===1||n=="-"&&e.width()===1)return e.emit(t.QueryLexer.PRESENCE),t.QueryLexer.lexText;if(n.match(t.QueryLexer.termSeparator))return t.QueryLexer.lexTerm}},t.QueryParser=function(e,n){this.lexer=new t.QueryLexer(e),this.query=n,this.currentClause={},this.lexemeIdx=0},t.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var e=t.QueryParser.parseClause;e;)e=e(this);return this.query},t.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},t.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},t.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},t.QueryParser.parseClause=function(e){var n=e.peekLexeme();if(n!=null)switch(n.type){case t.QueryLexer.PRESENCE:return t.QueryParser.parsePresence;case t.QueryLexer.FIELD:return t.QueryParser.parseField;case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var r="expected either a field or a term, found "+n.type;throw n.str.length>=1&&(r+=" with value '"+n.str+"'"),new t.QueryParseError(r,n.start,n.end)}},t.QueryParser.parsePresence=function(e){var n=e.consumeLexeme();if(n!=null){switch(n.str){case"-":e.currentClause.presence=t.Query.presence.PROHIBITED;break;case"+":e.currentClause.presence=t.Query.presence.REQUIRED;break;default:var r="unrecognised presence operator'"+n.str+"'";throw new t.QueryParseError(r,n.start,n.end)}var i=e.peekLexeme();if(i==null){var r="expecting term or field, found nothing";throw new t.QueryParseError(r,n.start,n.end)}switch(i.type){case t.QueryLexer.FIELD:return t.QueryParser.parseField;case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var r="expecting term or field, found '"+i.type+"'";throw new t.QueryParseError(r,i.start,i.end)}}},t.QueryParser.parseField=function(e){var n=e.consumeLexeme();if(n!=null){if(e.query.allFields.indexOf(n.str)==-1){var r=e.query.allFields.map(function(o){return"'"+o+"'"}).join(", "),i="unrecognised field '"+n.str+"', possible fields: "+r;throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.fields=[n.str];var s=e.peekLexeme();if(s==null){var i="expecting term, found nothing";throw new t.QueryParseError(i,n.start,n.end)}switch(s.type){case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var i="expecting term, found '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},t.QueryParser.parseTerm=function(e){var n=e.consumeLexeme();if(n!=null){e.currentClause.term=n.str.toLowerCase(),n.str.indexOf("*")!=-1&&(e.currentClause.usePipeline=!1);var r=e.peekLexeme();if(r==null){e.nextClause();return}switch(r.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+r.type+"'";throw new t.QueryParseError(i,r.start,r.end)}}},t.QueryParser.parseEditDistance=function(e){var n=e.consumeLexeme();if(n!=null){var r=parseInt(n.str,10);if(isNaN(r)){var i="edit distance must be numeric";throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.editDistance=r;var s=e.peekLexeme();if(s==null){e.nextClause();return}switch(s.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},t.QueryParser.parseBoost=function(e){var n=e.consumeLexeme();if(n!=null){var r=parseInt(n.str,10);if(isNaN(r)){var i="boost must be numeric";throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.boost=r;var s=e.peekLexeme();if(s==null){e.nextClause();return}switch(s.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},function(e,n){typeof define=="function"&&define.amd?define(n):typeof se=="object"?oe.exports=n():e.lunr=n()}(this,function(){return t})})()});var re=[];function G(t,e){re.push({selector:e,constructor:t})}var U=class{constructor(){this.alwaysVisibleMember=null;this.createComponents(document.body),this.ensureActivePageVisible(),this.ensureFocusedElementVisible(),this.listenForCodeCopies(),window.addEventListener("hashchange",()=>this.ensureFocusedElementVisible())}createComponents(e){re.forEach(n=>{e.querySelectorAll(n.selector).forEach(r=>{r.dataset.hasInstance||(new n.constructor({el:r,app:this}),r.dataset.hasInstance=String(!0))})})}filterChanged(){this.ensureFocusedElementVisible()}ensureActivePageVisible(){let e=document.querySelector(".tsd-navigation .current"),n=e?.parentElement;for(;n&&!n.classList.contains(".tsd-navigation");)n instanceof HTMLDetailsElement&&(n.open=!0),n=n.parentElement;if(e){let r=e.getBoundingClientRect().top-document.documentElement.clientHeight/4;document.querySelector(".site-menu").scrollTop=r}}ensureFocusedElementVisible(){if(this.alwaysVisibleMember&&(this.alwaysVisibleMember.classList.remove("always-visible"),this.alwaysVisibleMember.firstElementChild.remove(),this.alwaysVisibleMember=null),!location.hash)return;let e=document.getElementById(location.hash.substring(1));if(!e)return;let n=e.parentElement;for(;n&&n.tagName!=="SECTION";)n=n.parentElement;if(n&&n.offsetParent==null){this.alwaysVisibleMember=n,n.classList.add("always-visible");let r=document.createElement("p");r.classList.add("warning"),r.textContent="This member is normally hidden due to your filter settings.",n.prepend(r)}}listenForCodeCopies(){document.querySelectorAll("pre > button").forEach(e=>{let n;e.addEventListener("click",()=>{e.previousElementSibling instanceof HTMLElement&&navigator.clipboard.writeText(e.previousElementSibling.innerText.trim()),e.textContent="Copied!",e.classList.add("visible"),clearTimeout(n),n=setTimeout(()=>{e.classList.remove("visible"),n=setTimeout(()=>{e.textContent="Copy"},100)},1e3)})})}};var ie=(t,e=100)=>{let n;return()=>{clearTimeout(n),n=setTimeout(()=>t(),e)}};var de=De(ae());async function le(t,e){if(!window.searchData)return;let n=await fetch(window.searchData),r=new Blob([await n.arrayBuffer()]).stream().pipeThrough(new DecompressionStream("gzip")),i=await new Response(r).json();t.data=i,t.index=de.Index.load(i.index),e.classList.remove("loading"),e.classList.add("ready")}function he(){let t=document.getElementById("tsd-search");if(!t)return;let e={base:t.dataset.base+"/"},n=document.getElementById("tsd-search-script");t.classList.add("loading"),n&&(n.addEventListener("error",()=>{t.classList.remove("loading"),t.classList.add("failure")}),n.addEventListener("load",()=>{le(e,t)}),le(e,t));let r=document.querySelector("#tsd-search input"),i=document.querySelector("#tsd-search .results");if(!r||!i)throw new Error("The input field or the result list wrapper was not found");let s=!1;i.addEventListener("mousedown",()=>s=!0),i.addEventListener("mouseup",()=>{s=!1,t.classList.remove("has-focus")}),r.addEventListener("focus",()=>t.classList.add("has-focus")),r.addEventListener("blur",()=>{s||(s=!1,t.classList.remove("has-focus"))}),Ae(t,i,r,e)}function Ae(t,e,n,r){n.addEventListener("input",ie(()=>{Ne(t,e,n,r)},200));let i=!1;n.addEventListener("keydown",s=>{i=!0,s.key=="Enter"?Ve(e,n):s.key=="Escape"?n.blur():s.key=="ArrowUp"?ue(e,-1):s.key==="ArrowDown"?ue(e,1):i=!1}),n.addEventListener("keypress",s=>{i&&s.preventDefault()}),document.body.addEventListener("keydown",s=>{s.altKey||s.ctrlKey||s.metaKey||!n.matches(":focus")&&s.key==="/"&&(n.focus(),s.preventDefault())})}function Ne(t,e,n,r){if(!r.index||!r.data)return;e.textContent="";let i=n.value.trim(),s;if(i){let o=i.split(" ").map(a=>a.length?`*${a}*`:"").join(" ");s=r.index.search(o)}else s=[];for(let o=0;oa.score-o.score);for(let o=0,a=Math.min(10,s.length);o`,d=ce(l.name,i);globalThis.DEBUG_SEARCH_WEIGHTS&&(d+=` (score: ${s[o].score.toFixed(2)})`),l.parent&&(d=` - ${ce(l.parent,i)}.${d}`);let v=document.createElement("li");v.classList.value=l.classes??"";let f=document.createElement("a");f.href=r.base+l.url,f.innerHTML=u+d,v.append(f),e.appendChild(v)}}function ue(t,e){let n=t.querySelector(".current");if(!n)n=t.querySelector(e==1?"li:first-child":"li:last-child"),n&&n.classList.add("current");else{let r=n;if(e===1)do r=r.nextElementSibling??void 0;while(r instanceof HTMLElement&&r.offsetParent==null);else do r=r.previousElementSibling??void 0;while(r instanceof HTMLElement&&r.offsetParent==null);r&&(n.classList.remove("current"),r.classList.add("current"))}}function Ve(t,e){let n=t.querySelector(".current");if(n||(n=t.querySelector("li:first-child")),n){let r=n.querySelector("a");r&&(window.location.href=r.href),e.blur()}}function ce(t,e){if(e==="")return t;let n=t.toLocaleLowerCase(),r=e.toLocaleLowerCase(),i=[],s=0,o=n.indexOf(r);for(;o!=-1;)i.push(K(t.substring(s,o)),`${K(t.substring(o,o+r.length))}`),s=o+r.length,o=n.indexOf(r,s);return i.push(K(t.substring(s))),i.join("")}var Be={"&":"&","<":"<",">":">","'":"'",'"':"""};function K(t){return t.replace(/[&<>"'"]/g,e=>Be[e])}var C=class{constructor(e){this.el=e.el,this.app=e.app}};var F="mousedown",pe="mousemove",B="mouseup",J={x:0,y:0},fe=!1,ee=!1,He=!1,D=!1,me=/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);document.documentElement.classList.add(me?"is-mobile":"not-mobile");me&&"ontouchstart"in document.documentElement&&(He=!0,F="touchstart",pe="touchmove",B="touchend");document.addEventListener(F,t=>{ee=!0,D=!1;let e=F=="touchstart"?t.targetTouches[0]:t;J.y=e.pageY||0,J.x=e.pageX||0});document.addEventListener(pe,t=>{if(ee&&!D){let e=F=="touchstart"?t.targetTouches[0]:t,n=J.x-(e.pageX||0),r=J.y-(e.pageY||0);D=Math.sqrt(n*n+r*r)>10}});document.addEventListener(B,()=>{ee=!1});document.addEventListener("click",t=>{fe&&(t.preventDefault(),t.stopImmediatePropagation(),fe=!1)});var X=class extends C{constructor(n){super(n);this.className=this.el.dataset.toggle||"",this.el.addEventListener(B,r=>this.onPointerUp(r)),this.el.addEventListener("click",r=>r.preventDefault()),document.addEventListener(F,r=>this.onDocumentPointerDown(r)),document.addEventListener(B,r=>this.onDocumentPointerUp(r))}setActive(n){if(this.active==n)return;this.active=n,document.documentElement.classList.toggle("has-"+this.className,n),this.el.classList.toggle("active",n);let r=(this.active?"to-has-":"from-has-")+this.className;document.documentElement.classList.add(r),setTimeout(()=>document.documentElement.classList.remove(r),500)}onPointerUp(n){D||(this.setActive(!0),n.preventDefault())}onDocumentPointerDown(n){if(this.active){if(n.target.closest(".col-sidebar, .tsd-filter-group"))return;this.setActive(!1)}}onDocumentPointerUp(n){if(!D&&this.active&&n.target.closest(".col-sidebar")){let r=n.target.closest("a");if(r){let i=window.location.href;i.indexOf("#")!=-1&&(i=i.substring(0,i.indexOf("#"))),r.href.substring(0,i.length)==i&&setTimeout(()=>this.setActive(!1),250)}}}};var te;try{te=localStorage}catch{te={getItem(){return null},setItem(){}}}var Q=te;var ve=document.head.appendChild(document.createElement("style"));ve.dataset.for="filters";var Y=class extends C{constructor(n){super(n);this.key=`filter-${this.el.name}`,this.value=this.el.checked,this.el.addEventListener("change",()=>{this.setLocalStorage(this.el.checked)}),this.setLocalStorage(this.fromLocalStorage()),ve.innerHTML+=`html:not(.${this.key}) .tsd-is-${this.el.name} { display: none; } -`}fromLocalStorage(){let n=Q.getItem(this.key);return n?n==="true":this.el.checked}setLocalStorage(n){Q.setItem(this.key,n.toString()),this.value=n,this.handleValueChange()}handleValueChange(){this.el.checked=this.value,document.documentElement.classList.toggle(this.key,this.value),this.app.filterChanged(),document.querySelectorAll(".tsd-index-section").forEach(n=>{n.style.display="block";let r=Array.from(n.querySelectorAll(".tsd-index-link")).every(i=>i.offsetParent==null);n.style.display=r?"none":"block"})}};var Z=class extends C{constructor(n){super(n);this.summary=this.el.querySelector(".tsd-accordion-summary"),this.icon=this.summary.querySelector("svg"),this.key=`tsd-accordion-${this.summary.dataset.key??this.summary.textContent.trim().replace(/\s+/g,"-").toLowerCase()}`;let r=Q.getItem(this.key);this.el.open=r?r==="true":this.el.open,this.el.addEventListener("toggle",()=>this.update());let i=this.summary.querySelector("a");i&&i.addEventListener("click",()=>{location.assign(i.href)}),this.update()}update(){this.icon.style.transform=`rotate(${this.el.open?0:-90}deg)`,Q.setItem(this.key,this.el.open.toString())}};function ge(t){let e=Q.getItem("tsd-theme")||"os";t.value=e,ye(e),t.addEventListener("change",()=>{Q.setItem("tsd-theme",t.value),ye(t.value)})}function ye(t){document.documentElement.dataset.theme=t}var Le;function be(){let t=document.getElementById("tsd-nav-script");t&&(t.addEventListener("load",xe),xe())}async function xe(){let t=document.getElementById("tsd-nav-container");if(!t||!window.navigationData)return;let n=await(await fetch(window.navigationData)).arrayBuffer(),r=new Blob([n]).stream().pipeThrough(new DecompressionStream("gzip")),i=await new Response(r).json();Le=t.dataset.base+"/",t.innerHTML="";for(let s of i)we(s,t,[]);window.app.createComponents(t),window.app.ensureActivePageVisible()}function we(t,e,n){let r=e.appendChild(document.createElement("li"));if(t.children){let i=[...n,t.text],s=r.appendChild(document.createElement("details"));s.className=t.class?`${t.class} tsd-index-accordion`:"tsd-index-accordion",s.dataset.key=i.join("$");let o=s.appendChild(document.createElement("summary"));o.className="tsd-accordion-summary",o.innerHTML='',Ee(t,o);let a=s.appendChild(document.createElement("div"));a.className="tsd-accordion-details";let l=a.appendChild(document.createElement("ul"));l.className="tsd-nested-navigation";for(let u of t.children)we(u,l,i)}else Ee(t,r,t.class)}function Ee(t,e,n){if(t.path){let r=e.appendChild(document.createElement("a"));r.href=Le+t.path,n&&(r.className=n),location.href===r.href&&r.classList.add("current"),t.kind&&(r.innerHTML=``),r.appendChild(document.createElement("span")).textContent=t.text}else e.appendChild(document.createElement("span")).textContent=t.text}G(X,"a[data-toggle]");G(Z,".tsd-index-accordion");G(Y,".tsd-filter-item input[type=checkbox]");var Se=document.getElementById("tsd-theme");Se&&ge(Se);var je=new U;Object.defineProperty(window,"app",{value:je});he();be();})(); -/*! Bundled license information: - -lunr/lunr.js: - (** - * lunr - http://lunrjs.com - A bit like Solr, but much smaller and not as bright - 2.3.9 - * Copyright (C) 2020 Oliver Nightingale - * @license MIT - *) - (*! - * lunr.utils - * Copyright (C) 2020 Oliver Nightingale - *) - (*! - * lunr.Set - * Copyright (C) 2020 Oliver Nightingale - *) - (*! - * lunr.tokenizer - * Copyright (C) 2020 Oliver Nightingale - *) - (*! - * lunr.Pipeline - * Copyright (C) 2020 Oliver Nightingale - *) - (*! - * lunr.Vector - * Copyright (C) 2020 Oliver Nightingale - *) - (*! - * lunr.stemmer - * Copyright (C) 2020 Oliver Nightingale - * Includes code from - http://tartarus.org/~martin/PorterStemmer/js.txt - *) - (*! - * lunr.stopWordFilter - * Copyright (C) 2020 Oliver Nightingale - *) - (*! - * lunr.trimmer - * Copyright (C) 2020 Oliver Nightingale - *) - (*! - * lunr.TokenSet - * Copyright (C) 2020 Oliver Nightingale - *) - (*! - * lunr.Index - * Copyright (C) 2020 Oliver Nightingale - *) - (*! - * lunr.Builder - * Copyright (C) 2020 Oliver Nightingale - *) -*/ diff --git a/docs/assets/navigation.js b/docs/assets/navigation.js deleted file mode 100644 index 9b89bae2..00000000 --- a/docs/assets/navigation.js +++ /dev/null @@ -1 +0,0 @@ -window.navigationData = "data:application/octet-stream;base64,H4sIAAAAAAAACpWZ33PcJhCA/5frqyeNr+6P+M291BPPtE06d00fMn7AiDtRI6QAanLTyf8eJE4SCFg2j9Z++g5Jy7LgD/9vDPtsNrcb2opW6c3VpiOmtn83bdULpr9311/UphE2+MxltbndXm1ozUWlmNzcfpgVuwG9U4qcFw0VROtFsyCh8Xr7y5erWfQwYlmJC0MCGt5/7CU1vJWzgcaCn27W9+uSQAOGiv/H1InLEyCZGcAjWlIBiiEM3P2xJ4IbYuwPARKPAlyafeyZNJwIQLVAgMkQLj7Zy7vSWw7ByPgYfDFpX6Zh6RSeYqg0ln2zVaen9Lhm04UCHtNGt5YqeC4U9LpY0213+YyeVQsI2dqROPSdyOTE4vNQ0PiGfS6qLAM4eqp3E11Q+SiYEkcuLPLrOU6IKYJKhwm2P2oU0SY1vFm4hoFHntDXXBsiafJjRN4JRnjf9Dil5RC23/mpNpLp5HSNnDONMfcNl+gXMNMI856YXpFBhFIvOJhWJyaZxZKL5RJDpVY66zOy71a0M99cv7r54WW48mjaWuodEcwYlvxgnnqNA++VEWVq08rkl/KUMwe46p7ta35Mzib/wS8YYOLSvo+uFcSwfSd4cXQRj3Kni29SC5bfjnDFqj2tWVMaqI+CRm1Yck0OXAMEre6YEen0WPzZoVtlUiXXXUfNCodC5fYiC0Ho4UYQKrSBEVFkHZgpsYEMLq+OAYtrYMMU1gsJldXQiSipjoQLaiBFFlNz7liijo6XUclyV5FuaFwv5ettN45lMY6miy/Nrn7m5aufr3/cekMce6ApJUB/ikTZ3z79y6gBpA7AuYoj/JaR7TtCGSRzAMp1sO0pYBrCOE/7zCQkGuI4U9gEx6a4841Nr9mRU84kPR/snWlbyBSN075wvUwEyhAqOX+b1mQwP9ZUyXpPaLAy+i4Xwxn+IF3HQI8jSjZbbItpGzII4z1puDhnZS6M8NhHyEpsDGEYWyHwA66gkvMh2d/4wodsWwPbwFEmwJIb9GEdqsol2Rgq3f/Oa8jA8STAkvuv5QwGmvURVvLuqV3s3hPR56aDBxRd8+EONMQ1VbIegg2FbzpEW4j47r8lP7aqKc76mCuZ33P2yZZX215WHPjWEVby2vctngh9TuumaNrit0694SLROo2XUa0TEV1NUo2cU4xhoCV8UkMvypKtoDNMROmgdVkd864VCJ28EvUMjcrFAcGJmV1NpExvqpxkYQqitrF7zMbOB6Jy24XFuIJL6vwGyVMWN0eWuh+WfabtI6m2AVIiQpFazEjXME5deqUehxOCW7FIi9mOWTzRRCSkmV5iLQM3drMMs6mz2J+MKNyHD0icNHdkHTkLR9Y+icikFYsSl/JowVA6XBatYeggSt/R8c0bTvNOnwJlu7YFipuLg4J/iEr+Y2MSDHFAMBw45g4SnWIiwH9Ileu0xtRpjZpUGppUj18evwJ1qAwzSx0AAA==" \ No newline at end of file diff --git a/docs/assets/search.js b/docs/assets/search.js deleted file mode 100644 index 7a6d4747..00000000 --- a/docs/assets/search.js +++ /dev/null @@ -1 +0,0 @@ -window.searchData = "data:application/octet-stream;base64,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"; \ No newline at end of file diff --git a/docs/assets/style.css b/docs/assets/style.css deleted file mode 100644 index 108428c3..00000000 --- a/docs/assets/style.css +++ /dev/null @@ -1,1383 +0,0 @@ -:root { - /* Light */ - --light-color-background: #f2f4f8; - --light-color-background-secondary: #eff0f1; - --light-color-warning-text: #222; - --light-color-background-warning: #e6e600; - --light-color-icon-background: var(--light-color-background); - --light-color-accent: #c5c7c9; - --light-color-active-menu-item: var(--light-color-accent); - --light-color-text: #222; - --light-color-text-aside: #6e6e6e; - --light-color-link: #1f70c2; - - --light-color-ts-project: #b111c9; - --light-color-ts-module: var(--light-color-ts-project); - --light-color-ts-namespace: var(--light-color-ts-project); - --light-color-ts-enum: #7e6f15; - --light-color-ts-enum-member: var(--light-color-ts-enum); - --light-color-ts-variable: #4760ec; - --light-color-ts-function: #572be7; - --light-color-ts-class: #1f70c2; - --light-color-ts-interface: #108024; - --light-color-ts-constructor: var(--light-color-ts-class); - --light-color-ts-property: var(--light-color-ts-variable); - --light-color-ts-method: var(--light-color-ts-function); - --light-color-ts-call-signature: var(--light-color-ts-method); - --light-color-ts-index-signature: var(--light-color-ts-property); - --light-color-ts-constructor-signature: var(--light-color-ts-constructor); - --light-color-ts-parameter: var(--light-color-ts-variable); - /* type literal not included as links will never be generated to it */ - --light-color-ts-type-parameter: var(--light-color-ts-type-alias); - --light-color-ts-accessor: var(--light-color-ts-property); - --light-color-ts-get-signature: var(--light-color-ts-accessor); - --light-color-ts-set-signature: var(--light-color-ts-accessor); - --light-color-ts-type-alias: #d51270; - /* reference not included as links will be colored with the kind that it points to */ - - --light-external-icon: url("data:image/svg+xml;utf8,"); - --light-color-scheme: light; - - /* Dark */ - --dark-color-background: #2b2e33; - --dark-color-background-secondary: #1e2024; - --dark-color-background-warning: #bebe00; - --dark-color-warning-text: #222; - --dark-color-icon-background: var(--dark-color-background-secondary); - --dark-color-accent: #9096a2; - --dark-color-active-menu-item: #5d5d6a; - --dark-color-text: #f5f5f5; - --dark-color-text-aside: #dddddd; - --dark-color-link: #00aff4; - - --dark-color-ts-project: #e358ff; - --dark-color-ts-module: var(--dark-color-ts-project); - --dark-color-ts-namespace: var(--dark-color-ts-project); - --dark-color-ts-enum: #f4d93e; - --dark-color-ts-enum-member: var(--dark-color-ts-enum); - --dark-color-ts-variable: #798dff; - --dark-color-ts-function: #a280ff; - --dark-color-ts-class: #8ac4ff; - --dark-color-ts-interface: #6cff87; - --dark-color-ts-constructor: var(--dark-color-ts-class); - --dark-color-ts-property: var(--dark-color-ts-variable); - --dark-color-ts-method: var(--dark-color-ts-function); - --dark-color-ts-call-signature: var(--dark-color-ts-method); - --dark-color-ts-index-signature: var(--dark-color-ts-property); - --dark-color-ts-constructor-signature: var(--dark-color-ts-constructor); - --dark-color-ts-parameter: var(--dark-color-ts-variable); - /* type literal not included as links will never be generated to it */ - --dark-color-ts-type-parameter: var(--dark-color-ts-type-alias); - --dark-color-ts-accessor: var(--dark-color-ts-property); - --dark-color-ts-get-signature: var(--dark-color-ts-accessor); - --dark-color-ts-set-signature: var(--dark-color-ts-accessor); - --dark-color-ts-type-alias: #ff6492; - /* reference not included as links will be colored with the kind that it points to */ - - --dark-external-icon: url("data:image/svg+xml;utf8,"); - --dark-color-scheme: dark; -} - -@media (prefers-color-scheme: light) { - :root { - --color-background: var(--light-color-background); - --color-background-secondary: var(--light-color-background-secondary); - --color-background-warning: var(--light-color-background-warning); - --color-warning-text: var(--light-color-warning-text); - --color-icon-background: var(--light-color-icon-background); - --color-accent: var(--light-color-accent); - --color-active-menu-item: var(--light-color-active-menu-item); - --color-text: var(--light-color-text); - --color-text-aside: var(--light-color-text-aside); - --color-link: var(--light-color-link); - - --color-ts-module: var(--light-color-ts-module); - --color-ts-namespace: var(--light-color-ts-namespace); - --color-ts-enum: var(--light-color-ts-enum); - --color-ts-enum-member: var(--light-color-ts-enum-member); - --color-ts-variable: var(--light-color-ts-variable); - --color-ts-function: var(--light-color-ts-function); - --color-ts-class: var(--light-color-ts-class); - --color-ts-interface: var(--light-color-ts-interface); - --color-ts-constructor: var(--light-color-ts-constructor); - --color-ts-property: var(--light-color-ts-property); - --color-ts-method: var(--light-color-ts-method); - --color-ts-call-signature: var(--light-color-ts-call-signature); - --color-ts-index-signature: var(--light-color-ts-index-signature); - --color-ts-constructor-signature: var( - --light-color-ts-constructor-signature - ); - --color-ts-parameter: var(--light-color-ts-parameter); - --color-ts-type-parameter: var(--light-color-ts-type-parameter); - --color-ts-accessor: var(--light-color-ts-accessor); - --color-ts-get-signature: var(--light-color-ts-get-signature); - --color-ts-set-signature: var(--light-color-ts-set-signature); - --color-ts-type-alias: var(--light-color-ts-type-alias); - - --external-icon: var(--light-external-icon); - --color-scheme: var(--light-color-scheme); - } -} - -@media (prefers-color-scheme: dark) { - :root { - --color-background: var(--dark-color-background); - --color-background-secondary: var(--dark-color-background-secondary); - --color-background-warning: var(--dark-color-background-warning); - --color-warning-text: var(--dark-color-warning-text); - --color-icon-background: var(--dark-color-icon-background); - --color-accent: var(--dark-color-accent); - --color-active-menu-item: var(--dark-color-active-menu-item); - --color-text: var(--dark-color-text); - --color-text-aside: var(--dark-color-text-aside); - --color-link: var(--dark-color-link); - - --color-ts-module: var(--dark-color-ts-module); - --color-ts-namespace: var(--dark-color-ts-namespace); - --color-ts-enum: var(--dark-color-ts-enum); - --color-ts-enum-member: var(--dark-color-ts-enum-member); - --color-ts-variable: var(--dark-color-ts-variable); - --color-ts-function: var(--dark-color-ts-function); - --color-ts-class: var(--dark-color-ts-class); - --color-ts-interface: var(--dark-color-ts-interface); - --color-ts-constructor: var(--dark-color-ts-constructor); - --color-ts-property: var(--dark-color-ts-property); - --color-ts-method: var(--dark-color-ts-method); - --color-ts-call-signature: var(--dark-color-ts-call-signature); - --color-ts-index-signature: var(--dark-color-ts-index-signature); - --color-ts-constructor-signature: var( - --dark-color-ts-constructor-signature - ); - --color-ts-parameter: var(--dark-color-ts-parameter); - --color-ts-type-parameter: var(--dark-color-ts-type-parameter); - --color-ts-accessor: var(--dark-color-ts-accessor); - --color-ts-get-signature: var(--dark-color-ts-get-signature); - --color-ts-set-signature: var(--dark-color-ts-set-signature); - --color-ts-type-alias: var(--dark-color-ts-type-alias); - - --external-icon: var(--dark-external-icon); - --color-scheme: var(--dark-color-scheme); - } -} - -html { - color-scheme: var(--color-scheme); -} - -body { - margin: 0; -} - -:root[data-theme="light"] { - --color-background: var(--light-color-background); - --color-background-secondary: var(--light-color-background-secondary); - --color-background-warning: var(--light-color-background-warning); - --color-warning-text: var(--light-color-warning-text); - --color-icon-background: var(--light-color-icon-background); - --color-accent: var(--light-color-accent); - --color-active-menu-item: var(--light-color-active-menu-item); - --color-text: var(--light-color-text); - --color-text-aside: var(--light-color-text-aside); - --color-link: var(--light-color-link); - - --color-ts-module: var(--light-color-ts-module); - --color-ts-namespace: var(--light-color-ts-namespace); - --color-ts-enum: var(--light-color-ts-enum); - --color-ts-enum-member: var(--light-color-ts-enum-member); - --color-ts-variable: var(--light-color-ts-variable); - --color-ts-function: var(--light-color-ts-function); - --color-ts-class: var(--light-color-ts-class); - --color-ts-interface: var(--light-color-ts-interface); - --color-ts-constructor: var(--light-color-ts-constructor); - --color-ts-property: var(--light-color-ts-property); - --color-ts-method: var(--light-color-ts-method); - --color-ts-call-signature: var(--light-color-ts-call-signature); - --color-ts-index-signature: var(--light-color-ts-index-signature); - --color-ts-constructor-signature: var( - --light-color-ts-constructor-signature - ); - --color-ts-parameter: var(--light-color-ts-parameter); - --color-ts-type-parameter: var(--light-color-ts-type-parameter); - --color-ts-accessor: var(--light-color-ts-accessor); - --color-ts-get-signature: var(--light-color-ts-get-signature); - --color-ts-set-signature: var(--light-color-ts-set-signature); - --color-ts-type-alias: var(--light-color-ts-type-alias); - - --external-icon: var(--light-external-icon); - --color-scheme: var(--light-color-scheme); -} - -:root[data-theme="dark"] { - --color-background: var(--dark-color-background); - --color-background-secondary: var(--dark-color-background-secondary); - --color-background-warning: var(--dark-color-background-warning); - --color-warning-text: var(--dark-color-warning-text); - --color-icon-background: var(--dark-color-icon-background); - --color-accent: var(--dark-color-accent); - --color-active-menu-item: var(--dark-color-active-menu-item); - --color-text: var(--dark-color-text); - --color-text-aside: var(--dark-color-text-aside); - --color-link: var(--dark-color-link); - - --color-ts-module: var(--dark-color-ts-module); - --color-ts-namespace: var(--dark-color-ts-namespace); - --color-ts-enum: var(--dark-color-ts-enum); - --color-ts-enum-member: var(--dark-color-ts-enum-member); - --color-ts-variable: var(--dark-color-ts-variable); - --color-ts-function: var(--dark-color-ts-function); - --color-ts-class: var(--dark-color-ts-class); - --color-ts-interface: var(--dark-color-ts-interface); - --color-ts-constructor: var(--dark-color-ts-constructor); - --color-ts-property: var(--dark-color-ts-property); - --color-ts-method: var(--dark-color-ts-method); - --color-ts-call-signature: var(--dark-color-ts-call-signature); - --color-ts-index-signature: var(--dark-color-ts-index-signature); - --color-ts-constructor-signature: var( - --dark-color-ts-constructor-signature - ); - --color-ts-parameter: var(--dark-color-ts-parameter); - --color-ts-type-parameter: var(--dark-color-ts-type-parameter); - --color-ts-accessor: var(--dark-color-ts-accessor); - --color-ts-get-signature: var(--dark-color-ts-get-signature); - --color-ts-set-signature: var(--dark-color-ts-set-signature); - --color-ts-type-alias: var(--dark-color-ts-type-alias); - - --external-icon: var(--dark-external-icon); - --color-scheme: var(--dark-color-scheme); -} - -.always-visible, -.always-visible .tsd-signatures { - display: inherit !important; -} - -h1, -h2, -h3, -h4, -h5, -h6 { - line-height: 1.2; -} - -h1 > a, -h2 > a, -h3 > a, -h4 > a, -h5 > a, -h6 > a { - text-decoration: none; - color: var(--color-text); -} - -h1 { - font-size: 1.875rem; - margin: 0.67rem 0; -} - -h2 { - font-size: 1.5rem; - margin: 0.83rem 0; -} - -h3 { - font-size: 1.25rem; - margin: 1rem 0; -} - -h4 { - font-size: 1.05rem; - margin: 1.33rem 0; -} - -h5 { - font-size: 1rem; - margin: 1.5rem 0; -} - -h6 { - font-size: 0.875rem; - margin: 2.33rem 0; -} - -.uppercase { - text-transform: uppercase; -} - -dl, -menu, -ol, -ul { - margin: 1em 0; -} - -dd { - margin: 0 0 0 40px; -} - -.container { - max-width: 1700px; - padding: 0 2rem; -} - -/* Footer */ -.tsd-generator { - border-top: 1px solid var(--color-accent); - padding-top: 1rem; - padding-bottom: 1rem; - max-height: 3.5rem; -} - -.tsd-generator > p { - margin-top: 0; - margin-bottom: 0; - padding: 0 1rem; -} - -.container-main { - margin: 0 auto; - /* toolbar, footer, margin */ - min-height: calc(100vh - 41px - 56px - 4rem); -} - -@keyframes fade-in { - from { - opacity: 0; - } - to { - opacity: 1; - } -} -@keyframes fade-out { - from { - opacity: 1; - visibility: visible; - } - to { - opacity: 0; - } -} -@keyframes fade-in-delayed { - 0% { - opacity: 0; - } - 33% { - opacity: 0; - } - 100% { - opacity: 1; - } -} -@keyframes fade-out-delayed { - 0% { - opacity: 1; - visibility: visible; - } - 66% { - opacity: 0; - } - 100% { - opacity: 0; - } -} -@keyframes pop-in-from-right { - from { - transform: translate(100%, 0); - } - to { - transform: translate(0, 0); - } -} -@keyframes pop-out-to-right { - from { - transform: translate(0, 0); - visibility: visible; - } - to { - transform: translate(100%, 0); - } -} -body { - background: var(--color-background); - font-family: "Segoe UI", sans-serif; - font-size: 16px; - color: var(--color-text); -} - -a { - color: var(--color-link); - text-decoration: none; -} -a:hover { - text-decoration: underline; -} -a.external[target="_blank"] { - background-image: var(--external-icon); - background-position: top 3px right; - background-repeat: no-repeat; - padding-right: 13px; -} - -code, -pre { - font-family: Menlo, Monaco, Consolas, "Courier New", monospace; - padding: 0.2em; - margin: 0; - font-size: 0.875rem; - border-radius: 0.8em; -} - -pre { - position: relative; - white-space: pre; - white-space: pre-wrap; - word-wrap: break-word; - padding: 10px; - border: 1px solid var(--color-accent); -} -pre code { - padding: 0; - font-size: 100%; -} -pre > button { - position: absolute; - top: 10px; - right: 10px; - opacity: 0; - transition: opacity 0.1s; - box-sizing: border-box; -} -pre:hover > button, -pre > button.visible { - opacity: 1; -} - -blockquote { - margin: 1em 0; - padding-left: 1em; - border-left: 4px solid gray; -} - -.tsd-typography { - line-height: 1.333em; -} -.tsd-typography ul { - list-style: square; - padding: 0 0 0 20px; - margin: 0; -} -.tsd-typography .tsd-index-panel h3, -.tsd-index-panel .tsd-typography h3, -.tsd-typography h4, -.tsd-typography h5, -.tsd-typography h6 { - font-size: 1em; -} -.tsd-typography h5, -.tsd-typography h6 { - font-weight: normal; -} -.tsd-typography p, -.tsd-typography ul, -.tsd-typography ol { - margin: 1em 0; -} -.tsd-typography table { - border-collapse: collapse; - border: none; -} -.tsd-typography td, -.tsd-typography th { - padding: 6px 13px; - border: 1px solid var(--color-accent); -} -.tsd-typography thead, -.tsd-typography tr:nth-child(even) { - background-color: var(--color-background-secondary); -} - -.tsd-breadcrumb { - margin: 0; - padding: 0; - color: var(--color-text-aside); -} -.tsd-breadcrumb a { - color: var(--color-text-aside); - text-decoration: none; -} -.tsd-breadcrumb a:hover { - text-decoration: underline; -} -.tsd-breadcrumb li { - display: inline; -} -.tsd-breadcrumb li:after { - content: " / "; -} - -.tsd-comment-tags { - display: flex; - flex-direction: column; -} -dl.tsd-comment-tag-group { - display: flex; - align-items: center; - overflow: hidden; - margin: 0.5em 0; -} -dl.tsd-comment-tag-group dt { - display: flex; - margin-right: 0.5em; - font-size: 0.875em; - font-weight: normal; -} -dl.tsd-comment-tag-group dd { - margin: 0; -} -code.tsd-tag { - padding: 0.25em 0.4em; - border: 0.1em solid var(--color-accent); - margin-right: 0.25em; - font-size: 70%; -} -h1 code.tsd-tag:first-of-type { - margin-left: 0.25em; -} - -dl.tsd-comment-tag-group dd:before, -dl.tsd-comment-tag-group dd:after { - content: " "; -} -dl.tsd-comment-tag-group dd pre, -dl.tsd-comment-tag-group dd:after { - clear: both; -} -dl.tsd-comment-tag-group p { - margin: 0; -} - -.tsd-panel.tsd-comment .lead { - font-size: 1.1em; - line-height: 1.333em; - margin-bottom: 2em; -} -.tsd-panel.tsd-comment .lead:last-child { - margin-bottom: 0; -} - -.tsd-filter-visibility h4 { - font-size: 1rem; - padding-top: 0.75rem; - padding-bottom: 0.5rem; - margin: 0; -} -.tsd-filter-item:not(:last-child) { - margin-bottom: 0.5rem; -} -.tsd-filter-input { - display: flex; - width: fit-content; - width: -moz-fit-content; - align-items: center; - user-select: none; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - cursor: pointer; -} -.tsd-filter-input input[type="checkbox"] { - cursor: pointer; - position: absolute; - width: 1.5em; - height: 1.5em; - opacity: 0; -} -.tsd-filter-input input[type="checkbox"]:disabled { - pointer-events: none; -} -.tsd-filter-input svg { - cursor: pointer; - width: 1.5em; - height: 1.5em; - margin-right: 0.5em; - border-radius: 0.33em; - /* Leaving this at full opacity breaks event listeners on Firefox. - Don't remove unless you know what you're doing. */ - opacity: 0.99; -} -.tsd-filter-input input[type="checkbox"]:focus + svg { - transform: scale(0.95); -} -.tsd-filter-input input[type="checkbox"]:focus:not(:focus-visible) + svg { - transform: scale(1); -} -.tsd-checkbox-background { - fill: var(--color-accent); -} -input[type="checkbox"]:checked ~ svg .tsd-checkbox-checkmark { - stroke: var(--color-text); -} -.tsd-filter-input input:disabled ~ svg > .tsd-checkbox-background { - fill: var(--color-background); - stroke: var(--color-accent); - stroke-width: 0.25rem; -} -.tsd-filter-input input:disabled ~ svg > .tsd-checkbox-checkmark { - stroke: var(--color-accent); -} - -.tsd-theme-toggle { - padding-top: 0.75rem; -} -.tsd-theme-toggle > h4 { - display: inline; - vertical-align: middle; - margin-right: 0.75rem; -} - -.tsd-hierarchy { - list-style: square; - margin: 0; -} -.tsd-hierarchy .target { - font-weight: bold; -} - -.tsd-panel-group.tsd-index-group { - margin-bottom: 0; -} -.tsd-index-panel .tsd-index-list { - list-style: none; - line-height: 1.333em; - margin: 0; - padding: 0.25rem 0 0 0; - overflow: hidden; - display: grid; - grid-template-columns: repeat(3, 1fr); - column-gap: 1rem; - grid-template-rows: auto; -} -@media (max-width: 1024px) { - .tsd-index-panel .tsd-index-list { - grid-template-columns: repeat(2, 1fr); - } -} -@media (max-width: 768px) { - .tsd-index-panel .tsd-index-list { - grid-template-columns: repeat(1, 1fr); - } -} -.tsd-index-panel .tsd-index-list li { - -webkit-page-break-inside: avoid; - -moz-page-break-inside: avoid; - -ms-page-break-inside: avoid; - -o-page-break-inside: avoid; - page-break-inside: avoid; -} - -.tsd-flag { - display: inline-block; - padding: 0.25em 0.4em; - border-radius: 4px; - color: var(--color-comment-tag-text); - background-color: var(--color-comment-tag); - text-indent: 0; - font-size: 75%; - line-height: 1; - font-weight: normal; -} - -.tsd-anchor { - position: relative; - top: -100px; -} - -.tsd-member { - position: relative; -} -.tsd-member .tsd-anchor + h3 { - display: flex; - align-items: center; - margin-top: 0; - margin-bottom: 0; - border-bottom: none; -} - -.tsd-navigation.settings { - margin: 1rem 0; -} -.tsd-navigation > a, -.tsd-navigation .tsd-accordion-summary { - width: calc(100% - 0.5rem); -} -.tsd-navigation a, -.tsd-navigation summary > span, -.tsd-page-navigation a { - display: inline-flex; - align-items: center; - padding: 0.25rem; - color: var(--color-text); - text-decoration: none; - box-sizing: border-box; -} -.tsd-navigation a.current, -.tsd-page-navigation a.current { - background: var(--color-active-menu-item); -} -.tsd-navigation a:hover, -.tsd-page-navigation a:hover { - text-decoration: underline; -} -.tsd-navigation ul, -.tsd-page-navigation ul { - margin-top: 0; - margin-bottom: 0; - padding: 0; - list-style: none; -} -.tsd-navigation li, -.tsd-page-navigation li { - padding: 0; - max-width: 100%; -} -.tsd-nested-navigation { - margin-left: 3rem; -} -.tsd-nested-navigation > li > details { - margin-left: -1.5rem; -} -.tsd-small-nested-navigation { - margin-left: 1.5rem; -} -.tsd-small-nested-navigation > li > details { - margin-left: -1.5rem; -} - -.tsd-nested-navigation > li > a, -.tsd-nested-navigation > li > span { - width: calc(100% - 1.75rem - 0.5rem); -} - -.tsd-page-navigation ul { - padding-left: 1.75rem; -} - -#tsd-sidebar-links a { - margin-top: 0; - margin-bottom: 0.5rem; - line-height: 1.25rem; -} -#tsd-sidebar-links a:last-of-type { - margin-bottom: 0; -} - -a.tsd-index-link { - padding: 0.25rem 0 !important; - font-size: 1rem; - line-height: 1.25rem; - display: inline-flex; - align-items: center; - color: var(--color-text); -} -.tsd-accordion-summary { - list-style-type: none; /* hide marker on non-safari */ - outline: none; /* broken on safari, so just hide it */ -} -.tsd-accordion-summary::-webkit-details-marker { - display: none; /* hide marker on safari */ -} -.tsd-accordion-summary, -.tsd-accordion-summary a { - user-select: none; - -moz-user-select: none; - -webkit-user-select: none; - -ms-user-select: none; - - cursor: pointer; -} -.tsd-accordion-summary a { - width: calc(100% - 1.5rem); -} -.tsd-accordion-summary > * { - margin-top: 0; - margin-bottom: 0; - padding-top: 0; - padding-bottom: 0; -} -.tsd-index-accordion .tsd-accordion-summary > svg { - margin-left: 0.25rem; -} -.tsd-index-content > :not(:first-child) { - margin-top: 0.75rem; -} -.tsd-index-heading { - margin-top: 1.5rem; - margin-bottom: 0.75rem; -} - -.tsd-kind-icon { - margin-right: 0.5rem; - width: 1.25rem; - height: 1.25rem; - min-width: 1.25rem; - min-height: 1.25rem; -} -.tsd-kind-icon path { - transform-origin: center; - transform: scale(1.1); -} -.tsd-signature > .tsd-kind-icon { - margin-right: 0.8rem; -} - -.tsd-panel { - margin-bottom: 2.5rem; -} -.tsd-panel.tsd-member { - margin-bottom: 4rem; -} -.tsd-panel:empty { - display: none; -} -.tsd-panel > h1, -.tsd-panel > h2, -.tsd-panel > h3 { - margin: 1.5rem -1.5rem 0.75rem -1.5rem; - padding: 0 1.5rem 0.75rem 1.5rem; -} -.tsd-panel > h1.tsd-before-signature, -.tsd-panel > h2.tsd-before-signature, -.tsd-panel > h3.tsd-before-signature { - margin-bottom: 0; - border-bottom: none; -} - -.tsd-panel-group { - margin: 4rem 0; -} -.tsd-panel-group.tsd-index-group { - margin: 2rem 0; -} -.tsd-panel-group.tsd-index-group details { - margin: 2rem 0; -} - -#tsd-search { - transition: background-color 0.2s; -} -#tsd-search .title { - position: relative; - z-index: 2; -} -#tsd-search .field { - position: absolute; - left: 0; - top: 0; - right: 2.5rem; - height: 100%; -} -#tsd-search .field input { - box-sizing: border-box; - position: relative; - top: -50px; - z-index: 1; - width: 100%; - padding: 0 10px; - opacity: 0; - outline: 0; - border: 0; - background: transparent; - color: var(--color-text); -} -#tsd-search .field label { - position: absolute; - overflow: hidden; - right: -40px; -} -#tsd-search .field input, -#tsd-search .title, -#tsd-toolbar-links a { - transition: opacity 0.2s; -} -#tsd-search .results { - position: absolute; - visibility: hidden; - top: 40px; - width: 100%; - margin: 0; - padding: 0; - list-style: none; - box-shadow: 0 0 4px rgba(0, 0, 0, 0.25); -} -#tsd-search .results li { - background-color: var(--color-background); - line-height: initial; - padding: 4px; -} -#tsd-search .results li:nth-child(even) { - background-color: var(--color-background-secondary); -} -#tsd-search .results li.state { - display: none; -} -#tsd-search .results li.current:not(.no-results), -#tsd-search .results li:hover:not(.no-results) { - background-color: var(--color-accent); -} -#tsd-search .results a { - display: flex; - align-items: center; - padding: 0.25rem; - box-sizing: border-box; -} -#tsd-search .results a:before { - top: 10px; -} -#tsd-search .results span.parent { - color: var(--color-text-aside); - font-weight: normal; -} -#tsd-search.has-focus { - background-color: var(--color-accent); -} -#tsd-search.has-focus .field input { - top: 0; - opacity: 1; -} -#tsd-search.has-focus .title, -#tsd-search.has-focus #tsd-toolbar-links a { - z-index: 0; - opacity: 0; -} -#tsd-search.has-focus .results { - visibility: visible; -} -#tsd-search.loading .results li.state.loading { - display: block; -} -#tsd-search.failure .results li.state.failure { - display: block; -} - -#tsd-toolbar-links { - position: absolute; - top: 0; - right: 2rem; - height: 100%; - display: flex; - align-items: center; - justify-content: flex-end; -} -#tsd-toolbar-links a { - margin-left: 1.5rem; -} -#tsd-toolbar-links a:hover { - text-decoration: underline; -} - -.tsd-signature { - margin: 0 0 1rem 0; - padding: 1rem 0.5rem; - border: 1px solid var(--color-accent); - font-family: Menlo, Monaco, Consolas, "Courier New", monospace; - font-size: 14px; - overflow-x: auto; -} - -.tsd-signature-symbol { - color: var(--color-text-aside); - font-weight: normal; -} - -.tsd-signature-type { - font-style: italic; - font-weight: normal; -} - -.tsd-signatures { - padding: 0; - margin: 0 0 1em 0; - list-style-type: none; -} -.tsd-signatures .tsd-signature { - margin: 0; - border-color: var(--color-accent); - border-width: 1px 0; - transition: background-color 0.1s; -} -.tsd-description .tsd-signatures .tsd-signature { - border-width: 1px; -} - -ul.tsd-parameter-list, -ul.tsd-type-parameter-list { - list-style: square; - margin: 0; - padding-left: 20px; -} -ul.tsd-parameter-list > li.tsd-parameter-signature, -ul.tsd-type-parameter-list > li.tsd-parameter-signature { - list-style: none; - margin-left: -20px; -} -ul.tsd-parameter-list h5, -ul.tsd-type-parameter-list h5 { - font-size: 16px; - margin: 1em 0 0.5em 0; -} -.tsd-sources { - margin-top: 1rem; - font-size: 0.875em; -} -.tsd-sources a { - color: var(--color-text-aside); - text-decoration: underline; -} -.tsd-sources ul { - list-style: none; - padding: 0; -} - -.tsd-page-toolbar { - position: sticky; - z-index: 1; - top: 0; - left: 0; - width: 100%; - color: var(--color-text); - background: var(--color-background-secondary); - border-bottom: 1px var(--color-accent) solid; - transition: transform 0.3s ease-in-out; -} -.tsd-page-toolbar a { - color: var(--color-text); - text-decoration: none; -} -.tsd-page-toolbar a.title { - font-weight: bold; -} -.tsd-page-toolbar a.title:hover { - text-decoration: underline; -} -.tsd-page-toolbar .tsd-toolbar-contents { - display: flex; - justify-content: space-between; - height: 2.5rem; - margin: 0 auto; -} -.tsd-page-toolbar .table-cell { - position: relative; - white-space: nowrap; - line-height: 40px; -} -.tsd-page-toolbar .table-cell:first-child { - width: 100%; -} -.tsd-page-toolbar .tsd-toolbar-icon { - box-sizing: border-box; - line-height: 0; - padding: 12px 0; -} - -.tsd-widget { - display: inline-block; - overflow: hidden; - opacity: 0.8; - height: 40px; - transition: - opacity 0.1s, - background-color 0.2s; - vertical-align: bottom; - cursor: pointer; -} -.tsd-widget:hover { - opacity: 0.9; -} -.tsd-widget.active { - opacity: 1; - background-color: var(--color-accent); -} -.tsd-widget.no-caption { - width: 40px; -} -.tsd-widget.no-caption:before { - margin: 0; -} - -.tsd-widget.options, -.tsd-widget.menu { - display: none; -} -input[type="checkbox"] + .tsd-widget:before { - background-position: -120px 0; -} -input[type="checkbox"]:checked + .tsd-widget:before { - background-position: -160px 0; -} - -img { - max-width: 100%; -} - -.tsd-anchor-icon { - display: inline-flex; - align-items: center; - margin-left: 0.5rem; - vertical-align: middle; - color: var(--color-text); -} - -.tsd-anchor-icon svg { - width: 1em; - height: 1em; - visibility: hidden; -} - -.tsd-anchor-link:hover > .tsd-anchor-icon svg { - visibility: visible; -} - -.deprecated { - text-decoration: line-through !important; -} - -.warning { - padding: 1rem; - color: var(--color-warning-text); - background: var(--color-background-warning); -} - -.tsd-kind-project { - color: var(--color-ts-project); -} -.tsd-kind-module { - color: var(--color-ts-module); -} -.tsd-kind-namespace { - color: var(--color-ts-namespace); -} -.tsd-kind-enum { - color: var(--color-ts-enum); -} -.tsd-kind-enum-member { - color: var(--color-ts-enum-member); -} -.tsd-kind-variable { - color: var(--color-ts-variable); -} -.tsd-kind-function { - color: var(--color-ts-function); -} -.tsd-kind-class { - color: var(--color-ts-class); -} -.tsd-kind-interface { - color: var(--color-ts-interface); -} -.tsd-kind-constructor { - color: var(--color-ts-constructor); -} -.tsd-kind-property { - color: var(--color-ts-property); -} -.tsd-kind-method { - color: var(--color-ts-method); -} -.tsd-kind-call-signature { - color: var(--color-ts-call-signature); -} -.tsd-kind-index-signature { - color: var(--color-ts-index-signature); -} -.tsd-kind-constructor-signature { - color: var(--color-ts-constructor-signature); -} -.tsd-kind-parameter { - color: var(--color-ts-parameter); -} -.tsd-kind-type-literal { - color: var(--color-ts-type-literal); -} -.tsd-kind-type-parameter { - color: var(--color-ts-type-parameter); -} -.tsd-kind-accessor { - color: var(--color-ts-accessor); -} -.tsd-kind-get-signature { - color: var(--color-ts-get-signature); -} -.tsd-kind-set-signature { - color: var(--color-ts-set-signature); -} -.tsd-kind-type-alias { - color: var(--color-ts-type-alias); -} - -/* if we have a kind icon, don't color the text by kind */ -.tsd-kind-icon ~ span { - color: var(--color-text); -} - -* { - scrollbar-width: thin; - scrollbar-color: var(--color-accent) var(--color-icon-background); -} - -*::-webkit-scrollbar { - width: 0.75rem; -} - -*::-webkit-scrollbar-track { - background: var(--color-icon-background); -} - -*::-webkit-scrollbar-thumb { - background-color: var(--color-accent); - border-radius: 999rem; - border: 0.25rem solid var(--color-icon-background); -} - -/* mobile */ -@media (max-width: 769px) { - .tsd-widget.options, - .tsd-widget.menu { - display: inline-block; - } - - .container-main { - display: flex; - } - html .col-content { - float: none; - max-width: 100%; - width: 100%; - } - html .col-sidebar { - position: fixed !important; - overflow-y: auto; - -webkit-overflow-scrolling: touch; - z-index: 1024; - top: 0 !important; - bottom: 0 !important; - left: auto !important; - right: 0 !important; - padding: 1.5rem 1.5rem 0 0; - width: 75vw; - visibility: hidden; - background-color: var(--color-background); - transform: translate(100%, 0); - } - html .col-sidebar > *:last-child { - padding-bottom: 20px; - } - html .overlay { - content: ""; - display: block; - position: fixed; - z-index: 1023; - top: 0; - left: 0; - right: 0; - bottom: 0; - background-color: rgba(0, 0, 0, 0.75); - visibility: hidden; - } - - .to-has-menu .overlay { - animation: fade-in 0.4s; - } - - .to-has-menu .col-sidebar { - animation: pop-in-from-right 0.4s; - } - - .from-has-menu .overlay { - animation: fade-out 0.4s; - } - - .from-has-menu .col-sidebar { - animation: pop-out-to-right 0.4s; - } - - .has-menu body { - overflow: hidden; - } - .has-menu .overlay { - visibility: visible; - } - .has-menu .col-sidebar { - visibility: visible; - transform: translate(0, 0); - display: flex; - flex-direction: column; - gap: 1.5rem; - max-height: 100vh; - padding: 1rem 2rem; - } - .has-menu .tsd-navigation { - max-height: 100%; - } -} - -/* one sidebar */ -@media (min-width: 770px) { - .container-main { - display: grid; - grid-template-columns: minmax(0, 1fr) minmax(0, 2fr); - grid-template-areas: "sidebar content"; - margin: 2rem auto; - } - - .col-sidebar { - grid-area: sidebar; - } - .col-content { - grid-area: content; - padding: 0 1rem; - } -} -@media (min-width: 770px) and (max-width: 1399px) { - .col-sidebar { - max-height: calc(100vh - 2rem - 42px); - overflow: auto; - position: sticky; - top: 42px; - padding-top: 1rem; - } - .site-menu { - margin-top: 1rem; - } -} - -/* two sidebars */ -@media (min-width: 1200px) { - .container-main { - grid-template-columns: minmax(0, 1fr) minmax(0, 2.5fr) minmax(0, 20rem); - grid-template-areas: "sidebar content toc"; - } - - .col-sidebar { - display: contents; - } - - .page-menu { - grid-area: toc; - padding-left: 1rem; - } - .site-menu { - grid-area: sidebar; - } - - .site-menu { - margin-top: 1rem 0; - } - - .page-menu, - .site-menu { - max-height: calc(100vh - 2rem - 42px); - overflow: auto; - position: sticky; - top: 42px; - } -} diff --git a/docs/classes/Color.Color.md b/docs/classes/Color.Color.md new file mode 100644 index 00000000..5811762c --- /dev/null +++ b/docs/classes/Color.Color.md @@ -0,0 +1,16 @@ +[huetiful-js](README.md) / Modules + +# huetiful-js + +## Table of contents📜 + +### Modules📦 + +- [colors](modules/colors.md) +- [converters](modules/converters.md) +- [filterBy](modules/filterBy.md) +- [generators](modules/generators.md) +- [helpers](modules/helpers.md) +- [sortBy](modules/sortBy.md) +- [types](modules/types.md) +- [utils](modules/utils.md) diff --git a/docs/classes/Color.ColorArray.md b/docs/classes/Color.ColorArray.md new file mode 100644 index 00000000..5811762c --- /dev/null +++ b/docs/classes/Color.ColorArray.md @@ -0,0 +1,16 @@ +[huetiful-js](README.md) / Modules + +# huetiful-js + +## Table of contents📜 + +### Modules📦 + +- [colors](modules/colors.md) +- [converters](modules/converters.md) +- [filterBy](modules/filterBy.md) +- [generators](modules/generators.md) +- [helpers](modules/helpers.md) +- [sortBy](modules/sortBy.md) +- [types](modules/types.md) +- [utils](modules/utils.md) diff --git a/docs/classes/colors.Color.md b/docs/classes/colors.Color.md new file mode 100644 index 00000000..260f8ffa --- /dev/null +++ b/docs/classes/colors.Color.md @@ -0,0 +1,518 @@ +[huetiful-js](../README.md) / [Modules](../modules.md) / [colors](../modules/colors.md) / Color + +# Class: Color + +[colors](../modules/colors.md).Color + +## Table of contents + +### Constructors + +- [constructor](colors.Color.md#constructor) + +### Methods + +- [alpha](colors.Color.md#alpha) +- [brighten](colors.Color.md#brighten) +- [contrast](colors.Color.md#contrast) +- [darken](colors.Color.md#darken) +- [deficiency](colors.Color.md#deficiency) +- [earthtone](colors.Color.md#earthtone) +- [getChannel](colors.Color.md#getchannel) +- [getComplimentaryHue](colors.Color.md#getcomplimentaryhue) +- [getFarthestChroma](colors.Color.md#getfarthestchroma) +- [getFarthestHue](colors.Color.md#getfarthesthue) +- [getFarthestLightness](colors.Color.md#getfarthestlightness) +- [getHue](colors.Color.md#gethue) +- [getNearestChroma](colors.Color.md#getnearestchroma) +- [getNearestHue](colors.Color.md#getnearesthue) +- [getNearestLightness](colors.Color.md#getnearestlightness) +- [hueShift](colors.Color.md#hueshift) +- [isAchromatic](colors.Color.md#isachromatic) +- [isCool](colors.Color.md#iscool) +- [isWarm](colors.Color.md#iswarm) +- [luminance](colors.Color.md#luminance) +- [output](colors.Color.md#output) +- [ovetone](colors.Color.md#ovetone) +- [pairedScheme](colors.Color.md#pairedscheme) +- [pastel](colors.Color.md#pastel) +- [saturation](colors.Color.md#saturation) +- [scheme](colors.Color.md#scheme) +- [setChannel](colors.Color.md#setchannel) +- [toHex](colors.Color.md#tohex) +- [via](colors.Color.md#via) + +## Constructors + +### constructor + +• **new Color**(`c`, `options?`): [`Color`](colors.Color.md) + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `c` | [`ColorToken`](../modules/types.md#colortoken) | +| `options?` | [`ColorOptions`](../modules/types.md#coloroptions) | + +#### Returns + +[`Color`](colors.Color.md) + +## Methods + +### alpha + +▸ **alpha**(`amount?`): `number` \| [`Color`](colors.Color.md) + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `amount?` | `string` \| `number` | + +#### Returns + +`number` \| [`Color`](colors.Color.md) + +___ + +### brighten + +▸ **brighten**(`amount`, `colorspace`): [`Color`](colors.Color.md) + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `amount` | `string` \| `number` | +| `colorspace` | `any` | + +#### Returns + +[`Color`](colors.Color.md) + +___ + +### contrast + +▸ **contrast**(`against`): `number` + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `against` | [`Color`](colors.Color.md) \| ``"lightMode"`` \| ``"darkMode"`` | + +#### Returns + +`number` + +___ + +### darken + +▸ **darken**(`amount`): [`Color`](colors.Color.md) + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `amount` | `string` \| `number` | + +#### Returns + +[`Color`](colors.Color.md) + +___ + +### deficiency + +▸ **deficiency**(`deficiencyType?`, `severity?`): [`ColorToken`](../modules/types.md#colortoken) + +Returns the color as a simulation of the passed in type of color vision deficiency with the deficiency filter's intensity determined by the severity value. + +#### Parameters + +| Name | Type | Default value | Description | +| :------ | :------ | :------ | :------ | +| `deficiencyType?` | ``"red"`` \| ``"green"`` \| ``"blue"`` \| ``"monochromacy"`` | `undefined` | The type of color vision deficiency. To avoid writing the long types, the expected parameters are simply the colors that are hard to perceive for the type of color blindness. For example those with 'tritanopia' are unable to perceive 'blue' light. Default is 'red' when the defeciency parameter is undefined or any falsy value. | +| `severity` | `number` | `1` | The intensity of the filter. The exepected value is between [0,1]. For example 0.5 | + +#### Returns + +[`ColorToken`](../modules/types.md#colortoken) + +The color as its simulated variant as a hexadecimal string. + +**`See`** + +For a deep dive on color vision deficiency go to + +**`Example`** + +```ts +import { colorDeficiency, toHex } from 'huetiful-js' + +// Here we are simulating color blindness of tritanomaly or we can't see 'blue'. +// We are passing in our color as an array of channel values in the mode "rgb". The severity is set to 0.1 +let tritanomaly = colorDeficiency('blue') +console.log(tritanomaly(['rgb', 230, 100, 50, 0.5], 0.1)) +// #dd663680 + +// Here we are simulating color blindness of tritanomaly or we can't see 'red'. The severity is not explicitly set so it defaults to 1 +let protanopia = colorDeficiency('red') +console.log(protanopia({ h: 20, w: 50, b: 30, mode: 'hwb' })) +// #9f9f9f +``` + +___ + +### earthtone + +▸ **earthtone**(`options?`): [`ColorToken`](../modules/types.md#colortoken) \| [`ColorArray`](colors.ColorArray.md) + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `options?` | [`EarthtoneOptions`](../modules/types.md#earthtoneoptions) | + +#### Returns + +[`ColorToken`](../modules/types.md#colortoken) \| [`ColorArray`](colors.ColorArray.md) + +___ + +### getChannel + +▸ **getChannel**(`channel`): `number` + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `channel` | `string` | + +#### Returns + +`number` + +___ + +### getComplimentaryHue + +▸ **getComplimentaryHue**(`mode?`, `colorObj?`): [`ColorToken`](../modules/types.md#colortoken) \| \{ `color`: [`ColorToken`](../modules/types.md#colortoken) ; `hue`: [`HueFamily`](../modules/types.md#huefamily) } + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `mode?` | [`HueColorSpaces`](../modules/types.md#huecolorspaces) | +| `colorObj?` | `boolean` | + +#### Returns + +[`ColorToken`](../modules/types.md#colortoken) \| \{ `color`: [`ColorToken`](../modules/types.md#colortoken) ; `hue`: [`HueFamily`](../modules/types.md#huefamily) } + +___ + +### getFarthestChroma + +▸ **getFarthestChroma**(`colors`, `colorObj?`): `number` \| \{ `color`: [`ColorToken`](../modules/types.md#colortoken) ; `factor`: `number` } + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `colors` | [`ColorToken`](../modules/types.md#colortoken)[] | +| `colorObj?` | `boolean` | + +#### Returns + +`number` \| \{ `color`: [`ColorToken`](../modules/types.md#colortoken) ; `factor`: `number` } + +___ + +### getFarthestHue + +▸ **getFarthestHue**(`colors`, `colorObj?`): `number` \| \{ `color`: [`ColorToken`](../modules/types.md#colortoken) ; `factor`: `number` } + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `colors` | [`ColorToken`](../modules/types.md#colortoken)[] | +| `colorObj?` | `boolean` | + +#### Returns + +`number` \| \{ `color`: [`ColorToken`](../modules/types.md#colortoken) ; `factor`: `number` } + +___ + +### getFarthestLightness + +▸ **getFarthestLightness**(`colors`, `colorObj?`): `number` \| \{ `color`: [`ColorToken`](../modules/types.md#colortoken) ; `factor`: `number` } + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `colors` | [`ColorToken`](../modules/types.md#colortoken)[] | +| `colorObj?` | `boolean` | + +#### Returns + +`number` \| \{ `color`: [`ColorToken`](../modules/types.md#colortoken) ; `factor`: `number` } + +___ + +### getHue + +▸ **getHue**(): [`HueFamily`](../modules/types.md#huefamily) + +#### Returns + +[`HueFamily`](../modules/types.md#huefamily) + +___ + +### getNearestChroma + +▸ **getNearestChroma**(`colors`): `number` \| \{ `color`: [`ColorToken`](../modules/types.md#colortoken) ; `factor`: `number` } + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `colors` | [`ColorToken`](../modules/types.md#colortoken)[] | + +#### Returns + +`number` \| \{ `color`: [`ColorToken`](../modules/types.md#colortoken) ; `factor`: `number` } + +___ + +### getNearestHue + +▸ **getNearestHue**(`colors`, `colorObj?`): `number` \| \{ `color`: [`ColorToken`](../modules/types.md#colortoken) ; `factor`: `number` } + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `colors` | [`ColorToken`](../modules/types.md#colortoken)[] | +| `colorObj?` | `boolean` | + +#### Returns + +`number` \| \{ `color`: [`ColorToken`](../modules/types.md#colortoken) ; `factor`: `number` } + +___ + +### getNearestLightness + +▸ **getNearestLightness**(`colors`, `colorObj?`): `number` \| \{ `color`: [`ColorToken`](../modules/types.md#colortoken) ; `factor`: `number` } + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `colors` | [`ColorToken`](../modules/types.md#colortoken)[] | +| `colorObj?` | `boolean` | + +#### Returns + +`number` \| \{ `color`: [`ColorToken`](../modules/types.md#colortoken) ; `factor`: `number` } + +___ + +### hueShift + +▸ **hueShift**(`options?`): [`ColorArray`](colors.ColorArray.md) + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `options?` | [`HueShiftOptions`](../modules/types.md#hueshiftoptions) | + +#### Returns + +[`ColorArray`](colors.ColorArray.md) + +___ + +### isAchromatic + +▸ **isAchromatic**(): `boolean` + +#### Returns + +`boolean` + +___ + +### isCool + +▸ **isCool**(): `boolean` + +#### Returns + +`boolean` + +___ + +### isWarm + +▸ **isWarm**(): `boolean` + +#### Returns + +`boolean` + +___ + +### luminance + +▸ **luminance**(`amount?`): `number` + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `amount?` | `number` | + +#### Returns + +`number` + +___ + +### output + +▸ **output**(): `any` + +#### Returns + +`any` + +___ + +### ovetone + +▸ **ovetone**(): `string` \| `boolean` + +#### Returns + +`string` \| `boolean` + +___ + +### pairedScheme + +▸ **pairedScheme**(`options?`): [`ColorArray`](colors.ColorArray.md) + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `options?` | [`PairedSchemeOptions`](../modules/types.md#pairedschemeoptions) | + +#### Returns + +[`ColorArray`](colors.ColorArray.md) + +___ + +### pastel + +▸ **pastel**(): [`Color`](colors.Color.md) + +#### Returns + +[`Color`](colors.Color.md) + +___ + +### saturation + +▸ **saturation**(`amount?`): `any` + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `amount?` | `string` \| `number` | + +#### Returns + +`any` + +___ + +### scheme + +▸ **scheme**(`scheme`, `easingFunc?`): [`ColorToken`](../modules/types.md#colortoken)[] \| [`ColorArray`](colors.ColorArray.md) + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `scheme` | ``"analogous"`` \| ``"triadic"`` \| ``"tetradic"`` \| ``"complementary"`` | +| `easingFunc?` | (`t`: `number`) => `number` | + +#### Returns + +[`ColorToken`](../modules/types.md#colortoken)[] \| [`ColorArray`](colors.ColorArray.md) + +___ + +### setChannel + +▸ **setChannel**(`modeChannel`, `value`): [`Color`](colors.Color.md) + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `modeChannel` | `string` | +| `value` | `string` \| `number` | + +#### Returns + +[`Color`](colors.Color.md) + +___ + +### toHex + +▸ **toHex**(): [`Color`](colors.Color.md) + +#### Returns + +[`Color`](colors.Color.md) + +___ + +### via + +▸ **via**(`origin`, `t?`, `options?`): `string` + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `origin` | [`ColorToken`](../modules/types.md#colortoken) | +| `t?` | `number` | +| `options?` | `Object` | +| `options.chromaInterpolator` | [`Interpolator`](../modules/types.md#interpolator) | +| `options.easingFunc` | (`t`: `number`) => `number` | +| `options.hueFixup` | (`arr`: `number`[]) => `number`[] | +| `options.hueInterpolator` | [`Interpolator`](../modules/types.md#interpolator) | +| `options.lightnessInterpolator` | [`Interpolator`](../modules/types.md#interpolator) | + +#### Returns + +`string` diff --git a/docs/classes/colors.ColorArray.html b/docs/classes/colors.ColorArray.html deleted file mode 100644 index ef56dd83..00000000 --- a/docs/classes/colors.ColorArray.html +++ /dev/null @@ -1,302 +0,0 @@ -ColorArray | huetiful-js

Hierarchy

  • Array
    • ColorArray

Constructors

Properties

[unscopables]: {
    [unscopables]?: boolean;
    length?: boolean;
    [iterator]?: any;
    concat?: any;
    copyWithin?: any;
    entries?: any;
    every?: any;
    fill?: any;
    filter?: any;
    find?: any;
    findIndex?: any;
    forEach?: any;
    indexOf?: any;
    join?: any;
    keys?: any;
    lastIndexOf?: any;
    map?: any;
    pop?: any;
    push?: any;
    reduce?: any;
    reduceRight?: any;
    reverse?: any;
    shift?: any;
    slice?: any;
    some?: any;
    sort?: any;
    splice?: any;
    toLocaleString?: any;
    toString?: any;
    unshift?: any;
    values?: any;
}

Is an object whose properties have the value 'true' -when they will be absent when used in a 'with' statement.

-

Type declaration

  • Optional Readonly [unscopables]?: boolean

    Is an object whose properties have the value 'true' -when they will be absent when used in a 'with' statement.

    -
  • Optional length?: boolean

    Gets or sets the length of the array. This is a number one higher than the highest index in the array.

    -
length: number

Gets or sets the length of the array. This is a number one higher than the highest index in the array.

-
[species]: ArrayConstructor

Methods

  • Iterator

    -

    Returns IterableIterator<any>

  • Combines two or more arrays. -This method returns a new array without modifying any existing arrays.

    -

    Parameters

    • Rest ...items: ConcatArray<any>[]

      Additional arrays and/or items to add to the end of the array.

      -

    Returns any[]

  • Combines two or more arrays. -This method returns a new array without modifying any existing arrays.

    -

    Parameters

    • Rest ...items: any[]

      Additional arrays and/or items to add to the end of the array.

      -

    Returns any[]

  • Returns the this object after copying a section of the array identified by start and end -to the same array starting at position target

    -

    Parameters

    • target: number

      If target is negative, it is treated as length+target where length is the -length of the array.

      -
    • start: number

      If start is negative, it is treated as length+start. If end is negative, it -is treated as length+end.

      -
    • Optional end: number

      If not specified, length of the this object is used as its default value.

      -

    Returns ColorArray

  • Takes an array of colors and finds the best matches for a set of predefined palettes. The function does not work on achromatic colors, you may use isAchromatic to filter grays from your collection before passing it to the function.

    -

    Parameters

    • Optional schemeType: "analogous" | "triadic" | "tetradic" | "complementary"

      (Optional) The palette type you want to return.

      -

    Returns object | ColorToken[]

    An array of colors if the scheme parameter is specified else it returns an object of all the palette types as keys and their values as an array of colors. If no colors are valid for the palette types it returns an empty array for the palette results.

    -

    Example

    import { discoverPalettes } from 'huetiful-js'

    let sample = [
    "#ffff00",
    "#00ffdc",
    "#00ff78",
    "#00c000",
    "#007e00",
    "#164100",
    "#720000",
    "#600000",
    "#4e0000",
    "#3e0000",
    "#310000",
    ]

    console.log(load(sample).discoverPalettes(sample, "tetradic").output())
    // [ '#ffff00ff', '#00ffdcff', '#310000ff', '#720000ff' ] -
    -
  • Returns an iterable of key, value pairs for every entry in the array

    -

    Returns IterableIterator<[number, any]>

  • Determines whether all the members of an array satisfy the specified test.

    -

    Type Parameters

    • S extends any

    Parameters

    • predicate: ((value, index, array) => value is S)

      A function that accepts up to three arguments. The every method calls -the predicate function for each element in the array until the predicate returns a value -which is coercible to the Boolean value false, or until the end of the array.

      -
        • (value, index, array): value is S
        • Parameters

          • value: any
          • index: number
          • array: any[]

          Returns value is S

    • Optional thisArg: any

      An object to which the this keyword can refer in the predicate function. -If thisArg is omitted, undefined is used as the this value.

      -

    Returns this is S[]

  • Determines whether all the members of an array satisfy the specified test.

    -

    Parameters

    • predicate: ((value, index, array) => unknown)

      A function that accepts up to three arguments. The every method calls -the predicate function for each element in the array until the predicate returns a value -which is coercible to the Boolean value false, or until the end of the array.

      -
        • (value, index, array): unknown
        • Parameters

          • value: any
          • index: number
          • array: any[]

          Returns unknown

    • Optional thisArg: any

      An object to which the this keyword can refer in the predicate function. -If thisArg is omitted, undefined is used as the this value.

      -

    Returns boolean

  • Changes all array elements from start to end index to a static value and returns the modified array

    -

    Parameters

    • value: any

      value to fill array section with

      -
    • Optional start: number

      index to start filling the array at. If start is negative, it is treated as -length+start where length is the length of the array.

      -
    • Optional end: number

      index to stop filling the array at. If end is negative, it is treated as -length+end.

      -

    Returns ColorArray

  • Returns the elements of an array that meet the condition specified in a callback function.

    -

    Type Parameters

    • S extends any

    Parameters

    • predicate: ((value, index, array) => value is S)

      A function that accepts up to three arguments. The filter method calls the predicate function one time for each element in the array.

      -
        • (value, index, array): value is S
        • Parameters

          • value: any
          • index: number
          • array: any[]

          Returns value is S

    • Optional thisArg: any

      An object to which the this keyword can refer in the predicate function. If thisArg is omitted, undefined is used as the this value.

      -

    Returns S[]

  • Returns the elements of an array that meet the condition specified in a callback function.

    -

    Parameters

    • predicate: ((value, index, array) => unknown)

      A function that accepts up to three arguments. The filter method calls the predicate function one time for each element in the array.

      -
        • (value, index, array): unknown
        • Parameters

          • value: any
          • index: number
          • array: any[]

          Returns unknown

    • Optional thisArg: any

      An object to which the this keyword can refer in the predicate function. If thisArg is omitted, undefined is used as the this value.

      -

    Returns any[]

  • Returns an array of colors with the specified contrast range. The contrast is tested against a comparison color (the 'against' param) and the specified contrast ranges.

    -

    Parameters

    • against: ColorToken
    • startContrast: number = 0.05

      The minimum end of the contrast range.

      -
    • Optional endContrast: number

      The maximum end of the contrast range.

      -

    Returns ColorArray

    Array of filtered colors.

    -

    Example

    import { filterByContrast } from 'huetiful-js'

    let sample = [
    '#00ffdc',
    '#00ff78',
    '#00c000',
    '#007e00',
    '#164100',
    '#ffff00',
    '#310000',
    '#3e0000',
    '#4e0000',
    '#600000',
    '#720000',
    ]

    console.log(filterByContrast(sample, 'green', '>=3'))
    // [ '#00ffdc', '#00ff78', '#ffff00', '#310000', '#3e0000', '#4e0000' ] -
    -
  • Returns an array of colors with the specified distance range. The distance is tested against a comparison color (the 'against' param) and the specified distance ranges.

    -

    Parameters

    • against: ColorToken
    • startDistance: number = 0.05

      The minimum end of the distance range.

      -
    • Optional endDistance: number

      The maximum end of the distance range.

      -
    • Optional mode: ColorSpaces

      The color space to calculate the distance in .

      -
    • Optional weights: [number, number, number, number]

      The weighting values to pass to the Euclidean function. Default is [1,1,1,0].

      -

    Returns ColorArray

    Array of filtered colors.

    -

    Example

    import { filterByDistance } from 'huetiful-js'

    let sample = [
    "#ffff00",
    "#00ffdc",
    "#00ff78",
    "#00c000",
    "#007e00",
    "#164100",
    "#720000",
    "#600000",
    ]

    console.log(filterByDistance(sample, "yellow", 0.1))
    // [ '#ffff00' ] -
    -
  • Returns colors in the specified hue ranges between 0 to 360.

    -

    Parameters

    • startHue: number = 0

      The minimum end of the hue range.

      -
    • endHue: number = 360

      The maximum end of the hue range.

      -

    Returns ColorArray

    Array of the filtered colors.

    -

    Example

    let sample = [
    '#00ffdc',
    '#00ff78',
    '#00c000',
    '#007e00',
    '#164100',
    '#ffff00',
    '#310000',
    '#3e0000',
    '#4e0000',
    '#600000',
    '#720000',
    ]

    filterByHue(sample, 20, 80)

    // [ '#310000', '#3e0000', '#4e0000', '#600000', '#720000' ] -
    -
  • Returns an array of colors in the specified lightness range. The range is between 0 and 100.

    -

    Parameters

    • startLightness: number = 5

      The minimum end of the lightness range.

      -
    • endLightness: number = 100

      The maximum end of the lightness range.

      -

    Returns ColorArray

    Array of filtered colors.

    -

    Example

    import { filterByLightness } from 'huetiful-js'
    let sample = [
    '#00ffdc',
    '#00ff78',
    '#00c000',
    '#007e00',
    '#164100',
    '#ffff00',
    '#310000',
    '#3e0000',
    '#4e0000',
    '#600000',
    '#720000',
    ]

    filterByLightness(sample, 20, 80)

    // [ '#00c000', '#007e00', '#164100', '#720000' ] -
    -
  • Returns an array of colors in the specified luminance range. The range is normalised to [0,1].

    -

    Parameters

    • startLuminance: number = 0.05

      The minimum end of the luminance range.

      -
    • endLuminance: number = 1

      The maximum end of the luminance range.

      -

    Returns ColorArray

    Array of filtered colors.

    -

    Example

    import { filterByLuminance } from 'huetiful-js'
    let sample = [
    '#00ffdc',
    '#00ff78',
    '#00c000',
    '#007e00',
    '#164100',
    '#ffff00',
    '#310000',
    '#3e0000',
    '#4e0000',
    '#600000',
    '#720000',
    ]

    filterByLuminance(sample, 0.4, 0.9)

    // [ '#00ffdc', '#00ff78' ] -
    -
  • Returns an array of colors in the specified saturation range. The range is normalised to [0,1].

    -

    Parameters

    • startSaturation: number = 0.05

      The minimum end of the saturation range.

      -
    • endSaturation: number = 1

      The maximum end of the saturation range.

      -
    • Optional mode: HueColorSpaces

      The color space to fetch the saturation value from. Any color space with a chroma channel e.g 'lch' or 'hsl' will do.

      -

    Returns ColorArray

    Array of filtered colors.

    -

    Example

    import { filterByContrast } from 'huetiful-js'

    let sample = [
    '#00ffdc',
    '#00ff78',
    '#00c000',
    '#007e00',
    '#164100',
    '#ffff00',
    '#310000',
    '#3e0000',
    '#4e0000',
    '#600000',
    '#720000',
    ]

    console.log(filterByContrast(sample, 'green', '>=3'))
    // [ '#00ffdc', '#00ff78', '#ffff00', '#310000', '#3e0000', '#4e0000' ] -
    -
  • Returns the value of the first element in the array where predicate is true, and undefined -otherwise.

    -

    Type Parameters

    • S extends any

    Parameters

    • predicate: ((value, index, obj) => value is S)

      find calls predicate once for each element of the array, in ascending -order, until it finds one where predicate returns true. If such an element is found, find -immediately returns that element value. Otherwise, find returns undefined.

      -
        • (value, index, obj): value is S
        • Parameters

          • value: any
          • index: number
          • obj: any[]

          Returns value is S

    • Optional thisArg: any

      If provided, it will be used as the this value for each invocation of -predicate. If it is not provided, undefined is used instead.

      -

    Returns S

  • Parameters

    • predicate: ((value, index, obj) => unknown)
        • (value, index, obj): unknown
        • Parameters

          • value: any
          • index: number
          • obj: any[]

          Returns unknown

    • Optional thisArg: any

    Returns any

  • Returns the index of the first element in the array where predicate is true, and -1 -otherwise.

    -

    Parameters

    • predicate: ((value, index, obj) => unknown)

      find calls predicate once for each element of the array, in ascending -order, until it finds one where predicate returns true. If such an element is found, -findIndex immediately returns that element index. Otherwise, findIndex returns -1.

      -
        • (value, index, obj): unknown
        • Parameters

          • value: any
          • index: number
          • obj: any[]

          Returns unknown

    • Optional thisArg: any

      If provided, it will be used as the this value for each invocation of -predicate. If it is not provided, undefined is used instead.

      -

    Returns number

  • Performs the specified action for each element in an array.

    -

    Parameters

    • callbackfn: ((value, index, array) => void)

      A function that accepts up to three arguments. forEach calls the callbackfn function one time for each element in the array.

      -
        • (value, index, array): void
        • Parameters

          • value: any
          • index: number
          • array: any[]

          Returns void

    • Optional thisArg: any

      An object to which the this keyword can refer in the callbackfn function. If thisArg is omitted, undefined is used as the this value.

      -

    Returns void

  • Gets the largest hue value from the passed in colors.

    -

    Parameters

    • Optional colorSpace: HueColorSpaces

      The mode color space to perform the computation in.

      -
    • colorObj: boolean = false

      Optional boolean that makes the function return a custom object with factor (hue) and name of the color as keys. Default is false.

      -

    Returns number | {
        color: ColorToken;
        factor: number;
    }

    The largest hue value in the colors passed in or a custom object.

    -

    Example

    import { getFarthestHue } from 'huetiful-js'
    let sample = ['b2c3f1', '#a1bd2f', '#f3bac1']

    console.log(load(output).getFarthestHue('lch'))
    // 273.54920266436477 -
    -
  • Gets the largest lightness value from the passed in colors.

    -

    Parameters

    • Optional colorspace: HueColorSpaces
    • colorObj: boolean = false

      Optional boolean that makes the function return a custom object with factor (lightness) and name of the color as keys. Default is false.

      -

    Returns number | {
        color: ColorToken;
        factor: number;
    }

    The largest lightness value in the colors passed in or a custom object.

    -

    Example

    import { maxLightness } from 'huetiful-js'

    let sample = ["b2c3f1", "#a1bd2f", "#f3bac1"]

    console.log(load(sample).getFarthestLightness('lch', true))

    // { lightness: 80.94668903360088, name: '#f3bac1' } -
    -
  • Gets the smallest hue value from the passed in colors.

    -

    Parameters

    • Optional colorSpace: HueColorSpaces

      The mode color space to perform the computation in.

      -
    • colorObj: boolean = false

      Optional boolean that makes the function return a custom object with factor (hue) and name of the color as keys. Default is false.

      -

    Returns number | {
        color: ColorToken;
        factor: number;
    }

    The smallest hue value in the colors passed in or a custom object.

    -

    Example

    import { getNearestHue } from 'huetiful-js'

    let sample = ['b2c3f1', '#a1bd2f', '#f3bac1']

    console.log(load(sample).getNearestHue('lch'))
    // 12.462831644544274 -
    -
  • Gets the smallest lightness value from the passed in colors.

    -

    Parameters

    • Optional colorspace: HueColorSpaces
    • colorObj: boolean = false

      Optional boolean that makes the function return a custom object with factor (lightness) and name of the color as keys. Default is false.

      -

    Returns number | {
        color: ColorToken;
        factor: number;
    }

    The smallest lightness value in the colors passed in or a custom object.

    -

    Example

    import { minLightness } from 'huetiful-js'

    let sample = ["b2c3f1", "#a1bd2f", "#f3bac1"]

    console.log(load(sample).getNearestLightness('lch', true))

    // { lightness: 72.61647882089876, name: '#a1bd2f' } -
    -
  • Returns the index of the first occurrence of a value in an array, or -1 if it is not present.

    -

    Parameters

    • searchElement: any

      The value to locate in the array.

      -
    • Optional fromIndex: number

      The array index at which to begin the search. If fromIndex is omitted, the search starts at index 0.

      -

    Returns number

  • Returns a spline based interpolator function with customizable interpolation methods (passed in as 'kind') and optional channel specific overrides.If a color has a falsy channel for example black has an undefined hue channel some interpolation methods may return NaN affecting the final result.

    -

    Parameters

    • Optional colorspace: HueColorSpaces

      The colorspace to perform the color space in. Prefer uniform color spaces for better results such as Lch or Jch.

      -
    • Optional samples: number
    • Optional kind: "natural" | "monotone" | "basis"

      The type of the spline interpolation method. Default is basis.

      -
    • Optional closed: boolean

      Optional parameter to return the 'closed' variant of the 'kind' of interpolation method which can be useful for cyclical color scales. Default is false

      -
    • Optional options: InterpolatorOptions

      Optional channel specific overrides.

      -

    Returns ColorToken[]

    A hexadecimal representation of the resultant color.

    -
  • Adds all the elements of an array into a string, separated by the specified separator string.

    -

    Parameters

    • Optional separator: string

      A string used to separate one element of the array from the next in the resulting string. If omitted, the array elements are separated with a comma.

      -

    Returns string

  • Returns an iterable of keys in the array

    -

    Returns IterableIterator<number>

  • Returns the index of the last occurrence of a specified value in an array, or -1 if it is not present.

    -

    Parameters

    • searchElement: any

      The value to locate in the array.

      -
    • Optional fromIndex: number

      The array index at which to begin searching backward. If fromIndex is omitted, the search starts at the last index in the array.

      -

    Returns number

  • Calls a defined callback function on each element of an array, and returns an array that contains the results.

    -

    Type Parameters

    • U

    Parameters

    • callbackfn: ((value, index, array) => U)

      A function that accepts up to three arguments. The map method calls the callbackfn function one time for each element in the array.

      -
        • (value, index, array): U
        • Parameters

          • value: any
          • index: number
          • array: any[]

          Returns U

    • Optional thisArg: any

      An object to which the this keyword can refer in the callbackfn function. If thisArg is omitted, undefined is used as the this value.

      -

    Returns U[]

  • Removes the last element from an array and returns it. -If the array is empty, undefined is returned and the array is not modified.

    -

    Returns any

  • Appends new elements to the end of an array, and returns the new length of the array.

    -

    Parameters

    • Rest ...items: any[]

      New elements to add to the array.

      -

    Returns number

  • Calls the specified callback function for all the elements in an array. The return value of the callback function is the accumulated result, and is provided as an argument in the next call to the callback function.

    -

    Parameters

    • callbackfn: ((previousValue, currentValue, currentIndex, array) => any)

      A function that accepts up to four arguments. The reduce method calls the callbackfn function one time for each element in the array.

      -
        • (previousValue, currentValue, currentIndex, array): any
        • Parameters

          • previousValue: any
          • currentValue: any
          • currentIndex: number
          • array: any[]

          Returns any

    Returns any

  • Parameters

    • callbackfn: ((previousValue, currentValue, currentIndex, array) => any)
        • (previousValue, currentValue, currentIndex, array): any
        • Parameters

          • previousValue: any
          • currentValue: any
          • currentIndex: number
          • array: any[]

          Returns any

    • initialValue: any

    Returns any

  • Calls the specified callback function for all the elements in an array. The return value of the callback function is the accumulated result, and is provided as an argument in the next call to the callback function.

    -

    Type Parameters

    • U

    Parameters

    • callbackfn: ((previousValue, currentValue, currentIndex, array) => U)

      A function that accepts up to four arguments. The reduce method calls the callbackfn function one time for each element in the array.

      -
        • (previousValue, currentValue, currentIndex, array): U
        • Parameters

          • previousValue: U
          • currentValue: any
          • currentIndex: number
          • array: any[]

          Returns U

    • initialValue: U

      If initialValue is specified, it is used as the initial value to start the accumulation. The first call to the callbackfn function provides this value as an argument instead of an array value.

      -

    Returns U

  • Calls the specified callback function for all the elements in an array, in descending order. The return value of the callback function is the accumulated result, and is provided as an argument in the next call to the callback function.

    -

    Parameters

    • callbackfn: ((previousValue, currentValue, currentIndex, array) => any)

      A function that accepts up to four arguments. The reduceRight method calls the callbackfn function one time for each element in the array.

      -
        • (previousValue, currentValue, currentIndex, array): any
        • Parameters

          • previousValue: any
          • currentValue: any
          • currentIndex: number
          • array: any[]

          Returns any

    Returns any

  • Parameters

    • callbackfn: ((previousValue, currentValue, currentIndex, array) => any)
        • (previousValue, currentValue, currentIndex, array): any
        • Parameters

          • previousValue: any
          • currentValue: any
          • currentIndex: number
          • array: any[]

          Returns any

    • initialValue: any

    Returns any

  • Calls the specified callback function for all the elements in an array, in descending order. The return value of the callback function is the accumulated result, and is provided as an argument in the next call to the callback function.

    -

    Type Parameters

    • U

    Parameters

    • callbackfn: ((previousValue, currentValue, currentIndex, array) => U)

      A function that accepts up to four arguments. The reduceRight method calls the callbackfn function one time for each element in the array.

      -
        • (previousValue, currentValue, currentIndex, array): U
        • Parameters

          • previousValue: U
          • currentValue: any
          • currentIndex: number
          • array: any[]

          Returns U

    • initialValue: U

      If initialValue is specified, it is used as the initial value to start the accumulation. The first call to the callbackfn function provides this value as an argument instead of an array value.

      -

    Returns U

  • Reverses the elements in an array in place. -This method mutates the array and returns a reference to the same array.

    -

    Returns any[]

  • Removes the first element from an array and returns it. -If the array is empty, undefined is returned and the array is not modified.

    -

    Returns any

  • Returns a copy of a section of an array. -For both start and end, a negative index can be used to indicate an offset from the end of the array. -For example, -2 refers to the second to last element of the array.

    -

    Parameters

    • Optional start: number

      The beginning index of the specified portion of the array. -If start is undefined, then the slice begins at index 0.

      -
    • Optional end: number

      The end index of the specified portion of the array. This is exclusive of the element at the index 'end'. -If end is undefined, then the slice extends to the end of the array.

      -

    Returns any[]

  • Determines whether the specified callback function returns true for any element of an array.

    -

    Parameters

    • predicate: ((value, index, array) => unknown)

      A function that accepts up to three arguments. The some method calls -the predicate function for each element in the array until the predicate returns a value -which is coercible to the Boolean value true, or until the end of the array.

      -
        • (value, index, array): unknown
        • Parameters

          • value: any
          • index: number
          • array: any[]

          Returns unknown

    • Optional thisArg: any

      An object to which the this keyword can refer in the predicate function. -If thisArg is omitted, undefined is used as the this value.

      -

    Returns boolean

  • Sorts an array in place. -This method mutates the array and returns a reference to the same array.

    -

    Parameters

    • Optional compareFn: ((a, b) => number)

      Function used to determine the order of the elements. It is expected to return -a negative value if the first argument is less than the second argument, zero if they're equal, and a positive -value otherwise. If omitted, the elements are sorted in ascending, ASCII character order.

      -
      [11,2,22,1].sort((a, b) => a - b)
      -
      -
        • (a, b): number
        • Parameters

          • a: any
          • b: any

          Returns number

    Returns ColorArray

  • Sorts colors according to their contrast value as defined by WCAG. The contrast is tested against a comparison color (the 'against' param)

    -

    Parameters

    • against: ColorToken
    • Optional order: "asc" | "desc"

      The expected order of arrangement. Either 'asc' or 'desc'. Default is ascending ('asc')

      -

    Returns ColorArray

    An array of the sorted color values.

    -

    Example

    import { sortByContrast } from 'huetiful-js'

    let sample = ['purple', 'green', 'red', 'brown']
    console.log(sortByContrast(sample, 'yellow'))
    // [ 'red', 'green', 'brown', 'purple' ]

    console.log(sortByContrast(sample, 'yellow', 'desc'))
    // [ 'purple', 'brown', 'green', 'red' ] -
    -
  • Sorts colors according to their Euclidean distance. The distance factor is determined by the color space used (some color spaces are not symmetrical meaning that the distance between colorA and colorB is not equal to the distance between colorB and colorA ). The distance is computed from against a color which is used for comparison for all the colors in the array i.e it sorts the colors against the dist

    -

    Parameters

    • against: ColorToken

      The color to compare the distance with. All the distances are calculated between this color and the ones in the colors array.

      -
    • Optional order: "asc" | "desc"

      The expected order of arrangement. Either 'asc' or 'desc'. Default is ascending ('asc')

      -
    • Optional options: ColorDistanceOptions

    Returns ColorArray

    An array of the sorted color values.

    -

    Example

    import { sortByDistance } from 'huetiful-js'

    let sample = ['purple', 'green', 'red', 'brown']
    console.log(
    sortByDistance(sample, 'yellow', 'asc', {
    mode: 'lch',
    })
    )

    // [ 'brown', 'red', 'green', 'purple' ]

    let sample = ['purple', 'green', 'red', 'brown']
    console.log(
    sortByDistance(sample, 'yellow', 'asc', {
    mode: 'lch',
    })
    )

    // [ 'green', 'brown', 'red', 'purple' ] -
    -
  • Sorts colors according to hue values. It works with any color space with a hue channel. Note that hue values between HSL and Lch do not align. Achromatic colors are not supported

    -

    Parameters

    • order: "asc" | "desc"

      The expected order of arrangement. Either 'asc' or 'desc'. Default is ascending ('asc')

      -
    • colorspace: string = 'jch'

      The color space to compute the color distances in. All colors within the collection will be converted to mode. Also note that because differences in hue mapping certain color spaces such as HSL and LCH hue values do not align. Keep such quirks in mind to avoid weird results.

      -

    Returns ColorArray

    An array of the sorted color values.

    -

    Example

    let sample = [
    "#00ffdc",
    "#00ff78",
    "#00c000",
    "#007e00",
    "#164100",
    "#ffff00",
    "#310000",
    "#3e0000",
    "#4e0000",
    "#600000",
    "#720000",
    ];


    let sorted = sortByHue(sample);
    console.log(sorted)
    // [
    '#310000', '#3e0000',
    '#4e0000', '#600000',
    '#720000', '#ffff00',
    '#164100', '#00c000',
    '#007e00', '#00ff78',
    '#00ffdc'
    ]

    let sortedDescending = sortByHue(sample,'desc');
    console.log(sortedDescending)
    // [
    '#00ffdc', '#00ff78',
    '#007e00', '#00c000',
    '#164100', '#ffff00',
    '#720000', '#600000',
    '#4e0000', '#3e0000',
    '#310000'
    ] -
    -
  • Sorts colors according to their lightness.

    -

    Parameters

    • Optional order: "asc" | "desc"

      The expected order of arrangement. Either 'asc' or 'desc'. Default is ascending ('asc')

      -

    Returns ColorArray

    An array of the sorted color values.

    -

    Example

    import { sortByLightness } from "huetiful-js";

    let sample = [
    "#00ffdc",
    "#00ff78",
    "#00c000",
    "#007e00",
    "#164100",
    "#ffff00",
    "#310000",
    "#3e0000",
    "#4e0000",
    "#600000",
    "#720000",
    ]

    sortByLightness(sample)

    // [
    '#310000', '#3e0000',
    '#4e0000', '#600000',
    '#720000', '#164100',
    '#007e00', '#00c000',
    '#00ff78', '#00ffdc',
    '#ffff00'
    ]


    sortByLightness(sample,'desc')

    // [
    '#ffff00', '#00ffdc',
    '#00ff78', '#00c000',
    '#007e00', '#164100',
    '#720000', '#600000',
    '#4e0000', '#3e0000',
    '#310000'
    ] -
    -
  • Sorts colors according to the relative brightness as defined by WCAG definition.

    -

    Parameters

    • Optional order: "asc" | "desc"

      The expected order of arrangement. Either 'asc' or 'desc'. Default is ascending ('asc')

      -

    Returns ColorArray

    An array of the sorted color values.

    -

    Example

    import { sortByLuminance } from "huetiful-js";
    let sample = [
    "#00ffdc",
    "#00ff78",
    "#00c000",
    "#007e00",
    "#164100",
    "#ffff00",
    "#310000",
    "#3e0000",
    "#4e0000",
    "#600000",
    "#720000",
    ];



    let sorted = sortByLuminance(sample)
    console.log(sorted)
    // [
    '#310000', '#3e0000',
    '#4e0000', '#600000',
    '#720000', '#164100',
    '#007e00', '#00c000',
    '#00ff78', '#00ffdc',
    '#ffff00'
    ]

    let sortedDescending = sortByLuminance(sample, "desc");
    console.log(sortedDescending)
    // [
    '#ffff00', '#00ffdc',
    '#00ff78', '#00c000',
    '#007e00', '#164100',
    '#720000', '#600000',
    '#4e0000', '#3e0000',
    '#310000'
    ] -
    -
  • Sorts colors according to their saturation.

    -

    Parameters

    • order: "asc" | "desc"

      The expected order of arrangement. Either 'asc' or 'desc'. Default is ascending ('asc')

      -
    • Optional mode: HueColorSpaces

      The mode color space to compute the saturation value in. The default is jch .

      -

    Returns ColorArray

    An array of the sorted color values.

    -

    Example

    import { sortBySaturation } from "huetiful-js";
    let sample = [
    "#00ffdc",
    "#00ff78",
    "#00c000",
    "#007e00",
    "#164100",
    "#ffff00",
    "#310000",
    "#3e0000",
    "#4e0000",
    "#600000",
    "#720000",
    ];

    let sorted = sortBySaturation(sample);
    console.log(sorted);

    // [
    '#310000', '#3e0000',
    '#164100', '#4e0000',
    '#600000', '#720000',
    '#00ffdc', '#007e00',
    '#00ff78', '#00c000',
    '#ffff00'
    ]

    let sortedDescending = sortBySaturation(sample,'desc');
    console.log(sortedDescending)
    // [
    '#ffff00', '#00c000',
    '#00ff78', '#007e00',
    '#00ffdc', '#720000',
    '#600000', '#4e0000',
    '#164100', '#3e0000',
    '#310000'
    ] -
    -
  • Removes elements from an array and, if necessary, inserts new elements in their place, returning the deleted elements.

    -

    Parameters

    • start: number

      The zero-based location in the array from which to start removing elements.

      -
    • Optional deleteCount: number

      The number of elements to remove.

      -

    Returns any[]

    An array containing the elements that were deleted.

    -
  • Removes elements from an array and, if necessary, inserts new elements in their place, returning the deleted elements.

    -

    Parameters

    • start: number

      The zero-based location in the array from which to start removing elements.

      -
    • deleteCount: number

      The number of elements to remove.

      -
    • Rest ...items: any[]

      Elements to insert into the array in place of the deleted elements.

      -

    Returns any[]

    An array containing the elements that were deleted.

    -
  • Returns a string representation of an array. The elements are converted to string using their toLocaleString methods.

    -

    Returns string

  • Returns a string representation of an array.

    -

    Returns string

  • Inserts new elements at the start of an array, and returns the new length of the array.

    -

    Parameters

    • Rest ...items: any[]

      Elements to insert at the start of the array.

      -

    Returns number

  • Returns an iterable of values in the array

    -

    Returns IterableIterator<any>

  • Creates an array from an array-like object.

    -

    Type Parameters

    • T

    Parameters

    • arrayLike: ArrayLike<T>

      An array-like object to convert to an array.

      -

    Returns T[]

  • Creates an array from an iterable object.

    -

    Type Parameters

    • T

    • U

    Parameters

    • arrayLike: ArrayLike<T>

      An array-like object to convert to an array.

      -
    • mapfn: ((v, k) => U)

      A mapping function to call on every element of the array.

      -
        • (v, k): U
        • Parameters

          • v: T
          • k: number

          Returns U

    • Optional thisArg: any

      Value of 'this' used to invoke the mapfn.

      -

    Returns U[]

  • Creates an array from an iterable object.

    -

    Type Parameters

    • T

    Parameters

    • iterable: Iterable<T> | ArrayLike<T>

      An iterable object to convert to an array.

      -

    Returns T[]

  • Creates an array from an iterable object.

    -

    Type Parameters

    • T

    • U

    Parameters

    • iterable: Iterable<T> | ArrayLike<T>

      An iterable object to convert to an array.

      -
    • mapfn: ((v, k) => U)

      A mapping function to call on every element of the array.

      -
        • (v, k): U
        • Parameters

          • v: T
          • k: number

          Returns U

    • Optional thisArg: any

      Value of 'this' used to invoke the mapfn.

      -

    Returns U[]

  • Parameters

    • arg: any

    Returns arg is any[]

  • Returns a new array from a set of elements.

    -

    Type Parameters

    • T

    Parameters

    • Rest ...items: T[]

      A set of elements to include in the new array object.

      -

    Returns T[]

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/classes/colors.ColorArray.md b/docs/classes/colors.ColorArray.md new file mode 100644 index 00000000..60e88d60 --- /dev/null +++ b/docs/classes/colors.ColorArray.md @@ -0,0 +1,849 @@ +[huetiful-js](../README.md) / [Modules](../modules.md) / [colors](../modules/colors.md) / ColorArray + +# Class: ColorArray + +[colors](../modules/colors.md).ColorArray + +## Table of contents + +### Constructors + +- [constructor](colors.ColorArray.md#constructor) + +### Methods + +- [discoverPalettes](colors.ColorArray.md#discoverpalettes) +- [filterByContrast](colors.ColorArray.md#filterbycontrast) +- [filterByDistance](colors.ColorArray.md#filterbydistance) +- [filterByHue](colors.ColorArray.md#filterbyhue) +- [filterByLightness](colors.ColorArray.md#filterbylightness) +- [filterByLuminance](colors.ColorArray.md#filterbyluminance) +- [filterBySaturation](colors.ColorArray.md#filterbysaturation) +- [getFarthestHue](colors.ColorArray.md#getfarthesthue) +- [getFarthestLightness](colors.ColorArray.md#getfarthestlightness) +- [getNearestHue](colors.ColorArray.md#getnearesthue) +- [getNearestLightness](colors.ColorArray.md#getnearestlightness) +- [interpolateSpline](colors.ColorArray.md#interpolatespline) +- [output](colors.ColorArray.md#output) +- [sortByContrast](colors.ColorArray.md#sortbycontrast) +- [sortByDistance](colors.ColorArray.md#sortbydistance) +- [sortByHue](colors.ColorArray.md#sortbyhue) +- [sortByLightness](colors.ColorArray.md#sortbylightness) +- [sortByLuminance](colors.ColorArray.md#sortbyluminance) +- [sortBySaturation](colors.ColorArray.md#sortbysaturation) + +## Constructors + +### constructor + +• **new ColorArray**(`colors`): [`ColorArray`](colors.ColorArray.md) + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `colors` | [`ColorToken`](../modules/types.md#colortoken)[] | + +#### Returns + +[`ColorArray`](colors.ColorArray.md) + +## Methods + +### discoverPalettes + +▸ **discoverPalettes**(`schemeType?`): `object` \| [`ColorToken`](../modules/types.md#colortoken)[] + +Takes an array of colors and finds the best matches for a set of predefined palettes. The function does not work on achromatic colors, you may use isAchromatic to filter grays from your collection before passing it to the function. + +#### Parameters + +| Name | Type | Description | +| :------ | :------ | :------ | +| `schemeType?` | ``"analogous"`` \| ``"triadic"`` \| ``"tetradic"`` \| ``"complementary"`` | (Optional) The palette type you want to return. | + +#### Returns + +`object` \| [`ColorToken`](../modules/types.md#colortoken)[] + +An array of colors if the scheme parameter is specified else it returns an object of all the palette types as keys and their values as an array of colors. If no colors are valid for the palette types it returns an empty array for the palette results. + +**`Example`** + +```ts +import { discoverPalettes } from 'huetiful-js' + +let sample = [ + "#ffff00", + "#00ffdc", + "#00ff78", + "#00c000", + "#007e00", + "#164100", + "#720000", + "#600000", + "#4e0000", + "#3e0000", + "#310000", +] + +console.log(load(sample).discoverPalettes(sample, "tetradic").output()) +// [ '#ffff00ff', '#00ffdcff', '#310000ff', '#720000ff' ] +``` + +___ + +### filterByContrast + +▸ **filterByContrast**(`against`, `startContrast?`, `endContrast?`): [`ColorArray`](colors.ColorArray.md) + +Returns an array of colors with the specified contrast range. The contrast is tested against a comparison color (the 'against' param) and the specified contrast ranges. + +#### Parameters + +| Name | Type | Default value | Description | +| :------ | :------ | :------ | :------ | +| `against` | [`ColorToken`](../modules/types.md#colortoken) | `undefined` | - | +| `startContrast` | `number` | `0.05` | The minimum end of the contrast range. | +| `endContrast?` | `number` | `undefined` | The maximum end of the contrast range. | + +#### Returns + +[`ColorArray`](colors.ColorArray.md) + +Array of filtered colors. + +**`Example`** + +```ts +import { filterByContrast } from 'huetiful-js' + +let sample = [ +'#00ffdc', +'#00ff78', +'#00c000', +'#007e00', +'#164100', +'#ffff00', +'#310000', +'#3e0000', +'#4e0000', +'#600000', +'#720000', +] + +console.log(filterByContrast(sample, 'green', '>=3')) +// [ '#00ffdc', '#00ff78', '#ffff00', '#310000', '#3e0000', '#4e0000' ] +``` + +___ + +### filterByDistance + +▸ **filterByDistance**(`against`, `startDistance?`, `endDistance?`): [`ColorArray`](colors.ColorArray.md) + +Returns an array of colors with the specified distance range. The distance is tested against a comparison color (the 'against' param) and the specified distance ranges. + +#### Parameters + +| Name | Type | Default value | Description | +| :------ | :------ | :------ | :------ | +| `against` | [`ColorToken`](../modules/types.md#colortoken) | `undefined` | - | +| `startDistance` | `number` | `0.05` | The minimum end of the distance range. | +| `endDistance?` | `number` | `undefined` | The maximum end of the distance range. | + +#### Returns + +[`ColorArray`](colors.ColorArray.md) + +Array of filtered colors. + +**`Example`** + +```ts +import { filterByDistance } from 'huetiful-js' + +let sample = [ + "#ffff00", + "#00ffdc", + "#00ff78", + "#00c000", + "#007e00", + "#164100", + "#720000", + "#600000", +] + +console.log(filterByDistance(sample, "yellow", 0.1)) +// [ '#ffff00' ] +``` + +___ + +### filterByHue + +▸ **filterByHue**(`startHue?`, `endHue?`): [`ColorArray`](colors.ColorArray.md) + +Returns colors in the specified hue ranges between 0 to 360. + +#### Parameters + +| Name | Type | Default value | Description | +| :------ | :------ | :------ | :------ | +| `startHue` | `number` | `0` | The minimum end of the hue range. | +| `endHue` | `number` | `360` | The maximum end of the hue range. | + +#### Returns + +[`ColorArray`](colors.ColorArray.md) + +Array of the filtered colors. + +**`Example`** + +```ts +let sample = [ + '#00ffdc', + '#00ff78', + '#00c000', + '#007e00', + '#164100', + '#ffff00', + '#310000', + '#3e0000', + '#4e0000', + '#600000', + '#720000', +] + +filterByHue(sample, 20, 80) + +// [ '#310000', '#3e0000', '#4e0000', '#600000', '#720000' ] +``` + +___ + +### filterByLightness + +▸ **filterByLightness**(`startLightness?`, `endLightness?`): [`ColorArray`](colors.ColorArray.md) + +Returns an array of colors in the specified lightness range. The range is between 0 and 100. + +#### Parameters + +| Name | Type | Default value | Description | +| :------ | :------ | :------ | :------ | +| `startLightness` | `number` | `5` | The minimum end of the lightness range. | +| `endLightness` | `number` | `100` | The maximum end of the lightness range. | + +#### Returns + +[`ColorArray`](colors.ColorArray.md) + +Array of filtered colors. + +**`Example`** + +```ts +import { filterByLightness } from 'huetiful-js' +let sample = [ + '#00ffdc', + '#00ff78', + '#00c000', + '#007e00', + '#164100', + '#ffff00', + '#310000', + '#3e0000', + '#4e0000', + '#600000', + '#720000', +] + +filterByLightness(sample, 20, 80) + +// [ '#00c000', '#007e00', '#164100', '#720000' ] +``` + +___ + +### filterByLuminance + +▸ **filterByLuminance**(`startLuminance?`, `endLuminance?`): [`ColorArray`](colors.ColorArray.md) + +Returns an array of colors in the specified luminance range. The range is normalised to [0,1]. + +#### Parameters + +| Name | Type | Default value | Description | +| :------ | :------ | :------ | :------ | +| `startLuminance` | `number` | `0.05` | The minimum end of the luminance range. | +| `endLuminance` | `number` | `1` | The maximum end of the luminance range. | + +#### Returns + +[`ColorArray`](colors.ColorArray.md) + +Array of filtered colors. + +**`Example`** + +```ts +import { filterByLuminance } from 'huetiful-js' +let sample = [ + '#00ffdc', + '#00ff78', + '#00c000', + '#007e00', + '#164100', + '#ffff00', + '#310000', + '#3e0000', + '#4e0000', + '#600000', + '#720000', +] + +filterByLuminance(sample, 0.4, 0.9) + +// [ '#00ffdc', '#00ff78' ] +``` + +___ + +### filterBySaturation + +▸ **filterBySaturation**(`startSaturation?`, `endSaturation?`, `mode?`): [`ColorArray`](colors.ColorArray.md) + +Returns an array of colors in the specified saturation range. The range is normalised to [0,1]. + +#### Parameters + +| Name | Type | Default value | Description | +| :------ | :------ | :------ | :------ | +| `startSaturation` | `number` | `0.05` | The minimum end of the saturation range. | +| `endSaturation` | `number` | `1` | The maximum end of the saturation range. | +| `mode?` | [`HueColorSpaces`](../modules/types.md#huecolorspaces) | `undefined` | The color space to fetch the saturation value from. Any color space with a chroma channel e.g 'lch' or 'hsl' will do. | + +#### Returns + +[`ColorArray`](colors.ColorArray.md) + +Array of filtered colors. + +**`Example`** + +```ts +import { filterByContrast } from 'huetiful-js' + +let sample = [ + '#00ffdc', + '#00ff78', + '#00c000', + '#007e00', + '#164100', + '#ffff00', + '#310000', + '#3e0000', + '#4e0000', + '#600000', + '#720000', +] + +console.log(filterByContrast(sample, 'green', '>=3')) +// [ '#00ffdc', '#00ff78', '#ffff00', '#310000', '#3e0000', '#4e0000' ] +``` + +___ + +### getFarthestHue + +▸ **getFarthestHue**(`colorSpace?`, `colorObj?`): `number` \| \{ `color`: [`ColorToken`](../modules/types.md#colortoken) ; `factor`: `number` } + +Gets the largest hue value from the passed in colors. + +#### Parameters + +| Name | Type | Default value | Description | +| :------ | :------ | :------ | :------ | +| `colorSpace?` | [`HueColorSpaces`](../modules/types.md#huecolorspaces) | `undefined` | The mode color space to perform the computation in. | +| `colorObj` | `boolean` | `false` | Optional boolean that makes the function return a custom object with factor (hue) and name of the color as keys. Default is false. | + +#### Returns + +`number` \| \{ `color`: [`ColorToken`](../modules/types.md#colortoken) ; `factor`: `number` } + +The largest hue value in the colors passed in or a custom object. + +**`Example`** + +```ts +import { getFarthestHue } from 'huetiful-js' +let sample = ['b2c3f1', '#a1bd2f', '#f3bac1'] + +console.log(load(output).getFarthestHue('lch')) +// 273.54920266436477 +``` + +___ + +### getFarthestLightness + +▸ **getFarthestLightness**(`colorspace?`, `colorObj?`): `number` \| \{ `color`: [`ColorToken`](../modules/types.md#colortoken) ; `factor`: `number` } + +Gets the largest lightness value from the passed in colors. + +#### Parameters + +| Name | Type | Default value | Description | +| :------ | :------ | :------ | :------ | +| `colorspace?` | [`HueColorSpaces`](../modules/types.md#huecolorspaces) | `undefined` | - | +| `colorObj` | `boolean` | `false` | Optional boolean that makes the function return a custom object with factor (lightness) and name of the color as keys. Default is false. | + +#### Returns + +`number` \| \{ `color`: [`ColorToken`](../modules/types.md#colortoken) ; `factor`: `number` } + +The largest lightness value in the colors passed in or a custom object. + +**`Example`** + +```ts +import { maxLightness } from 'huetiful-js' + +let sample = ["b2c3f1", "#a1bd2f", "#f3bac1"] + +console.log(load(sample).getFarthestLightness('lch', true)) + +// { lightness: 80.94668903360088, name: '#f3bac1' } +``` + +___ + +### getNearestHue + +▸ **getNearestHue**(`colorSpace?`, `colorObj?`): `number` \| \{ `color`: [`ColorToken`](../modules/types.md#colortoken) ; `factor`: `number` } + +Gets the smallest hue value from the passed in colors. + +#### Parameters + +| Name | Type | Default value | Description | +| :------ | :------ | :------ | :------ | +| `colorSpace?` | [`HueColorSpaces`](../modules/types.md#huecolorspaces) | `undefined` | The mode color space to perform the computation in. | +| `colorObj` | `boolean` | `false` | Optional boolean that makes the function return a custom object with factor (hue) and name of the color as keys. Default is false. | + +#### Returns + +`number` \| \{ `color`: [`ColorToken`](../modules/types.md#colortoken) ; `factor`: `number` } + +The smallest hue value in the colors passed in or a custom object. + +**`Example`** + +```ts +import { getNearestHue } from 'huetiful-js' + +let sample = ['b2c3f1', '#a1bd2f', '#f3bac1'] + +console.log(load(sample).getNearestHue('lch')) +// 12.462831644544274 +``` + +___ + +### getNearestLightness + +▸ **getNearestLightness**(`colorspace?`, `colorObj?`): `number` \| \{ `color`: [`ColorToken`](../modules/types.md#colortoken) ; `factor`: `number` } + +Gets the smallest lightness value from the passed in colors. + +#### Parameters + +| Name | Type | Default value | Description | +| :------ | :------ | :------ | :------ | +| `colorspace?` | [`HueColorSpaces`](../modules/types.md#huecolorspaces) | `undefined` | - | +| `colorObj` | `boolean` | `false` | Optional boolean that makes the function return a custom object with factor (lightness) and name of the color as keys. Default is false. | + +#### Returns + +`number` \| \{ `color`: [`ColorToken`](../modules/types.md#colortoken) ; `factor`: `number` } + +The smallest lightness value in the colors passed in or a custom object. + +**`Example`** + +```ts +import { minLightness } from 'huetiful-js' + +let sample = ["b2c3f1", "#a1bd2f", "#f3bac1"] + +console.log(load(sample).getNearestLightness('lch', true)) + +// { lightness: 72.61647882089876, name: '#a1bd2f' } +``` + +___ + +### interpolateSpline + +▸ **interpolateSpline**(`colorspace?`, `samples?`, `kind?`, `closed?`, `options?`): [`ColorToken`](../modules/types.md#colortoken)[] + +Returns a spline based interpolator function with customizable interpolation methods (passed in as 'kind') and optional channel specific overrides.If a color has a falsy channel for example black has an undefined hue channel some interpolation methods may return NaN affecting the final result. + +#### Parameters + +| Name | Type | Description | +| :------ | :------ | :------ | +| `colorspace?` | [`HueColorSpaces`](../modules/types.md#huecolorspaces) | The colorspace to perform the color space in. Prefer uniform color spaces for better results such as Lch or Jch. | +| `samples?` | `number` | - | +| `kind?` | ``"natural"`` \| ``"monotone"`` \| ``"basis"`` | The type of the spline interpolation method. Default is basis. | +| `closed?` | `boolean` | Optional parameter to return the 'closed' variant of the 'kind' of interpolation method which can be useful for cyclical color scales. Default is false | +| `options?` | [`InterpolatorOptions`](../modules/types.md#interpolatoroptions) | Optional channel specific overrides. | + +#### Returns + +[`ColorToken`](../modules/types.md#colortoken)[] + +A hexadecimal representation of the resultant color. + +___ + +### output + +▸ **output**(): [`ColorToken`](../modules/types.md#colortoken) + +#### Returns + +[`ColorToken`](../modules/types.md#colortoken) + +Returns the result value from the chain. + +**`Method`** + +___ + +### sortByContrast + +▸ **sortByContrast**(`against`, `order?`): [`ColorArray`](colors.ColorArray.md) + +Sorts colors according to their contrast value as defined by WCAG. The contrast is tested against a comparison color (the 'against' param) + +#### Parameters + +| Name | Type | Description | +| :------ | :------ | :------ | +| `against` | [`ColorToken`](../modules/types.md#colortoken) | - | +| `order?` | ``"asc"`` \| ``"desc"`` | The expected order of arrangement. Either 'asc' or 'desc'. Default is ascending ('asc') | + +#### Returns + +[`ColorArray`](colors.ColorArray.md) + +An array of the sorted color values. + +**`Example`** + +```ts +import { sortByContrast } from 'huetiful-js' + +let sample = ['purple', 'green', 'red', 'brown'] +console.log(sortByContrast(sample, 'yellow')) +// [ 'red', 'green', 'brown', 'purple' ] + +console.log(sortByContrast(sample, 'yellow', 'desc')) +// [ 'purple', 'brown', 'green', 'red' ] +``` + +___ + +### sortByDistance + +▸ **sortByDistance**(`against`, `order?`, `options?`): [`ColorArray`](colors.ColorArray.md) + +Sorts colors according to their Euclidean distance. The distance factor is determined by the color space used (some color spaces are not symmetrical meaning that the distance between colorA and colorB is not equal to the distance between colorB and colorA ). The distance is computed from against a color which is used for comparison for all the colors in the array i.e it sorts the colors against the dist + +#### Parameters + +| Name | Type | Description | +| :------ | :------ | :------ | +| `against` | [`ColorToken`](../modules/types.md#colortoken) | The color to compare the distance with. All the distances are calculated between this color and the ones in the colors array. | +| `order?` | ``"asc"`` \| ``"desc"`` | The expected order of arrangement. Either 'asc' or 'desc'. Default is ascending ('asc') | +| `options?` | [`ColorDistanceOptions`](../modules/types.md#colordistanceoptions) | - | + +#### Returns + +[`ColorArray`](colors.ColorArray.md) + +An array of the sorted color values. + +**`Example`** + +```ts +import { sortByDistance } from 'huetiful-js' + +let sample = ['purple', 'green', 'red', 'brown'] +console.log( + sortByDistance(sample, 'yellow', 'asc', { + mode: 'lch', + }) +) + +// [ 'brown', 'red', 'green', 'purple' ] + +let sample = ['purple', 'green', 'red', 'brown'] +console.log( + sortByDistance(sample, 'yellow', 'asc', { + mode: 'lch', + }) +) + +// [ 'green', 'brown', 'red', 'purple' ] +``` + +___ + +### sortByHue + +▸ **sortByHue**(`order`, `colorspace`): [`ColorArray`](colors.ColorArray.md) + +Sorts colors according to hue values. It works with any color space with a hue channel. Note that hue values between HSL and Lch do not align. Achromatic colors are not supported + +#### Parameters + +| Name | Type | Description | +| :------ | :------ | :------ | +| `order` | ``"asc"`` \| ``"desc"`` | The expected order of arrangement. Either 'asc' or 'desc'. Default is ascending ('asc') | +| `colorspace` | [`HueColorSpaces`](../modules/types.md#huecolorspaces) | The color space to compute the color distances in. All colors within the collection will be converted to mode. Also note that because differences in hue mapping certain color spaces such as HSL and LCH hue values do not align. Keep such quirks in mind to avoid weird results. | + +#### Returns + +[`ColorArray`](colors.ColorArray.md) + +An array of the sorted color values. + +**`Example`** + +```ts +let sample = [ + "#00ffdc", + "#00ff78", + "#00c000", + "#007e00", + "#164100", + "#ffff00", + "#310000", + "#3e0000", + "#4e0000", + "#600000", + "#720000", +]; + +let sorted = sortByHue(sample); +console.log(sorted) +// [ + '#310000', '#3e0000', + '#4e0000', '#600000', + '#720000', '#ffff00', + '#164100', '#00c000', + '#007e00', '#00ff78', + '#00ffdc' +] + +let sortedDescending = sortByHue(sample,'desc'); +console.log(sortedDescending) +// [ + '#00ffdc', '#00ff78', + '#007e00', '#00c000', + '#164100', '#ffff00', + '#720000', '#600000', + '#4e0000', '#3e0000', + '#310000' +] +``` + +___ + +### sortByLightness + +▸ **sortByLightness**(`order?`): [`ColorArray`](colors.ColorArray.md) + +Sorts colors according to their lightness. + +#### Parameters + +| Name | Type | Description | +| :------ | :------ | :------ | +| `order?` | ``"asc"`` \| ``"desc"`` | The expected order of arrangement. Either 'asc' or 'desc'. Default is ascending ('asc') | + +#### Returns + +[`ColorArray`](colors.ColorArray.md) + +An array of the sorted color values. + +**`Example`** + +```ts +import { sortByLightness } from "huetiful-js"; + +let sample = [ + "#00ffdc", + "#00ff78", + "#00c000", + "#007e00", + "#164100", + "#ffff00", + "#310000", + "#3e0000", + "#4e0000", + "#600000", + "#720000", +] + +sortByLightness(sample) + +// [ + '#310000', '#3e0000', + '#4e0000', '#600000', + '#720000', '#164100', + '#007e00', '#00c000', + '#00ff78', '#00ffdc', + '#ffff00' +] + +sortByLightness(sample,'desc') + +// [ + '#ffff00', '#00ffdc', + '#00ff78', '#00c000', + '#007e00', '#164100', + '#720000', '#600000', + '#4e0000', '#3e0000', + '#310000' +] +``` + +___ + +### sortByLuminance + +▸ **sortByLuminance**(`order?`): [`ColorArray`](colors.ColorArray.md) + +Sorts colors according to the relative brightness as defined by WCAG definition. + +#### Parameters + +| Name | Type | Description | +| :------ | :------ | :------ | +| `order?` | ``"asc"`` \| ``"desc"`` | The expected order of arrangement. Either 'asc' or 'desc'. Default is ascending ('asc') | + +#### Returns + +[`ColorArray`](colors.ColorArray.md) + +An array of the sorted color values. + +**`Example`** + +```ts +import { sortByLuminance } from "huetiful-js"; +let sample = [ + "#00ffdc", + "#00ff78", + "#00c000", + "#007e00", + "#164100", + "#ffff00", + "#310000", + "#3e0000", + "#4e0000", + "#600000", + "#720000", +]; + +let sorted = sortByLuminance(sample) +console.log(sorted) +// [ + '#310000', '#3e0000', + '#4e0000', '#600000', + '#720000', '#164100', + '#007e00', '#00c000', + '#00ff78', '#00ffdc', + '#ffff00' +] + +let sortedDescending = sortByLuminance(sample, "desc"); +console.log(sortedDescending) +// [ + '#ffff00', '#00ffdc', + '#00ff78', '#00c000', + '#007e00', '#164100', + '#720000', '#600000', + '#4e0000', '#3e0000', + '#310000' +] +``` + +___ + +### sortBySaturation + +▸ **sortBySaturation**(`order`, `mode?`): [`ColorArray`](colors.ColorArray.md) + +Sorts colors according to their saturation. + +#### Parameters + +| Name | Type | Description | +| :------ | :------ | :------ | +| `order` | ``"asc"`` \| ``"desc"`` | The expected order of arrangement. Either 'asc' or 'desc'. Default is ascending ('asc') | +| `mode?` | [`HueColorSpaces`](../modules/types.md#huecolorspaces) | The mode color space to compute the saturation value in. The default is jch . | + +#### Returns + +[`ColorArray`](colors.ColorArray.md) + +An array of the sorted color values. + +**`Example`** + +```ts +import { sortBySaturation } from "huetiful-js"; +let sample = [ + "#00ffdc", + "#00ff78", + "#00c000", + "#007e00", + "#164100", + "#ffff00", + "#310000", + "#3e0000", + "#4e0000", + "#600000", + "#720000", +]; + +let sorted = sortBySaturation(sample); +console.log(sorted); + +// [ + '#310000', '#3e0000', + '#164100', '#4e0000', + '#600000', '#720000', + '#00ffdc', '#007e00', + '#00ff78', '#00c000', + '#ffff00' +] + +let sortedDescending = sortBySaturation(sample,'desc'); +console.log(sortedDescending) +// [ + '#ffff00', '#00c000', + '#00ff78', '#007e00', + '#00ffdc', '#720000', + '#600000', '#4e0000', + '#164100', '#3e0000', + '#310000' +] +``` diff --git a/docs/classes/colors.IColor.html b/docs/classes/colors.IColor.html deleted file mode 100644 index 82d54b61..00000000 --- a/docs/classes/colors.IColor.html +++ /dev/null @@ -1,41 +0,0 @@ -IColor | huetiful-js

Hierarchy

  • IColor

Constructors

Methods

  • Parameters

    • Optional amount: string | number

    Returns number | IColor

  • Parameters

    • amount: string | number
    • colorspace: any

    Returns IColor

  • Parameters

    • against: IColor | "lightMode" | "darkMode"

    Returns number

  • Parameters

    • amount: string | number

    Returns IColor

  • Returns the color as a simulation of the passed in type of color vision deficiency with the deficiency filter's intensity determined by the severity value.

    -

    Parameters

    • Optional deficiencyType: "red" | "green" | "blue" | "monochromacy"

      The type of color vision deficiency. To avoid writing the long types, the expected parameters are simply the colors that are hard to perceive for the type of color blindness. For example those with 'tritanopia' are unable to perceive 'blue' light. Default is 'red' when the defeciency parameter is undefined or any falsy value.

      -
    • severity: number = 1

      The intensity of the filter. The exepected value is between [0,1]. For example 0.5

      -

    Returns ColorToken

    The color as its simulated variant as a hexadecimal string.

    -

    See

    For a deep dive on color vision deficiency go to

    -

    Example

    import { colorDeficiency, toHex } from 'huetiful-js'

    // Here we are simulating color blindness of tritanomaly or we can't see 'blue'.
    // We are passing in our color as an array of channel values in the mode "rgb". The severity is set to 0.1
    let tritanomaly = colorDeficiency('blue')
    console.log(tritanomaly(['rgb', 230, 100, 50, 0.5], 0.1))
    // #dd663680

    // Here we are simulating color blindness of tritanomaly or we can't see 'red'. The severity is not explicitly set so it defaults to 1
    let protanopia = colorDeficiency('red')
    console.log(protanopia({ h: 20, w: 50, b: 30, mode: 'hwb' }))
    // #9f9f9f -
    -
  • Parameters

    • channel: string

    Returns number

  • Parameters

    Returns number | {
        color: ColorToken;
        factor: number;
    }

  • Parameters

    Returns number | {
        color: ColorToken;
        factor: number;
    }

  • Parameters

    Returns number | {
        color: ColorToken;
        factor: number;
    }

  • Parameters

    Returns number | {
        color: ColorToken;
        factor: number;
    }

  • Parameters

    Returns number | {
        color: ColorToken;
        factor: number;
    }

  • Parameters

    Returns number | {
        color: ColorToken;
        factor: number;
    }

  • Returns boolean

  • Returns boolean

  • Returns boolean

  • Parameters

    • Optional amount: number

    Returns number

  • Returns any

  • Returns string | boolean

  • Parameters

    • Optional amount: string | number

    Returns any

  • Parameters

    • scheme: "analogous" | "triadic" | "tetradic" | "complementary"
    • Optional easingFunc: ((t) => number)
        • (t): number
        • Parameters

          • t: number

          Returns number

    Returns ColorToken[] | ColorArray

  • Parameters

    • modeChannel: string
    • value: string | number

    Returns IColor

  • Parameters

    • origin: ColorToken
    • Optional t: number
    • Optional options: {
          chromaInterpolator: Interpolator;
          easingFunc: ((t) => number);
          hueFixup: ((arr) => number[]);
          hueInterpolator: Interpolator;
          lightnessInterpolator: Interpolator;
      }
      • chromaInterpolator: Interpolator
      • easingFunc: ((t) => number)
          • (t): number
          • The easing function to use.

            -

            Parameters

            • t: number

              Any value between 0 and 1

              -

            Returns number

            A number.

            -
      • hueFixup: ((arr) => number[])
          • (arr): number[]
          • Parameters

            • arr: number[]

            Returns number[]

      • hueInterpolator: Interpolator
      • lightnessInterpolator: Interpolator

    Returns string

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/functions/colors.color.html b/docs/functions/colors.color.html deleted file mode 100644 index 20ce2a9d..00000000 --- a/docs/functions/colors.color.html +++ /dev/null @@ -1 +0,0 @@ -color | huetiful-js

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/functions/colors.colors.html b/docs/functions/colors.colors.html deleted file mode 100644 index 458bd0a3..00000000 --- a/docs/functions/colors.colors.html +++ /dev/null @@ -1,7 +0,0 @@ -colors | huetiful-js
  • A wrapper function for the default Tailwind palette. If called with both parameters it return the hex code at the specified shade and value. Else, if called with the shade parameter as "all" it will return all colors from the shades in the palette map at the specified value (if value is undefined it will default to "500"). When called with the shade parameter only it will return all the colors from 100 to 900 of the specified shade.

    -

    Parameters

    • shade: string

      Any shade in the default TailwindCSS palette e.g amber,blue.

      -
    • Optional val: ScaleValues

      Any value from 100 to 900 in increments of 100 e.g "200".

      -

    Returns ColorToken | ColorToken[]

    color Returns a hex code string or array of hex codes depending on how the function is called.

    -

    Example

    import { colors } from "huetiful-js";

    let all300 = colors("all", 300);

    console.log(all300)
    //[
    '#cbd5e1', '#d1d5db', '#d4d4d8',
    '#d4d4d4', '#d6d3d1', '#fca5a5',
    '#fdba74', '#fcd34d', '#fde047',
    '#bef264', '#86efac', '#6ee7b7',
    '#5eead4', '#7dd3fc', '#93c5fd',
    '#c4b5fd', '#d8b4fe', '#f0abfc',
    '#f9a8d4', '#fda4af'
    ]

    let red = colors("red");
    console.log(red);

    // [
    '#fef2f2', '#fee2e2',
    '#fecaca', '#fca5a5',
    '#f87171', '#ef4444',
    '#dc2626', '#b91c1c',
    '#991b1b', '#7f1d1d'
    ]

    let red100 = colors("red", 100);

    console.log(red100)
    // #fee2e2 -
    -

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/functions/colors.diverging.html b/docs/functions/colors.diverging.html deleted file mode 100644 index 13a4f132..00000000 --- a/docs/functions/colors.diverging.html +++ /dev/null @@ -1,6 +0,0 @@ -diverging | huetiful-js

Function diverging

  • A wrapper function for ColorBrewer's map of diverging color schemes.

    -

    Parameters

    Returns ColorToken[]

    An array of colors in hex represantation.

    -

    Example

    import { diverging } from 'huetiful-js'



    console.log(diverging("Spectral"))
    //[
    '#7fc97f', '#beaed4',
    '#fdc086', '#ffff99',
    '#386cb0', '#f0027f',
    '#bf5b17', '#666666'
    ] -
    -

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/functions/colors.load.html b/docs/functions/colors.load.html deleted file mode 100644 index 98d3843e..00000000 --- a/docs/functions/colors.load.html +++ /dev/null @@ -1,2 +0,0 @@ -load | huetiful-js
  • Parameters

    • colors: ColorToken[]

      An array of colors to chain the array methods on. Every element in the array will be parsed as a color token.

      -

    Returns ColorArray

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/functions/colors.qualitative.html b/docs/functions/colors.qualitative.html deleted file mode 100644 index a2c98cc4..00000000 --- a/docs/functions/colors.qualitative.html +++ /dev/null @@ -1,6 +0,0 @@ -qualitative | huetiful-js

Function qualitative

  • A wrapper function for ColorBrewer's map of qualitative color schemes.

    -

    Parameters

    Returns ColorToken[]

    An array of colors in hex represantation.

    -

    Example

    import { qualitative } from 'huetiful-js'


    console.log(qualitative("Accent"))
    // [
    '#7fc97f', '#beaed4',
    '#fdc086', '#ffff99',
    '#386cb0', '#f0027f',
    '#bf5b17', '#666666'
    ] -
    -

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/functions/colors.sequential.html b/docs/functions/colors.sequential.html deleted file mode 100644 index 518f6dad..00000000 --- a/docs/functions/colors.sequential.html +++ /dev/null @@ -1,6 +0,0 @@ -sequential | huetiful-js

Function sequential

  • A wrapper function for ColorBrewer's map of sequential color schemes.

    -

    Parameters

    Returns ColorToken[]

    An array of colors in hex represantation.

    -

    Example

    import { sequential } from 'huetiful-js


    console.log(sequential("OrRd"))

    // [
    '#fff7ec', '#fee8c8',
    '#fdd49e', '#fdbb84',
    '#fc8d59', '#ef6548',
    '#d7301f', '#b30000',
    '#7f0000'
    ] -
    -

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/functions/colors.tailwindColors.html b/docs/functions/colors.tailwindColors.html deleted file mode 100644 index ca9de527..00000000 --- a/docs/functions/colors.tailwindColors.html +++ /dev/null @@ -1,5 +0,0 @@ -tailwindColors | huetiful-js

Function tailwindColors

  • Wrapper function that returns TailwindCSS color value(s) of the specified shade. If invoked with no parameters it returns an array of colors from 100 to 900. If invoked with parameter will return the specified shade vale,

    -

    Parameters

    Returns ((val?) => string | string[])

    color A hex string value or array of hex strings.

    -
      • (val?): string | string[]
      • Parameters

        Returns string | string[]

    Example

    import { tailwindColors } from "huetiful-js";

    // We pass in red as the target hue.
    // It returns a function that can be called with an optional value parameter
    let red = tailwindColors("red");
    console.log(red());
    // [
    '#fef2f2', '#fee2e2',
    '#fecaca', '#fca5a5',
    '#f87171', '#ef4444',
    '#dc2626', '#b91c1c',
    '#991b1b', '#7f1d1d'
    ]


    console.log(red(100));
    // '#fee2e2'

    console.log(red('900'));
    // '#7f1d1d' -
    -

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/functions/converters.num2rgb.html b/docs/functions/converters.num2rgb.html deleted file mode 100644 index 1ee86533..00000000 --- a/docs/functions/converters.num2rgb.html +++ /dev/null @@ -1,6 +0,0 @@ -num2rgb | huetiful-js
  • Returns the RGB color equivalent of any number between 0 and 16,777,215.

    -

    Parameters

    • num: number

      The number to convert to RGB

      -
    • hex: boolean = false

    Returns ColorToken

    color An RGB color object or hex string.

    -

    Example

    import { num2rgb } from 'huetiful-js'

    console.log(num2rgb(900, true))
    // #000384 -
    -

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/functions/converters.rgb2num.html b/docs/functions/converters.rgb2num.html deleted file mode 100644 index 12150cf2..00000000 --- a/docs/functions/converters.rgb2num.html +++ /dev/null @@ -1,6 +0,0 @@ -rgb2num | huetiful-js
  • Returns the numerical equivalent of a color.

    -

    Parameters

    • color: ColorToken

      The color to convert to its numerical equivalent.

      -

    Returns number

    value The numerical value of the color from 0 to 16,777,215.

    -

    Example

    import { rgb2num } from 'huetiful-js'

    console.log(rgb2num("b2c3f1"))
    // 11715569 -
    -

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/functions/converters.temp2Color.html b/docs/functions/converters.temp2Color.html deleted file mode 100644 index 8d86b718..00000000 --- a/docs/functions/converters.temp2Color.html +++ /dev/null @@ -1,7 +0,0 @@ -temp2Color | huetiful-js
  • Converts the temperature value (in Kelvins) to an RGB color.

    -

    Parameters

    • kelvin: number

      The number of Kelvins. From 0 to 30,000 .

      -
    • hex: boolean = false

      Optional boolean parameter to either return an RGB color object or hexadecimal string. Default is true.

      -

    Returns ColorToken

    color The color as a hexadecimal or RGB color object.

    -

    Example

    import { temp2Color } from 'huetiful-js'

    console.log(temp2Color(2542))
    // #ffa44a -
    -

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/functions/converters.toColorTuple.html b/docs/functions/converters.toColorTuple.html deleted file mode 100644 index cfb2353d..00000000 --- a/docs/functions/converters.toColorTuple.html +++ /dev/null @@ -1,7 +0,0 @@ -toColorTuple | huetiful-js
  • Returns an array of channel values in the mode color space.

    -

    Parameters

    • color: ColorToken

      Any recognizable color token.

      -
    • mode: ColorSpaces

      The mode color space to return channel values for

      -

    Returns ColorTuple

    An array of channel values with the colorspace as first element and the alpha channel if its explicitly defined in the passed in color.

    -

    Example

    let rgbColor = {
    r: 0.4,
    g: 0.3,
    b: 0.7,
    mode: "rgb",
    };
    console.log(toColorTuple(rgbColor,'rgb'));

    // [ 'rgb', 0.4, 0.3, 0.7 ] -
    -

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/functions/converters.toHex.html b/docs/functions/converters.toHex.html deleted file mode 100644 index 80edc2d5..00000000 --- a/docs/functions/converters.toHex.html +++ /dev/null @@ -1,6 +0,0 @@ -toHex | huetiful-js
  • Converts a wide range of color tokens which are color objects, and CSS named colors (for example 'red'), numbers from 0 to 166,777,215 and arrays in the form of [string,number,number,number,numer?] the first element in the array being the mode color space and the fourth optional number element as the opacity value to hexadecimal.

    -

    Parameters

    • color: ColorToken

      The color to convert to hexadecimal. Works on color objects and CSS named colors.

      -

    Returns string

    A hexadecimal representation of the passed in color.

    -

    Example

    import { toHex } from "huetiful-js";

    console.log(toHex({ l: 50, c: 31, h: 100, alpha: 0.5, mode: "lch" }))
    // #7b794180

    console.log(toHex({ l: 50, c: 31, h: 100, mode: "lch" }))
    // #7b7941 -
    -

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/functions/converters.ucsConverter.html b/docs/functions/converters.ucsConverter.html deleted file mode 100644 index eebb04cd..00000000 --- a/docs/functions/converters.ucsConverter.html +++ /dev/null @@ -1,4 +0,0 @@ -ucsConverter | huetiful-js
  • Converter function with mode definitions for uniform color spaces. The function is curried to return a converter in the passed colospace.

    -

    Parameters

    Returns ConvertFn<any>

    The converter function in the mode colorspace.

    -

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/functions/filterBy.filterByContrast.html b/docs/functions/filterBy.filterByContrast.html deleted file mode 100644 index a9dec2e9..00000000 --- a/docs/functions/filterBy.filterByContrast.html +++ /dev/null @@ -1,8 +0,0 @@ -filterByContrast | huetiful-js

Function filterByContrast

  • Returns an array of colors with the specified contrast range. The contrast is tested against a comparison color (the 'against' param) and the specified contrast ranges.

    -

    Parameters

    • colors: ColorToken[]

      The array of colors to filter.

      -
    • against: ColorToken
    • startContrast: number = 1

      The minimum end of the contrast range.

      -
    • endContrast: number = 21

      The maximum end of the contrast range.

      -

    Returns ColorToken[]

    Array of filtered colors.

    -

    Example

    import { filterByContrast } from 'huetiful-js'

    let sample = [
    '#00ffdc',
    '#00ff78',
    '#00c000',
    '#007e00',
    '#164100',
    '#ffff00',
    '#310000',
    '#3e0000',
    '#4e0000',
    '#600000',
    '#720000',
    ]

    console.log(filterByContrast(sample, 'green', '>=3'))
    // [ '#00ffdc', '#00ff78', '#ffff00', '#310000', '#3e0000', '#4e0000' ] -
    -

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/functions/filterBy.filterByDistance.html b/docs/functions/filterBy.filterByDistance.html deleted file mode 100644 index f1e5376c..00000000 --- a/docs/functions/filterBy.filterByDistance.html +++ /dev/null @@ -1,10 +0,0 @@ -filterByDistance | huetiful-js

Function filterByDistance

  • Returns an array of colors with the specified distance range. The distance is tested against a comparison color (the 'against' param) and the specified distance ranges.

    -

    Parameters

    • colors: ColorToken[]

      The array of colors to filter.

      -
    • against: ColorToken
    • startDistance: number = 0.05

      The minimum end of the distance range.

      -
    • Optional endDistance: number

      The maximum end of the distance range.

      -
    • Optional colorspace: ColorSpaces

      The color space to calculate the distance in .

      -
    • Optional weights: [number, number, number, number]

      The weighting values to pass to the Euclidean function. Default is [1,1,1,0].

      -

    Returns ColorToken[]

    Array of filtered colors.

    -

    Example

    import { filterByDistance } from 'huetiful-js'

    let sample = [
    "#ffff00",
    "#00ffdc",
    "#00ff78",
    "#00c000",
    "#007e00",
    "#164100",
    "#720000",
    "#600000",
    ]

    console.log(filterByDistance(sample, "yellow", 0.1))
    // [ '#ffff00' ] -
    -

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/functions/filterBy.filterByHue.html b/docs/functions/filterBy.filterByHue.html deleted file mode 100644 index 3b69868c..00000000 --- a/docs/functions/filterBy.filterByHue.html +++ /dev/null @@ -1,8 +0,0 @@ -filterByHue | huetiful-js

Function filterByHue

  • Returns colors in the specified hue ranges between 0 to 360.

    -

    Parameters

    • colors: ColorToken[]

      The array of colors to filter.

      -
    • startHue: number = 0

      The minimum end of the hue range.

      -
    • endHue: number = 360

      The maximum end of the hue range.

      -
    • Optional colorspace: HueColorSpaces

    Returns ColorToken[]

    Array of the filtered colors.

    -

    Example

    let sample = [
    '#00ffdc',
    '#00ff78',
    '#00c000',
    '#007e00',
    '#164100',
    '#ffff00',
    '#310000',
    '#3e0000',
    '#4e0000',
    '#600000',
    '#720000',
    ]

    filterByHue(sample, 20, 80)

    // [ '#310000', '#3e0000', '#4e0000', '#600000', '#720000' ] -
    -

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/functions/filterBy.filterByLightness.html b/docs/functions/filterBy.filterByLightness.html deleted file mode 100644 index 2b44db55..00000000 --- a/docs/functions/filterBy.filterByLightness.html +++ /dev/null @@ -1,9 +0,0 @@ -filterByLightness | huetiful-js

Function filterByLightness

  • Returns an array of colors in the specified lightness range. The range is between 0 and 100.

    -

    Parameters

    • colors: ColorToken[]

      The array of colors to filter.

      -
    • startLightness: number = 5

      The minimum end of the lightness range.

      -
    • endLightness: number = 100

      The maximum end of the lightness range.

      -
    • Optional colorspace: HueColorSpaces

      The mode colorspace to retrieve the lightness value from. The default is lch65

      -

    Returns ColorToken[]

    Array of filtered colors.

    -

    Example

    import { filterByLightness } from 'huetiful-js'
    let sample = [
    '#00ffdc',
    '#00ff78',
    '#00c000',
    '#007e00',
    '#164100',
    '#ffff00',
    '#310000',
    '#3e0000',
    '#4e0000',
    '#600000',
    '#720000',
    ]

    filterByLightness(sample, 20, 80)

    // [ '#00c000', '#007e00', '#164100', '#720000' ] -
    -

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/functions/filterBy.filterByLuminance.html b/docs/functions/filterBy.filterByLuminance.html deleted file mode 100644 index 5c47608f..00000000 --- a/docs/functions/filterBy.filterByLuminance.html +++ /dev/null @@ -1,8 +0,0 @@ -filterByLuminance | huetiful-js

Function filterByLuminance

  • Returns an array of colors in the specified luminance range. The range is normalised to [0,1].

    -

    Parameters

    • colors: ColorToken[]

      The array of colors to filter.

      -
    • startLuminance: number = 0.05

      The minimum end of the luminance range.

      -
    • endLuminance: number = 1

      The maximum end of the luminance range.

      -

    Returns ColorToken[]

    Array of filtered colors.

    -

    Example

    import { filterByLuminance } from 'huetiful-js'
    let sample = [
    '#00ffdc',
    '#00ff78',
    '#00c000',
    '#007e00',
    '#164100',
    '#ffff00',
    '#310000',
    '#3e0000',
    '#4e0000',
    '#600000',
    '#720000',
    ]

    filterByLuminance(sample, 0.4, 0.9)

    // [ '#00ffdc', '#00ff78' ] -
    -

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/functions/filterBy.filterBySaturation.html b/docs/functions/filterBy.filterBySaturation.html deleted file mode 100644 index 43eb8fe8..00000000 --- a/docs/functions/filterBy.filterBySaturation.html +++ /dev/null @@ -1,9 +0,0 @@ -filterBySaturation | huetiful-js

Function filterBySaturation

  • Returns an array of colors in the specified saturation range. The range is normalised to [0,1].

    -

    Parameters

    • colors: ColorToken[]

      The array of colors to filter.

      -
    • startSaturation: number = 0.05

      The minimum end of the saturation range.

      -
    • endSaturation: number = 1

      The maximum end of the saturation range.

      -
    • Optional colorspace: HueColorSpaces

      The color space to fetch the saturation value from. Any color space with a chroma channel e.g 'lch' or 'hsl' will do.

      -

    Returns ColorToken[]

    Array of filtered colors.

    -

    Example

    import { filterByContrast } from 'huetiful-js'

    let sample = [
    '#00ffdc',
    '#00ff78',
    '#00c000',
    '#007e00',
    '#164100',
    '#ffff00',
    '#310000',
    '#3e0000',
    '#4e0000',
    '#600000',
    '#720000',
    ]

    console.log(filterByContrast(sample, 'green', '>=3'))
    // [ '#00ffdc', '#00ff78', '#ffff00', '#310000', '#3e0000', '#4e0000' ] -
    -

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/functions/generators.discoverPalettes.html b/docs/functions/generators.discoverPalettes.html deleted file mode 100644 index 4463bced..00000000 --- a/docs/functions/generators.discoverPalettes.html +++ /dev/null @@ -1,7 +0,0 @@ -discoverPalettes | huetiful-js

Function discoverPalettes

  • Takes an array of colors and finds the best matches for a set of predefined palettes. The function does not work on achromatic colors, you may use isAchromatic to filter grays from your collection before passing it to the function.

    -

    Parameters

    • colors: ColorToken[]

      The array of colors to create palettes from. Preferably use 5 or more colors for better results.

      -
    • Optional schemeType: "analogous" | "triadic" | "tetradic" | "complementary"

      (Optional) The palette type you want to return.

      -

    Returns ColorToken[] | object

    An array of colors if the scheme parameter is specified else it returns an object of all the palette types as keys and their values as an array of colors. If no colors are valid for the palette types it returns an empty array for the palette results.

    -

    Example

    import { discoverPalettes } from 'huetiful-js'

    let sample = [
    "#ffff00",
    "#00ffdc",
    "#00ff78",
    "#00c000",
    "#007e00",
    "#164100",
    "#720000",
    "#600000",
    "#4e0000",
    "#3e0000",
    "#310000",
    ]

    console.log(discoverPalettes(sample, "tetradic"))
    // [ '#ffff00ff', '#00ffdcff', '#310000ff', '#720000ff' ] -
    -

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/functions/generators.earthtone.html b/docs/functions/generators.earthtone.html deleted file mode 100644 index 56530f5c..00000000 --- a/docs/functions/generators.earthtone.html +++ /dev/null @@ -1,8 +0,0 @@ -earthtone | huetiful-js
  • Creates a scale of a spline based interpolation between an earthtone and a color.

    -

    Parameters

    • color: ColorToken

      The color to interpolate an earth tone with. - *

      -
    • Optional colorspace: HueColorSpaces
    • Optional options: EarthtoneOptions

      Optional overrides for customising interpolation and easing functions.

      -

    Returns ColorToken[]

    The array of colors resulting from the earthtone interpolation as hex codes.

    -

    Example

    import { earthtone } from 'huetiful-js'


    console.log(earthtone("pink",{earthtones:'clay',iterations:5 }))
    // [ '#6a5c52ff', '#8d746aff', '#b38d86ff', '#d9a6a6ff', '#ffc0cbff' ] -
    -

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/functions/generators.hueShift.html b/docs/functions/generators.hueShift.html deleted file mode 100644 index 37a6b67a..00000000 --- a/docs/functions/generators.hueShift.html +++ /dev/null @@ -1,7 +0,0 @@ -hueShift | huetiful-js
  • Generates a palette of hue shifted colors (as a color becomes lighter, its hue shifts up and darker when its hue shifts down. ) from a single base color. Min and max lightness value determine how light or dark our colour will be at either extreme.

    -

    Parameters

    • color: ColorToken

      The color to use as the base of the hueshift. Colors are internally converted to LCH.

      -
    • Optional colorspace: UniformColorSpaces
    • Optional options: HueShiftOptions

      The optional overrides object to customize per channel options like interpolation methods and channel fixups.

      -

    Returns ColorToken[]

    An array of colors in hex. The length of the resultant array is the number of iterations multiplied by 2 plus the base color passed or (iterations*2)+1

    -

    Example

    import { hueShift } from "huetiful-js";

    let hueShiftedPalette = hueShift("#3e0000");

    console.log(hueShiftedPalette);

    // [
    '#ffffe1', '#ffdca5',
    '#ca9a70', '#935c40',
    '#5c2418', '#3e0000',
    '#310000', '#34000f',
    '#38001e', '#3b002c',
    '#3b0c3a'
    ] -
    -

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/functions/generators.interpolateSpline.html b/docs/functions/generators.interpolateSpline.html deleted file mode 100644 index 63c4dccc..00000000 --- a/docs/functions/generators.interpolateSpline.html +++ /dev/null @@ -1,8 +0,0 @@ -interpolateSpline | huetiful-js

Function interpolateSpline

  • Returns a spline based interpolator function with customizable interpolation methods (passed in as 'kind') and optional channel specific overrides.

    -

    Parameters

    • colors: ColorToken[]

      The array of colors to interpolate. If a color has a falsy channel for example black has an undefined hue channel some interpolation methods may return NaN affecting the final result.

      -
    • Optional colorspace: HueColorSpaces

      The colorspace to perform the color space in. Prefer uniform color spaces for better results such as Lch or Jch.

      -
    • Optional samples: number
    • Optional kind: "natural" | "monotone" | "basis"

      The type of the spline interpolation method. Default is basis.

      -
    • closed: boolean = false

      Optional parameter to return the 'closed' variant of the 'kind' of interpolation method which can be useful for cyclical color scales. Default is false

      -
    • Optional options: InterpolatorOptions

      Optional channel specific overrides.

      -

    Returns ColorToken[]

    A hexadecimal representation of the resultant color.

    -

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/functions/generators.interpolator.html b/docs/functions/generators.interpolator.html deleted file mode 100644 index b5d230f2..00000000 --- a/docs/functions/generators.interpolator.html +++ /dev/null @@ -1 +0,0 @@ -interpolator | huetiful-js

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/functions/generators.pairedScheme.html b/docs/functions/generators.pairedScheme.html deleted file mode 100644 index 55d958a9..00000000 --- a/docs/functions/generators.pairedScheme.html +++ /dev/null @@ -1,8 +0,0 @@ -pairedScheme | huetiful-js
  • pairedScheme - Creates a scheme that consists of a base color that is incremented by a hueStep to get the final hue to pair with.The colors are interpolated via white or black.

    -

    Parameters

    • color: ColorToken

      The color to return a paired color scheme from.

      -
    • Optional options: PairedSchemeOptions

      The optional overrides object to customize per channel options like interpolation methods and channel fixups.

      -

    Returns ColorToken[] | ColorToken

    An array containing the paired scheme.

    -

    Example

    import { pairedScheme } from 'huetiful-js'

    console.log(pairedScheme("green",{hueStep:6,iterations:4,tone:'dark'}))
    // [ '#008116ff', '#006945ff', '#184b4eff', '#007606ff' ] -
    -

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/functions/generators.pastel.html b/docs/functions/generators.pastel.html deleted file mode 100644 index 7d3b5589..00000000 --- a/docs/functions/generators.pastel.html +++ /dev/null @@ -1,6 +0,0 @@ -pastel | huetiful-js
  • Returns a random pastel variant of the passed in color.

    -

    Parameters

    • color: ColorToken

      The color to return a pastel variant of.

      -

    Returns ColorToken

    A random pastel color.

    -

    Example

    import { pastel } from 'huetiful-js'

    console.log(pastel("green"))
    // #036103ff -
    -

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/functions/generators.scheme.html b/docs/functions/generators.scheme.html deleted file mode 100644 index cdecb526..00000000 --- a/docs/functions/generators.scheme.html +++ /dev/null @@ -1,6 +0,0 @@ -scheme | huetiful-js
  • Generates a randomised classic color scheme from a single base color.

    -

    Parameters

    • schemeType: string

      Any classic color scheme either "analogous"|"triadic"|"tetradic"|"complementary"|"splitComplementary".

      -

    Returns ((color, easingFunc?) => ColorToken[])

    An array of 8 character hex codes. Elements in the array depend on the number of sample colors in the targeted scheme.

    -
      • (color, easingFunc?): ColorToken[]
      • Parameters

        • color: ColorToken
        • Optional easingFunc: ((t) => number)
            • (t): number
            • Parameters

              • t: number

              Returns number

        Returns ColorToken[]

    Example

    import { base } from 'huetiful-js'

    console.log(base("triadic")("#a1bd2f", true))
    // [ '#a1bd2fff', '#00caffff', '#ff78c9ff' ] -
    -

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/functions/sortBy.sortByContrast.html b/docs/functions/sortBy.sortByContrast.html deleted file mode 100644 index 591a42b3..00000000 --- a/docs/functions/sortBy.sortByContrast.html +++ /dev/null @@ -1,7 +0,0 @@ -sortByContrast | huetiful-js

Function sortByContrast

  • Sorts colors according to their contrast value as defined by WCAG. The contrast is tested against a comparison color (the 'against' param)

    -

    Parameters

    • colors: ColorToken[]

      The array of colors to sort

      -
    • against: ColorToken
    • Optional order: Order

      The expected order of arrangement. Either 'asc' or 'desc'. Default is ascending ('asc')

      -

    Returns ColorToken[]

    An array of the sorted color values.

    -

    Example

    import { sortByContrast } from 'huetiful-js'

    let sample = ['purple', 'green', 'red', 'brown']
    console.log(sortByContrast(sample, 'yellow'))
    // [ 'red', 'green', 'brown', 'purple' ]

    console.log(sortByContrast(sample, 'yellow', 'desc'))
    // [ 'purple', 'brown', 'green', 'red' ] -
    -

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/functions/sortBy.sortByDistance.html b/docs/functions/sortBy.sortByDistance.html deleted file mode 100644 index 5aef1ef0..00000000 --- a/docs/functions/sortBy.sortByDistance.html +++ /dev/null @@ -1,8 +0,0 @@ -sortByDistance | huetiful-js

Function sortByDistance

  • Sorts colors according to their Euclidean distance. The distance factor is determined by the color space used (some color spaces are not symmetrical meaning that the distance between colorA and colorB is not equal to the distance between colorB and colorA ). The distance is computed from against a color which is used for comparison for all the colors in the array i.e it sorts the colors against the dist

    -

    Parameters

    • colors: ColorToken[]

      The array of colors to sort.

      -
    • against: ColorToken

      The color to compare the distance with. All the distances are calculated between this color and the ones in the colors array.

      -
    • Optional order: "asc" | "desc"

      The expected order of arrangement. Either 'asc' or 'desc'. Default is ascending ('asc')

      -
    • Optional options: ColorDistanceOptions

    Returns ColorToken[]

    An array of the sorted color values.

    -

    Example

    import { sortByDistance } from 'huetiful-js'

    let sample = ['purple', 'green', 'red', 'brown']
    console.log(
    sortByDistance(sample, 'yellow', 'asc', {
    mode: 'lch',
    })
    )

    // [ 'brown', 'red', 'green', 'purple' ]

    let sample = ['purple', 'green', 'red', 'brown']
    console.log(
    sortByDistance(sample, 'yellow', 'asc', {
    mode: 'lch',
    })
    )

    // [ 'green', 'brown', 'red', 'purple' ] -
    -

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/functions/sortBy.sortByHue.html b/docs/functions/sortBy.sortByHue.html deleted file mode 100644 index 1f4a63f6..00000000 --- a/docs/functions/sortBy.sortByHue.html +++ /dev/null @@ -1,8 +0,0 @@ -sortByHue | huetiful-js

Function sortByHue

  • Sorts colors according to hue values. It works with any color space with a hue channel. Note that hue values between HSL and Lch do not align. Achromatic colors are not supported

    -

    Parameters

    • colors: ColorToken[]

      The array of colors to sort

      -
    • Optional order: Order

      The expected order of arrangement. Either 'asc' or 'desc'. Default is ascending ('asc')

      -
    • Optional colorspace: HueColorSpaces

      The color space to compute the color distances in. All colors within the collection will be converted to mode. Also note that because differences in hue mapping certain color spaces such as HSL and LCH hue values do not align. Keep such quirks in mind to avoid weird results.

      -

    Returns ColorToken[]

    An array of the sorted color values.

    -

    Example

    let sample = [
    "#00ffdc",
    "#00ff78",
    "#00c000",
    "#007e00",
    "#164100",
    "#ffff00",
    "#310000",
    "#3e0000",
    "#4e0000",
    "#600000",
    "#720000",
    ];


    let sorted = sortByHue(sample);
    console.log(sorted)
    // [
    '#310000', '#3e0000',
    '#4e0000', '#600000',
    '#720000', '#ffff00',
    '#164100', '#00c000',
    '#007e00', '#00ff78',
    '#00ffdc'
    ]

    let sortedDescending = sortByHue(sample,'desc');
    console.log(sortedDescending)
    // [
    '#00ffdc', '#00ff78',
    '#007e00', '#00c000',
    '#164100', '#ffff00',
    '#720000', '#600000',
    '#4e0000', '#3e0000',
    '#310000'
    ] -
    -

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/functions/sortBy.sortByLightness.html b/docs/functions/sortBy.sortByLightness.html deleted file mode 100644 index 69d5c61b..00000000 --- a/docs/functions/sortBy.sortByLightness.html +++ /dev/null @@ -1,8 +0,0 @@ -sortByLightness | huetiful-js

Function sortByLightness

  • Sorts colors according to their lightness.

    -

    Parameters

    • colors: ColorToken[]

      The array of colors to sort

      -
    • Optional order: Order

      The expected order of arrangement. Either 'asc' or 'desc'. Default is ascending ('asc')

      -
    • Optional colorspace: HueColorSpaces

      The mode colorspace to use for filtering color lightness. Defaut is lch65

      -

    Returns ColorToken[]

    An array of the sorted color values.

    -

    Example

    import { sortByLightness } from "huetiful-js";

    let sample = [
    "#00ffdc",
    "#00ff78",
    "#00c000",
    "#007e00",
    "#164100",
    "#ffff00",
    "#310000",
    "#3e0000",
    "#4e0000",
    "#600000",
    "#720000",
    ]

    sortByLightness(sample)

    // [
    '#310000', '#3e0000',
    '#4e0000', '#600000',
    '#720000', '#164100',
    '#007e00', '#00c000',
    '#00ff78', '#00ffdc',
    '#ffff00'
    ]


    sortByLightness(sample,'desc')

    // [
    '#ffff00', '#00ffdc',
    '#00ff78', '#00c000',
    '#007e00', '#164100',
    '#720000', '#600000',
    '#4e0000', '#3e0000',
    '#310000'
    ] -
    -

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/functions/sortBy.sortByLuminance.html b/docs/functions/sortBy.sortByLuminance.html deleted file mode 100644 index b0e500af..00000000 --- a/docs/functions/sortBy.sortByLuminance.html +++ /dev/null @@ -1,7 +0,0 @@ -sortByLuminance | huetiful-js

Function sortByLuminance

  • Sorts colors according to the relative brightness as defined by WCAG definition.

    -

    Parameters

    • colors: ColorToken[]

      The array of colors to sort

      -
    • order: "asc" | "desc"

      The expected order of arrangement. Either 'asc' or 'desc'. Default is ascending ('asc')

      -

    Returns ColorToken[]

    An array of the sorted color values.

    -

    Example

    import { sortByLuminance } from "huetiful-js";
    let sample = [
    "#00ffdc",
    "#00ff78",
    "#00c000",
    "#007e00",
    "#164100",
    "#ffff00",
    "#310000",
    "#3e0000",
    "#4e0000",
    "#600000",
    "#720000",
    ];



    let sorted = sortByLuminance(sample)
    console.log(sorted)
    // [
    '#310000', '#3e0000',
    '#4e0000', '#600000',
    '#720000', '#164100',
    '#007e00', '#00c000',
    '#00ff78', '#00ffdc',
    '#ffff00'
    ]

    let sortedDescending = sortByLuminance(sample, "desc");
    console.log(sortedDescending)
    // [
    '#ffff00', '#00ffdc',
    '#00ff78', '#00c000',
    '#007e00', '#164100',
    '#720000', '#600000',
    '#4e0000', '#3e0000',
    '#310000'
    ] -
    -

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/functions/sortBy.sortBySaturation.html b/docs/functions/sortBy.sortBySaturation.html deleted file mode 100644 index 5807d93a..00000000 --- a/docs/functions/sortBy.sortBySaturation.html +++ /dev/null @@ -1,8 +0,0 @@ -sortBySaturation | huetiful-js

Function sortBySaturation

  • Sorts colors according to their saturation.

    -

    Parameters

    • colors: ColorToken[]

      The array of colors to sort

      -
    • order: "asc" | "desc"

      The expected order of arrangement. Either 'asc' or 'desc'. Default is ascending ('asc')

      -
    • Optional mode: HueColorSpaces

      The mode color space to compute the saturation value in. The default is jch .

      -

    Returns ColorToken[]

    An array of the sorted color values.

    -

    Example

    import { sortBySaturation } from "huetiful-js";
    let sample = [
    "#00ffdc",
    "#00ff78",
    "#00c000",
    "#007e00",
    "#164100",
    "#ffff00",
    "#310000",
    "#3e0000",
    "#4e0000",
    "#600000",
    "#720000",
    ];

    let sorted = sortBySaturation(sample);
    console.log(sorted);

    // [
    '#310000', '#3e0000',
    '#164100', '#4e0000',
    '#600000', '#720000',
    '#00ffdc', '#007e00',
    '#00ff78', '#00c000',
    '#ffff00'
    ]

    let sortedDescending = sortBySaturation(sample,'desc');
    console.log(sortedDescending)
    // [
    '#ffff00', '#00c000',
    '#00ff78', '#007e00',
    '#00ffdc', '#720000',
    '#600000', '#4e0000',
    '#164100', '#3e0000',
    '#310000'
    ] -
    -

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/functions/utils.alpha.html b/docs/functions/utils.alpha.html deleted file mode 100644 index 2553ee31..00000000 --- a/docs/functions/utils.alpha.html +++ /dev/null @@ -1,7 +0,0 @@ -alpha | huetiful-js

Function alpha

  • Sets the opacity of a color. Also gets the alpha value of the color if the value param is omitted

    -

    Parameters

    • color: ColorToken

      The color with the targeted opacity/alpha channel.

      -
    • Optional value: string | number

      The value to apply to the opacity channel. The value is between [0,1]

      -

    Returns number

    color The resulting color. Returns an 8 character hex code.

    -

    Example

    // Getting the alpha
    console.log(alpha('#a1bd2f0d'))
    // 0.050980392156862744

    // Setting the alpha

    let myColor = alpha('b2c3f1', 0.5)

    console.log(myColor)

    // #b2c3f180 -
    -

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/functions/utils.brighten.html b/docs/functions/utils.brighten.html deleted file mode 100644 index 2db82bca..00000000 --- a/docs/functions/utils.brighten.html +++ /dev/null @@ -1,3 +0,0 @@ -brighten | huetiful-js

Function brighten

  • Parameters

    • color: ColorToken

      The color to brighten.

      -
    • value: string | number

      The amount to brighten with. Also supports expressions as strings e.g darken("#fc23a1","*0.5")

      -
    • colorspace: any

    Returns ColorToken

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/functions/utils.colorDeficiency.html b/docs/functions/utils.colorDeficiency.html deleted file mode 100644 index c79900b7..00000000 --- a/docs/functions/utils.colorDeficiency.html +++ /dev/null @@ -1,7 +0,0 @@ -colorDeficiency | huetiful-js

Function colorDeficiency

  • Returns the color as a simulation of the passed in type of color vision deficiency with the deficiency filter's intensity determined by the severity value.

    -

    Parameters

    • Optional deficiencyType: DeficiencyType

      The type of color vision deficiency. To avoid writing the long types, the expected parameters are simply the colors that are hard to perceive for the type of color blindness. For example those with 'tritanopia' are unable to perceive 'blue' light. Default is 'red' when the defeciency parameter is undefined or any falsy value.

      -

    Returns ((color, severity?) => string)

    The color as its simulated variant as a hexadecimal string.

    -
      • (color, severity?): string
      • Parameters

        Returns string

    See

    For a deep dive on color vision deficiency go to

    -

    Example

    import { colorDeficiency, toHex } from 'huetiful-js'

    // Here we are simulating color blindness of tritanomaly or we can't see 'blue'.
    // We are passing in our color as an array of channel values in the mode "rgb". The severity is set to 0.1
    let tritanomaly = colorDeficiency('blue')
    console.log(tritanomaly(['rgb', 230, 100, 50, 0.5], 0.1))
    // #dd663680

    // Here we are simulating color blindness of tritanomaly or we can't see 'red'. The severity is not explicitly set so it defaults to 1
    let protanopia = colorDeficiency('red')
    console.log(protanopia({ h: 20, w: 50, b: 30, mode: 'hwb' }))
    // #9f9f9f -
    -

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/functions/utils.darken.html b/docs/functions/utils.darken.html deleted file mode 100644 index 50b6c29e..00000000 --- a/docs/functions/utils.darken.html +++ /dev/null @@ -1,7 +0,0 @@ -darken | huetiful-js

Function darken

  • Darkens the color by reducing the lightness channel. .

    -

    Parameters

    • color: ColorToken

      The color to darken.

      -
    • value: string | number

      The amount to darken with. Also supports expressions as strings e.g darken("#fc23a1","*0.5")

      -

    Returns ColorToken

    color The darkened color.

    -

    Example

    
    -
    -

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/functions/utils.getChannel.html b/docs/functions/utils.getChannel.html deleted file mode 100644 index 07cac3b0..00000000 --- a/docs/functions/utils.getChannel.html +++ /dev/null @@ -1,6 +0,0 @@ -getChannel | huetiful-js

Function getChannel

  • Gets the value specifified channel on the color.

    -

    Parameters

    • mc: string

      The mode and channel to be retrieved. For example "rgb.b" will return the value of the blue channel in the RGB color space of that color.

      -

    Returns ((color) => number)

    value The value of the queried channel.

    -
      • (color): number
      • Parameters

        Returns number

    Example

    import { getChannel } from 'huetiful-js'

    console.log(getChannel('rgb.g')('#a1bd2f'))
    // 0.7411764705882353 -
    -

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/functions/utils.getComplimentaryHue.html b/docs/functions/utils.getComplimentaryHue.html deleted file mode 100644 index 4506b153..00000000 --- a/docs/functions/utils.getComplimentaryHue.html +++ /dev/null @@ -1,7 +0,0 @@ -getComplimentaryHue | huetiful-js

Function getComplimentaryHue

  • Gets the complementary hue of the passed in color. The function is internally guarded against achromatic colors.

    -

    Parameters

    • color: ColorToken

      The color to retrieve its complimentary hue.

      -
    • Optional colorspace: HueColorSpaces
    • colorObj: boolean = false

      Optional boolean whether to return an object with the result color hue family or just the result color. Default is false.

      -

    Returns {
        color: ColorToken;
        hue: string;
    } | ColorToken

    An object with the hue family and complimentary color as keys.

    -

    Example

    import { getComplimentaryHue } from "huetiful-js";


    console.log(getComplimentaryHue("pink", true))
    //// { hue: 'blue-green', color: '#97dfd7ff' }

    console.log(getComplimentaryHue("purple"))
    // #005700ff -
    -

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/functions/utils.getContrast.html b/docs/functions/utils.getContrast.html deleted file mode 100644 index 7edc2ae4..00000000 --- a/docs/functions/utils.getContrast.html +++ /dev/null @@ -1,5 +0,0 @@ -getContrast | huetiful-js

Function getContrast

  • Gets the contrast between the passed in colors.

    -

    Parameters

    Returns number

    The relative luminance of the lightest color.

    -

    Example

    import { getContrast } from 'huetiful-js'

    console.log(getContrast("black", "white"));
    // 21 -
    -

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/functions/utils.getFarthestChroma.html b/docs/functions/utils.getFarthestChroma.html deleted file mode 100644 index 69739288..00000000 --- a/docs/functions/utils.getFarthestChroma.html +++ /dev/null @@ -1,7 +0,0 @@ -getFarthestChroma | huetiful-js

Function getFarthestChroma

  • Gets the largest saturation value from the passed in colors.

    -

    Parameters

    • colors: ColorToken[]

      The array of colors to query the color with the largest saturation value.

      -
    • colorObj: boolean = false

      Optional boolean that makes the function return a custom object with factor (saturation) and name of the color as keys. Default is false.

      -

    Returns number | {
        color: ColorToken;
        factor: number;
    }

    The largest saturation value in the colors passed in or a custom object.

    -

    Example

    import { getFarthestChroma } from 'huetiful-js'

    let sample = ['b2c3f1', '#a1bd2f', '#f3bac1']

    console.log(getFarthestChroma(sample, 'lch'))
    // 67.22120855010492 -
    -

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/functions/utils.getFarthestContrast.html b/docs/functions/utils.getFarthestContrast.html deleted file mode 100644 index cd183b79..00000000 --- a/docs/functions/utils.getFarthestContrast.html +++ /dev/null @@ -1,7 +0,0 @@ -getFarthestContrast | huetiful-js

Function getFarthestContrast

  • Gets the largest contrast value from the passed in colors compared against a sample color.

    -

    Parameters

    • colors: ColorToken[]

      The array of colors to query the color with the largest contrast value.

      -
    • against: ColorToken
    • Optional colorObj: boolean

      Optional boolean that makes the function return a custom object with factor (contrast) and name of the color as keys. Default is false.

      -

    Returns number | {
        factor: number;
        name: ColorToken;
    }

    The largest contrast value in the colors passed in or a custom object.

    -

    Example

    import { getFarthestContrast } from 'huetiful-js'

    console.log(getFarthestContrast(["b2c3f1", "#a1bd2f", "#f3bac1"], "green"));
    // 3.08355493246362

    console.log(getFarthestContrast(["b2c3f1", "#a1bd2f", "#f3bac1"], "green", true));
    // { contrast: 3.08355493246362, name: '#f3bac1' } -
    -

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/functions/utils.getFarthestHue.html b/docs/functions/utils.getFarthestHue.html deleted file mode 100644 index 29269051..00000000 --- a/docs/functions/utils.getFarthestHue.html +++ /dev/null @@ -1,8 +0,0 @@ -getFarthestHue | huetiful-js

Function getFarthestHue

  • Gets the largest hue value from the passed in colors.

    -

    Parameters

    • colors: ColorToken[]

      The array of colors to query the color with the largest hue value.

      -
    • Optional colorspace: HueColorSpaces

      The mode color space to perform the computation in.

      -
    • colorObj: boolean = false

      Optional boolean that makes the function return a custom object with factor (hue) and name of the color as keys. Default is false.

      -

    Returns number | {
        color: ColorToken;
        factor: number;
    }

    The largest hue value in the colors passed in or a custom object.

    -

    Example

    import { getFarthestHue } from 'huetiful-js'
    let sample = ['b2c3f1', '#a1bd2f', '#f3bac1']

    console.log(getFarthestHue(sample, 'lch'))
    // 273.54920266436477 -
    -

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/functions/utils.getFarthestLightness.html b/docs/functions/utils.getFarthestLightness.html deleted file mode 100644 index 1d8696af..00000000 --- a/docs/functions/utils.getFarthestLightness.html +++ /dev/null @@ -1,8 +0,0 @@ -getFarthestLightness | huetiful-js

Function getFarthestLightness

  • Gets the largest lightness value from the passed in colors.

    -

    Parameters

    • colors: ColorToken[]

      The array of colors to query the color with the largest lightness value.

      -
    • Optional colorspace: HueColorSpaces

      THe mode colorspace to retrieve the lightness value from.

      -
    • colorObj: boolean = false

      Optional boolean that makes the function return a custom object with factor (lightness) and name of the color as keys. Default is false.

      -

    Returns number | {
        color: ColorToken;
        factor: number;
    }

    The largest lightness value in the colors passed in or a custom object.

    -

    Example

    import { getFarthestLightness } from 'huetiful-js'

    let sample = ["b2c3f1", "#a1bd2f", "#f3bac1"]

    console.log(getFarthestLightness(sample, true))

    // { lightness: 80.94668903360088, name: '#f3bac1' } -
    -

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/functions/utils.getHueFamily.html b/docs/functions/utils.getHueFamily.html deleted file mode 100644 index bbe689e7..00000000 --- a/docs/functions/utils.getHueFamily.html +++ /dev/null @@ -1,6 +0,0 @@ -getHueFamily | huetiful-js

Function getHueFamily

  • Gets the hue family which a a color belongs to with the overtone included (if it has one.). For achromatic colors it returns the string "gray".

    -

    Parameters

    Returns HueFamily

    The name of the hue family for example red or green.

    -

    Example

    import { getHue } from 'huetiful-js'


    console.log(getHue("#310000"))
    // red -
    -

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/functions/utils.getLuminance.html b/docs/functions/utils.getLuminance.html deleted file mode 100644 index 42cd0c4e..00000000 --- a/docs/functions/utils.getLuminance.html +++ /dev/null @@ -1,6 +0,0 @@ -getLuminance | huetiful-js

Function getLuminance

  • Parameters

    Returns number

    value The color's luminance value.

    -

    Alias

    Gets the luminance value of that color as defined by WCAG.

    -

    Example

    import { getLuminance } from 'huetiful-js'

    console.log(getLuminance('#a1bd2f'))
    // 0.4417749513730954 -
    -

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/functions/utils.getNearestChroma.html b/docs/functions/utils.getNearestChroma.html deleted file mode 100644 index ba3e6819..00000000 --- a/docs/functions/utils.getNearestChroma.html +++ /dev/null @@ -1,8 +0,0 @@ -getNearestChroma | huetiful-js

Function getNearestChroma

  • Gets the smallest chroma/saturation value from the passed in colors.

    -

    Parameters

    • colors: ColorToken[]

      The array of colors to query the color with the smallest chroma/saturation value.

      -
    • Optional colorspace: HueColorSpaces

      The mode color space to perform the computation in.

      -
    • colorObj: boolean = false

      Optional boolean that makes the function return a custom object with factor (saturation) and name of the color as keys. Default is false.

      -

    Returns number | {
        color: ColorToken;
        factor: number;
    }

    The smallest chroma/saturation value in the colors passed in or a custom object.

    -

    Example

    import { getNearestChroma } from 'huetiful-js'

    let sample = ['b2c3f1', '#a1bd2f', '#f3bac1']

    console.log(getNearestChroma(sample, 'lch'))
    // 22.45669293295522 -
    -

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/functions/utils.getNearestColor.html b/docs/functions/utils.getNearestColor.html deleted file mode 100644 index 38ea751f..00000000 --- a/docs/functions/utils.getNearestColor.html +++ /dev/null @@ -1,7 +0,0 @@ -getNearestColor | huetiful-js

Function getNearestColor

  • Parameters

    • collection: ColorToken[] | "tailwind" | "material"

      The collection of colors to search for nearest colors

      -
    • color: ColorToken

      The color to use for distance comparison

      -
    • samples: number = 1

      The number of colors to return, if the value is above the colors in the available sample, the entire collection is returned with colors ordered in ascending order.

      -

    Returns ColorToken | ColorToken[]

    An array of colors.

    -

    Example

    
    -
    -

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/functions/utils.getNearestContrast.html b/docs/functions/utils.getNearestContrast.html deleted file mode 100644 index 91e4a791..00000000 --- a/docs/functions/utils.getNearestContrast.html +++ /dev/null @@ -1,7 +0,0 @@ -getNearestContrast | huetiful-js

Function getNearestContrast

  • Gets the smallest contrast value from the passed in colors compared against a sample color.

    -

    Parameters

    • colors: ColorToken[]

      The array of colors to query the color with the smallest contrast value.

      -
    • against: ColorToken
    • Optional colorObj: boolean

      Optional boolean that makes the function return a custom object with factor (contrast) and name of the color as keys. Default is false.

      -

    Returns any

    The smallest contrast value in the colors passed in or a custom object.

    -

    Example

    import { getNearestContrast } from 'huetiful-js'

    console.log(getNearestContrast(["b2c3f1", "#a1bd2f", "#f3bac1"], "green"));
    // 2.4061390502133424

    console.log(getNearestContrast(["b2c3f1", "#a1bd2f", "#f3bac1"], "green", true));
    // { contrast: 2.4061390502133424, name: '#a1bd2f' } -
    -

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/functions/utils.getNearestHue.html b/docs/functions/utils.getNearestHue.html deleted file mode 100644 index 1051e4cc..00000000 --- a/docs/functions/utils.getNearestHue.html +++ /dev/null @@ -1,8 +0,0 @@ -getNearestHue | huetiful-js

Function getNearestHue

  • Gets the smallest hue value from the passed in colors.

    -

    Parameters

    • colors: ColorToken[]

      The array of colors to query the color with the smallest hue value.

      -
    • Optional colorspace: string

      The mode color space to perform the computation in.

      -
    • colorObj: boolean = false

      Optional boolean that makes the function return a custom object with factor (hue) and name of the color as keys. Default is false.

      -

    Returns number | {
        color: ColorToken;
        factor: number;
    }

    The smallest hue value in the colors passed in or a custom object.

    -

    Example

    import { getNearestHue } from 'huetiful-js'

    let sample = ['b2c3f1', '#a1bd2f', '#f3bac1']

    console.log(getNearestHue(sample, 'lch'))
    // 12.462831644544274 -
    -

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/functions/utils.getNearestLightness.html b/docs/functions/utils.getNearestLightness.html deleted file mode 100644 index dff3a06b..00000000 --- a/docs/functions/utils.getNearestLightness.html +++ /dev/null @@ -1,7 +0,0 @@ -getNearestLightness | huetiful-js

Function getNearestLightness

  • Gets the smallest lightness value from the passed in colors.

    -

    Parameters

    • colors: ColorToken[]

      The array of colors to query the color with the smallest lightness value.

      -
    • Optional colorspace: HueColorSpaces
    • colorObj: boolean = false

      Optional boolean that makes the function return a custom object with factor (lightness) and name of the color as keys. Default is false.

      -

    Returns number | {
        color: ColorToken;
        factor: number;
    }

    The smallest lightness value in the colors passed in or a custom object.

    -

    Example

    import { getNearestLightness } from 'huetiful-js'

    let sample = ["b2c3f1", "#a1bd2f", "#f3bac1"]

    console.log(getNearestLightness(sample, true))

    // { lightness: 72.61647882089876, name: '#a1bd2f' } -
    -

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/functions/utils.isAchromatic.html b/docs/functions/utils.isAchromatic.html deleted file mode 100644 index d806cb31..00000000 --- a/docs/functions/utils.isAchromatic.html +++ /dev/null @@ -1,6 +0,0 @@ -isAchromatic | huetiful-js

Function isAchromatic

  • Checks if a color is achromatic(without hue or simply grayscale).

    -

    Parameters

    Returns boolean

    boolean Returns true if the color is achromatic else false

    -

    Example

    import { isAchromatic } from "huetiful-js";
    import { formatHex8, interpolate, samples } from "culori"


    isAchromatic('pink')
    // false

    let sample = [
    "#164100",
    "#ffff00",
    "#310000",
    'pink'
    ];

    console.log(map(sample, isAchromatic));

    // [false, false, false,false]

    isAchromatic('gray')
    // Returns true


    console.log(map(sample, isAchromatic));


    // we create an interpolation using black and white
    let f = interpolate(["black", "white"]);

    //We then create 12 evenly spaced samples and pass them to f as the `t` param required by an interpolating function.
    // Lastly we convert the color to hex for brevity for this example (otherwise color objects work fine too.)
    let grays = map(samples(12), (c) => formatHex8(f(c)));
    console.log(map(grays, isAchromatic));

    //
    [ false, true, true,
    true, true, true,
    true, true, true,
    true, true, false
    ] -
    -

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/functions/utils.isCool.html b/docs/functions/utils.isCool.html deleted file mode 100644 index 7db7102c..00000000 --- a/docs/functions/utils.isCool.html +++ /dev/null @@ -1,6 +0,0 @@ -isCool | huetiful-js

Function isCool

  • Checks if a color can be roughly classified as a cool color. Returns true if color is a cool color else false.

    -

    Parameters

    • color: ColorToken

      The color to check the temperature.

      -

    Returns boolean

    True or false.

    -

    Example

    import { isCool } from 'huetiful-js'

    let sample = [
    "#00ffdc",
    "#00ff78",
    "#00c000"
    ];


    console.log(isCool(sample[2]));
    // false

    console.log(map(sample, isCool));

    // [ true, false, true] -
    -

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/functions/utils.isWarm.html b/docs/functions/utils.isWarm.html deleted file mode 100644 index 5b3d70dd..00000000 --- a/docs/functions/utils.isWarm.html +++ /dev/null @@ -1,6 +0,0 @@ -isWarm | huetiful-js

Function isWarm

  • Checks if a color can be roughly classified as a warm color. Returns true if color is a warm color else false.

    -

    Parameters

    • color: ColorToken

      The color to check the temperature.

      -

    Returns boolean

    True or false.

    -

    Example

    import { isWarm } from 'huetiful-js'

    let sample = [
    "#00ffdc",
    "#00ff78",
    "#00c000"
    ];



    console.log(isWarm(sample[2]));
    //true

    console.log(map(sample, isWarm));


    // [ false, true, false] -
    -

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/functions/utils.overtone.html b/docs/functions/utils.overtone.html deleted file mode 100644 index 8c9dab6d..00000000 --- a/docs/functions/utils.overtone.html +++ /dev/null @@ -1,6 +0,0 @@ -overtone | huetiful-js

Function overtone

  • Returns the hue which is biasing the passed in color

    -

    Parameters

    • color: ColorToken

      The color to query its overtone.

      -

    Returns string | boolean

    The name of the overtone hue. If an achromatic color is passed in it return the string gray otherwise if the color has no bias it returns false.

    -

    Example

    import { overtone } from "huetiful-js";

    console.log(overtone("fefefe"))
    // 'gray'

    console.log(overtone("cyan"))
    // 'green'

    console.log(overtone("blue"))
    // false -
    -

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/functions/utils.setChannel.html b/docs/functions/utils.setChannel.html deleted file mode 100644 index 6779a084..00000000 --- a/docs/functions/utils.setChannel.html +++ /dev/null @@ -1,6 +0,0 @@ -setChannel | huetiful-js

Function setChannel

  • Sets the value for the specified channel in a color.

    -

    Parameters

    • mc: string

      The mode and channel to work with. For example 'rgb.b'.

      -

    Returns ((color, value) => ColorToken)

    color The mutated color.

    -

    Example

    import { setChannel } from 'huetiful-js'

    let myColor = setChannel('lch.h')('green',10)

    console.log(getChannel('lch.h')(myColor))
    // 10 -
    -

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/functions/utils.setLuminance.html b/docs/functions/utils.setLuminance.html deleted file mode 100644 index aef377a6..00000000 --- a/docs/functions/utils.setLuminance.html +++ /dev/null @@ -1,7 +0,0 @@ -setLuminance | huetiful-js

Function setLuminance

  • Sets the luminance by interpolating the color with black (to decrease luminance) or white (to increase the luminance).

    -

    Parameters

    • color: ColorToken

      The color to set luminance

      -
    • lum: number

      The amount of luminance to set. The value range is normalised between [0,1]

      -

    Returns ColorToken

    The mutated color with the modified properties.

    -

    Example

    import { setLuminance, getLuminance } from 'huetiful-js'

    let myColor = setLuminance('#a1bd2f', 0.5)

    console.log(getLuminance(myColor))
    // 0.4999999136285792 -
    -

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/index.html b/docs/index.html deleted file mode 100644 index 857edc5d..00000000 --- a/docs/index.html +++ /dev/null @@ -1,61 +0,0 @@ -huetiful-js

huetiful-js

Logo -TypeScript library for general purpose color manipulations and generating custom color scales.

-

Getting started⛳

Node

The library🧾 is available on npm as a package📦 for use in Node:

-
npm i huetiful-js
-
-

You can use a CDN in this example, jsdelivr to load the library remotely:

-
import {...} from 'https://cdn.jsdelivr.net/npm/huetiful-js/lib/huetiful.esm.mjs'
-
-

Browser

Or load the library as a UMD glabal (huetiful) in your HTML file using a <script> tag:

-
# With script tag

<script src='https://cdn.jsdelivr.net/npm/huetiful-js/dist/huetiful.umd.js'></script> -
-

What's a color 🤔?

A color can be defined using different data types(arrays, strings, numbers plain objects). This allows us to work with color in almost any format and flexibility in how we want to define our color. Below are some examples listing all the supported formats of passing in color values and their respective conversion functions:

-
import { num2rgb, toHex } from 'huetiful-js'

let cssNamedColor = 'pink'
let colorNumber = 5000
let colorObject = { l: 50, c: 20, h: 40, mode: 'lch' }
let colorObjectWithAlpha = { l: 50, c: 20, h: 40, alpha: 0.5, mode: 'lch' }
let arrColor = ['rgb', 120, 80, 50]
let arrColorWithAlpha = ['rgb', 120, 80, 50, 0.1]


// Converting CSS named colors to hex
console.log(toHex(cssNamedColor))
// #ffc0cb

// Converting a number to an RGB object
console.log(num2rgb(colorNumber, true))
// #001388

// Converting a color object to a 6 character hex (without the alpha value)
console.log(toHex(colorObject))
// #956d62

// Converting a color object with an alpha property to an 8 character hex code (including the alpha channel)
console.log(toHex(colorObjectWithAlpha))
// #956d6280

// Converting an array of channel values to a 6 character hex code.
console.log(toHex(arrColor))
// #785032

// Converting an array of channel values (including the alpha channel) to an 8 character hex
console.log(toHex(arrColorWithAlpha))
//#7850321a

-
-
-

ℹ️ See here and the expected channel ranges or more on converter functions page 🔗.

-
-

TailwindCSS colors🎨

As a starting point the library comes along with the default TailwindCSS palette included. This helps you get started easier when you're using palette functions such as hueShift() and earthtone()

-

The Tailwind colors can be accessed from two wrapper functions, tailwindColors and colors , that both take the same parameters but colors takes both parameters at once while tailwindColors is curried. Here's an example showing the differences between the two functions:

-
 import { tailwindColors , colors } from "huetiful-js";

// We pass in red as the target hue.
// It returns a function that can be called with an optional value parameter
let red = tailwindColors("red");
console.log(red());
// [
'#fef2f2', '#fee2e2',
'#fecaca', '#fca5a5',
'#f87171', '#ef4444',
'#dc2626', '#b91c1c',
'#991b1b', '#7f1d1d'
]


console.log(red(100));
// '#fee2e2'

console.log(red('900'));
// '#7f1d1d'

////// example for colors() //////

// colors() has a builtin parameter called 'all' that returns all colors at the specified value
let all300 = colors("all", 300);

console.log(all300)
//[
'#cbd5e1', '#d1d5db', '#d4d4d8',
'#d4d4d4', '#d6d3d1', '#fca5a5',
'#fdba74', '#fcd34d', '#fde047',
'#bef264', '#86efac', '#6ee7b7',
'#5eead4', '#7dd3fc', '#93c5fd',
'#c4b5fd', '#d8b4fe', '#f0abfc',
'#f9a8d4', '#fda4af'
]

let red = colors("red");
console.log(red);

// [
'#fef2f2', '#fee2e2',
'#fecaca', '#fca5a5',
'#f87171', '#ef4444',
'#dc2626', '#b91c1c',
'#991b1b', '#7f1d1d'
]

let red100 = colors("red", 100);

console.log(red100)
// #fee2e2
-
-

Working with arrays of color🎨

We can sort and filter colors using their property or channel values values like saturation,lightness and even contrast! -Here are some example using the filtering and sorting functions on an array of colors:

-

Sorting colors

An example of sorting colors by the relative luminance as defined by the WCAG 2.0 formula

-
import { sortByLuminance } from "huetiful-js";
let sample = [
"#00ffdc",
"#00ff78",
"#00c000",
"#007e00",
"#164100",
"#ffff00",
"#310000",
"#3e0000",
"#4e0000",
"#600000",
"#720000",
];



let sorted = sortByLuminance(sample)
console.log(sorted)
// [
'#310000', '#3e0000',
'#4e0000', '#600000',
'#720000', '#164100',
'#007e00', '#00c000',
'#00ff78', '#00ffdc',
'#ffff00'
]

// Note that you can specify the order as either ascending (`asc`) or descending (`desc`). The default is ascending. :

let sortedDescending = sortByLuminance(sample, "desc");
console.log(sortedDescending)
// [
'#ffff00', '#00ffdc',
'#00ff78', '#00c000',
'#007e00', '#164100',
'#720000', '#600000',
'#4e0000', '#3e0000',
'#310000'
]

-
-

Filtering colors

An example of filtering colors by the value of the hue angle. The function uses the Jch colorspace because of its perceptual uniformity. George Francis explains this phenomena in detail here.

-
 let sample = [
'#00ffdc',
'#00ff78',
'#00c000',
'#007e00',
'#164100',
'#ffff00',
'#310000',
'#3e0000',
'#4e0000',
'#600000',
'#720000',
]

filterByHue(sample, 20, 80)

// [ '#310000', '#3e0000', '#4e0000', '#600000', '#720000' ]

// We can even use expressions as the condition e.g '>=50' which means return the colors with a hue angle greater than or equal to 50

// Here are some examples
console.log(filterByHue(sample, '>100')
)
// [ '#00ffdc', '#00ff78', '#00c000', '#007e00', '#164100' ]

console.log(filterByHue(sample, '<=100')
)
// [ '#ffff00', '#310000', '#3e0000', '#4e0000', '#600000', '#720000' ]
-
-

See more about the parameter types and other filtering functions

-

Palette generators

A few simple palette generator functions are included in the library. One of my favourites is hueShift (as a color becomes lighter, its hue shifts up and darker when its hue shifts down. ) .

-
import { hueShift } from "huetiful-js";

let hueShiftedPalette = hueShift("#3e0000", {}, true);

console.log(hueShiftedPalette);

// [
'#ffffe1', '#ffdca5',
'#ca9a70', '#935c40',
'#5c2418', '#3e0000',
'#310000', '#34000f',
'#38001e', '#3b002c',
'#3b0c3a'
]


-
-

See more palette generator functions

-

Predicates⚖️

Is this color cool🥶 or warm 🥵, is it achromatic (grayscale) or chromatic? Though its easy to tell colors apart visually when they're displayed on the screen📺 it can be a bit confusing to tell colors apart using code🔢. Below is an example showing how to determine if a color is gray or not:

-

import { isAchromatic } from "huetiful-js";
import { formatHex8, interpolate, samples } from "culori"


isAchromatic('pink')
// false

let sample = [
"#164100",
"#ffff00",
"#310000",
'pink'
];

console.log(map(sample, isAchromatic));

// [false, false, false,false]

isAchromatic('gray')
// true



// Here are using some of Culori's functions to demonstrate this example
// we create an interpolation using black and white
let f = interpolate(["black", "white"]);

//We then create 12 evenly spaced samples and pass them to f as the `t` param required by an interpolating function.
// Lastly we convert the color to hex for brevity for this example (otherwise color objects work fine too.)
let grays = map(samples(12), (c) => formatHex8(f(c)));
console.log(map(grays, isAchromatic));

// The last two colors are false because we can't categorize black and white as achromatic.

//
[ false, true, true,
true, true, true,
true, true, true,
true, true, false
]
-
-

Here's an example🎆 showing how we can check if a color is cool using one of the predicate functions:

-
import { isCool } from 'huetiful-js'

let sample = [
"#00ffdc",
"#00ff78",
"#00c000"
];


console.log(isCool(sample[0]));
// false

console.log(map(sample, isCool));

// [ true, false, true]

-
-

Another use👷 case would be passing the predicate to an array method like filter to filter a collection of colors removing colors that return false for the passed in predicate. In the following example we use is isWarm to only return warm colors:

-
import { isWarm } from 'huetiful-js'

let sample = [
"#00ffdc",
"#00ff78",
"#00c000"
];

console.log(sample.filter(isWarm))
// [ '#00ff78' ]

-
-

Or maybe we want to know which color has the furthest hue distance in our sample collection against our target color 🤔:

-

import { getFarthestHue } from 'huetiful-js'
let sample = [
'#00ffdc',
'#00ff78',
'#00c000',
'#007e00',
'#164100',
'#ffff00',
'#310000',
'#3e0000',
'#4e0000',
'#600000',
'#720000',
]

console.log(getFarthestHue('lime', sample, 'lch'))
// 112.60431681589854
-
-

What's next🤷🏽‍♂️

-

The possibilities are limited by the imagination🤯 of the user._ -~ me :smile:

-
-

See the full docs here📜

-

Need help😣 ?

See some unexpected results😖? Check the issue tracker to open an issue or search for the problem to see if your issue already exists or has been resolved.

-

Would like to join the chat🗣️ and share ideas💡 and suggestions💭 ? See the discussions and just say hi, or share a coding meme(whatever breaks the ice🏔️)

-

Contributing👐🏾

This project is fully open source so contributions are welcome! Help make this project better by suggesting improvements or features and patching bugs🐛. See🔍 the CONTRIBUTING file for more information on how to get started.

-

References🔗

Coloring with code: A programmatic approach by George Francis

-
-
License

Copyright (c) 2023, -Dean Tarisai and contributors -huetiful-js is released under the Apache 2.0 license.

-
-

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 00000000..9afa1191 --- /dev/null +++ b/docs/index.md @@ -0,0 +1,16 @@ +[huetiful-js](README.md) / Modules + +![Logo](./huetiful-logo.png) + +## Table of contents + +### Modules + +- [colors](modules/colors.md) +- [converters](modules/converters.md) +- [filterBy](modules/filterBy.md) +- [generators](modules/generators.md) +- [helpers](modules/helpers.md) +- [sortBy](modules/sortBy.md) +- [types](modules/types.md) +- [utils](modules/utils.md) diff --git a/docs/modules/colors.html b/docs/modules/colors.html deleted file mode 100644 index 4e8315fe..00000000 --- a/docs/modules/colors.html +++ /dev/null @@ -1,10 +0,0 @@ -colors | huetiful-js

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/modules/colors.md b/docs/modules/colors.md new file mode 100644 index 00000000..80ad670a --- /dev/null +++ b/docs/modules/colors.md @@ -0,0 +1,272 @@ +[huetiful-js](../README.md) / [Modules](../modules.md) / colors + +# Module:📦 colors + +## Table of contents📜 + +### Classes🗃 + +- [Color](../classes/colors.Color.md) +- [ColorArray](../classes/colors.ColorArray.md) + +### Functions🧰 + +- [color](colors.md#color) +- [colors](colors.md#colors) +- [diverging](colors.md#diverging) +- [load](colors.md#load) +- [qualitative](colors.md#qualitative) +- [sequential](colors.md#sequential) +- [tailwindColors](colors.md#tailwindcolors) + +## Functions + +### color + +▸ **color**(`color`): [`Color`](../classes/colors.Color.md) + +Wrapper function over the Color class that returns a new Color method chain. + +#### Parameters🧮 + +| Name | Type | Description | +| :------ | :------ | :------ | +| `color` | [`ColorToken`](types.md#colortoken) | The color token to bind. | + +#### Returns🔙 + +[`Color`](../classes/colors.Color.md) + +A new Color class with all the utilities that take a single color as the first parameter bound to its prototype. + +___ + +### colors + +▸ **colors**(`shade`, `value?`): [`ColorToken`](types.md#colortoken) \| [`ColorToken`](types.md#colortoken)[] + +A wrapper function for the default Tailwind palette. If called with both parameters it return the hex code at the specified shade and value. Else, if called with the shade parameter as "all" it will return all colors from the shades in the palette map at the specified value (if value is undefined it will default to "500"). When called with the shade parameter only it will return all the colors from 100 to 900 of the specified shade. + +#### Parameters🧮 + +| Name | Type | Description | +| :------ | :------ | :------ | +| `shade` | [`TailwindColorFamilies`](types.md#tailwindcolorfamilies) \| ``"all"`` | Any shade in the default TailwindCSS palette e.g amber,blue. | +| `value?` | [`ScaleValues`](types.md#scalevalues) | Any value from 100 to 900 in increments of 100 e.g "200". | + +#### Returns🔙 + +[`ColorToken`](types.md#colortoken) \| [`ColorToken`](types.md#colortoken)[] + +color Returns a hex code string or array of hex codes depending on how the function is called. + +**`Example`** 📋 + +```ts +import { colors } from "huetiful-js"; + +let all300 = colors("all", 300); + +console.log(all300) +//[ + '#cbd5e1', '#d1d5db', '#d4d4d8', + '#d4d4d4', '#d6d3d1', '#fca5a5', + '#fdba74', '#fcd34d', '#fde047', + '#bef264', '#86efac', '#6ee7b7', + '#5eead4', '#7dd3fc', '#93c5fd', + '#c4b5fd', '#d8b4fe', '#f0abfc', + '#f9a8d4', '#fda4af' +] + +let red = colors("red"); +console.log(red); + +// [ + '#fef2f2', '#fee2e2', + '#fecaca', '#fca5a5', + '#f87171', '#ef4444', + '#dc2626', '#b91c1c', + '#991b1b', '#7f1d1d' +] + +let red100 = colors("red", 100); + +console.log(red100) +// #fee2e2 +``` + +___ + +### diverging + +▸ **diverging**(`scheme`): [`ColorToken`](types.md#colortoken)[] + +A wrapper function for ColorBrewer's map of diverging color schemes. + +#### Parameters🧮 + +| Name | Type | Description | +| :------ | :------ | :------ | +| `scheme` | [`DivergingScheme`](types.md#divergingscheme) | The name of the scheme. | + +#### Returns🔙 + +[`ColorToken`](types.md#colortoken)[] + +An array of colors in hex represantation. + +**`Example`** 📋 + +```ts +import { diverging } from 'huetiful-js' + +console.log(diverging("Spectral")) +//[ + '#7fc97f', '#beaed4', + '#fdc086', '#ffff99', + '#386cb0', '#f0027f', + '#bf5b17', '#666666' +] +``` + +___ + +### load + +▸ **load**(`colors`): [`ColorArray`](../classes/colors.ColorArray.md) + +#### Parameters🧮 + +| Name | Type | Description | +| :------ | :------ | :------ | +| `colors` | [`ColorToken`](types.md#colortoken)[] | An array of colors to chain the array methods on. Every element in the array will be parsed as a color token. | + +#### Returns🔙 + +[`ColorArray`](../classes/colors.ColorArray.md) + +___ + +### qualitative + +▸ **qualitative**(`scheme`): [`ColorToken`](types.md#colortoken)[] + +A wrapper function for ColorBrewer's map of qualitative color schemes. + +#### Parameters🧮 + +| Name | Type | Description | +| :------ | :------ | :------ | +| `scheme` | [`QualitativeScheme`](types.md#qualitativescheme) | The name of the scheme | + +#### Returns🔙 + +[`ColorToken`](types.md#colortoken)[] + +An array of colors in hex represantation. + +**`Example`** 📋 + +```ts +import { qualitative } from 'huetiful-js' + +console.log(qualitative("Accent")) +// [ + '#7fc97f', '#beaed4', + '#fdc086', '#ffff99', + '#386cb0', '#f0027f', + '#bf5b17', '#666666' +] +``` + +___ + +### sequential + +▸ **sequential**(`scheme`): [`ColorToken`](types.md#colortoken)[] + +A wrapper function for ColorBrewer's map of sequential color schemes. + +#### Parameters🧮 + +| Name | Type | Description | +| :------ | :------ | :------ | +| `scheme` | [`SequentialScheme`](types.md#sequentialscheme) | The name of the scheme | + +#### Returns🔙 + +[`ColorToken`](types.md#colortoken)[] + +An array of colors in hex represantation. + +**`Example`** 📋 + +```ts +import { sequential } from 'huetiful-js + +console.log(sequential("OrRd")) + +// [ + '#fff7ec', '#fee8c8', + '#fdd49e', '#fdbb84', + '#fc8d59', '#ef6548', + '#d7301f', '#b30000', + '#7f0000' +] +``` + +___ + +### tailwindColors + +▸ **tailwindColors**(`shade`): (`val?`: [`ScaleValues`](types.md#scalevalues)) => `string` \| `string`[] + +Wrapper function that returns TailwindCSS color value(s) of the specified shade. If invoked with no parameters it returns an array of colors from 100 to 900. If invoked with parameter will return the specified shade vale, + +#### Parameters🧮 + +| Name | Type | +| :------ | :------ | +| `shade` | `number` \| typeof `iterator` \| ``"length"`` \| ``"toString"`` \| ``"concat"`` \| ``"slice"`` \| ``"indexOf"`` \| ``"lastIndexOf"`` \| ``"charAt"`` \| ``"charCodeAt"`` \| ``"localeCompare"`` \| ``"match"`` \| ``"replace"`` \| ``"search"`` \| ``"split"`` \| ``"substring"`` \| ``"toLowerCase"`` \| ``"toLocaleLowerCase"`` \| ``"toUpperCase"`` \| ``"toLocaleUpperCase"`` \| ``"trim"`` \| ``"substr"`` \| ``"codePointAt"`` \| ``"includes"`` \| ``"endsWith"`` \| ``"normalize"`` \| ``"repeat"`` \| ``"startsWith"`` \| ``"anchor"`` \| ``"big"`` \| ``"blink"`` \| ``"bold"`` \| ``"fixed"`` \| ``"fontcolor"`` \| ``"fontsize"`` \| ``"italics"`` \| ``"link"`` \| ``"small"`` \| ``"strike"`` \| ``"sub"`` \| ``"sup"`` \| ``"valueOf"`` | + +#### Returns🔙 + +`fn` + +color A hex string value or array of hex strings. + +▸ (`val?`): `string` \| `string`[] + +##### Parameters🧮 + +| Name | Type | +| :------ | :------ | +| `val?` | [`ScaleValues`](types.md#scalevalues) | + +##### Returns🔙 + +`string` \| `string`[] + +**`Example`** 📋 + +```ts +import { tailwindColors } from "huetiful-js"; + +// We pass in red as the target hue. +// It returns a function that can be called with an optional value parameter +let red = tailwindColors("red"); +console.log(red()); +// [ + '#fef2f2', '#fee2e2', + '#fecaca', '#fca5a5', + '#f87171', '#ef4444', + '#dc2626', '#b91c1c', + '#991b1b', '#7f1d1d' +] + +console.log(red(100)); +// '#fee2e2' + +console.log(red('900')); +// '#7f1d1d' +``` diff --git a/docs/modules/converters.html b/docs/modules/converters.html deleted file mode 100644 index 5638133c..00000000 --- a/docs/modules/converters.html +++ /dev/null @@ -1,7 +0,0 @@ -converters | huetiful-js

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/modules/converters.md b/docs/modules/converters.md new file mode 100644 index 00000000..02033445 --- /dev/null +++ b/docs/modules/converters.md @@ -0,0 +1,190 @@ +[huetiful-js](../README.md) / [Modules](../modules.md) / converters + +# Module:📦 converters + +## Table of contents📜 + +### Functions🧰 + +- [num2rgb](converters.md#num2rgb) +- [rgb2num](converters.md#rgb2num) +- [temp2Color](converters.md#temp2color) +- [toColorTuple](converters.md#tocolortuple) +- [toHex](converters.md#tohex) +- [ucsConverter](converters.md#ucsconverter) + +## Functions + +### num2rgb + +▸ **num2rgb**(`num`, `hex?`): [`ColorToken`](types.md#colortoken) + +Returns the RGB color equivalent of any number between 0 and 16,777,215. + +#### Parameters🧮 + +| Name | Type | Default value | Description | +| :------ | :------ | :------ | :------ | +| `num` | `number` | `undefined` | The number to convert to RGB | +| `hex` | `boolean` | `false` | - | + +#### Returns🔙 + +[`ColorToken`](types.md#colortoken) + +color An RGB color object or hex string. + +**`Example`** 📋 + +```ts +import { num2rgb } from 'huetiful-js' + +console.log(num2rgb(900, true)) +// #000384 +``` + +___ + +### rgb2num + +▸ **rgb2num**(`color`): `number` + +Returns the numerical equivalent of a color. + +#### Parameters🧮 + +| Name | Type | Description | +| :------ | :------ | :------ | +| `color` | [`ColorToken`](types.md#colortoken) | The color to convert to its numerical equivalent. | + +#### Returns🔙 + +`number` + +value The numerical value of the color from 0 to 16,777,215. + +**`Example`** 📋 + +```ts +import { rgb2num } from 'huetiful-js' + +console.log(rgb2num("b2c3f1")) +// 11715569 +``` + +___ + +### temp2Color + +▸ **temp2Color**(`kelvin`, `hex?`): [`ColorToken`](types.md#colortoken) + +Converts the temperature value (in Kelvins) to an RGB color. + +#### Parameters🧮 + +| Name | Type | Default value | Description | +| :------ | :------ | :------ | :------ | +| `kelvin` | `number` | `undefined` | The number of Kelvins. From 0 to 30,000 . | +| `hex` | `boolean` | `false` | Optional boolean parameter to either return an RGB color object or hexadecimal string. Default is true. | + +#### Returns🔙 + +[`ColorToken`](types.md#colortoken) + +color The color as a hexadecimal or RGB color object. + +**`Example`** 📋 + +```ts +import { temp2Color } from 'huetiful-js' + +console.log(temp2Color(2542)) +// #ffa44a +``` + +___ + +### toColorTuple + +▸ **toColorTuple**(`color`, `mode`): `any`[] + +Returns an array of channel values in the mode color space. It does not mutate the values of the passed in color token. + +#### Parameters🧮 + +| Name | Type | Description | +| :------ | :------ | :------ | +| `color` | `string` \| `object` | Expects the color to be in hexadecimal represantation or as a plain color object. | +| `mode` | [`Colorspaces`](types.md#colorspaces) | The mode color space to return channel values for | + +#### Returns🔙 + +`any`[] + +An array of channel values with the colorspace as first element and the alpha channel if its explicitly defined in the passed in color. + +**`Example`** 📋 + +```ts +let rgbColor = { + r: 0.4, + g: 0.3, + b: 0.7, + mode: "rgb", +}; +console.log(toColorTuple(rgbColor,'rgb')); + +// [ 'rgb', 0.4, 0.3, 0.7 ] +``` + +___ + +### toHex + +▸ **toHex**(`color`): `string` + +Converts a wide range of color tokens which are color objects, and CSS named colors (for example 'red'), numbers from 0 to 166,777,215 and arrays in the form of [string,number,number,number,numer?] the first element in the array being the mode color space and the fourth optional number element as the opacity value to hexadecimal. + +#### Parameters🧮 + +| Name | Type | Description | +| :------ | :------ | :------ | +| `color` | [`ColorToken`](types.md#colortoken) | The color to convert to hexadecimal. Works on color objects and CSS named colors. | + +#### Returns🔙 + +`string` + +A hexadecimal representation of the passed in color. + +**`Example`** 📋 + +```ts +import { toHex } from "huetiful-js"; + +console.log(toHex({ l: 50, c: 31, h: 100, alpha: 0.5, mode: "lch" })) +// #7b794180 + +console.log(toHex({ l: 50, c: 31, h: 100, mode: "lch" })) +// #7b7941 +``` + +___ + +### ucsConverter + +▸ **ucsConverter**(`colorspace`): `ConvertFn`\<`any`\> + +Converter function with mode definitions for uniform color spaces. The function is curried to return a converter in the passed colospace. + +#### Parameters🧮 + +| Name | Type | Description | +| :------ | :------ | :------ | +| `colorspace` | [`UniformColorSpaces`](types.md#uniformcolorspaces) | The mode converter to return. | + +#### Returns🔙 + +`ConvertFn`\<`any`\> + +The converter function in the mode colorspace. diff --git a/docs/modules/filterBy.html b/docs/modules/filterBy.html deleted file mode 100644 index 598516ae..00000000 --- a/docs/modules/filterBy.html +++ /dev/null @@ -1,7 +0,0 @@ -filterBy | huetiful-js

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/modules/filterBy.md b/docs/modules/filterBy.md new file mode 100644 index 00000000..5a04a931 --- /dev/null +++ b/docs/modules/filterBy.md @@ -0,0 +1,285 @@ +[huetiful-js](../README.md) / [Modules](../modules.md) / filterBy + +# Module:📦 filterBy + +## Table of contents📜 + +### Functions🧰 + +- [filterByContrast](filterBy.md#filterbycontrast) +- [filterByDistance](filterBy.md#filterbydistance) +- [filterByHue](filterBy.md#filterbyhue) +- [filterByLightness](filterBy.md#filterbylightness) +- [filterByLuminance](filterBy.md#filterbyluminance) +- [filterBySaturation](filterBy.md#filterbysaturation) + +## Functions + +### filterByContrast + +▸ **filterByContrast**(`collection`, `against`, `startContrast?`, `endContrast?`): [`ColorToken`](types.md#colortoken)[] + +Returns an array of colors with the specified contrast range. The contrast is tested against a comparison color (the 'against' param) and the specified contrast ranges. + +#### Parameters🧮 + +| Name | Type | Default value | Description | +| :------ | :------ | :------ | :------ | +| `collection` | `object` \| [`ColorToken`](types.md#colortoken)[] | `undefined` | - | +| `against` | [`ColorToken`](types.md#colortoken) | `undefined` | - | +| `startContrast` | `number` | `1` | The minimum end of the contrast range. | +| `endContrast` | `number` | `21` | The maximum end of the contrast range. | + +#### Returns🔙 + +[`ColorToken`](types.md#colortoken)[] + +Array of filtered colors. + +**`Example`** 📋 + +```ts +import { filterByContrast } from 'huetiful-js' + +let sample = [ + '#00ffdc', + '#00ff78', + '#00c000', + '#007e00', + '#164100', + '#ffff00', + '#310000', + '#3e0000', + '#4e0000', + '#600000', + '#720000', +] + +console.log(filterByContrast(sample, 'green', '>=3')) +// [ '#00ffdc', '#00ff78', '#ffff00', '#310000', '#3e0000', '#4e0000' ] +``` + +___ + +### filterByDistance + +▸ **filterByDistance**(`collection`, `against`, `startDistance?`, `endDistance?`): [`ColorToken`](types.md#colortoken)[] + +Returns an array of colors with the specified distance range. The distance is tested against a comparison color (the 'against' param) and the specified distance ranges. Uses the differenceHyab metric for calculating the distances. + +#### Parameters🧮 + +| Name | Type | Default value | Description | +| :------ | :------ | :------ | :------ | +| `collection` | `object` \| [`ColorToken`](types.md#colortoken)[] | `undefined` | - | +| `against` | [`ColorToken`](types.md#colortoken) | `undefined` | - | +| `startDistance` | `number` | `0.05` | The minimum end of the distance range. | +| `endDistance?` | `number` | `undefined` | The maximum end of the distance range. | + +#### Returns🔙 + +[`ColorToken`](types.md#colortoken)[] + +Array of filtered colors. + +**`Example`** 📋 + +```ts +import { filterByDistance } from 'huetiful-js' + +let sample = [ + "#ffff00", + "#00ffdc", + "#00ff78", + "#00c000", + "#007e00", + "#164100", + "#720000", + "#600000", +] + +console.log(filterByDistance(sample, "yellow", 0.1)) +// [ '#ffff00' ] +``` + +___ + +### filterByHue + +▸ **filterByHue**(`collection`, `startHue?`, `endHue?`, `colorspace?`): [`ColorToken`](types.md#colortoken)[] + +Returns colors in the specified hue ranges between 0 to 360. + +#### Parameters🧮 + +| Name | Type | Default value | Description | +| :------ | :------ | :------ | :------ | +| `collection` | `object` \| [`ColorToken`](types.md#colortoken)[] | `undefined` | - | +| `startHue` | `number` | `0` | The minimum end of the hue range. | +| `endHue` | `number` | `360` | The maximum end of the hue range. | +| `colorspace?` | [`HueColorSpaces`](types.md#huecolorspaces) | `undefined` | - | + +#### Returns🔙 + +[`ColorToken`](types.md#colortoken)[] + +Array of the filtered colors. + +**`Example`** 📋 + +```ts +let sample = [ + '#00ffdc', + '#00ff78', + '#00c000', + '#007e00', + '#164100', + '#ffff00', + '#310000', + '#3e0000', + '#4e0000', + '#600000', + '#720000', +] + +filterByHue(sample, 20, 80) + +// [ '#310000', '#3e0000', '#4e0000', '#600000', '#720000' ] +``` + +___ + +### filterByLightness + +▸ **filterByLightness**(`collection`, `startLightness?`, `endLightness?`, `colorspace?`): [`ColorToken`](types.md#colortoken)[] + +Returns an array of colors in the specified lightness range. The range is between 0 and 100. + +#### Parameters🧮 + +| Name | Type | Default value | Description | +| :------ | :------ | :------ | :------ | +| `collection` | `object` \| [`ColorToken`](types.md#colortoken)[] | `undefined` | - | +| `startLightness` | `number` | `5` | The minimum end of the lightness range. | +| `endLightness` | `number` | `100` | The maximum end of the lightness range. | +| `colorspace?` | [`HueColorSpaces`](types.md#huecolorspaces) | `undefined` | The mode colorspace to retrieve the lightness value from. The default is lch65 | + +#### Returns🔙 + +[`ColorToken`](types.md#colortoken)[] + +Array of filtered colors. + +**`Example`** 📋 + +```ts +import { filterByLightness } from 'huetiful-js' +let sample = [ + '#00ffdc', + '#00ff78', + '#00c000', + '#007e00', + '#164100', + '#ffff00', + '#310000', + '#3e0000', + '#4e0000', + '#600000', + '#720000', +] + +filterByLightness(sample, 20, 80) + +// [ '#00c000', '#007e00', '#164100', '#720000' ] +``` + +___ + +### filterByLuminance + +▸ **filterByLuminance**(`collection`, `startLuminance?`, `endLuminance?`): [`ColorToken`](types.md#colortoken)[] + +Returns an array of colors in the specified luminance range. The range is normalised to [0,1]. + +#### Parameters🧮 + +| Name | Type | Default value | Description | +| :------ | :------ | :------ | :------ | +| `collection` | `object` \| [`ColorToken`](types.md#colortoken)[] | `undefined` | - | +| `startLuminance` | `number` | `0.05` | The minimum end of the luminance range. | +| `endLuminance` | `number` | `1` | The maximum end of the luminance range. | + +#### Returns🔙 + +[`ColorToken`](types.md#colortoken)[] + +Array of filtered colors. + +**`Example`** 📋 + +```ts +import { filterByLuminance } from 'huetiful-js' +let sample = [ + '#00ffdc', + '#00ff78', + '#00c000', + '#007e00', + '#164100', + '#ffff00', + '#310000', + '#3e0000', + '#4e0000', + '#600000', + '#720000', +] + +filterByLuminance(sample, 0.4, 0.9) + +// [ '#00ffdc', '#00ff78' ] +``` + +___ + +### filterBySaturation + +▸ **filterBySaturation**(`collection`, `startSaturation?`, `endSaturation?`, `colorspace?`): [`ColorToken`](types.md#colortoken)[] + +Returns an array of colors in the specified saturation range. The range is normalised to [0,1]. + +#### Parameters🧮 + +| Name | Type | Default value | Description | +| :------ | :------ | :------ | :------ | +| `collection` | `object` \| [`ColorToken`](types.md#colortoken)[] | `undefined` | - | +| `startSaturation` | `number` | `0.05` | The minimum end of the saturation range. | +| `endSaturation` | `number` | `1` | The maximum end of the saturation range. | +| `colorspace?` | [`HueColorSpaces`](types.md#huecolorspaces) | `undefined` | The color space to fetch the saturation value from. Any color space with a chroma channel e.g 'lch' or 'hsl' will do. | + +#### Returns🔙 + +[`ColorToken`](types.md#colortoken)[] + +Array of filtered colors. + +**`Example`** 📋 + +```ts +import { filterByContrast } from 'huetiful-js' + +let sample = [ + '#00ffdc', + '#00ff78', + '#00c000', + '#007e00', + '#164100', + '#ffff00', + '#310000', + '#3e0000', + '#4e0000', + '#600000', + '#720000', +] + +console.log(filterByContrast(sample, 'green', '>=3')) +// [ '#00ffdc', '#00ff78', '#ffff00', '#310000', '#3e0000', '#4e0000' ] +``` diff --git a/docs/modules/generators.html b/docs/modules/generators.html deleted file mode 100644 index a4b3418e..00000000 --- a/docs/modules/generators.html +++ /dev/null @@ -1,10 +0,0 @@ -generators | huetiful-js

Module generators

References

Re-exports ucsConverter

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/modules/generators.md b/docs/modules/generators.md new file mode 100644 index 00000000..b6c109f6 --- /dev/null +++ b/docs/modules/generators.md @@ -0,0 +1,287 @@ +[huetiful-js](../README.md) / [Modules](../modules.md) / generators + +# Module:📦 generators + +## Table of contents📜 + +### References + +- [ucsConverter](generators.md#ucsconverter) + +### Functions🧰 + +- [discoverPalettes](generators.md#discoverpalettes) +- [earthtone](generators.md#earthtone) +- [hueShift](generators.md#hueshift) +- [interpolateSpline](generators.md#interpolatespline) +- [interpolator](generators.md#interpolator) +- [pairedScheme](generators.md#pairedscheme) +- [pastel](generators.md#pastel) +- [scheme](generators.md#scheme) + +## References + +### ucsConverter + +Re-exports [ucsConverter](converters.md#ucsconverter) + +## Functions + +### discoverPalettes + +▸ **discoverPalettes**(`colors`, `schemeType?`): [`ColorToken`](types.md#colortoken)[] \| `object` + +Takes an array of colors and finds the best matches for a set of predefined palettes. The function does not work on achromatic colors, you may use isAchromatic to filter grays from your collection before passing it to the function. + +#### Parameters🧮 + +| Name | Type | Description | +| :------ | :------ | :------ | +| `colors` | [`ColorToken`](types.md#colortoken)[] | The array of colors to create palettes from. Preferably use 5 or more colors for better results. | +| `schemeType?` | ``"analogous"`` \| ``"triadic"`` \| ``"tetradic"`` \| ``"complementary"`` | (Optional) The palette type you want to return. | + +#### Returns🔙 + +[`ColorToken`](types.md#colortoken)[] \| `object` + +An array of colors if the scheme parameter is specified else it returns an object of all the palette types as keys and their values as an array of colors. If no colors are valid for the palette types it returns an empty array for the palette results. + +**`Example`** 📋 + +```ts +import { discoverPalettes } from 'huetiful-js' + +let sample = [ + "#ffff00", + "#00ffdc", + "#00ff78", + "#00c000", + "#007e00", + "#164100", + "#720000", + "#600000", + "#4e0000", + "#3e0000", + "#310000", +] + +console.log(discoverPalettes(sample, "tetradic")) +// [ '#ffff00ff', '#00ffdcff', '#310000ff', '#720000ff' ] +``` + +___ + +### earthtone + +▸ **earthtone**(`color`, `colorspace?`, `options?`): [`ColorToken`](types.md#colortoken)[] + +Creates a scale of a spline based interpolation between an earthtone and a color. + +#### Parameters🧮 + +| Name | Type | Description | +| :------ | :------ | :------ | +| `color` | [`ColorToken`](types.md#colortoken) | The color to interpolate an earth tone with. * | +| `colorspace?` | [`HueColorSpaces`](types.md#huecolorspaces) | - | +| `options?` | [`EarthtoneOptions`](types.md#earthtoneoptions) | Optional overrides for customising interpolation and easing functions. | + +#### Returns🔙 + +[`ColorToken`](types.md#colortoken)[] + +The array of colors resulting from the earthtone interpolation as hex codes. + +**`Example`** 📋 + +```ts +import { earthtone } from 'huetiful-js' + +console.log(earthtone("pink",{earthtones:'clay',iterations:5 })) +// [ '#6a5c52ff', '#8d746aff', '#b38d86ff', '#d9a6a6ff', '#ffc0cbff' ] +``` + +___ + +### hueShift + +▸ **hueShift**(`color`, `colorspace?`, `options?`): [`ColorToken`](types.md#colortoken)[] + +Generates a palette of hue shifted colors (as a color becomes lighter, its hue shifts up and darker when its hue shifts down. ) from a single base color. Min and max lightness value determine how light or dark our colour will be at either extreme. + +#### Parameters🧮 + +| Name | Type | Description | +| :------ | :------ | :------ | +| `color` | [`ColorToken`](types.md#colortoken) | The color to use as the base of the hueshift. Colors are internally converted to LCH. | +| `colorspace?` | [`UniformColorSpaces`](types.md#uniformcolorspaces) | - | +| `options?` | [`HueShiftOptions`](types.md#hueshiftoptions) | The optional overrides object to customize per channel options like interpolation methods and channel fixups. | + +#### Returns🔙 + +[`ColorToken`](types.md#colortoken)[] + +An array of colors in hex. The length of the resultant array is the number of iterations multiplied by 2 plus the base color passed or (iterations*2)+1 + +**`Example`** 📋 + +```ts +import { hueShift } from "huetiful-js"; + +let hueShiftedPalette = hueShift("#3e0000"); + +console.log(hueShiftedPalette); + +// [ + '#ffffe1', '#ffdca5', + '#ca9a70', '#935c40', + '#5c2418', '#3e0000', + '#310000', '#34000f', + '#38001e', '#3b002c', + '#3b0c3a' +] +``` + +___ + +### interpolateSpline + +▸ **interpolateSpline**(`colors`, `colorspace?`, `samples?`, `kind?`, `closed?`, `options?`): [`ColorToken`](types.md#colortoken)[] + +Returns a spline based interpolator function with customizable interpolation methods (passed in as 'kind') and optional channel specific overrides. + +#### Parameters🧮 + +| Name | Type | Default value | Description | +| :------ | :------ | :------ | :------ | +| `colors` | [`ColorToken`](types.md#colortoken)[] | `undefined` | The array of colors to interpolate. If a color has a falsy channel for example black has an undefined hue channel some interpolation methods may return NaN affecting the final result. | +| `colorspace?` | [`HueColorSpaces`](types.md#huecolorspaces) | `undefined` | The colorspace to perform the color space in. Prefer uniform color spaces for better results such as Lch or Jch. | +| `samples?` | `number` | `undefined` | - | +| `kind?` | ``"natural"`` \| ``"monotone"`` \| ``"basis"`` | `undefined` | The type of the spline interpolation method. Default is basis. | +| `closed` | `boolean` | `false` | Optional parameter to return the 'closed' variant of the 'kind' of interpolation method which can be useful for cyclical color scales. Default is false | +| `options?` | [`InterpolatorOptions`](types.md#interpolatoroptions) | `undefined` | Optional channel specific overrides. | + +#### Returns🔙 + +[`ColorToken`](types.md#colortoken)[] + +A hexadecimal representation of the resultant color. + +___ + +### interpolator + +▸ **interpolator**(`colors`, `colorspace?`, `options?`): `Interpolator`\<[`HueColorSpaces`](types.md#huecolorspaces)\> + +#### Parameters🧮 + +| Name | Type | +| :------ | :------ | +| `colors` | [`ColorToken`](types.md#colortoken)[] | +| `colorspace?` | [`HueColorSpaces`](types.md#huecolorspaces) | +| `options?` | `object` | + +#### Returns🔙 + +`Interpolator`\<[`HueColorSpaces`](types.md#huecolorspaces)\> + +___ + +### pairedScheme + +▸ **pairedScheme**(`color`, `options?`): [`ColorToken`](types.md#colortoken)[] \| [`ColorToken`](types.md#colortoken) + +pairedScheme + Creates a scheme that consists of a base color that is incremented by a hueStep to get the final hue to pair with.The colors are interpolated via white or black. + +#### Parameters🧮 + +| Name | Type | Description | +| :------ | :------ | :------ | +| `color` | [`ColorToken`](types.md#colortoken) | The color to return a paired color scheme from. | +| `options?` | [`PairedSchemeOptions`](types.md#pairedschemeoptions) | The optional overrides object to customize per channel options like interpolation methods and channel fixups. | + +#### Returns🔙 + +[`ColorToken`](types.md#colortoken)[] \| [`ColorToken`](types.md#colortoken) + +An array containing the paired scheme. + +**`Example`** 📋 + +```ts +import { pairedScheme } from 'huetiful-js' + +console.log(pairedScheme("green",{hueStep:6,iterations:4,tone:'dark'})) +// [ '#008116ff', '#006945ff', '#184b4eff', '#007606ff' ] +``` + +___ + +### pastel + +▸ **pastel**(`color`): [`ColorToken`](types.md#colortoken) + +Returns a random pastel variant of the passed in color. + +#### Parameters🧮 + +| Name | Type | Description | +| :------ | :------ | :------ | +| `color` | [`ColorToken`](types.md#colortoken) | The color to return a pastel variant of. | + +#### Returns🔙 + +[`ColorToken`](types.md#colortoken) + +A random pastel color. + +**`Example`** 📋 + +```ts +import { pastel } from 'huetiful-js' + +console.log(pastel("green")) +// #036103ff +``` + +___ + +### scheme + +▸ **scheme**(`schemeType`): (`color`: [`ColorToken`](types.md#colortoken), `easingFunc?`: (`t`: `number`) => `number`) => [`ColorToken`](types.md#colortoken)[] + +Generates a randomised classic color scheme from a single base color. + +#### Parameters🧮 + +| Name | Type | Description | +| :------ | :------ | :------ | +| `schemeType` | `string` | Any classic color scheme either "analogous"\|"triadic"\|"tetradic"\|"complementary"\|"splitComplementary". | + +#### Returns🔙 + +`fn` + +An array of 8 character hex codes. Elements in the array depend on the number of sample colors in the targeted scheme. + +▸ (`color`, `easingFunc?`): [`ColorToken`](types.md#colortoken)[] + +##### Parameters🧮 + +| Name | Type | +| :------ | :------ | +| `color` | [`ColorToken`](types.md#colortoken) | +| `easingFunc?` | (`t`: `number`) => `number` | + +##### Returns🔙 + +[`ColorToken`](types.md#colortoken)[] + +**`Example`** 📋 + +```ts +import { base } from 'huetiful-js' + +console.log(base("triadic")("#a1bd2f", true)) +// [ '#a1bd2fff', '#00caffff', '#ff78c9ff' ] +``` diff --git a/docs/modules/helpers.md b/docs/modules/helpers.md new file mode 100644 index 00000000..031ab42a --- /dev/null +++ b/docs/modules/helpers.md @@ -0,0 +1,771 @@ +[huetiful-js](../README.md) / [Modules](../modules.md) / helpers + +# Module:📦 helpers + +## Table of contents📜 + +### Variables + +- [interpolatorConfig](helpers.md#interpolatorconfig) + +### Functions🧰 + +- [adjustHue](helpers.md#adjusthue) +- [channelDifference](helpers.md#channeldifference) +- [checkArg](helpers.md#checkarg) +- [colorObj](helpers.md#colorobj) +- [colorObjArr](helpers.md#colorobjarr) +- [customConcat](helpers.md#customconcat) +- [customFindKey](helpers.md#customfindkey) +- [customSort](helpers.md#customsort) +- [eq](helpers.md#eq) +- [expressionParser](helpers.md#expressionparser) +- [filteredArr](helpers.md#filteredarr) +- [floorCeil](helpers.md#floorceil) +- [getModeChannel](helpers.md#getmodechannel) +- [gt](helpers.md#gt) +- [gte](helpers.md#gte) +- [inRange](helpers.md#inrange) +- [isInteger](helpers.md#isinteger) +- [lt](helpers.md#lt) +- [lte](helpers.md#lte) +- [matchChromaChannel](helpers.md#matchchromachannel) +- [matchComparator](helpers.md#matchcomparator) +- [matchDigits](helpers.md#matchdigits) +- [matchLightnessChannel](helpers.md#matchlightnesschannel) +- [max](helpers.md#max) +- [min](helpers.md#min) +- [normalize](helpers.md#normalize) +- [random](helpers.md#random) +- [sortedArr](helpers.md#sortedarr) + +## Variables + +### interpolatorConfig + +• `Const` **interpolatorConfig**: `Object` + +#### Type declaration + +| Name | Type | +| :------ | :------ | +| `chromaInterpolator` | [`Interpolator`](types.md#interpolator) | +| `easingFunc` | (`t`: `number`) => `number` | +| `hueFixup` | (`arr`: `number`[]) => `number`[] | +| `hueInterpolator` | [`Interpolator`](types.md#interpolator) | +| `lightnessInterpolator` | [`Interpolator`](types.md#interpolator) | + +## Functions + +### adjustHue + +▸ **adjustHue**(`value`): `number` + +#### Parameters🧮 + +| Name | Type | Description | +| :------ | :------ | :------ | +| `value` | `number` | The hue angle to normalize. | + +#### Returns🔙 + +`number` + +The normalized hue angle or passed in value if it was within [0,360] + +**`Example`** 📋 + +```ts +console.log(adjustHue(4)); +// 4 + +console.log(adjustHue(444)); +// 84 +``` + +___ + +### channelDifference + +▸ **channelDifference**(`color`, `modeChannel`): (`subtrahend`: [`ColorToken`](types.md#colortoken)) => `number` + +Returns the channel value difference between the passed in colors. They are both converted to the colorspace in the modeChannel parameter before values are computed. + +#### Parameters🧮 + +| Name | Type | Description | +| :------ | :------ | :------ | +| `color` | [`ColorToken`](types.md#colortoken) | The color to subtract values from/ | +| `modeChannel` | `string` | The colorspace and channel string to perform the operation in. | + +#### Returns🔙 + +`fn` + +The difference between the color channel(s) + +▸ (`subtrahend`): `number` + +##### Parameters🧮 + +| Name | Type | +| :------ | :------ | +| `subtrahend` | [`ColorToken`](types.md#colortoken) | + +##### Returns🔙 + +`number` + +**`Example`** 📋 + +```ts + +``` + +___ + +### checkArg + +▸ **checkArg**(`arg`, `def`): `unknown` + +Returns the first truthy value. + +#### Parameters🧮 + +| Name | Type | Description | +| :------ | :------ | :------ | +| `arg` | `unknown` | The value to check | +| `def` | `unknown` | The value to cast if arg is falsy | + +#### Returns🔙 + +`unknown` + +The first truthy value + +___ + +### colorObj + +▸ **colorObj**(`factor`, `callback`): (`color`: [`ColorToken`](types.md#colortoken)) => \{ `color`: [`ColorToken`](types.md#colortoken) = color } + +#### Parameters🧮 + +| Name | Type | +| :------ | :------ | +| `factor` | [`Factor`](types.md#factor) | +| `callback` | `unknown` | + +#### Returns🔙 + +`fn` + +▸ (`color`): `Object` + +##### Parameters🧮 + +| Name | Type | +| :------ | :------ | +| `color` | [`ColorToken`](types.md#colortoken) | + +##### Returns🔙 + +`Object` + +| Name | Type | +| :------ | :------ | +| `color` | [`ColorToken`](types.md#colortoken) | + +___ + +### colorObjArr + +▸ **colorObjArr**(`factor`, `callback`): (`collection`: `object` \| [`ColorToken`](types.md#colortoken)[]) => \{ `color`: [`ColorToken`](types.md#colortoken) ; `factor`: [`Factor`](types.md#factor) }[] + +#### Parameters🧮 + +| Name | Type | +| :------ | :------ | +| `factor` | [`Factor`](types.md#factor) | +| `callback` | `any` | + +#### Returns🔙 + +`fn` + +▸ (`collection`): \{ `color`: [`ColorToken`](types.md#colortoken) ; `factor`: [`Factor`](types.md#factor) }[] + +##### Parameters🧮 + +| Name | Type | +| :------ | :------ | +| `collection` | `object` \| [`ColorToken`](types.md#colortoken)[] | + +##### Returns🔙 + +\{ `color`: [`ColorToken`](types.md#colortoken) ; `factor`: [`Factor`](types.md#factor) }[] + +___ + +### customConcat + +▸ **customConcat**(`hue`): `number`[] + +#### Parameters🧮 + +| Name | Type | +| :------ | :------ | +| `hue` | `object` | + +#### Returns🔙 + +`number`[] + +___ + +### customFindKey + +▸ **customFindKey**(`collection`, `factor`): `string` + +#### Parameters🧮 + +| Name | Type | Description | +| :------ | :------ | :------ | +| `collection` | `object` | The collection to inspect. | +| `factor` | `number` | The value to compare against | + +#### Returns🔙 + +`string` + +Returns the found element or its key, else `undefined`. + +___ + +### customSort + +▸ **customSort**(`order`, `factor?`): (`a`: `any`, `b`: `any`) => `number` + +Helper function for native sorting method for arrays. + +#### Parameters🧮 + +| Name | Type | Description | +| :------ | :------ | :------ | +| `order` | [`Order`](types.md#order) | Either ascending or descending. | +| `factor?` | `string` | The property to query. | + +#### Returns🔙 + +`fn` + +A sorted array. + +▸ (`a`, `b`): `number` + +##### Parameters🧮 + +| Name | Type | +| :------ | :------ | +| `a` | `any` | +| `b` | `any` | + +##### Returns🔙 + +`number` + +___ + +### eq + +▸ **eq**(`x`, `y`): `boolean` + +#### Parameters🧮 + +| Name | Type | +| :------ | :------ | +| `x` | `number` | +| `y` | `number` | + +#### Returns🔙 + +`boolean` + +___ + +### expressionParser + +▸ **expressionParser**(`color`, `modeChannel`, `expression`): `number` + +Takes an arithmetic operator followed by a value and passes the result of the expression to the specified channel. Currently supports addition,subtraction,division and multiplication symbols only. + +#### Parameters🧮 + +| Name | Type | Description | +| :------ | :------ | :------ | +| `color` | [`ColorToken`](types.md#colortoken) | The color. | +| `modeChannel` | `string` | The colorspace channel to set. | +| `expression` | `string` | The expression assignment as a string. | + +#### Returns🔙 + +`number` + +**`Example`** 📋 + +```ts +console.log(lch('blue')); +// { mode: 'lch',l: 29.568297153444703,c: 131.2014771995311,h: 301.36428148973533} + +console.log(expressionParser('blue', 'lch.l', '*0.3')); +// { mode: 'lch',l: 8.87048914603341,c: 131.2014771995311,h: 301.36428148973533 } +``` + +___ + +### filteredArr + +▸ **filteredArr**(`factor`, `cb?`): (`collection`: `object` \| [`ColorToken`](types.md#colortoken)[], `start`: `string` \| `number`, `end?`: `number`) => [`ColorToken`](types.md#colortoken)[] + +Filters an array according to the value of a color's queried factor + +#### Parameters🧮 + +| Name | Type | Description | +| :------ | :------ | :------ | +| `factor` | [`Factor`](types.md#factor) | The property to query and use as filtering criteria | +| `cb?` | `unknown` | The function to use for comparison | + +#### Returns🔙 + +`fn` + +The filtered array + +▸ (`collection`, `start`, `end?`): [`ColorToken`](types.md#colortoken)[] + +##### Parameters🧮 + +| Name | Type | +| :------ | :------ | +| `collection` | `object` \| [`ColorToken`](types.md#colortoken)[] | +| `start` | `string` \| `number` | +| `end?` | `number` | + +##### Returns🔙 + +[`ColorToken`](types.md#colortoken)[] + +___ + +### floorCeil + +▸ **floorCeil**(`num`): `number` + +#### Parameters🧮 + +| Name | Type | Description | +| :------ | :------ | :------ | +| `num` | `number` | The number to round up or down. | + +#### Returns🔙 + +`number` + +An integer + + + +Rounds up or down a number based on the float value. + +**`Example`** 📋 + +```ts +console.log(floorCeil(1.45)); +// 1 +console.log(floorCeil(1.501)); +// 2 +``` + +___ + +### getModeChannel + +▸ **getModeChannel**(`colorspace`, `index?`): `string` + +Gets the clipped string of a passed in colorspace by removing non-channel characters. + +#### Parameters🧮 + +| Name | Type | Description | +| :------ | :------ | :------ | +| `colorspace` | `string` | The colorspace to get the channel keys. | +| `index?` | `number` | Optional index to return a single specified channel. | + +#### Returns🔙 + +`string` + +A string. + +**`Example`** 📋 + +```ts +console.log(getModeChannel("oklch")); +// lch + +console.log(getModeChannel("okhsl", 2)); +// l +``` + +___ + +### gt + +▸ **gt**(`x`, `y`): `boolean` + +#### Parameters🧮 + +| Name | Type | +| :------ | :------ | +| `x` | `number` | +| `y` | `number` | + +#### Returns🔙 + +`boolean` + +___ + +### gte + +▸ **gte**(`x`, `y`): `boolean` + +#### Parameters🧮 + +| Name | Type | +| :------ | :------ | +| `x` | `number` | +| `y` | `number` | + +#### Returns🔙 + +`boolean` + +___ + +### inRange + +▸ **inRange**(`number`, `start`, `end?`): `boolean` + +#### Parameters🧮 + +| Name | Type | Description | +| :------ | :------ | :------ | +| `number` | `number` | The number to check. | +| `start` | `number` | The minimum or starting value. | +| `end?` | `number` | The maximum or starting value. | + +#### Returns🔙 + +`boolean` + +True if the number is in range else false. + + + +Checks if a value is within the start and end range. + +___ + +### isInteger + +▸ **isInteger**(`num`): `boolean` + +Checks if a number is an integer or float. + +#### Parameters🧮 + +| Name | Type | Description | +| :------ | :------ | :------ | +| `num` | `string` \| `number` | The number to query | + +#### Returns🔙 + +`boolean` + +True if the number is an integer else false if it is a float. + +___ + +### lt + +▸ **lt**(`x`, `y`): `boolean` + +#### Parameters🧮 + +| Name | Type | +| :------ | :------ | +| `x` | `number` | +| `y` | `number` | + +#### Returns🔙 + +`boolean` + +___ + +### lte + +▸ **lte**(`x`, `y`): `boolean` + +#### Parameters🧮 + +| Name | Type | +| :------ | :------ | +| `x` | `number` | +| `y` | `number` | + +#### Returns🔙 + +`boolean` + +___ + +### matchChromaChannel + +▸ **matchChromaChannel**(`colorspace`): `string` + +#### Parameters🧮 + +| Name | Type | Description | +| :------ | :------ | :------ | +| `colorspace` | `string` | The color space to match saturation/chroma channel. | + +#### Returns🔙 + +`string` + +The mode channel string passed to getChannel() + + + +Matches the chroma/saturation channel of any compliant color space + +**`Example`** 📋 + +```ts +import { matchChromaChannel } from 'huetiful-js' +console.log(matchChromaChannel("jch")); +// jch.c + +console.log(matchChromaChannel("okhsl")); +// okhsl.s +``` + +___ + +### matchComparator + +▸ **matchComparator**(`s`): `string` + +Matches the comparison symbols used in the expression string. + +#### Parameters🧮 + +| Name | Type | Description | +| :------ | :------ | :------ | +| `s` | `string` | The string to match. | + +#### Returns🔙 + +`string` + +The matched comparator, if any, as a string. + +___ + +### matchDigits + +▸ **matchDigits**(`s`): `string` + +Gets the digits in the expression string + +#### Parameters🧮 + +| Name | Type | Description | +| :------ | :------ | :------ | +| `s` | `string` | Thestring to match | + +#### Returns🔙 + +`string` + +The matched digits, if any, as a string. + +___ + +### matchLightnessChannel + +▸ **matchLightnessChannel**(`colorspace`): `string` + +#### Parameters🧮 + +| Name | Type | Description | +| :------ | :------ | :------ | +| `colorspace` | `string` | The color space to match lightness channel. | + +#### Returns🔙 + +`string` + +The mode channel string passed to getChannel + + + +Matches the lightness channel of any compliant color space + +**`Example`** 📋 + +```ts +console.log(matchLightnessChannel("jch")); +// jch.j + +console.log(matchLightnessChannel("okhsl")); +// okhsl.l +``` + +___ + +### max + +▸ **max**(`array`): `number` + +Gets the largest value in an array + +#### Parameters🧮 + +| Name | Type | Description | +| :------ | :------ | :------ | +| `array` | `number`[] | The array to retrieve maximum value | + +#### Returns🔙 + +`number` + +The largest number in the array + +**`Example`** 📋 + +```ts +console.log(max([0, 3, 4])); +// 4 +``` + +___ + +### min + +▸ **min**(`array`): `number` + +Gets the smallest value in an array + +#### Parameters🧮 + +| Name | Type | Description | +| :------ | :------ | :------ | +| `array` | `number`[] | The array to retrieve minimum value | + +#### Returns🔙 + +`number` + +The smallest number in the array + +**`Example`** 📋 + +```ts +console.log(min([0, 3, 4])); +// 0 +``` + +___ + +### normalize + +▸ **normalize**(`value`, `modeChannel`): `number` + +#### Parameters🧮 + +| Name | Type | Description | +| :------ | :------ | :------ | +| `value` | `number` | The value to chec if its in the accepted range for the passed in mode channel | +| `modeChannel` | `string` | A string defining the mode and channel ranges to use for comparison | + +#### Returns🔙 + +`number` + +The normalized channel value or the passed in value if it was within range + + + +Normalizes passed in channel value to a range accepted by color spaces as defined in Culori. + +___ + +### random + +▸ **random**(`min`, `max`): `number` + +#### Parameters🧮 + +| Name | Type | Description | +| :------ | :------ | :------ | +| `min` | `number` | The lower bound. | +| `max` | `number` | The upper bound. | + +#### Returns🔙 + +`number` + +A number. + + + +Returns a random number between minimum and maximum bounds. + +___ + +### sortedArr + +▸ **sortedArr**(`factor`, `callback`, `order`, `colorObj?`): (`collection`: `object` \| [`ColorToken`](types.md#colortoken)[]) => `any`[] + +Filters an array of color objects with a "factor" property whose value is determined by a predicate or getter via the cb param. + +#### Parameters🧮 + +| Name | Type | Default value | Description | +| :------ | :------ | :------ | :------ | +| `factor` | [`Factor`](types.md#factor) | `undefined` | The property to query | +| `callback` | `unknown` | `undefined` | The function to use for comparison. | +| `order` | [`Order`](types.md#order) | `undefined` | - | +| `colorObj` | `boolean` | `false` | - | + +#### Returns🔙 + +`fn` + +An array of colors or color objects. + +▸ (`collection`): `any`[] + +##### Parameters🧮 + +| Name | Type | +| :------ | :------ | +| `collection` | `object` \| [`ColorToken`](types.md#colortoken)[] | + +##### Returns🔙 + +`any`[] diff --git a/docs/modules/sortBy.html b/docs/modules/sortBy.html deleted file mode 100644 index 8528c39c..00000000 --- a/docs/modules/sortBy.html +++ /dev/null @@ -1,7 +0,0 @@ -sortBy | huetiful-js

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/modules/sortBy.md b/docs/modules/sortBy.md new file mode 100644 index 00000000..fea83dc8 --- /dev/null +++ b/docs/modules/sortBy.md @@ -0,0 +1,348 @@ +[huetiful-js](../README.md) / [Modules](../modules.md) / sortBy + +# Module:📦 sortBy + +## Table of contents📜 + +### Functions🧰 + +- [sortByContrast](sortBy.md#sortbycontrast) +- [sortByDistance](sortBy.md#sortbydistance) +- [sortByHue](sortBy.md#sortbyhue) +- [sortByLightness](sortBy.md#sortbylightness) +- [sortByLuminance](sortBy.md#sortbyluminance) +- [sortBySaturation](sortBy.md#sortbysaturation) + +## Functions + +### sortByContrast + +▸ **sortByContrast**(`collection`, `against`, `order?`): [`ColorToken`](types.md#colortoken)[] + +Sorts colors according to their contrast value as defined by WCAG. The contrast is tested against a comparison color (the 'against' param) + +#### Parameters🧮 + +| Name | Type | Description | +| :------ | :------ | :------ | +| `collection` | `object` \| [`ColorToken`](types.md#colortoken)[] | - | +| `against` | [`ColorToken`](types.md#colortoken) | - | +| `order?` | [`Order`](types.md#order) | The expected order of arrangement. Either 'asc' or 'desc'. Default is ascending ('asc') | + +#### Returns🔙 + +[`ColorToken`](types.md#colortoken)[] + +An array of the sorted color values. + +**`Example`** 📋 + +```ts +import { sortByContrast } from 'huetiful-js' + +let sample = ['purple', 'green', 'red', 'brown'] +console.log(sortByContrast(sample, 'yellow')) +// [ 'red', 'green', 'brown', 'purple' ] + +console.log(sortByContrast(sample, 'yellow', 'desc')) +// [ 'purple', 'brown', 'green', 'red' ] +``` + +___ + +### sortByDistance + +▸ **sortByDistance**(`collection`, `against`, `order?`, `options?`): [`ColorToken`](types.md#colortoken)[] + +Sorts colors according to their Euclidean distance. The distance factor is determined by the color space used (some color spaces are not symmetrical meaning that the distance between colorA and colorB is not equal to the distance between colorB and colorA ). The distance is computed from against a color which is used for comparison for all the colors in the array i.e it sorts the colors against the dist + +#### Parameters🧮 + +| Name | Type | Description | +| :------ | :------ | :------ | +| `collection` | `object` \| [`ColorToken`](types.md#colortoken)[] | - | +| `against` | [`ColorToken`](types.md#colortoken) | The color to compare the distance with. All the distances are calculated between this color and the ones in the colors array. | +| `order?` | ``"asc"`` \| ``"desc"`` | The expected order of arrangement. Either 'asc' or 'desc'. Default is ascending ('asc') | +| `options?` | [`ColorDistanceOptions`](types.md#colordistanceoptions) | - | + +#### Returns🔙 + +[`ColorToken`](types.md#colortoken)[] + +An array of the sorted color values. + +**`Example`** 📋 + +```ts +import { sortByDistance } from 'huetiful-js' + +let sample = ['purple', 'green', 'red', 'brown'] +console.log( + sortByDistance(sample, 'yellow', 'asc', { + mode: 'lch', + }) +) + +// [ 'brown', 'red', 'green', 'purple' ] + +let sample = ['purple', 'green', 'red', 'brown'] +console.log( + sortByDistance(sample, 'yellow', 'asc', { + mode: 'lch', + }) +) + +// [ 'green', 'brown', 'red', 'purple' ] +``` + +___ + +### sortByHue + +▸ **sortByHue**(`collection`, `order?`, `colorspace?`): [`ColorToken`](types.md#colortoken)[] + +Sorts colors according to hue values. It works with any color space with a hue channel. Note that hue values between HSL and Lch do not align. Achromatic colors are not supported + +#### Parameters🧮 + +| Name | Type | Description | +| :------ | :------ | :------ | +| `collection` | `object` \| [`ColorToken`](types.md#colortoken)[] | - | +| `order?` | [`Order`](types.md#order) | The expected order of arrangement. Either 'asc' or 'desc'. Default is ascending ('asc') | +| `colorspace?` | [`HueColorSpaces`](types.md#huecolorspaces) | The color space to compute the color distances in. All colors within the collection will be converted to mode. Also note that because differences in hue mapping certain color spaces such as HSL and LCH hue values do not align. Keep such quirks in mind to avoid weird results. | + +#### Returns🔙 + +[`ColorToken`](types.md#colortoken)[] + +An array of the sorted color values. + +**`Example`** 📋 + +```ts +let sample = [ + "#00ffdc", + "#00ff78", + "#00c000", + "#007e00", + "#164100", + "#ffff00", + "#310000", + "#3e0000", + "#4e0000", + "#600000", + "#720000", +]; + +let sorted = sortByHue(sample); +console.log(sorted) +// [ + '#310000', '#3e0000', + '#4e0000', '#600000', + '#720000', '#ffff00', + '#164100', '#00c000', + '#007e00', '#00ff78', + '#00ffdc' +] + +let sortedDescending = sortByHue(sample,'desc'); +console.log(sortedDescending) +// [ + '#00ffdc', '#00ff78', + '#007e00', '#00c000', + '#164100', '#ffff00', + '#720000', '#600000', + '#4e0000', '#3e0000', + '#310000' +] +``` + +___ + +### sortByLightness + +▸ **sortByLightness**(`collection`, `order?`, `colorspace?`): [`ColorToken`](types.md#colortoken)[] + +Sorts colors according to their lightness. + +#### Parameters🧮 + +| Name | Type | Description | +| :------ | :------ | :------ | +| `collection` | `object` \| [`ColorToken`](types.md#colortoken)[] | - | +| `order?` | [`Order`](types.md#order) | The expected order of arrangement. Either 'asc' or 'desc'. Default is ascending ('asc') | +| `colorspace?` | [`HueColorSpaces`](types.md#huecolorspaces) | The mode colorspace to use for filtering color lightness. Defaut is lch65 | + +#### Returns🔙 + +[`ColorToken`](types.md#colortoken)[] + +An array of the sorted color values. + +**`Example`** 📋 + +```ts +import { sortByLightness } from "huetiful-js"; + +let sample = [ + "#00ffdc", + "#00ff78", + "#00c000", + "#007e00", + "#164100", + "#ffff00", + "#310000", + "#3e0000", + "#4e0000", + "#600000", + "#720000", +] + +sortByLightness(sample) + +// [ + '#310000', '#3e0000', + '#4e0000', '#600000', + '#720000', '#164100', + '#007e00', '#00c000', + '#00ff78', '#00ffdc', + '#ffff00' +] + +sortByLightness(sample,'desc') + +// [ + '#ffff00', '#00ffdc', + '#00ff78', '#00c000', + '#007e00', '#164100', + '#720000', '#600000', + '#4e0000', '#3e0000', + '#310000' +] +``` + +___ + +### sortByLuminance + +▸ **sortByLuminance**(`collection`, `order`): [`ColorToken`](types.md#colortoken)[] + +Sorts colors according to the relative brightness as defined by WCAG definition. + +#### Parameters🧮 + +| Name | Type | Description | +| :------ | :------ | :------ | +| `collection` | `object` \| [`ColorToken`](types.md#colortoken)[] | - | +| `order` | ``"asc"`` \| ``"desc"`` | The expected order of arrangement. Either 'asc' or 'desc'. Default is ascending ('asc') | + +#### Returns🔙 + +[`ColorToken`](types.md#colortoken)[] + +An array of the sorted color values. + +**`Example`** 📋 + +```ts +import { sortByLuminance } from "huetiful-js"; +let sample = [ + "#00ffdc", + "#00ff78", + "#00c000", + "#007e00", + "#164100", + "#ffff00", + "#310000", + "#3e0000", + "#4e0000", + "#600000", + "#720000", +]; + +let sorted = sortByLuminance(sample) +console.log(sorted) +// [ + '#310000', '#3e0000', + '#4e0000', '#600000', + '#720000', '#164100', + '#007e00', '#00c000', + '#00ff78', '#00ffdc', + '#ffff00' +] + +let sortedDescending = sortByLuminance(sample, "desc"); +console.log(sortedDescending) +// [ + '#ffff00', '#00ffdc', + '#00ff78', '#00c000', + '#007e00', '#164100', + '#720000', '#600000', + '#4e0000', '#3e0000', + '#310000' +] +``` + +___ + +### sortBySaturation + +▸ **sortBySaturation**(`collection`, `order`, `mode?`): [`ColorToken`](types.md#colortoken)[] + +Sorts colors according to their saturation. + +#### Parameters🧮 + +| Name | Type | Description | +| :------ | :------ | :------ | +| `collection` | `object` \| [`ColorToken`](types.md#colortoken)[] | - | +| `order` | ``"asc"`` \| ``"desc"`` | The expected order of arrangement. Either 'asc' or 'desc'. Default is ascending ('asc') | +| `mode?` | [`HueColorSpaces`](types.md#huecolorspaces) | The mode color space to compute the saturation value in. The default is jch . | + +#### Returns🔙 + +[`ColorToken`](types.md#colortoken)[] + +An array of the sorted color values. + +**`Example`** 📋 + +```ts +import { sortBySaturation } from "huetiful-js"; +let sample = [ + "#00ffdc", + "#00ff78", + "#00c000", + "#007e00", + "#164100", + "#ffff00", + "#310000", + "#3e0000", + "#4e0000", + "#600000", + "#720000", +]; + +let sorted = sortBySaturation(sample); +console.log(sorted); + +// [ + '#310000', '#3e0000', + '#164100', '#4e0000', + '#600000', '#720000', + '#00ffdc', '#007e00', + '#00ff78', '#00c000', + '#ffff00' +] + +let sortedDescending = sortBySaturation(sample,'desc'); +console.log(sortedDescending) +// [ + '#ffff00', '#00c000', + '#00ff78', '#007e00', + '#00ffdc', '#720000', + '#600000', '#4e0000', + '#164100', '#3e0000', + '#310000' +] +``` diff --git a/docs/modules/types.html b/docs/modules/types.html deleted file mode 100644 index 1c67c8bb..00000000 --- a/docs/modules/types.html +++ /dev/null @@ -1,30 +0,0 @@ -types | huetiful-js

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/modules/types.md b/docs/modules/types.md new file mode 100644 index 00000000..e6cca5c4 --- /dev/null +++ b/docs/modules/types.md @@ -0,0 +1,319 @@ +[huetiful-js](../README.md) / [Modules](../modules.md) / types + +# Module:📦 types + +## Table of contents📜 + +### Type Aliases + +- [AdaptivePaletteOptions](types.md#adaptivepaletteoptions) +- [ColorDistanceOptions](types.md#colordistanceoptions) +- [ColorObject](types.md#colorobject) +- [ColorOptions](types.md#coloroptions) +- [ColorToken](types.md#colortoken) +- [ColorTuple](types.md#colortuple) +- [Colorspaces](types.md#colorspaces) +- [DeficiencyType](types.md#deficiencytype) +- [DivergingScheme](types.md#divergingscheme) +- [EarthtoneOptions](types.md#earthtoneoptions) +- [Factor](types.md#factor) +- [FactorMapper](types.md#factormapper) +- [HueColorSpaces](types.md#huecolorspaces) +- [HueFamily](types.md#huefamily) +- [HueShiftOptions](types.md#hueshiftoptions) +- [Interpolator](types.md#interpolator) +- [InterpolatorOptions](types.md#interpolatoroptions) +- [Options](types.md#options) +- [Order](types.md#order) +- [PairedSchemeOptions](types.md#pairedschemeoptions) +- [QualitativeScheme](types.md#qualitativescheme) +- [ScaleValues](types.md#scalevalues) +- [SequentialScheme](types.md#sequentialscheme) +- [TailwindColorFamilies](types.md#tailwindcolorfamilies) +- [Tone](types.md#tone) +- [UniformColorSpaces](types.md#uniformcolorspaces) +- [callback](types.md#callback) + +## Type Aliases + +### AdaptivePaletteOptions + +Ƭ **AdaptivePaletteOptions**: `Object` + +**`Description`** ℹ + +This object returns the lightMode and darkMode optimized version of a color with support to add color vision deficiency simulation to the final color result. + +#### Type declaration + +| Name | Type | +| :------ | :------ | +| `backgroundColor?` | \{ `dark?`: [`ColorToken`](types.md#colortoken) ; `light?`: [`ColorToken`](types.md#colortoken) } | +| `backgroundColor.dark?` | [`ColorToken`](types.md#colortoken) | +| `backgroundColor.light?` | [`ColorToken`](types.md#colortoken) | +| `colorBlind?` | `boolean` | +| `viewingConditions?` | `ViewingConditions` | + +___ + +### ColorDistanceOptions + +Ƭ **ColorDistanceOptions**: `Object` + +#### Type declaration + +| Name | Type | +| :------ | :------ | +| `mode?` | [`Colorspaces`](types.md#colorspaces) | +| `weights?` | [`number`, `number`, `number`, `number`] | + +___ + +### ColorObject + +Ƭ **ColorObject**: `Object` + +#### Type declaration + +| Name | Type | +| :------ | :------ | +| `alpha?` | `number` | +| `mode` | [`Colorspaces`](types.md#colorspaces) | + +___ + +### ColorOptions + +Ƭ **ColorOptions**: `Object` + +#### Type declaration + +| Name | Type | +| :------ | :------ | +| `alpha?` | `number` | +| `colorSpace?` | [`HueColorSpaces`](types.md#huecolorspaces) | +| `colorspace?` | [`HueColorSpaces`](types.md#huecolorspaces) | +| `contrast?` | `number` | +| `darkMode?` | [`ColorToken`](types.md#colortoken) | +| `lightMode?` | [`ColorToken`](types.md#colortoken) | +| `lightness?` | `number` | +| `luminance?` | `number` | +| `saturation?` | `number` | +| `temperature?` | `number` | + +___ + +### ColorToken + +Ƭ **ColorToken**: `number` \| `string` \| `object` \| [`ColorTuple`](types.md#colortuple) + +**`Description`** ℹ + +Any recognizable color token. + +___ + +### ColorTuple + +Ƭ **ColorTuple**: [`string`, `number`, `number`, `number`, number?] + +___ + +### Colorspaces + +Ƭ **Colorspaces**: ``"a98"`` \| ``"cubehelix"`` \| ``"dlab"`` \| ``"jab"`` \| ``"lab"`` \| ``"lab65"`` \| ``"lrgb"`` \| ``"luv"`` \| ``"oklab"`` \| ``"rgb"`` \| [`HueColorSpaces`](types.md#huecolorspaces) + +___ + +### DeficiencyType + +Ƭ **DeficiencyType**: ``"red"`` \| ``"blue"`` \| ``"green"`` \| ``"monochromacy"`` + +___ + +### DivergingScheme + +Ƭ **DivergingScheme**: ``"Spectral"`` \| ``"RdYlGn"`` \| ``"RdBu"`` \| ``"PiYG"`` \| ``"PRGn"`` \| ``"RdYlBu"`` \| ``"BrBG"`` \| ``"RdGy"`` \| ``"PuOr"`` + +___ + +### EarthtoneOptions + +Ƭ **EarthtoneOptions**: `Omit`\<[`Options`](types.md#options), ``"hueStep"`` \| ``"via"`` \| ``"maxLightness"`` \| ``"minLightness"``\> + +___ + +### Factor + +Ƭ **Factor**: ``"luminance"`` \| ``"temp"`` \| ``"saturation"`` \| ``"contrast"`` \| ``"distance"`` \| ``"lightness"`` \| ``"hue"`` + +___ + +### FactorMapper + +Ƭ **FactorMapper**: (`factor`: [`Factor`](types.md#factor), `callback`: [`callback`](types.md#callback), `order?`: [`Order`](types.md#order), `colorObj?`: `boolean`) => (`colors`: [`ColorToken`](types.md#colortoken)[]) => [`ColorToken`](types.md#colortoken)[] + +#### Type declaration + +▸ (`factor`, `callback`, `order?`, `colorObj?`): (`colors`: [`ColorToken`](types.md#colortoken)[]) => [`ColorToken`](types.md#colortoken)[] + +##### Parameters🧮 + +| Name | Type | +| :------ | :------ | +| `factor` | [`Factor`](types.md#factor) | +| `callback` | [`callback`](types.md#callback) | +| `order?` | [`Order`](types.md#order) | +| `colorObj?` | `boolean` | + +##### Returns🔙 + +`fn` + +▸ (`colors`): [`ColorToken`](types.md#colortoken)[] + +##### Parameters🧮 + +| Name | Type | +| :------ | :------ | +| `colors` | [`ColorToken`](types.md#colortoken)[] | + +##### Returns🔙 + +[`ColorToken`](types.md#colortoken)[] + +___ + +### HueColorSpaces + +Ƭ **HueColorSpaces**: [`UniformColorSpaces`](types.md#uniformcolorspaces) \| ``"hsl"`` \| ``"hsv"`` \| ``"hsi"`` \| ``"hwb"`` \| ``"okhsl"`` \| ``"okhsv"`` + +___ + +### HueFamily + +Ƭ **HueFamily**: ``"red-purple"`` \| ``"red"`` \| ``"yellow-red"`` \| ``"yellow"`` \| ``"green-yellow"`` \| ``"green"`` \| ``"blue-green"`` \| ``"blue"`` \| ``"purple-blue"`` \| ``"purple"`` + +___ + +### HueShiftOptions + +Ƭ **HueShiftOptions**: `Omit`\<[`Options`](types.md#options), ``"via"`` \| ``"earthtones"`` \| ``""``\> & [`InterpolatorOptions`](types.md#interpolatoroptions) + +___ + +### Interpolator + +Ƭ **Interpolator**: (`arr`: `number`[]) => (`t`: `number`) => `number` + +#### Type declaration + +▸ (`arr`): (`t`: `number`) => `number` + +##### Parameters🧮 + +| Name | Type | +| :------ | :------ | +| `arr` | `number`[] | + +##### Returns🔙 + +`fn` + +▸ (`t`): `number` + +##### Parameters🧮 + +| Name | Type | +| :------ | :------ | +| `t` | `number` | + +##### Returns🔙 + +`number` + +___ + +### InterpolatorOptions + +Ƭ **InterpolatorOptions**: `Pick`\<[`Options`](types.md#options), ``"easingFunc"`` \| ``"hueInterpolator"`` \| ``"chromaInterpolator"`` \| ``"hueFixup"`` \| ``"lightnessInterpolator"``\> + +___ + +### Options + +Ƭ **Options**: `Object` + +**`Description`** ℹ + +The override parameters for palette functions. + +#### Type declaration + +| Name | Type | Description | +| :------ | :------ | :------ | +| `chromaInterpolator?` | [`Interpolator`](types.md#interpolator) | **`Param`** interpolation method to use on the chroma channel. | +| `earthtones?` | ``"light-gray"`` \| ``"silver"`` \| ``"sand"`` \| ``"tupe"`` \| ``"mahogany"`` \| ``"brick-red"`` \| ``"clay"`` \| ``"cocoa"`` \| ``"dark-brown"`` \| ``"dark"`` | * **`Param`** The earthtone to interpolate with. | +| `easingFunc?` | (`t`: `number`) => `number` | The easing function to use. | +| `hueFixup?` | (`arr`: `number`[]) => `number`[] | | +| `hueInterpolator?` | [`Interpolator`](types.md#interpolator) | **`Param`** interpolation method to use on the hue channel. | +| `hueStep?` | `number` | **`Param`** amount of hue angles to increment each iteration with. | +| `lightnessInterpolator?` | [`Interpolator`](types.md#interpolator) | **`Param`** interpolation method to use on the lightness channel. | +| `maxLightness?` | `number` | **`Param`** Maximum lightness value (range 0-100). | +| `minLightness?` | `number` | * **`Param`** Minimum lightness value (range 0-100). | +| `samples?` | `number` | **`Param`** amount of samples to return in the result collection. | +| `via?` | [`Tone`](types.md#tone) | **`Param`** color to pass through during interpolation. | + +___ + +### Order + +Ƭ **Order**: ``"asc"`` \| ``"desc"`` + +___ + +### PairedSchemeOptions + +Ƭ **PairedSchemeOptions**: `Omit`\<[`Options`](types.md#options), ``"earthtones"`` \| ``"maxLightness"`` \| ``"minLightness"``\> + +___ + +### QualitativeScheme + +Ƭ **QualitativeScheme**: ``"Set2"`` \| ``"Accent"`` \| ``"Set1"`` \| ``"Set3"`` \| ``"Dark2"`` \| ``"Paired"`` \| ``"Pastel2"`` \| ``"Pastel1"`` + +___ + +### ScaleValues + +Ƭ **ScaleValues**: ``"50"`` \| ``"100"`` \| ``"200"`` \| ``"300"`` \| ``"400"`` \| ``"500"`` \| ``"600"`` \| ``"700"`` \| ``"800"`` \| ``"900"`` + +___ + +### SequentialScheme + +Ƭ **SequentialScheme**: ``"OrRd"`` \| ``"PuBu"`` \| ``"BuPu"`` \| ``"Oranges"`` \| ``"BuGn"`` \| ``"YlOrBr"`` \| ``"YlGn"`` \| ``"Reds"`` \| ``"RdPu"`` \| ``"Greens"`` \| ``"YlGnBu"`` \| ``"Purples"`` \| ``"GnBu"`` \| ``"Greys"`` \| ``"YlOrRd"`` \| ``"PuRd"`` \| ``"Blues"`` \| ``"PuBuGn"`` \| ``"Viridis"`` + +___ + +### TailwindColorFamilies + +Ƭ **TailwindColorFamilies**: ``"indigo"`` \| ``"gray"`` \| ``"zinc"`` \| ``"neutral"`` \| ``"stone"`` \| ``"red"`` \| ``"orange"`` \| ``"amber"`` \| ``"yellow"`` \| ``"lime"`` \| ``"green"`` \| ``"emerald"`` \| ``"teal"`` \| ``"sky"`` \| ``"blue"`` \| ``"violet"`` \| ``"purple"`` \| ``"fuchsia"`` \| ``"pink"`` \| ``"rose"`` + +___ + +### Tone + +Ƭ **Tone**: ``"light"`` \| ``"dark"`` + +___ + +### UniformColorSpaces + +Ƭ **UniformColorSpaces**: ``"lch"`` \| ``"jch"`` \| ``"dlch"`` \| ``"lch"`` \| ``"lch65"`` \| ``"lchuv"`` \| ``"oklch"`` + +___ + +### callback + +Ƭ **callback**: `unknown` diff --git a/docs/modules/utils.html b/docs/modules/utils.html deleted file mode 100644 index ab5523f9..00000000 --- a/docs/modules/utils.html +++ /dev/null @@ -1,25 +0,0 @@ -utils | huetiful-js

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/modules/utils.md b/docs/modules/utils.md new file mode 100644 index 00000000..86c0fa2b --- /dev/null +++ b/docs/modules/utils.md @@ -0,0 +1,880 @@ +[huetiful-js](../README.md) / [Modules](../modules.md) / utils + +# Module:📦 utils + +## Table of contents📜 + +### Functions🧰 + +- [alpha](utils.md#alpha) +- [brighten](utils.md#brighten) +- [colorDeficiency](utils.md#colordeficiency) +- [darken](utils.md#darken) +- [getChannel](utils.md#getchannel) +- [getComplimentaryHue](utils.md#getcomplimentaryhue) +- [getContrast](utils.md#getcontrast) +- [getFarthestChroma](utils.md#getfarthestchroma) +- [getFarthestContrast](utils.md#getfarthestcontrast) +- [getFarthestHue](utils.md#getfarthesthue) +- [getFarthestLightness](utils.md#getfarthestlightness) +- [getHueFamily](utils.md#gethuefamily) +- [getLuminance](utils.md#getluminance) +- [getNearestChroma](utils.md#getnearestchroma) +- [getNearestColor](utils.md#getnearestcolor) +- [getNearestContrast](utils.md#getnearestcontrast) +- [getNearestHue](utils.md#getnearesthue) +- [getNearestLightness](utils.md#getnearestlightness) +- [isAchromatic](utils.md#isachromatic) +- [isCool](utils.md#iscool) +- [isWarm](utils.md#iswarm) +- [overtone](utils.md#overtone) +- [setChannel](utils.md#setchannel) +- [setLuminance](utils.md#setluminance) + +## Functions + +### alpha + +▸ **alpha**(`color`, `value?`): `number` + +Sets the opacity of a color. Also gets the alpha value of the color if the value param is omitted + +#### Parameters🧮 + +| Name | Type | Description | +| :------ | :------ | :------ | +| `color` | [`ColorToken`](types.md#colortoken) | The color with the targeted opacity/alpha channel. | +| `value?` | `string` \| `number` | The value to apply to the opacity channel. The value is between [0,1] | + +#### Returns🔙 + +`number` + +color The resulting color. Returns an 8 character hex code. + +**`Example`** 📋 + +```ts +// Getting the alpha +console.log(alpha('#a1bd2f0d')) +// 0.050980392156862744 + +// Setting the alpha + +let myColor = alpha('b2c3f1', 0.5) + +console.log(myColor) + +// #b2c3f180 +``` + +___ + +### brighten + +▸ **brighten**(`color`, `value`, `colorspace`): [`ColorToken`](types.md#colortoken) + +#### Parameters🧮 + +| Name | Type | Description | +| :------ | :------ | :------ | +| `color` | [`ColorToken`](types.md#colortoken) | The color to brighten. | +| `value` | `string` \| `number` | The amount to brighten with. Also supports expressions as strings e.g darken("#fc23a1","*0.5") | +| `colorspace` | `any` | - | + +#### Returns🔙 + +[`ColorToken`](types.md#colortoken) + +___ + +### colorDeficiency + +▸ **colorDeficiency**(`deficiencyType?`): (`color`: [`ColorToken`](types.md#colortoken), `severity`: `number`) => `string` + +Returns the color as a simulation of the passed in type of color vision deficiency with the deficiency filter's intensity determined by the severity value. + +#### Parameters🧮 + +| Name | Type | Description | +| :------ | :------ | :------ | +| `deficiencyType?` | [`DeficiencyType`](types.md#deficiencytype) | The type of color vision deficiency. To avoid writing the long types, the expected parameters are simply the colors that are hard to perceive for the type of color blindness. For example those with 'tritanopia' are unable to perceive 'blue' light. Default is 'red' when the defeciency parameter is undefined or any falsy value. | + +#### Returns🔙 + +`fn` + +The color as its simulated variant as a hexadecimal string. + +▸ (`color`, `severity?`): `string` + +##### Parameters🧮 + +| Name | Type | Default value | +| :------ | :------ | :------ | +| `color` | [`ColorToken`](types.md#colortoken) | `undefined` | +| `severity` | `number` | `1` | + +##### Returns🔙 + +`string` + +**`See`** + +For a deep dive on color vision deficiency go to + +**`Example`** 📋 + +```ts +import { colorDeficiency, toHex } from 'huetiful-js' + +// Here we are simulating color blindness of tritanomaly or we can't see 'blue'. +// We are passing in our color as an array of channel values in the mode "rgb". The severity is set to 0.1 +let tritanomaly = colorDeficiency('blue') +console.log(tritanomaly(['rgb', 230, 100, 50, 0.5], 0.1)) +// #dd663680 + +// Here we are simulating color blindness of tritanomaly or we can't see 'red'. The severity is not explicitly set so it defaults to 1 +let protanopia = colorDeficiency('red') +console.log(protanopia({ h: 20, w: 50, b: 30, mode: 'hwb' })) +// #9f9f9f +``` + +___ + +### darken + +▸ **darken**(`color`, `value`): [`ColorToken`](types.md#colortoken) + +Darkens the color by reducing the lightness channel. . + +#### Parameters🧮 + +| Name | Type | Description | +| :------ | :------ | :------ | +| `color` | [`ColorToken`](types.md#colortoken) | The color to darken. | +| `value` | `string` \| `number` | The amount to darken with. Also supports expressions as strings e.g darken("#fc23a1","*0.5") | + +#### Returns🔙 + +[`ColorToken`](types.md#colortoken) + +color The darkened color. + +**`Example`** 📋 + +```ts + +``` + +___ + +### getChannel + +▸ **getChannel**(`mc`): (`color`: [`ColorToken`](types.md#colortoken)) => `number` + +Gets the value specifified channel on the color. + +#### Parameters🧮 + +| Name | Type | Description | +| :------ | :------ | :------ | +| `mc` | `string` | The mode and channel to be retrieved. For example "rgb.b" will return the value of the blue channel in the RGB color space of that color. | + +#### Returns🔙 + +`fn` + +value The value of the queried channel. + +▸ (`color`): `number` + +##### Parameters🧮 + +| Name | Type | +| :------ | :------ | +| `color` | [`ColorToken`](types.md#colortoken) | + +##### Returns🔙 + +`number` + +**`Example`** 📋 + +```ts +import { getChannel } from 'huetiful-js' + +console.log(getChannel('rgb.g')('#a1bd2f')) +// 0.7411764705882353 +``` + +___ + +### getComplimentaryHue + +▸ **getComplimentaryHue**(`color`, `colorspace?`, `colorObj?`): \{ `color`: [`ColorToken`](types.md#colortoken) ; `hue`: `string` } \| [`ColorToken`](types.md#colortoken) + +Gets the complementary hue of the passed in color. The function is internally guarded against achromatic colors. + +#### Parameters🧮 + +| Name | Type | Default value | Description | +| :------ | :------ | :------ | :------ | +| `color` | [`ColorToken`](types.md#colortoken) | `undefined` | The color to retrieve its complimentary hue. | +| `colorspace?` | [`HueColorSpaces`](types.md#huecolorspaces) | `undefined` | - | +| `colorObj` | `boolean` | `false` | Optional boolean whether to return an object with the result color hue family or just the result color. Default is false. | + +#### Returns🔙 + +\{ `color`: [`ColorToken`](types.md#colortoken) ; `hue`: `string` } \| [`ColorToken`](types.md#colortoken) + +An object with the hue family and complimentary color as keys. + +**`Example`** 📋 + +```ts +import { getComplimentaryHue } from "huetiful-js"; + +console.log(getComplimentaryHue("pink", true)) +//// { hue: 'blue-green', color: '#97dfd7ff' } + +console.log(getComplimentaryHue("purple")) +// #005700ff +``` + +___ + +### getContrast + +▸ **getContrast**(`color`, `against`): `number` + +Gets the contrast between the passed in colors. + +#### Parameters🧮 + +| Name | Type | +| :------ | :------ | +| `color` | [`ColorToken`](types.md#colortoken) | +| `against` | [`ColorToken`](types.md#colortoken) | + +#### Returns🔙 + +`number` + +The relative luminance of the lightest color. + +**`Example`** 📋 + +```ts +import { getContrast } from 'huetiful-js' + +console.log(getContrast("black", "white")); +// 21 +``` + +___ + +### getFarthestChroma + +▸ **getFarthestChroma**(`collection`, `colorObj?`): `number` \| \{ `color`: [`ColorToken`](types.md#colortoken) ; `factor`: `number` } + +Gets the largest saturation value from the passed in colors. + +#### Parameters🧮 + +| Name | Type | Default value | Description | +| :------ | :------ | :------ | :------ | +| `collection` | `object` \| [`ColorToken`](types.md#colortoken)[] | `undefined` | - | +| `colorObj` | `boolean` | `false` | Optional boolean that makes the function return a custom object with factor (saturation) and name of the color as keys. Default is false. | + +#### Returns🔙 + +`number` \| \{ `color`: [`ColorToken`](types.md#colortoken) ; `factor`: `number` } + +The largest saturation value in the colors passed in or a custom object. + +**`Example`** 📋 + +```ts +import { getFarthestChroma } from 'huetiful-js' + +let sample = ['b2c3f1', '#a1bd2f', '#f3bac1'] + +console.log(getFarthestChroma(sample, 'lch')) +// 67.22120855010492 +``` + +___ + +### getFarthestContrast + +▸ **getFarthestContrast**(`collection`, `against`, `colorObj?`): `number` \| \{ `factor`: `number` ; `name`: [`ColorToken`](types.md#colortoken) } + +Gets the largest contrast value from the passed in colors compared against a sample color. + +#### Parameters🧮 + +| Name | Type | Description | +| :------ | :------ | :------ | +| `collection` | `object` \| [`ColorToken`](types.md#colortoken)[] | - | +| `against` | [`ColorToken`](types.md#colortoken) | - | +| `colorObj?` | `boolean` | Optional boolean that makes the function return a custom object with factor (contrast) and name of the color as keys. Default is false. | + +#### Returns🔙 + +`number` \| \{ `factor`: `number` ; `name`: [`ColorToken`](types.md#colortoken) } + +The largest contrast value in the colors passed in or a custom object. + +**`Example`** 📋 + +```ts +import { getFarthestContrast } from 'huetiful-js' + +console.log(getFarthestContrast(["b2c3f1", "#a1bd2f", "#f3bac1"], "green")); +// 3.08355493246362 + +console.log(getFarthestContrast(["b2c3f1", "#a1bd2f", "#f3bac1"], "green", true)); +// { contrast: 3.08355493246362, name: '#f3bac1' } +``` + +___ + +### getFarthestHue + +▸ **getFarthestHue**(`collection`, `colorspace?`, `colorObj?`): `number` \| \{ `color`: [`ColorToken`](types.md#colortoken) ; `factor`: `number` } + +Gets the largest hue value from the passed in colors. + +#### Parameters🧮 + +| Name | Type | Default value | Description | +| :------ | :------ | :------ | :------ | +| `collection` | `object` \| [`ColorToken`](types.md#colortoken)[] | `undefined` | - | +| `colorspace?` | [`HueColorSpaces`](types.md#huecolorspaces) | `undefined` | The mode color space to perform the computation in. | +| `colorObj` | `boolean` | `false` | Optional boolean that makes the function return a custom object with factor (hue) and name of the color as keys. Default is false. | + +#### Returns🔙 + +`number` \| \{ `color`: [`ColorToken`](types.md#colortoken) ; `factor`: `number` } + +The largest hue value in the colors passed in or a custom object. + +**`Example`** 📋 + +```ts +import { getFarthestHue } from 'huetiful-js' +let sample = ['b2c3f1', '#a1bd2f', '#f3bac1'] + +console.log(getFarthestHue(sample, 'lch')) +// 273.54920266436477 +``` + +___ + +### getFarthestLightness + +▸ **getFarthestLightness**(`collection`, `colorspace?`, `colorObj?`): `number` \| \{ `color`: [`ColorToken`](types.md#colortoken) ; `factor`: `number` } + +Gets the largest lightness value from the passed in colors. + +#### Parameters🧮 + +| Name | Type | Default value | Description | +| :------ | :------ | :------ | :------ | +| `collection` | `object` \| [`ColorToken`](types.md#colortoken)[] | `undefined` | - | +| `colorspace?` | [`HueColorSpaces`](types.md#huecolorspaces) | `undefined` | THe mode colorspace to retrieve the lightness value from. | +| `colorObj` | `boolean` | `false` | Optional boolean that makes the function return a custom object with factor (lightness) and name of the color as keys. Default is false. | + +#### Returns🔙 + +`number` \| \{ `color`: [`ColorToken`](types.md#colortoken) ; `factor`: `number` } + +The largest lightness value in the colors passed in or a custom object. + +**`Example`** 📋 + +```ts +import { getFarthestLightness } from 'huetiful-js' + +let sample = ["b2c3f1", "#a1bd2f", "#f3bac1"] + +console.log(getFarthestLightness(sample, true)) + +// { lightness: 80.94668903360088, name: '#f3bac1' } +``` + +___ + +### getHueFamily + +▸ **getHueFamily**(`color`, `mode?`): [`HueFamily`](types.md#huefamily) + +Gets the hue family which a a color belongs to with the overtone included (if it has one.). For achromatic colors it returns the string "gray". + +#### Parameters🧮 + +| Name | Type | Description | +| :------ | :------ | :------ | +| `color` | [`ColorToken`](types.md#colortoken) | The color to query its shade or hue family. | +| `mode?` | [`HueColorSpaces`](types.md#huecolorspaces) | - | + +#### Returns🔙 + +[`HueFamily`](types.md#huefamily) + +The name of the hue family for example red or green. + +**`Example`** 📋 + +```ts +import { getHue } from 'huetiful-js' + +console.log(getHue("#310000")) +// red +``` + +___ + +### getLuminance + +▸ **getLuminance**(`color`): `number` + +#### Parameters🧮 + +| Name | Type | Description | +| :------ | :------ | :------ | +| `color` | [`ColorToken`](types.md#colortoken) | The color to query. | + +#### Returns🔙 + +`number` + +value The color's luminance value. + +**`Alias`** + +Gets the luminance value of that color as defined by WCAG. + +**`Example`** 📋 + +```ts +import { getLuminance } from 'huetiful-js' + +console.log(getLuminance('#a1bd2f')) +// 0.4417749513730954 +``` + +___ + +### getNearestChroma + +▸ **getNearestChroma**(`collection`, `colorspace?`, `colorObj?`): `number` \| \{ `color`: [`ColorToken`](types.md#colortoken) ; `factor`: `number` } + +Gets the smallest chroma/saturation value from the passed in colors. + +#### Parameters🧮 + +| Name | Type | Default value | Description | +| :------ | :------ | :------ | :------ | +| `collection` | `object` \| [`ColorToken`](types.md#colortoken)[] | `undefined` | - | +| `colorspace?` | [`HueColorSpaces`](types.md#huecolorspaces) | `undefined` | The mode color space to perform the computation in. | +| `colorObj` | `boolean` | `false` | Optional boolean that makes the function return a custom object with factor (saturation) and name of the color as keys. Default is false. | + +#### Returns🔙 + +`number` \| \{ `color`: [`ColorToken`](types.md#colortoken) ; `factor`: `number` } + +The smallest chroma/saturation value in the colors passed in or a custom object. + +**`Example`** 📋 + +```ts +import { getNearestChroma } from 'huetiful-js' + +let sample = ['b2c3f1', '#a1bd2f', '#f3bac1'] + +console.log(getNearestChroma(sample, 'lch')) +// 22.45669293295522 +``` + +___ + +### getNearestColor + +▸ **getNearestColor**(`collection`, `color`, `num?`): [`ColorToken`](types.md#colortoken) \| [`ColorToken`](types.md#colortoken)[] + +#### Parameters🧮 + +| Name | Type | Default value | Description | +| :------ | :------ | :------ | :------ | +| `collection` | [`ColorToken`](types.md#colortoken)[] \| ``"tailwind"`` | `undefined` | The collection of colors to search for nearest colors | +| `color` | [`ColorToken`](types.md#colortoken) | `undefined` | The color to use for distance comparison | +| `num` | `number` | `1` | The number of colors to return, if the value is above the colors in the available sample, the entire collection is returned with colors ordered in ascending order using the differenceHyab metric. | + +#### Returns🔙 + +[`ColorToken`](types.md#colortoken) \| [`ColorToken`](types.md#colortoken)[] + +An array of colors. + +**`Example`** 📋 + +```ts +let cols = colors('all', '500') + +console.log(getNearestColor(cols, 'blue', 3)); +// [ '#a855f7', '#8b5cf6', '#d946ef' ] +``` + +___ + +### getNearestContrast + +▸ **getNearestContrast**(`collection`, `against`, `colorObj?`): `any` + +Gets the smallest contrast value from the passed in colors compared against a sample color. + +#### Parameters🧮 + +| Name | Type | Description | +| :------ | :------ | :------ | +| `collection` | `object` \| [`ColorToken`](types.md#colortoken)[] | - | +| `against` | [`ColorToken`](types.md#colortoken) | - | +| `colorObj?` | `boolean` | Optional boolean that makes the function return a custom object with factor (contrast) and name of the color as keys. Default is false. | + +#### Returns🔙 + +`any` + +The smallest contrast value in the colors passed in or a custom object. + +**`Example`** 📋 + +```ts +import { getNearestContrast } from 'huetiful-js' + +console.log(getNearestContrast(["b2c3f1", "#a1bd2f", "#f3bac1"], "green")); +// 2.4061390502133424 + +console.log(getNearestContrast(["b2c3f1", "#a1bd2f", "#f3bac1"], "green", true)); +// { contrast: 2.4061390502133424, name: '#a1bd2f' } +``` + +___ + +### getNearestHue + +▸ **getNearestHue**(`collection`, `colorspace?`, `colorObj?`): `number` \| \{ `color`: [`ColorToken`](types.md#colortoken) ; `factor`: `number` } + +Gets the smallest hue value from the passed in colors. + +#### Parameters🧮 + +| Name | Type | Default value | Description | +| :------ | :------ | :------ | :------ | +| `collection` | `object` \| [`ColorToken`](types.md#colortoken)[] | `undefined` | - | +| `colorspace?` | `string` | `undefined` | The mode color space to perform the computation in. | +| `colorObj` | `boolean` | `false` | Optional boolean that makes the function return a custom object with factor (hue) and name of the color as keys. Default is false. | + +#### Returns🔙 + +`number` \| \{ `color`: [`ColorToken`](types.md#colortoken) ; `factor`: `number` } + +The smallest hue value in the colors passed in or a custom object. + +**`Example`** 📋 + +```ts +import { getNearestHue } from 'huetiful-js' + +let sample = ['b2c3f1', '#a1bd2f', '#f3bac1'] + +console.log(getNearestHue(sample, 'lch')) +// 12.462831644544274 +``` + +___ + +### getNearestLightness + +▸ **getNearestLightness**(`collection`, `colorspace?`, `colorObj?`): `number` \| \{ `color`: [`ColorToken`](types.md#colortoken) ; `factor`: `number` } + +Gets the smallest lightness value from the passed in colors. + +#### Parameters🧮 + +| Name | Type | Default value | Description | +| :------ | :------ | :------ | :------ | +| `collection` | `object` \| [`ColorToken`](types.md#colortoken)[] | `undefined` | - | +| `colorspace?` | [`HueColorSpaces`](types.md#huecolorspaces) | `undefined` | - | +| `colorObj` | `boolean` | `false` | Optional boolean that makes the function return a custom object with factor (lightness) and name of the color as keys. Default is false. | + +#### Returns🔙 + +`number` \| \{ `color`: [`ColorToken`](types.md#colortoken) ; `factor`: `number` } + +The smallest lightness value in the colors passed in or a custom object. + +**`Example`** 📋 + +```ts +import { getNearestLightness } from 'huetiful-js' + +let sample = ["b2c3f1", "#a1bd2f", "#f3bac1"] + +console.log(getNearestLightness(sample, true)) + +// { lightness: 72.61647882089876, name: '#a1bd2f' } +``` + +___ + +### isAchromatic + +▸ **isAchromatic**(`color`, `mode?`): `boolean` + +Checks if a color is achromatic(without hue or simply grayscale). + +#### Parameters🧮 + +| Name | Type | Description | +| :------ | :------ | :------ | +| `color` | [`ColorToken`](types.md#colortoken) | The color to test if it is achromatic or not. | +| `mode?` | [`HueColorSpaces`](types.md#huecolorspaces) | - | + +#### Returns🔙 + +`boolean` + +boolean Returns true if the color is achromatic else false + +**`Example`** 📋 + +```ts +import { isAchromatic } from "huetiful-js"; +import { formatHex8, interpolate, samples } from "culori" + +isAchromatic('pink') +// false + +let sample = [ + "#164100", + "#ffff00", + "#310000", + 'pink' +]; + +console.log(map(sample, isAchromatic)); + +// [false, false, false,false] + +isAchromatic('gray') +// Returns true + +console.log(map(sample, isAchromatic)); + +// we create an interpolation using black and white +let f = interpolate(["black", "white"]); + +//We then create 12 evenly spaced samples and pass them to f as the `t` param required by an interpolating function. +// Lastly we convert the color to hex for brevity for this example (otherwise color objects work fine too.) +let grays = map(samples(12), (c) => formatHex8(f(c))); +console.log(map(grays, isAchromatic)); + +// +[ false, true, true, + true, true, true, + true, true, true, + true, true, false +] +``` + +___ + +### isCool + +▸ **isCool**(`color`): `boolean` + +Checks if a color can be roughly classified as a cool color. Returns true if color is a cool color else false. + +#### Parameters🧮 + +| Name | Type | Description | +| :------ | :------ | :------ | +| `color` | [`ColorToken`](types.md#colortoken) | The color to check the temperature. | + +#### Returns🔙 + +`boolean` + +True or false. + +**`Example`** 📋 + +```ts +import { isCool } from 'huetiful-js' + +let sample = [ + "#00ffdc", + "#00ff78", + "#00c000" +]; + +console.log(isCool(sample[2])); +// false + +console.log(map(sample, isCool)); + +// [ true, false, true] +``` + +___ + +### isWarm + +▸ **isWarm**(`color`): `boolean` + +Checks if a color can be roughly classified as a warm color. Returns true if color is a warm color else false. + +#### Parameters🧮 + +| Name | Type | Description | +| :------ | :------ | :------ | +| `color` | [`ColorToken`](types.md#colortoken) | The color to check the temperature. | + +#### Returns🔙 + +`boolean` + +True or false. + +**`Example`** 📋 + +```ts +import { isWarm } from 'huetiful-js' + +let sample = [ + "#00ffdc", + "#00ff78", + "#00c000" +]; + +console.log(isWarm(sample[2])); +//true + +console.log(map(sample, isWarm)); + +// [ false, true, false] +``` + +___ + +### overtone + +▸ **overtone**(`color`): `string` \| `boolean` + +Returns the hue which is biasing the passed in color + +#### Parameters🧮 + +| Name | Type | Description | +| :------ | :------ | :------ | +| `color` | [`ColorToken`](types.md#colortoken) | The color to query its overtone. | + +#### Returns🔙 + +`string` \| `boolean` + +The name of the overtone hue. If an achromatic color is passed in it return the string gray otherwise if the color has no bias it returns false. + +**`Example`** 📋 + +```ts +import { overtone } from "huetiful-js"; + +console.log(overtone("fefefe")) +// 'gray' + +console.log(overtone("cyan")) +// 'green' + +console.log(overtone("blue")) +// false +``` + +___ + +### setChannel + +▸ **setChannel**(`mc`): (`color`: [`ColorToken`](types.md#colortoken), `value`: `string` \| `number`) => [`ColorToken`](types.md#colortoken) + +Sets the value for the specified channel in a color. + +#### Parameters🧮 + +| Name | Type | Description | +| :------ | :------ | :------ | +| `mc` | `string` | The mode and channel to work with. For example 'rgb.b'. | + +#### Returns🔙 + +`fn` + +color The mutated color. + +▸ (`color`, `value`): [`ColorToken`](types.md#colortoken) + +##### Parameters🧮 + +| Name | Type | +| :------ | :------ | +| `color` | [`ColorToken`](types.md#colortoken) | +| `value` | `string` \| `number` | + +##### Returns🔙 + +[`ColorToken`](types.md#colortoken) + +**`Example`** 📋 + +```ts +import { setChannel } from 'huetiful-js' + +let myColor = setChannel('lch.h')('green',10) + +console.log(getChannel('lch.h')(myColor)) +// 10 +``` + +___ + +### setLuminance + +▸ **setLuminance**(`color`, `lum`): [`ColorToken`](types.md#colortoken) + +Sets the luminance by interpolating the color with black (to decrease luminance) or white (to increase the luminance). + +#### Parameters🧮 + +| Name | Type | Description | +| :------ | :------ | :------ | +| `color` | [`ColorToken`](types.md#colortoken) | The color to set luminance | +| `lum` | `number` | The amount of luminance to set. The value range is normalised between [0,1] | + +#### Returns🔙 + +[`ColorToken`](types.md#colortoken) + +The mutated color with the modified properties. + +**`Example`** 📋 + +```ts +import { setLuminance, getLuminance } from 'huetiful-js' + +let myColor = setLuminance('#a1bd2f', 0.5) + +console.log(getLuminance(myColor)) +// 0.4999999136285792 +``` diff --git a/docs/notes/colorspaces.md b/docs/notes/colorspaces.md new file mode 100644 index 00000000..bb44f698 --- /dev/null +++ b/docs/notes/colorspaces.md @@ -0,0 +1,40 @@ +# About colorspaces + +This library makes use of the predefined colorspaces provided by Culori. Information about the expected channel ranges, supported colorspaces and other related information on how the library handles them [can be found here](https://culorijs.org/color-spaces/) + +## Channel range normalization + +Because of how Culori defines its colorspaces it may feel unintuitive to, let's say for example pass RGB channel values in the range [0,1] since most developers are familiar of the [0,255] range, which isn't compatible with Culori and will return unexpected results: + +```js + +import { formatHex } from 'culori'; + +// The range [0,1] expected by Culori +let colorA = { r: 1, g: 0.5, b: 0.05, mode: 'rgb' }; +console.log(formatHex(colorA)); +// #ff800d + +// Also a valid range but not supported by Culori +let colorB = { r: 100, g: 58, b: 43.51, mode: 'rgb' }; +console.log(formatHex(colorB)); +// #ffffff + + +``` + +Note that `colorB` is returned as pure white. This same color token will return the correct color if we pass it to the `toHex` converter, which is generic: + +```js + +import { toHex } from 'huetiful-js'; + +let colorB = { r: 100, g: 58, b: 43.51, mode: 'rgb' }; + +console.log(toHex(colorB)); +// #643a2c + + +``` + +The `toHex` utility will treat the color to be in the range [0,255] if any of the channel values is greater than 1. This is in contrast to the way Culori handles such a scenario where it will just clamp the values to the [0,1] ranges. The formula is very simple: `channel / 255` which will give us our channel value in the supported range. This behaviour also applies to color tokens passed as arrays. diff --git a/docs/notes/generators.md b/docs/notes/generators.md new file mode 100644 index 00000000..e7fd1d73 --- /dev/null +++ b/docs/notes/generators.md @@ -0,0 +1 @@ +# Working with the color generators diff --git a/docs/notes/index.md b/docs/notes/index.md new file mode 100644 index 00000000..03ebb627 --- /dev/null +++ b/docs/notes/index.md @@ -0,0 +1,9 @@ +# Notes and references + +- [Quickstart](notes/quickstart.html) +- [About generator functions](notes/generators.html) +- [About filtering utilities](modules/filterBy.html) +- [The attributes of a color: An introduction](notes/about-color.html) +- [About colorspaces:Behaviour and handling](notes/colorspaces.html) +- [About common types used](notes/types.md) +- [About utilities](notes/utils.md) diff --git a/docs/notes/quickstart.md b/docs/notes/quickstart.md new file mode 100644 index 00000000..8e170d86 --- /dev/null +++ b/docs/notes/quickstart.md @@ -0,0 +1,340 @@ +# Quickstart + +## A guide to working with color programmatically + +#### What's a color 🤔? + +A color can be defined using different data types(arrays, strings, numbers plain objects). This allows us to work with color in almost any format and flexibility in how we want to define our color. Below are some examples listing all the supported formats of passing in color values and their respective conversion functions: + +```js +import { num2rgb, toHex } from 'huetiful-js' + +let cssNamedColor = 'pink' +let colorNumber = 5000 +let colorObject = { l: 50, c: 20, h: 40, mode: 'lch' } +let colorObjectWithAlpha = { l: 50, c: 20, h: 40, alpha: 0.5, mode: 'lch' } +let arrColor = ['rgb', 120, 80, 50] +let arrColorWithAlpha = ['rgb', 120, 80, 50, 0.1] + + +// Converting CSS named colors to hex +console.log(toHex(cssNamedColor)) +// #ffc0cb + +// Converting a number to an RGB object +console.log(num2rgb(colorNumber, true)) +// #001388 + +// Converting a color object to a 6 character hex (without the alpha value) +console.log(toHex(colorObject)) +// #956d62 + +// Converting a color object with an alpha property to an 8 character hex code (including the alpha channel) +console.log(toHex(colorObjectWithAlpha)) +// #956d6280 + +// Converting an array of channel values to a 6 character hex code. +console.log(toHex(arrColor)) +// #785032 + +// Converting an array of channel values (including the alpha channel) to an 8 character hex +console.log(toHex(arrColorWithAlpha)) +//#7850321a + + +``` + +> ℹ️ [See here](https://culorijs.org/color-spaces +) and the expected channel ranges or [more on converter functions](https://prjctimg.github.io/huetiful/modules/converters.html) page 🔗. + +#### TailwindCSS colors🎨 + +As a starting point the library comes along with the default TailwindCSS palette included. This helps you get started easier when you're using [palette functions](https://prjctimg.github.io/huetiful/modules/generators.html) such as `hueShift()` and `earthtone()` + +The Tailwind colors can be accessed from two wrapper functions, `tailwindColors` and `colors` , that both take the same parameters but `colors` takes both parameters at once while `tailwindColors` is curried. Here's an example showing the differences between the two functions: + +```js + import { tailwindColors , colors } from "huetiful-js"; + +// We pass in red as the target hue. +// It returns a function that can be called with an optional value parameter +let red = tailwindColors("red"); +console.log(red()); +// [ + '#fef2f2', '#fee2e2', + '#fecaca', '#fca5a5', + '#f87171', '#ef4444', + '#dc2626', '#b91c1c', + '#991b1b', '#7f1d1d' +] + + +console.log(red(100)); +// '#fee2e2' + +console.log(red('900')); +// '#7f1d1d' + + ////// example for colors() ////// + +// colors() has a builtin parameter called 'all' that returns all colors at the specified value +let all300 = colors("all", 300); + +console.log(all300) +//[ + '#cbd5e1', '#d1d5db', '#d4d4d8', + '#d4d4d4', '#d6d3d1', '#fca5a5', + '#fdba74', '#fcd34d', '#fde047', + '#bef264', '#86efac', '#6ee7b7', + '#5eead4', '#7dd3fc', '#93c5fd', + '#c4b5fd', '#d8b4fe', '#f0abfc', + '#f9a8d4', '#fda4af' +] + +let red = colors("red"); +console.log(red); + +// [ + '#fef2f2', '#fee2e2', + '#fecaca', '#fca5a5', + '#f87171', '#ef4444', + '#dc2626', '#b91c1c', + '#991b1b', '#7f1d1d' +] + +let red100 = colors("red", 100); + +console.log(red100) +// #fee2e2 + +``` + +### Working with arrays of color🎨 + +We can sort and filter colors using their property or channel values values like saturation,lightness and even contrast! +Here are some example using the filtering and sorting functions on an array of colors: + +#### Sorting colors + +An example of sorting colors by the relative luminance as defined by the WCAG 2.0 formula + +```js +import { sortByLuminance } from "huetiful-js"; +let sample = [ + "#00ffdc", + "#00ff78", + "#00c000", + "#007e00", + "#164100", + "#ffff00", + "#310000", + "#3e0000", + "#4e0000", + "#600000", + "#720000", +]; + + + +let sorted = sortByLuminance(sample) +console.log(sorted) +// [ + '#310000', '#3e0000', + '#4e0000', '#600000', + '#720000', '#164100', + '#007e00', '#00c000', + '#00ff78', '#00ffdc', + '#ffff00' +] + +// Note that you can specify the order as either ascending (`asc`) or descending (`desc`). The default is ascending. : + +let sortedDescending = sortByLuminance(sample, "desc"); +console.log(sortedDescending) +// [ + '#ffff00', '#00ffdc', + '#00ff78', '#00c000', + '#007e00', '#164100', + '#720000', '#600000', + '#4e0000', '#3e0000', + '#310000' +] + + +``` + +#### Filtering colors + +An example of filtering colors by the value of the hue angle. The function uses the Jch colorspace because of its perceptual uniformity. [George Francis explains this phenomena in detail here.](https://tympanus.net/codrops/2021/12/07/coloring-with-code-a-programmatic-approach-to-design/) + +```js + let sample = [ + '#00ffdc', + '#00ff78', + '#00c000', + '#007e00', + '#164100', + '#ffff00', + '#310000', + '#3e0000', + '#4e0000', + '#600000', + '#720000', +] + +filterByHue(sample, 20, 80) + +// [ '#310000', '#3e0000', '#4e0000', '#600000', '#720000' ] + + // We can even use expressions as the condition e.g '>=50' which means return the colors with a hue angle greater than or equal to 50 + + // Here are some examples +console.log(filterByHue(sample, '>100') +) +// [ '#00ffdc', '#00ff78', '#00c000', '#007e00', '#164100' ] + +console.log(filterByHue(sample, '<=100') +) +// [ '#ffff00', '#310000', '#3e0000', '#4e0000', '#600000', '#720000' ] + +``` + +[See more about the parameter types and other filtering functions](https://prjctimg.github.io/huetiful/modules/sortBy.html) + +### Palette generators + +A few simple palette generator functions are included in the library. One of my favourites is `hueShift` (as a color becomes lighter, its hue shifts up and darker when its hue shifts down. ) . + +```js +import { hueShift } from "huetiful-js"; + +let hueShiftedPalette = hueShift("#3e0000", {}, true); + +console.log(hueShiftedPalette); + +// [ + '#ffffe1', '#ffdca5', + '#ca9a70', '#935c40', + '#5c2418', '#3e0000', + '#310000', '#34000f', + '#38001e', '#3b002c', + '#3b0c3a' +] + + + +``` + +[See more palette generator functions](https://prjctimg.github.io/huetiful/modules/generators.html) + +### Predicates⚖️ + +Is this color cool🥶 or warm 🥵, is it achromatic (grayscale) or chromatic? Though its easy to tell colors apart visually when they're displayed on the screen📺 it can be a bit confusing to tell colors apart using code🔢. Below is an example showing how to determine if a color is gray or not: + +```js + +import { isAchromatic } from "huetiful-js"; +import { formatHex8, interpolate, samples } from "culori" + + +isAchromatic('pink') +// false + +let sample = [ + "#164100", + "#ffff00", + "#310000", + 'pink' +]; + +console.log(map(sample, isAchromatic)); + +// [false, false, false,false] + +isAchromatic('gray') +// true + + + +// Here are using some of Culori's functions to demonstrate this example +// we create an interpolation using black and white +let f = interpolate(["black", "white"]); + +//We then create 12 evenly spaced samples and pass them to f as the `t` param required by an interpolating function. +// Lastly we convert the color to hex for brevity for this example (otherwise color objects work fine too.) +let grays = map(samples(12), (c) => formatHex8(f(c))); +console.log(map(grays, isAchromatic)); + +// The last two colors are false because we can't categorize black and white as achromatic. + +// + [ false, true, true, + true, true, true, + true, true, true, + true, true, false +] + +``` + +Here's an example🎆 showing how we can check if a color is cool using one of the predicate functions: + +```js +import { isCool } from 'huetiful-js' + +let sample = [ + "#00ffdc", + "#00ff78", + "#00c000" +]; + + +console.log(isCool(sample[0])); +// false + +console.log(map(sample, isCool)); + +// [ true, false, true] + + +``` + +Another use👷 case would be passing the predicate to an array method like `filter` to filter a collection of colors removing colors that return false for the passed in predicate. In the following example we use is `isWarm` to only return warm colors: + +```js +import { isWarm } from 'huetiful-js' + +let sample = [ + "#00ffdc", + "#00ff78", + "#00c000" +]; + +console.log(sample.filter(isWarm)) +// [ '#00ff78' ] + + +``` + +Or maybe we want to know which color has the furthest hue distance in our sample collection against our target color 🤔: + +```js + +import { getFarthestHue } from 'huetiful-js' +let sample = [ + '#00ffdc', + '#00ff78', + '#00c000', + '#007e00', + '#164100', + '#ffff00', + '#310000', + '#3e0000', + '#4e0000', + '#600000', + '#720000', +] + +console.log(getFarthestHue('lime', sample, 'lch')) +// 112.60431681589854 + +``` diff --git a/docs/types/types.AdaptivePaletteOptions.html b/docs/types/types.AdaptivePaletteOptions.html deleted file mode 100644 index 34c0f7d0..00000000 --- a/docs/types/types.AdaptivePaletteOptions.html +++ /dev/null @@ -1,2 +0,0 @@ -AdaptivePaletteOptions | huetiful-js

Type alias AdaptivePaletteOptions

AdaptivePaletteOptions: {
    backgroundColor?: {
        dark?: ColorToken;
        light?: ColorToken;
    };
    colorBlind?: boolean;
    viewingConditions?: ViewingConditions;
}

Type declaration

Description

This object returns the lightMode and darkMode optimized version of a color with support to add color vision deficiency simulation to the final color result.

-

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/types/types.ColorDistanceOptions.html b/docs/types/types.ColorDistanceOptions.html deleted file mode 100644 index 74be0b5d..00000000 --- a/docs/types/types.ColorDistanceOptions.html +++ /dev/null @@ -1 +0,0 @@ -ColorDistanceOptions | huetiful-js

Type alias ColorDistanceOptions

ColorDistanceOptions: {
    mode?: ColorSpaces;
    weights?: [number, number, number, number];
}

Type declaration

  • Optional mode?: ColorSpaces
  • Optional weights?: [number, number, number, number]

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/types/types.ColorObject.html b/docs/types/types.ColorObject.html deleted file mode 100644 index 00acc63f..00000000 --- a/docs/types/types.ColorObject.html +++ /dev/null @@ -1 +0,0 @@ -ColorObject | huetiful-js

Type alias ColorObject

ColorObject: {
    alpha?: number;
    mode: ColorSpaces;
}

Type declaration

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/types/types.ColorOptions.html b/docs/types/types.ColorOptions.html deleted file mode 100644 index e8bf6efb..00000000 --- a/docs/types/types.ColorOptions.html +++ /dev/null @@ -1 +0,0 @@ -ColorOptions | huetiful-js

Type alias ColorOptions

ColorOptions: {
    alpha?: number;
    colorSpace?: HueColorSpaces;
    colorspace?: HueColorSpaces;
    contrast?: number;
    darkMode?: ColorToken;
    illuminant?: "D50" | "D65";
    lightMode?: ColorToken;
    lightness?: number;
    luminance?: number;
    saturation?: number;
    temperature?: number;
}

Type declaration

  • Optional alpha?: number
  • Optional colorSpace?: HueColorSpaces
  • Optional colorspace?: HueColorSpaces
  • Optional contrast?: number
  • Optional darkMode?: ColorToken
  • Optional illuminant?: "D50" | "D65"
  • Optional lightMode?: ColorToken
  • Optional lightness?: number
  • Optional luminance?: number
  • Optional saturation?: number
  • Optional temperature?: number

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/types/types.ColorSpaces.html b/docs/types/types.ColorSpaces.html deleted file mode 100644 index 68328921..00000000 --- a/docs/types/types.ColorSpaces.html +++ /dev/null @@ -1 +0,0 @@ -ColorSpaces | huetiful-js

Type alias ColorSpaces

ColorSpaces: "a98" | "cubehelix" | "dlab" | "dlch" | "hsi" | "hsl" | "hsv" | "hwb" | "jab" | "jch" | "lab" | "lab65" | "lch" | "lch65" | "lchuv" | "lrgb" | "luv" | "okhsl" | "okhsv" | "oklab" | "rgb"

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/types/types.ColorTemp.html b/docs/types/types.ColorTemp.html deleted file mode 100644 index 77a1ce7f..00000000 --- a/docs/types/types.ColorTemp.html +++ /dev/null @@ -1 +0,0 @@ -ColorTemp | huetiful-js

Type alias ColorTemp

ColorTemp: "warm" | "cool" | "daylight" | "incadescent" | "fluorescent"

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/types/types.ColorToken.html b/docs/types/types.ColorToken.html deleted file mode 100644 index 3150a66a..00000000 --- a/docs/types/types.ColorToken.html +++ /dev/null @@ -1,2 +0,0 @@ -ColorToken | huetiful-js

Type alias ColorToken

ColorToken: number | string | object | ColorTuple

Description

Any recognizable color token.

-

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/types/types.ColorTuple.html b/docs/types/types.ColorTuple.html deleted file mode 100644 index 0545ca50..00000000 --- a/docs/types/types.ColorTuple.html +++ /dev/null @@ -1 +0,0 @@ -ColorTuple | huetiful-js

Type alias ColorTuple

ColorTuple: [string, number, number, number, number?]

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/types/types.DeficiencyType.html b/docs/types/types.DeficiencyType.html deleted file mode 100644 index b36758ff..00000000 --- a/docs/types/types.DeficiencyType.html +++ /dev/null @@ -1 +0,0 @@ -DeficiencyType | huetiful-js

Type alias DeficiencyType

DeficiencyType: "red" | "blue" | "green" | "monochromacy"

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/types/types.DivergingScheme.html b/docs/types/types.DivergingScheme.html deleted file mode 100644 index 0796069b..00000000 --- a/docs/types/types.DivergingScheme.html +++ /dev/null @@ -1 +0,0 @@ -DivergingScheme | huetiful-js

Type alias DivergingScheme

DivergingScheme: "Spectral" | "RdYlGn" | "RdBu" | "PiYG" | "PRGn" | "RdYlBu" | "BrBG" | "RdGy" | "PuOr"

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/types/types.EarthtoneOptions.html b/docs/types/types.EarthtoneOptions.html deleted file mode 100644 index 84dbac54..00000000 --- a/docs/types/types.EarthtoneOptions.html +++ /dev/null @@ -1 +0,0 @@ -EarthtoneOptions | huetiful-js

Type alias EarthtoneOptions

EarthtoneOptions: Omit<Options, "hueStep" | "via" | "maxLightness" | "minLightness">

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/types/types.Factor.html b/docs/types/types.Factor.html deleted file mode 100644 index 3c99569e..00000000 --- a/docs/types/types.Factor.html +++ /dev/null @@ -1 +0,0 @@ -Factor | huetiful-js

Type alias Factor

Factor: "luminance" | "temp" | "saturation" | "contrast" | "distance" | "lightness" | "hue"

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/types/types.FactorMapper.html b/docs/types/types.FactorMapper.html deleted file mode 100644 index f76236d2..00000000 --- a/docs/types/types.FactorMapper.html +++ /dev/null @@ -1 +0,0 @@ -FactorMapper | huetiful-js

Type alias FactorMapper

FactorMapper: ((factor, callback, order?, colorObj?) => ((colors) => ColorToken[]))

Type declaration

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/types/types.HueColorSpaces.html b/docs/types/types.HueColorSpaces.html deleted file mode 100644 index 7be751af..00000000 --- a/docs/types/types.HueColorSpaces.html +++ /dev/null @@ -1 +0,0 @@ -HueColorSpaces | huetiful-js

Type alias HueColorSpaces

HueColorSpaces: "jch" | "hsl" | "hsv" | "hsi" | "oklch" | "lch" | "hwb" | "okhsl" | "okhsv" | "lch65" | "lchuv" | "dlch"

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/types/types.HueFamily.html b/docs/types/types.HueFamily.html deleted file mode 100644 index be967334..00000000 --- a/docs/types/types.HueFamily.html +++ /dev/null @@ -1 +0,0 @@ -HueFamily | huetiful-js

Type alias HueFamily

HueFamily: "red-purple" | "red" | "yellow-red" | "yellow" | "green-yellow" | "green" | "blue-green" | "blue" | "purple-blue" | "purple"

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/types/types.HueMap.html b/docs/types/types.HueMap.html deleted file mode 100644 index a9e34fb6..00000000 --- a/docs/types/types.HueMap.html +++ /dev/null @@ -1 +0,0 @@ -HueMap | huetiful-js

Type alias HueMap

HueMap: {
    amber: {
        100: string;
        200: string;
        300: string;
        400: string;
        50: string;
        500: string;
        600: string;
        700: string;
        800: string;
        900: string;
    };
    blue: {
        100: string;
        200: string;
        300: string;
        400: string;
        50: string;
        500: string;
        600: string;
        700: string;
        800: string;
        900: string;
    };
    emerald: {
        100: string;
        200: string;
        300: string;
        400: string;
        50: string;
        500: string;
        600: string;
        700: string;
        800: string;
        900: string;
    };
    fuchsia: {
        100: string;
        200: string;
        300: string;
        400: string;
        50: string;
        500: string;
        600: string;
        700: string;
        800: string;
        900: string;
    };
    gray: {
        100: string;
        200: string;
        300: string;
        400: string;
        50: string;
        500: string;
        600: string;
        700: string;
        800: string;
        900: string;
    };
    green: {
        100: string;
        200: string;
        300: string;
        400: string;
        50: string;
        500: string;
        600: string;
        700: string;
        800: string;
        900: string;
    };
    indigo: {
        100: string;
        200: string;
        300: string;
        400: string;
        50: string;
        500: string;
        600: string;
        700: string;
        800: string;
        900: string;
    };
    lime: {
        100: string;
        200: string;
        300: string;
        400: string;
        50: string;
        500: string;
        600: string;
        700: string;
        800: string;
        900: string;
    };
    neutral: {
        100: string;
        200: string;
        300: string;
        400: string;
        50: string;
        500: string;
        600: string;
        700: string;
        800: string;
        900: string;
    };
    orange: {
        100: string;
        200: string;
        300: string;
        400: string;
        50: string;
        500: string;
        600: string;
        700: string;
        800: string;
        900: string;
    };
    pink: {
        100: string;
        200: string;
        300: string;
        400: string;
        50: string;
        500: string;
        600: string;
        700: string;
        800: string;
        900: string;
    };
    purple: {
        100: string;
        200: string;
        300: string;
        400: string;
        50: string;
        500: string;
        600: string;
        700: string;
        800: string;
        900: string;
    };
    red: {
        100: string;
        200: string;
        300: string;
        400: string;
        50: string;
        500: string;
        600: string;
        700: string;
        800: string;
        900: string;
    };
    rose: {
        100: string;
        200: string;
        300: string;
        400: string;
        50: string;
        500: string;
        600: string;
        700: string;
        800: string;
        900: string;
    };
    sky: {
        100: string;
        200: string;
        300: string;
        400: string;
        50: string;
        500: string;
        600: string;
        700: string;
        800: string;
        900: string;
    };
    stone: {
        100: string;
        200: string;
        300: string;
        400: string;
        50: string;
        500: string;
        600: string;
        700: string;
        800: string;
        900: string;
    };
    teal: {
        100: string;
        200: string;
        300: string;
        400: string;
        50: string;
        500: string;
        600: string;
        700: string;
        800: string;
        900: string;
    };
    violet: {
        100: string;
        200: string;
        300: string;
        400: string;
        50: string;
        500: string;
        600: string;
        700: string;
        800: string;
        900: string;
    };
    yellow: {
        100: string;
        200: string;
        300: string;
        400: string;
        50: string;
        500: string;
        600: string;
        700: string;
        800: string;
        900: string;
    };
    zinc: {
        100: string;
        200: string;
        300: string;
        400: string;
        50: string;
        500: string;
        600: string;
        700: string;
        800: string;
        900: string;
    };
}

Type declaration

  • amber: {
        100: string;
        200: string;
        300: string;
        400: string;
        50: string;
        500: string;
        600: string;
        700: string;
        800: string;
        900: string;
    }
    • 100: string
    • 200: string
    • 300: string
    • 400: string
    • 50: string
    • 500: string
    • 600: string
    • 700: string
    • 800: string
    • 900: string
  • blue: {
        100: string;
        200: string;
        300: string;
        400: string;
        50: string;
        500: string;
        600: string;
        700: string;
        800: string;
        900: string;
    }
    • 100: string
    • 200: string
    • 300: string
    • 400: string
    • 50: string
    • 500: string
    • 600: string
    • 700: string
    • 800: string
    • 900: string
  • emerald: {
        100: string;
        200: string;
        300: string;
        400: string;
        50: string;
        500: string;
        600: string;
        700: string;
        800: string;
        900: string;
    }
    • 100: string
    • 200: string
    • 300: string
    • 400: string
    • 50: string
    • 500: string
    • 600: string
    • 700: string
    • 800: string
    • 900: string
  • fuchsia: {
        100: string;
        200: string;
        300: string;
        400: string;
        50: string;
        500: string;
        600: string;
        700: string;
        800: string;
        900: string;
    }
    • 100: string
    • 200: string
    • 300: string
    • 400: string
    • 50: string
    • 500: string
    • 600: string
    • 700: string
    • 800: string
    • 900: string
  • gray: {
        100: string;
        200: string;
        300: string;
        400: string;
        50: string;
        500: string;
        600: string;
        700: string;
        800: string;
        900: string;
    }
    • 100: string
    • 200: string
    • 300: string
    • 400: string
    • 50: string
    • 500: string
    • 600: string
    • 700: string
    • 800: string
    • 900: string
  • green: {
        100: string;
        200: string;
        300: string;
        400: string;
        50: string;
        500: string;
        600: string;
        700: string;
        800: string;
        900: string;
    }
    • 100: string
    • 200: string
    • 300: string
    • 400: string
    • 50: string
    • 500: string
    • 600: string
    • 700: string
    • 800: string
    • 900: string
  • indigo: {
        100: string;
        200: string;
        300: string;
        400: string;
        50: string;
        500: string;
        600: string;
        700: string;
        800: string;
        900: string;
    }
    • 100: string
    • 200: string
    • 300: string
    • 400: string
    • 50: string
    • 500: string
    • 600: string
    • 700: string
    • 800: string
    • 900: string
  • lime: {
        100: string;
        200: string;
        300: string;
        400: string;
        50: string;
        500: string;
        600: string;
        700: string;
        800: string;
        900: string;
    }
    • 100: string
    • 200: string
    • 300: string
    • 400: string
    • 50: string
    • 500: string
    • 600: string
    • 700: string
    • 800: string
    • 900: string
  • neutral: {
        100: string;
        200: string;
        300: string;
        400: string;
        50: string;
        500: string;
        600: string;
        700: string;
        800: string;
        900: string;
    }
    • 100: string
    • 200: string
    • 300: string
    • 400: string
    • 50: string
    • 500: string
    • 600: string
    • 700: string
    • 800: string
    • 900: string
  • orange: {
        100: string;
        200: string;
        300: string;
        400: string;
        50: string;
        500: string;
        600: string;
        700: string;
        800: string;
        900: string;
    }
    • 100: string
    • 200: string
    • 300: string
    • 400: string
    • 50: string
    • 500: string
    • 600: string
    • 700: string
    • 800: string
    • 900: string
  • pink: {
        100: string;
        200: string;
        300: string;
        400: string;
        50: string;
        500: string;
        600: string;
        700: string;
        800: string;
        900: string;
    }
    • 100: string
    • 200: string
    • 300: string
    • 400: string
    • 50: string
    • 500: string
    • 600: string
    • 700: string
    • 800: string
    • 900: string
  • purple: {
        100: string;
        200: string;
        300: string;
        400: string;
        50: string;
        500: string;
        600: string;
        700: string;
        800: string;
        900: string;
    }
    • 100: string
    • 200: string
    • 300: string
    • 400: string
    • 50: string
    • 500: string
    • 600: string
    • 700: string
    • 800: string
    • 900: string
  • red: {
        100: string;
        200: string;
        300: string;
        400: string;
        50: string;
        500: string;
        600: string;
        700: string;
        800: string;
        900: string;
    }
    • 100: string
    • 200: string
    • 300: string
    • 400: string
    • 50: string
    • 500: string
    • 600: string
    • 700: string
    • 800: string
    • 900: string
  • rose: {
        100: string;
        200: string;
        300: string;
        400: string;
        50: string;
        500: string;
        600: string;
        700: string;
        800: string;
        900: string;
    }
    • 100: string
    • 200: string
    • 300: string
    • 400: string
    • 50: string
    • 500: string
    • 600: string
    • 700: string
    • 800: string
    • 900: string
  • sky: {
        100: string;
        200: string;
        300: string;
        400: string;
        50: string;
        500: string;
        600: string;
        700: string;
        800: string;
        900: string;
    }
    • 100: string
    • 200: string
    • 300: string
    • 400: string
    • 50: string
    • 500: string
    • 600: string
    • 700: string
    • 800: string
    • 900: string
  • stone: {
        100: string;
        200: string;
        300: string;
        400: string;
        50: string;
        500: string;
        600: string;
        700: string;
        800: string;
        900: string;
    }
    • 100: string
    • 200: string
    • 300: string
    • 400: string
    • 50: string
    • 500: string
    • 600: string
    • 700: string
    • 800: string
    • 900: string
  • teal: {
        100: string;
        200: string;
        300: string;
        400: string;
        50: string;
        500: string;
        600: string;
        700: string;
        800: string;
        900: string;
    }
    • 100: string
    • 200: string
    • 300: string
    • 400: string
    • 50: string
    • 500: string
    • 600: string
    • 700: string
    • 800: string
    • 900: string
  • violet: {
        100: string;
        200: string;
        300: string;
        400: string;
        50: string;
        500: string;
        600: string;
        700: string;
        800: string;
        900: string;
    }
    • 100: string
    • 200: string
    • 300: string
    • 400: string
    • 50: string
    • 500: string
    • 600: string
    • 700: string
    • 800: string
    • 900: string
  • yellow: {
        100: string;
        200: string;
        300: string;
        400: string;
        50: string;
        500: string;
        600: string;
        700: string;
        800: string;
        900: string;
    }
    • 100: string
    • 200: string
    • 300: string
    • 400: string
    • 50: string
    • 500: string
    • 600: string
    • 700: string
    • 800: string
    • 900: string
  • zinc: {
        100: string;
        200: string;
        300: string;
        400: string;
        50: string;
        500: string;
        600: string;
        700: string;
        800: string;
        900: string;
    }
    • 100: string
    • 200: string
    • 300: string
    • 400: string
    • 50: string
    • 500: string
    • 600: string
    • 700: string
    • 800: string
    • 900: string

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/types/types.HueShiftOptions.html b/docs/types/types.HueShiftOptions.html deleted file mode 100644 index c96b316c..00000000 --- a/docs/types/types.HueShiftOptions.html +++ /dev/null @@ -1 +0,0 @@ -HueShiftOptions | huetiful-js

Type alias HueShiftOptions

HueShiftOptions: Omit<Options, "via" | "earthtones" | ""> & InterpolatorOptions

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/types/types.Interpolator.html b/docs/types/types.Interpolator.html deleted file mode 100644 index 07a3cd5e..00000000 --- a/docs/types/types.Interpolator.html +++ /dev/null @@ -1 +0,0 @@ -Interpolator | huetiful-js

Type alias Interpolator

Interpolator: ((arr) => ((t) => number))

Type declaration

    • (arr): ((t) => number)
    • Parameters

      • arr: number[]

      Returns ((t) => number)

        • (t): number
        • Parameters

          • t: number

          Returns number

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/types/types.InterpolatorOptions.html b/docs/types/types.InterpolatorOptions.html deleted file mode 100644 index 9970aec6..00000000 --- a/docs/types/types.InterpolatorOptions.html +++ /dev/null @@ -1 +0,0 @@ -InterpolatorOptions | huetiful-js

Type alias InterpolatorOptions

InterpolatorOptions: Pick<Options, "easingFunc" | "hueInterpolator" | "chromaInterpolator" | "hueFixup" | "lightnessInterpolator">

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/types/types.Options.html b/docs/types/types.Options.html deleted file mode 100644 index d3206654..00000000 --- a/docs/types/types.Options.html +++ /dev/null @@ -1,20 +0,0 @@ -Options | huetiful-js

Type alias Options

Options: {
    chromaInterpolator?: Interpolator;
    earthtones?: "light-gray" | "silver" | "sand" | "tupe" | "mahogany" | "brick-red" | "clay" | "cocoa" | "dark-brown" | "dark";
    easingFunc?: ((t) => number);
    hueFixup?: ((arr) => number[]);
    hueInterpolator?: Interpolator;
    hueStep?: number;
    lightnessInterpolator?: Interpolator;
    maxLightness?: number;
    minLightness?: number;
    samples?: number;
    via?: Tone;
}

Type declaration

  • Optional chromaInterpolator?: Interpolator

    Param

    interpolation method to use on the chroma channel.

    -
  • Optional earthtones?: "light-gray" | "silver" | "sand" | "tupe" | "mahogany" | "brick-red" | "clay" | "cocoa" | "dark-brown" | "dark"
      -
    • -
    -

    Param

    The earthtone to interpolate with.

    -
  • Optional easingFunc?: ((t) => number)
      • (t): number
      • The easing function to use.

        -

        Parameters

        • t: number

          Any value between 0 and 1

          -

        Returns number

        A number.

        -
  • Optional hueFixup?: ((arr) => number[])
      • (arr): number[]
      • Parameters

        • arr: number[]

        Returns number[]

  • Optional hueInterpolator?: Interpolator

    Param

    interpolation method to use on the hue channel.

    -
  • Optional hueStep?: number

    Param

    amount of hue angles to increment each iteration with.

    -
  • Optional lightnessInterpolator?: Interpolator

    Param

    interpolation method to use on the lightness channel.

    -
  • Optional maxLightness?: number

    Param

    Maximum lightness value (range 0-100).

    -
  • Optional minLightness?: number
      -
    • -
    -

    Param

    Minimum lightness value (range 0-100).

    -
  • Optional samples?: number

    Param

    amount of samples to return in the result collection.

    -
  • Optional via?: Tone

    Param

    color to pass through during interpolation.

    -

Description

The override parameters for palette functions.

-

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/types/types.Order.html b/docs/types/types.Order.html deleted file mode 100644 index b97cd05e..00000000 --- a/docs/types/types.Order.html +++ /dev/null @@ -1 +0,0 @@ -Order | huetiful-js

Type alias Order

Order: "asc" | "desc"

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/types/types.PairedSchemeOptions.html b/docs/types/types.PairedSchemeOptions.html deleted file mode 100644 index 58464397..00000000 --- a/docs/types/types.PairedSchemeOptions.html +++ /dev/null @@ -1 +0,0 @@ -PairedSchemeOptions | huetiful-js

Type alias PairedSchemeOptions

PairedSchemeOptions: Omit<Options, "earthtones" | "maxLightness" | "minLightness">

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/types/types.QualitativeScheme.html b/docs/types/types.QualitativeScheme.html deleted file mode 100644 index 308038da..00000000 --- a/docs/types/types.QualitativeScheme.html +++ /dev/null @@ -1 +0,0 @@ -QualitativeScheme | huetiful-js

Type alias QualitativeScheme

QualitativeScheme: "Set2" | "Accent" | "Set1" | "Set3" | "Dark2" | "Paired" | "Pastel2" | "Pastel1"

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/types/types.ScaleValues.html b/docs/types/types.ScaleValues.html deleted file mode 100644 index fd694329..00000000 --- a/docs/types/types.ScaleValues.html +++ /dev/null @@ -1 +0,0 @@ -ScaleValues | huetiful-js

Type alias ScaleValues

ScaleValues: "100" | "50" | "200" | "300" | "400" | "500" | "600" | "700" | "800" | "900"

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/types/types.SequentialScheme.html b/docs/types/types.SequentialScheme.html deleted file mode 100644 index 36216d8e..00000000 --- a/docs/types/types.SequentialScheme.html +++ /dev/null @@ -1 +0,0 @@ -SequentialScheme | huetiful-js

Type alias SequentialScheme

SequentialScheme: "OrRd" | "PuBu" | "BuPu" | "Oranges" | "BuGn" | "YlOrBr" | "YlGn" | "Reds" | "RdPu" | "Greens" | "YlGnBu" | "Purples" | "GnBu" | "Greys" | "YlOrRd" | "PuRd" | "Blues" | "PuBuGn" | "Viridis"

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/types/types.Tone.html b/docs/types/types.Tone.html deleted file mode 100644 index 315f354a..00000000 --- a/docs/types/types.Tone.html +++ /dev/null @@ -1 +0,0 @@ -Tone | huetiful-js

Type alias Tone

Tone: "light" | "dark"

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/types/types.UniformColorSpaces.html b/docs/types/types.UniformColorSpaces.html deleted file mode 100644 index 94a025b6..00000000 --- a/docs/types/types.UniformColorSpaces.html +++ /dev/null @@ -1 +0,0 @@ -UniformColorSpaces | huetiful-js

Type alias UniformColorSpaces

UniformColorSpaces: "lch" | "jch"

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/types/types.ViewingConditions.html b/docs/types/types.ViewingConditions.html deleted file mode 100644 index 571ea3d5..00000000 --- a/docs/types/types.ViewingConditions.html +++ /dev/null @@ -1 +0,0 @@ -ViewingConditions | huetiful-js

Type alias ViewingConditions

ViewingConditions: {
    adaptingLuminance?: number;
    backgroundLuminance?: number;
    discounting?: boolean;
    surroundType?: "dim" | "dark" | "average";
    whitePoint?: Illuminant;
}

Type declaration

  • Optional adaptingLuminance?: number
  • Optional backgroundLuminance?: number
  • Optional discounting?: boolean
  • Optional surroundType?: "dim" | "dark" | "average"
  • Optional whitePoint?: Illuminant

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/types/types.callback.html b/docs/types/types.callback.html deleted file mode 100644 index 15a31ff7..00000000 --- a/docs/types/types.callback.html +++ /dev/null @@ -1 +0,0 @@ -callback | huetiful-js

Type alias callback

callback: unknown

Generated using TypeDoc

\ No newline at end of file diff --git a/huetiful-js-1.79.91.tgz b/huetiful-js-1.79.91.tgz new file mode 100644 index 00000000..c1eed0d0 Binary files /dev/null and b/huetiful-js-1.79.91.tgz differ diff --git a/huetiful.code-workspace b/huetiful.code-workspace new file mode 100644 index 00000000..0885b0e3 --- /dev/null +++ b/huetiful.code-workspace @@ -0,0 +1,10 @@ +{ + "folders": [ + { + "path": "." + } + ], + "settings": { + "liveServer.settings.multiRootWorkspaceName": "huetiful" + } +} diff --git a/notes/colorspaces.md b/notes/colorspaces.md new file mode 100644 index 00000000..bb44f698 --- /dev/null +++ b/notes/colorspaces.md @@ -0,0 +1,40 @@ +# About colorspaces + +This library makes use of the predefined colorspaces provided by Culori. Information about the expected channel ranges, supported colorspaces and other related information on how the library handles them [can be found here](https://culorijs.org/color-spaces/) + +## Channel range normalization + +Because of how Culori defines its colorspaces it may feel unintuitive to, let's say for example pass RGB channel values in the range [0,1] since most developers are familiar of the [0,255] range, which isn't compatible with Culori and will return unexpected results: + +```js + +import { formatHex } from 'culori'; + +// The range [0,1] expected by Culori +let colorA = { r: 1, g: 0.5, b: 0.05, mode: 'rgb' }; +console.log(formatHex(colorA)); +// #ff800d + +// Also a valid range but not supported by Culori +let colorB = { r: 100, g: 58, b: 43.51, mode: 'rgb' }; +console.log(formatHex(colorB)); +// #ffffff + + +``` + +Note that `colorB` is returned as pure white. This same color token will return the correct color if we pass it to the `toHex` converter, which is generic: + +```js + +import { toHex } from 'huetiful-js'; + +let colorB = { r: 100, g: 58, b: 43.51, mode: 'rgb' }; + +console.log(toHex(colorB)); +// #643a2c + + +``` + +The `toHex` utility will treat the color to be in the range [0,255] if any of the channel values is greater than 1. This is in contrast to the way Culori handles such a scenario where it will just clamp the values to the [0,1] ranges. The formula is very simple: `channel / 255` which will give us our channel value in the supported range. This behaviour also applies to color tokens passed as arrays. diff --git a/notes/generators.md b/notes/generators.md new file mode 100644 index 00000000..e7fd1d73 --- /dev/null +++ b/notes/generators.md @@ -0,0 +1 @@ +# Working with the color generators diff --git a/notes/index.md b/notes/index.md new file mode 100644 index 00000000..03ebb627 --- /dev/null +++ b/notes/index.md @@ -0,0 +1,9 @@ +# Notes and references + +- [Quickstart](notes/quickstart.html) +- [About generator functions](notes/generators.html) +- [About filtering utilities](modules/filterBy.html) +- [The attributes of a color: An introduction](notes/about-color.html) +- [About colorspaces:Behaviour and handling](notes/colorspaces.html) +- [About common types used](notes/types.md) +- [About utilities](notes/utils.md) diff --git a/notes/quickstart.md b/notes/quickstart.md new file mode 100644 index 00000000..8e170d86 --- /dev/null +++ b/notes/quickstart.md @@ -0,0 +1,340 @@ +# Quickstart + +## A guide to working with color programmatically + +#### What's a color 🤔? + +A color can be defined using different data types(arrays, strings, numbers plain objects). This allows us to work with color in almost any format and flexibility in how we want to define our color. Below are some examples listing all the supported formats of passing in color values and their respective conversion functions: + +```js +import { num2rgb, toHex } from 'huetiful-js' + +let cssNamedColor = 'pink' +let colorNumber = 5000 +let colorObject = { l: 50, c: 20, h: 40, mode: 'lch' } +let colorObjectWithAlpha = { l: 50, c: 20, h: 40, alpha: 0.5, mode: 'lch' } +let arrColor = ['rgb', 120, 80, 50] +let arrColorWithAlpha = ['rgb', 120, 80, 50, 0.1] + + +// Converting CSS named colors to hex +console.log(toHex(cssNamedColor)) +// #ffc0cb + +// Converting a number to an RGB object +console.log(num2rgb(colorNumber, true)) +// #001388 + +// Converting a color object to a 6 character hex (without the alpha value) +console.log(toHex(colorObject)) +// #956d62 + +// Converting a color object with an alpha property to an 8 character hex code (including the alpha channel) +console.log(toHex(colorObjectWithAlpha)) +// #956d6280 + +// Converting an array of channel values to a 6 character hex code. +console.log(toHex(arrColor)) +// #785032 + +// Converting an array of channel values (including the alpha channel) to an 8 character hex +console.log(toHex(arrColorWithAlpha)) +//#7850321a + + +``` + +> ℹ️ [See here](https://culorijs.org/color-spaces +) and the expected channel ranges or [more on converter functions](https://prjctimg.github.io/huetiful/modules/converters.html) page 🔗. + +#### TailwindCSS colors🎨 + +As a starting point the library comes along with the default TailwindCSS palette included. This helps you get started easier when you're using [palette functions](https://prjctimg.github.io/huetiful/modules/generators.html) such as `hueShift()` and `earthtone()` + +The Tailwind colors can be accessed from two wrapper functions, `tailwindColors` and `colors` , that both take the same parameters but `colors` takes both parameters at once while `tailwindColors` is curried. Here's an example showing the differences between the two functions: + +```js + import { tailwindColors , colors } from "huetiful-js"; + +// We pass in red as the target hue. +// It returns a function that can be called with an optional value parameter +let red = tailwindColors("red"); +console.log(red()); +// [ + '#fef2f2', '#fee2e2', + '#fecaca', '#fca5a5', + '#f87171', '#ef4444', + '#dc2626', '#b91c1c', + '#991b1b', '#7f1d1d' +] + + +console.log(red(100)); +// '#fee2e2' + +console.log(red('900')); +// '#7f1d1d' + + ////// example for colors() ////// + +// colors() has a builtin parameter called 'all' that returns all colors at the specified value +let all300 = colors("all", 300); + +console.log(all300) +//[ + '#cbd5e1', '#d1d5db', '#d4d4d8', + '#d4d4d4', '#d6d3d1', '#fca5a5', + '#fdba74', '#fcd34d', '#fde047', + '#bef264', '#86efac', '#6ee7b7', + '#5eead4', '#7dd3fc', '#93c5fd', + '#c4b5fd', '#d8b4fe', '#f0abfc', + '#f9a8d4', '#fda4af' +] + +let red = colors("red"); +console.log(red); + +// [ + '#fef2f2', '#fee2e2', + '#fecaca', '#fca5a5', + '#f87171', '#ef4444', + '#dc2626', '#b91c1c', + '#991b1b', '#7f1d1d' +] + +let red100 = colors("red", 100); + +console.log(red100) +// #fee2e2 + +``` + +### Working with arrays of color🎨 + +We can sort and filter colors using their property or channel values values like saturation,lightness and even contrast! +Here are some example using the filtering and sorting functions on an array of colors: + +#### Sorting colors + +An example of sorting colors by the relative luminance as defined by the WCAG 2.0 formula + +```js +import { sortByLuminance } from "huetiful-js"; +let sample = [ + "#00ffdc", + "#00ff78", + "#00c000", + "#007e00", + "#164100", + "#ffff00", + "#310000", + "#3e0000", + "#4e0000", + "#600000", + "#720000", +]; + + + +let sorted = sortByLuminance(sample) +console.log(sorted) +// [ + '#310000', '#3e0000', + '#4e0000', '#600000', + '#720000', '#164100', + '#007e00', '#00c000', + '#00ff78', '#00ffdc', + '#ffff00' +] + +// Note that you can specify the order as either ascending (`asc`) or descending (`desc`). The default is ascending. : + +let sortedDescending = sortByLuminance(sample, "desc"); +console.log(sortedDescending) +// [ + '#ffff00', '#00ffdc', + '#00ff78', '#00c000', + '#007e00', '#164100', + '#720000', '#600000', + '#4e0000', '#3e0000', + '#310000' +] + + +``` + +#### Filtering colors + +An example of filtering colors by the value of the hue angle. The function uses the Jch colorspace because of its perceptual uniformity. [George Francis explains this phenomena in detail here.](https://tympanus.net/codrops/2021/12/07/coloring-with-code-a-programmatic-approach-to-design/) + +```js + let sample = [ + '#00ffdc', + '#00ff78', + '#00c000', + '#007e00', + '#164100', + '#ffff00', + '#310000', + '#3e0000', + '#4e0000', + '#600000', + '#720000', +] + +filterByHue(sample, 20, 80) + +// [ '#310000', '#3e0000', '#4e0000', '#600000', '#720000' ] + + // We can even use expressions as the condition e.g '>=50' which means return the colors with a hue angle greater than or equal to 50 + + // Here are some examples +console.log(filterByHue(sample, '>100') +) +// [ '#00ffdc', '#00ff78', '#00c000', '#007e00', '#164100' ] + +console.log(filterByHue(sample, '<=100') +) +// [ '#ffff00', '#310000', '#3e0000', '#4e0000', '#600000', '#720000' ] + +``` + +[See more about the parameter types and other filtering functions](https://prjctimg.github.io/huetiful/modules/sortBy.html) + +### Palette generators + +A few simple palette generator functions are included in the library. One of my favourites is `hueShift` (as a color becomes lighter, its hue shifts up and darker when its hue shifts down. ) . + +```js +import { hueShift } from "huetiful-js"; + +let hueShiftedPalette = hueShift("#3e0000", {}, true); + +console.log(hueShiftedPalette); + +// [ + '#ffffe1', '#ffdca5', + '#ca9a70', '#935c40', + '#5c2418', '#3e0000', + '#310000', '#34000f', + '#38001e', '#3b002c', + '#3b0c3a' +] + + + +``` + +[See more palette generator functions](https://prjctimg.github.io/huetiful/modules/generators.html) + +### Predicates⚖️ + +Is this color cool🥶 or warm 🥵, is it achromatic (grayscale) or chromatic? Though its easy to tell colors apart visually when they're displayed on the screen📺 it can be a bit confusing to tell colors apart using code🔢. Below is an example showing how to determine if a color is gray or not: + +```js + +import { isAchromatic } from "huetiful-js"; +import { formatHex8, interpolate, samples } from "culori" + + +isAchromatic('pink') +// false + +let sample = [ + "#164100", + "#ffff00", + "#310000", + 'pink' +]; + +console.log(map(sample, isAchromatic)); + +// [false, false, false,false] + +isAchromatic('gray') +// true + + + +// Here are using some of Culori's functions to demonstrate this example +// we create an interpolation using black and white +let f = interpolate(["black", "white"]); + +//We then create 12 evenly spaced samples and pass them to f as the `t` param required by an interpolating function. +// Lastly we convert the color to hex for brevity for this example (otherwise color objects work fine too.) +let grays = map(samples(12), (c) => formatHex8(f(c))); +console.log(map(grays, isAchromatic)); + +// The last two colors are false because we can't categorize black and white as achromatic. + +// + [ false, true, true, + true, true, true, + true, true, true, + true, true, false +] + +``` + +Here's an example🎆 showing how we can check if a color is cool using one of the predicate functions: + +```js +import { isCool } from 'huetiful-js' + +let sample = [ + "#00ffdc", + "#00ff78", + "#00c000" +]; + + +console.log(isCool(sample[0])); +// false + +console.log(map(sample, isCool)); + +// [ true, false, true] + + +``` + +Another use👷 case would be passing the predicate to an array method like `filter` to filter a collection of colors removing colors that return false for the passed in predicate. In the following example we use is `isWarm` to only return warm colors: + +```js +import { isWarm } from 'huetiful-js' + +let sample = [ + "#00ffdc", + "#00ff78", + "#00c000" +]; + +console.log(sample.filter(isWarm)) +// [ '#00ff78' ] + + +``` + +Or maybe we want to know which color has the furthest hue distance in our sample collection against our target color 🤔: + +```js + +import { getFarthestHue } from 'huetiful-js' +let sample = [ + '#00ffdc', + '#00ff78', + '#00c000', + '#007e00', + '#164100', + '#ffff00', + '#310000', + '#3e0000', + '#4e0000', + '#600000', + '#720000', +] + +console.log(getFarthestHue('lime', sample, 'lch')) +// 112.60431681589854 + +``` diff --git a/package-lock.json b/package-lock.json index cdec7979..be972606 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,17 +1,19 @@ { "name": "huetiful-js", - "version": "1.7.87", + "version": "1.79.91", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "huetiful-js", - "version": "1.7.87", + "version": "1.79.91", "license": "Apache-2.0", "dependencies": { - "culori": "^3.0.1" + "culori": "^3.0.1", + "huetiful-js": "file:huetiful-js-1.79.91.tgz" }, "devDependencies": { + "@tailwindcss/typography": "^0.5.10", "@types/culori": "^2.0.0", "@typescript-eslint/eslint-plugin": "^6.10.0", "@typescript-eslint/parser": "^6.10.0", @@ -20,8 +22,11 @@ "eslint": "^8.53.0", "eslint-config-prettier": "^9.0.0", "eslint-plugin-prettier": "^5.0.1", + "feather-icons": "^4.29.1", + "github-emoji": "^1.2.0", "husky": "^8.0.3", "nodemon": "^3.0.1", + "tailwindcss": "^3.4.1", "typedoc": "^0.25.3", "typedoc-plugin-markdown": "^3.17.1", "typescript": "^5.0.2" @@ -39,6 +44,18 @@ "node": ">=0.10.0" } }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@esbuild/android-arm": { "version": "0.17.19", "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", @@ -480,6 +497,150 @@ "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", "dev": true }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", + "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -515,6 +676,16 @@ "node": ">= 8" } }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=14" + } + }, "node_modules/@pkgr/utils": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.4.2.tgz", @@ -535,6 +706,34 @@ "url": "https://opencollective.com/unts" } }, + "node_modules/@tailwindcss/typography": { + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.10.tgz", + "integrity": "sha512-Pe8BuPJQJd3FfRnm6H0ulKIGoMEQS+Vq01R6M5aCrFB/ccR/shT+0kXLjouGC1gFLm9hopTFN+DMP0pfwRWzPw==", + "dev": true, + "dependencies": { + "lodash.castarray": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.merge": "^4.6.2", + "postcss-selector-parser": "6.0.10" + }, + "peerDependencies": { + "tailwindcss": ">=3.0.0 || insiders" + } + }, + "node_modules/@tailwindcss/typography/node_modules/postcss-selector-parser": { + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", + "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/@types/culori": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@types/culori/-/culori-2.0.4.tgz", @@ -821,6 +1020,12 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true + }, "node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", @@ -834,6 +1039,12 @@ "node": ">= 8" } }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true + }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -931,6 +1142,15 @@ "node": ">=6" } }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -986,6 +1206,12 @@ "node": ">= 6" } }, + "node_modules/classnames": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", + "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==", + "dev": true + }, "node_modules/cliui": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", @@ -1018,12 +1244,32 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, + "node_modules/core-js": { + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.35.0.tgz", + "integrity": "sha512-ntakECeqg81KqMueeGJ79Q5ZgQNR+6eaE8sxGCx62zMbAIj65q+uYvatToew3m6eAGdU4gNZwpZ34NMe4GYswg==", + "dev": true, + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -1038,6 +1284,18 @@ "node": ">= 8" } }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/culori": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/culori/-/culori-3.3.0.tgz", @@ -1115,6 +1373,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true + }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -1127,6 +1391,12 @@ "node": ">=8" } }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true + }, "node_modules/doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", @@ -1155,6 +1425,12 @@ "node": ">=14.0.0" } }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -1486,6 +1762,16 @@ "reusify": "^1.0.4" } }, + "node_modules/feather-icons": { + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/feather-icons/-/feather-icons-4.29.1.tgz", + "integrity": "sha512-P1we61haGTds6lKWe6CCVPsNULb8tHr1y6S9gXEpU+lNR1Ja7GdV0A1l2hTNmzXv+0Stix/3YMWMAn7n1Qtd6A==", + "dev": true, + "dependencies": { + "classnames": "^2.2.5", + "core-js": "^3.1.3" + } + }, "node_modules/file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -1546,6 +1832,34 @@ "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", "dev": true }, + "node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -1566,6 +1880,15 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -1587,6 +1910,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/github-emoji": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/github-emoji/-/github-emoji-1.2.0.tgz", + "integrity": "sha512-+oqVqVMjVR7AUvTsaYkXAIyqFga+YyBfBCQd3kmXPoKuNXexkolaMuFE15//7WNAHyFv3sAF3rjQqoVFGwEK8g==", + "dev": true + }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -1690,6 +2019,31 @@ "node": ">=8" } }, + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/huetiful-js": { + "version": "1.79.91", + "resolved": "file:huetiful-js-1.79.91.tgz", + "integrity": "sha512-b8qf9K+r9xAs6Lwg//ybJuiB6jevzHa26exUjKOD7HtiA4OAeSRpHpHSHXKNWoXp+nqNcKM94JdkdV2ahF8zlA==", + "license": "Apache-2.0", + "dependencies": { + "culori": "^3.0.1", + "huetiful-js": "file:huetiful-js-1.79.91.tgz" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, "node_modules/human-signals": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", @@ -1782,6 +2136,18 @@ "node": ">=8" } }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-docker": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", @@ -1908,6 +2274,33 @@ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jiti": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", + "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", + "dev": true, + "bin": { + "jiti": "bin/jiti.js" + } + }, "node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -1966,6 +2359,21 @@ "node": ">= 0.8.0" } }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -1981,6 +2389,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/lodash.castarray": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.castarray/-/lodash.castarray-4.4.0.tgz", + "integrity": "sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==", + "dev": true + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "dev": true + }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -2078,12 +2498,50 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -2205,13 +2663,31 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "dev": true, - "dependencies": { - "wrappy": "1" + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" } }, "node_modules/onetime": { @@ -2333,6 +2809,37 @@ "node": ">=8" } }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-scurry": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", + "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "dev": true, + "dependencies": { + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz", + "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -2360,6 +2867,170 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss": { + "version": "8.4.33", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.33.tgz", + "integrity": "sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dev": true, + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-load-config/node_modules/lilconfig": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.0.0.tgz", + "integrity": "sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==", + "dev": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/postcss-nested": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", + "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.11" + }, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.15", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz", + "integrity": "sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -2432,6 +3103,15 @@ } ] }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "dependencies": { + "pify": "^2.3.0" + } + }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -2453,6 +3133,23 @@ "node": ">=0.10.0" } }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -2698,6 +3395,15 @@ "node": ">=0.10.0" } }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -2712,6 +3418,21 @@ "node": ">=8" } }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -2724,6 +3445,19 @@ "node": ">=8" } }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-final-newline": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", @@ -2748,6 +3482,74 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/sucrase": { + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", + "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "^10.3.10", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/sucrase/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/sucrase/node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sucrase/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -2760,6 +3562,18 @@ "node": ">=8" } }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/synckit": { "version": "0.8.5", "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.5.tgz", @@ -2776,12 +3590,70 @@ "url": "https://opencollective.com/unts" } }, + "node_modules/tailwindcss": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.1.tgz", + "integrity": "sha512-qAYmXRfk3ENzuPBakNK0SRrUDipP8NQnEY6772uDhflcQz5EhRdD7JNZxyrFHVQNCwULPBn6FNPp9brpO7ctcA==", + "dev": true, + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.0", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.19.1", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, "node_modules/titleize": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz", @@ -2830,6 +3702,12 @@ "typescript": ">=4.2.0" } }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true + }, "node_modules/tslib": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", @@ -2967,6 +3845,12 @@ "punycode": "^2.1.0" } }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, "node_modules/vscode-oniguruma": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz", @@ -3017,6 +3901,24 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -3038,6 +3940,15 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, + "node_modules/yaml": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", + "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", + "dev": true, + "engines": { + "node": ">= 14" + } + }, "node_modules/yargs": { "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", diff --git a/package.json b/package.json index ee2ca6e4..27b70530 100644 --- a/package.json +++ b/package.json @@ -1,17 +1,19 @@ { "name": "huetiful-js", - "version": "1.7.87", + "version": "1.79.91", "type": "module", - "main": "./lib/huetiful.cjs", + "main": "./lib/huetiful.esm.mjs", "module": "./lib/huetiful.esm.mjs", - "browser": "./lib/huetiful.min.js", + "browser": "./lib/huetiful.esm.mjs", "jsdelivr": "./lib/huetiful.umd.js", "types": "./lib/huetiful.d.ts", "description": "Open source TypeScript library for general purpose color manipulations and generating custom color scales.", "dependencies": { - "culori": "^3.0.1" + "culori": "^3.0.1", + "huetiful-js": "file:huetiful-js-1.79.91.tgz" }, "devDependencies": { + "@tailwindcss/typography": "^0.5.10", "@types/culori": "^2.0.0", "@typescript-eslint/eslint-plugin": "^6.10.0", "@typescript-eslint/parser": "^6.10.0", @@ -20,15 +22,19 @@ "eslint": "^8.53.0", "eslint-config-prettier": "^9.0.0", "eslint-plugin-prettier": "^5.0.1", + "feather-icons": "^4.29.1", + "github-emoji": "^1.2.0", "husky": "^8.0.3", "nodemon": "^3.0.1", + "tailwindcss": "^3.4.1", "typedoc": "^0.25.3", "typedoc-plugin-markdown": "^3.17.1", "typescript": "^5.0.2" }, "scripts": { + "css": "npx tailwindcss -i ./templates/index.css -o ./templates/dist/output.css --watch", "test": "jasmine", - "docs": "npx typedoc && cp -r ./huetiful-logo.png ./docs && git add .", + "docs": "npx typedoc && cp -r ./huetiful-logo.png ./docs && node docs.js && cp -r notes docs && git add .", "build": "node build.cjs", "prepare": " npm run build && npm run types && npm run docs", "types": "dts-bundle-generator -o ./lib/huetiful.d.ts ./src/index.ts", @@ -62,13 +68,14 @@ "prettier" ], "rules": { + "prefer-const": 0, "no-console": 1, "no-ternary": 2, "no-var": 0, "no-explicit-any": 0, "prettier/prettier": 0, "@typescript-eslint/ban-ts-comment": 0, - "no-useless-escape": 1 + "no-useless-escape": 0 } }, "typedocOptions": { @@ -79,10 +86,14 @@ "./src/converters.ts", "./src/filterBy.ts", "./src/sortBy.ts", - "./src/types.d.ts" + "./src/types.d.ts", + "./src/helpers.ts" ], "entryPointStrategy": "resolve", "out": "./docs", + "plugin": [ + "typedoc-plugin-markdown" + ], "exclude": [ "./color-maps" ], @@ -90,7 +101,6 @@ "disableSources": true }, "files": [ - "src", "lib", "CHANGELOG.md", "CODE_OF_CONDUCT.md", @@ -103,23 +113,14 @@ "url": "https://github.com/prjctimg/huetiful.git" }, "keywords": [ - "chromatic adaption", - "functional", "typescript", - "jch", - "lch", - "palettes", - "color blind", + "uniform colorspaces", "color vision deficiency", - "schemes", "color", "culori", - "gradients", + "interpolation", "tailwind", - "cielab", - "rgb", - "hsl", - "generator", + "palette generator", "color brewer" ], "author": "Dean Tarisai", diff --git a/showdown/.github/workflows/node.js.yml b/showdown/.github/workflows/node.js.yml new file mode 100644 index 00000000..d81d94b8 --- /dev/null +++ b/showdown/.github/workflows/node.js.yml @@ -0,0 +1,30 @@ +# This workflow will do a clean install of node dependencies, cache/restore them, build the source code and run tests across different versions of node +# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions + +name: Node.js CI + +on: + push: + branches: [ master ] + pull_request: + branches: [ master ] + +jobs: + build: + + runs-on: ubuntu-latest + + strategy: + matrix: + node-version: [12.x, 14.x, 16.x, 17.x] + # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ + + steps: + - uses: actions/checkout@v2 + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v2 + with: + node-version: ${{ matrix.node-version }} + cache: 'npm' + - run: npm ci + - run: npm test diff --git a/showdown/CHANGELOG.md b/showdown/CHANGELOG.md new file mode 100644 index 00000000..12672123 --- /dev/null +++ b/showdown/CHANGELOG.md @@ -0,0 +1,858 @@ + +## [2.1.0](https://github.com/showdownjs/showdown/compare/2.0.0...2.1.0) (2022-04-21) + +### BREAKING CHANGES + +* the CLI no longer accepts "extra options". Instead you should pass the `-c` flag. To update: + +before: +``` +showdown makehtml -i foo.md -o bar.html --strikethrough --emoji +``` + +after: +``` +showdown makehtml -i foo.md -o bar.html -c strikethrough -c emoji +``` + + +## [2.0.4](https://github.com/showdownjs/showdown/compare/2.0.3...2.0.4) (2022-04-21) + + +* test(cli): Add test for multiple config options ([914129f](https://github.com/showdownjs/showdown/commit/914129f)), closes [#916](https://github.com/showdownjs/showdown/issues/916) + + +### Bug Fixes + +* **cli:** cli displays the correct version number ([8b48882](https://github.com/showdownjs/showdown/commit/8b48882)) + + + +## [2.0.3](https://github.com/showdownjs/showdown/compare/2.0.2...2.0.3) (2022-03-08) + + +### Bug Fixes + +* **cli:** fix cli to work with yargs ([f8c4bd2](https://github.com/showdownjs/showdown/commit/f8c4bd2)), closes [#893](https://github.com/showdownjs/showdown/issues/893) + + + + +## [2.0.2](https://github.com/showdownjs/showdown/compare/2.0.1...2.0.2) (2022-03-03) + + +### Bug Fixes + +* **cli:** cli now works properly ([3871765](https://github.com/showdownjs/showdown/commit/3871765)), closes [#893](https://github.com/showdownjs/showdown/issues/893) [#894](https://github.com/showdownjs/showdown/issues/894) + + + + +# [2.0.1](https://github.com/showdownjs/showdown/compare/2.0.0...2.0.1) (2022-03-01) + +### Bug Fixes + +* Fix cli not working due to missing cli directory in npm package ([32a1aaa](https://github.com/showdownjs/showdown/commit/32a1aaa)), closes [#893](https://github.com/showdownjs/showdown/issues/893) + + +# [2.0.0](https://github.com/showdownjs/showdown/compare/1.9.1...2.0.0) (2022-02-15) + +### Breaking Changes +* Supported Node Versions were set to match the [node release schedule](https://nodejs.org/en/about/releases/) which at the time of writing includes Node 12.x, 14.x, 16.x and 17.x +* The `yargs` dependecy was updated to `^17.2.1` to mitigate a security issue. +* The Showdown Licesnse has been changed from BSD-3-Clause to MIT + +### Bug Fixes + +* allow escaping of colons ([25c4420](https://github.com/showdownjs/showdown/commit/25c4420)) +* reduce npm package size ([35730b7](https://github.com/showdownjs/showdown/commit/35730b7)), closes [#619](https://github.com/showdownjs/showdown/issues/619) + +### Features + +* Added `ellipsis` option to configure if the ellipsis unicode character is used or not. ( Thanks @VladimirV99 ) +* Added a default security policy. Please report security issues to the issues tab on GitHub. + + + +## [1.9.1](https://github.com/showdownjs/showdown/compare/1.9.0...1.9.1) (2019-11-02) + + +### Bug Fixes + +* **openLinksInNewWindow:** add rel="noopener noreferrer" to links ([1cd281f](https://github.com/showdownjs/showdown/commit/1cd281f)), closes [#670](https://github.com/showdownjs/showdown/issues/670) + + + + +# [1.9.0](https://github.com/showdownjs/showdown/compare/1.8.7...1.9.0) (2018-11-10) + + +### Bug Fixes + +* **italicsAndBold:** fix issue with consecutive spans ([#608](https://github.com/showdownjs/showdown/issues/608)) ([5c0d67e](https://github.com/showdownjs/showdown/commit/5c0d67e)), closes [#544](https://github.com/showdownjs/showdown/issues/544) +* **underline**: fix issue with consecutive spans ([81edc70](https://github.com/showdownjs/showdown/commit/81edc70)) + +### Features + +* **converter.makeMarkdown:** [EXPERIMENTAL] add an HTML to MD converter ([e4b0e69](https://github.com/showdownjs/showdown/commit/e4b0e69)), closes [#388](https://github.com/showdownjs/showdown/issues/388) [#233](https://github.com/showdownjs/showdown/issues/233) + + + + +## [1.8.7](https://github.com/showdownjs/showdown/compare/1.8.6...1.8.7) (2018-10-16) + + +### Bug Fixes + +* **emojis:** fix emoji excessive size ([4aca41c](https://github.com/showdownjs/showdown/commit/4aca41c)) +* **gfm-codeblocks:** + * add support for spaces before language declaration ([24bf7b1](https://github.com/showdownjs/showdown/commit/24bf7b1)), closes [#569](https://github.com/showdownjs/showdown/issues/569) + * leading space no longer breaks gfm codeblocks ([828c32f](https://github.com/showdownjs/showdown/commit/828c32f)), closes [#523](https://github.com/showdownjs/showdown/issues/523) +* **images:** fix js error when using image references ([980e702](https://github.com/showdownjs/showdown/commit/980e702)), closes [#585](https://github.com/showdownjs/showdown/issues/585) +* **literalMidWordAsterisks:** now parses single characters enclosed by * correctly ([fe70e45](https://github.com/showdownjs/showdown/commit/fe70e45)), closes [#478](https://github.com/showdownjs/showdown/issues/478) +* **mentions:** allow for usernames with dot, underscore and dash ([dfeb1e2](https://github.com/showdownjs/showdown/commit/dfeb1e2)), closes [#574](https://github.com/showdownjs/showdown/issues/574) +* **nbsp:** fix replacing of nbsp with regular spaces ([8bc1f42](https://github.com/showdownjs/showdown/commit/8bc1f42)) + + + + +## [1.8.6](https://github.com/showdownjs/showdown/compare/1.8.5...1.8.6) (2017-12-22) + + +### Features + +* **splitAdjacentBlockquotes:** add option to split adjacent blockquote blocks ([da328f2](https://github.com/showdownjs/showdown/commit/da328f2)), closes [#477](https://github.com/showdownjs/showdown/issues/477) + + + + +# [1.8.5](https://github.com/showdownjs/showdown/compare/1.8.4...1.8.5) (2017-12-10) + + +### Features + +* **completeHTMLDocument:** add option to output a complete HTML document ([a8427c9](https://github.com/showdownjs/showdown/commit/a8427c9)) +* **metadata:** add support for embedded metadata ([63d949f](https://github.com/showdownjs/showdown/commit/63d949f)), closes [#260](https://github.com/showdownjs/showdown/issues/260) + + + + +## [1.8.4](https://github.com/showdownjs/showdown/compare/1.8.3...1.8.4) (2017-12-05) + + +### Bug Fixes + +* **tables:** raw html inside code tags in tables no longer breaks tables ([4ef4c5e](https://github.com/showdownjs/showdown/commit/4ef4c5e)), closes [#471](https://github.com/showdownjs/showdown/issues/471) + + + + +## [1.8.3](https://github.com/showdownjs/showdown/compare/1.8.2...1.8.3) (2017-11-28) + + +### Bug Fixes + +* **literalMidWordAsterisks:** no longer treats colon as alphanumeric char ([21194c8](https://github.com/showdownjs/showdown/commit/21194c8)), closes [#461](https://github.com/showdownjs/showdown/issues/461) +* **spanGamut:** code spans are hashed after parsing ([f4f63c5](https://github.com/showdownjs/showdown/commit/f4f63c5)), closes [#464](https://github.com/showdownjs/showdown/issues/464) +* **tables:** pipe character in code spans no longer breaks table ([0c933a0](https://github.com/showdownjs/showdown/commit/0c933a0)), closes [#465](https://github.com/showdownjs/showdown/issues/465) + + + + +## [1.8.2](https://github.com/showdownjs/showdown/compare/1.8.1...1.8.2) (2017-11-11) + + +### Bug Fixes + +* **fenced codeblocks:** add tilde as fenced code block delimiter ([c956ede](https://github.com/showdownjs/showdown/commit/c956ede)), closes [#456](https://github.com/showdownjs/showdown/issues/456) +* **openLinksInNewWindow:** hash links are not affected by the option ([11936ec](https://github.com/showdownjs/showdown/commit/11936ec)), closes [#457](https://github.com/showdownjs/showdown/issues/457) + + + + +## [1.8.1](https://github.com/showdownjs/showdown/compare/1.8.0...1.8.1) (2017-11-01) + + +### Dependencies update + +* **package:** update yargs to version 10.0.3 ([#447](https://github.com/showdownjs/showdown/issues/447)) ([906b26d](https://github.com/showdownjs/showdown/commit/906b26d)) + +### Bug Fixes + +* **CDNjs:** bump version to fix version missmatch with CDNjs ([#452](https://github.com/showdownjs/showdown/issues/452)) + + + +# [1.8.0](https://github.com/showdownjs/showdown/compare/1.7.6...1.8.0) (2017-10-24) + +### NOTICE + +Don't use the CDNjs version of this release. See issue [#452](https://github.com/showdownjs/showdown/issues/452) for more details. + + +### Bug Fixes + +* **autolinks:** prevent _ and * to be parsed in links ([61929bb](https://github.com/showdownjs/showdown/commit/61929bb)), closes [#444](https://github.com/showdownjs/showdown/issues/444) + + +### Features + +* **ellipsis:** add auto-ellipsis support ([25f1978](https://github.com/showdownjs/showdown/commit/25f1978)) + + - *Example:* + + input + + ```md + this is an ellipsis... + ``` + + output + + ```html +

this is an ellipsis…

+ ``` + +* **emoji:** add emoji support through option `emoji`([5b8f1d3](https://github.com/showdownjs/showdown/commit/5b8f1d3)), closes [#448](https://github.com/showdownjs/showdown/issues/448) + + - *Usage:* + + ```js + var conv = new showdown.Converter({emoji: true}); + ``` + + - *Example:* + + input + + ```md + this is a smile :smile: emoji + ``` + + output + + ```html +

this is a smile 😄 emoji

+ ``` + +* **start ordered lists at an arbitrary number:** add support for defining the first item number of ordered lists ([9cdc35e](https://github.com/showdownjs/showdown/commit/9cdc35e)), closes [#377](https://github.com/showdownjs/showdown/issues/377) + + - *Example:* + + input + + ```md + 3. foo + 4. bar + 5. baz + ``` + + output + + ```html +
    +
  1. foo
  2. +
  3. bar
  4. +
  5. baz
  6. +
+ ``` + +* **underline:** add EXPERIMENTAL support for underline ([084b819](https://github.com/showdownjs/showdown/commit/084b819)), closes [#450](https://github.com/showdownjs/showdown/issues/450) + + - *Usage:* + + ```js + var conv = new showdown.Converter({underline: true}); + ``` + + - *Example:* + + input + + ```md + this is __underlined__ and this is ___also underlined___ + ``` + + output + + ```html +

this is underlined and this is also underlined

+ ``` + + - *Note:* With this option enabled, underscore no longer parses as `` or `` + +### BREAKING CHANGES + +* start ordered lists at an arbitrary number: Since showdown now supports starting ordered lists at an arbitrary number, +list output may differ. + + + + +## [1.7.6](https://github.com/showdownjs/showdown/compare/1.7.5...1.7.6) (2017-10-06) + + +### Bug Fixes + +* **tables:** tables are properly rendered when followed by a single linebreak and a list ([d88b095](https://github.com/showdownjs/showdown/commit/d88b095)), closes [#443](https://github.com/showdownjs/showdown/issues/443) +* **tables:** trailing spaces no longer prevent table parsing ([66bdd21](https://github.com/showdownjs/showdown/commit/66bdd21)), closes [#442](https://github.com/showdownjs/showdown/issues/442) + + + + +## [1.7.5](https://github.com/showdownjs/showdown/compare/1.7.4...1.7.5) (2017-10-02) + + +### Bug Fixes + +* **html-comments:** changed regex to precent malformed long comment to freeze showdown ([3efcd10](https://github.com/showdownjs/showdown/commit/3efcd10)), closes [#439](https://github.com/showdownjs/showdown/issues/439) + + + + +## [1.7.4](https://github.com/showdownjs/showdown/compare/1.7.3...1.7.4) (2017-09-08) + + +### Bug Fixes + +* **helper.isArray:** replace a.constructor === Array with Array.isArray ([466a2eb](https://github.com/showdownjs/showdown/commit/466a2eb)), closes [#425](https://github.com/showdownjs/showdown/issues/425) +* **loader:** allow AMD loader to be used within Node env ([ff24bdb](https://github.com/showdownjs/showdown/commit/ff24bdb)) + + +### Features + +* **base64-wrapping:** support for wrapping base64 strings ([8c593a4](https://github.com/showdownjs/showdown/commit/8c593a4)), closes [#429](https://github.com/showdownjs/showdown/issues/429) + + + + +## [1.7.3](https://github.com/showdownjs/showdown/compare/1.7.2...1.7.3) (2017-08-23) + + +### Bug Fixes + +* **github flavor:** add backslashEscapesHTMLTags to GFM flavor ([5284439](https://github.com/showdownjs/showdown/commit/5284439)) +* **literalMidWordAsterisks:** option no longer treats punctuation as word character ([8f05be7](https://github.com/showdownjs/showdown/commit/8f05be7)), closes [#398](https://github.com/showdownjs/showdown/issues/398) +* **tables:** allow for one column table ([fef110c](https://github.com/showdownjs/showdown/commit/fef110cccb2d02b218183398d9baa0ae256a7283)), closes [#406](https://github.com/showdownjs/showdown/issues/406) + +### Features + +* **rawHeaderId:** Remove only spaces, ' and " from generated header ids ([1791cf0](https://github.com/showdownjs/showdown/commit/1791cf0)), closes [#409](https://github.com/showdownjs/showdown/issues/409) +* **rawPrefixHeaderId:** add option to prevent showdown from modifying the prefix ([ff26c08](https://github.com/showdownjs/showdown/commit/ff26c08)), closes [#409](https://github.com/showdownjs/showdown/issues/409) + + + + +## [1.7.2](https://github.com/showdownjs/showdown/compare/1.7.1...1.7.2) (2017-08-05) + + +### Bug Fixes + +* **githubMentions:** githubMentions now works with openLinksInNewWindow options ([1194d88](https://github.com/showdownjs/showdown/commit/1194d88)), closes [#403](https://github.com/showdownjs/showdown/issues/403) +* **lists:** fix multi paragraph lists with sublists ([a2259c0](https://github.com/showdownjs/showdown/commit/a2259c0)), closes [#397](https://github.com/showdownjs/showdown/issues/397) +* **tablesHeaderId:** fix missmatch of option name ([51e4693](https://github.com/showdownjs/showdown/commit/51e4693)), closes [#412](https://github.com/showdownjs/showdown/issues/412) + + +### Features + +* **backslashEscapesHTMLTags:** backslash escapes HTML tags ([5a5aff6](https://github.com/showdownjs/showdown/commit/5a5aff6)), closes [#374](https://github.com/showdownjs/showdown/issues/374) + + + + +## [1.7.1](https://github.com/showdownjs/showdown/compare/1.7.0...1.7.1) (2017-06-02) + +Important HOTFIX + +### Bug Fixes + +* **HTML Parser:** fix nasty bug where malformed HTML would hang showdown ([6566c72](https://github.com/showdownjs/showdown/commit/6566c72)), closes [#393](https://github.com/showdownjs/showdown/issues/393) + + + + +## [1.7.0](https://github.com/showdownjs/showdown/compare/1.6.4...1.7.0) (2017-06-01) + +(DEPRECATED) + +### Bug Fixes + +* **anchors:** fix issue with brackets in link URL ([7ba18dd](https://github.com/showdownjs/showdown/commit/7ba18dd)), closes [#390](https://github.com/showdownjs/showdown/issues/390) +* **excludeTrailingPunctuationFromURL:** add comma to punctuation list ([fa35fd5](https://github.com/showdownjs/showdown/commit/fa35fd5)), closes [#354](https://github.com/showdownjs/showdown/issues/354) +* **excludeTrailingPunctuationFromURLs:** fix weird character when this option with simplifiedAutoLinks ([71acff5](https://github.com/showdownjs/showdown/commit/71acff5)), closes [#378](https://github.com/showdownjs/showdown/issues/378) +* **HTML parsing:** fix HTML parsing issues with nested tags ([6fbc072](https://github.com/showdownjs/showdown/commit/6fbc072)), closes [#357](https://github.com/showdownjs/showdown/issues/357) [#387](https://github.com/showdownjs/showdown/issues/387) +* **openLinksInNewWindow:** encode _ to prevent clash with em ([813f832](https://github.com/showdownjs/showdown/commit/813f832)), closes [#379](https://github.com/showdownjs/showdown/issues/379) +* **package:** update yargs to version 7.0.1 ([#349](https://github.com/showdownjs/showdown/issues/349)) ([9308d7b](https://github.com/showdownjs/showdown/commit/9308d7b)) +* **package:** update yargs to version 8.0.1 ([#385](https://github.com/showdownjs/showdown/issues/385)) ([5fd847b](https://github.com/showdownjs/showdown/commit/5fd847b)) +* **simpleAutoLinks:** URLs with emphasis/strikethrough are parsed ([5c50675](https://github.com/showdownjs/showdown/commit/5c50675)), closes [#347](https://github.com/showdownjs/showdown/issues/347) +* **tables:** pipe char can now be escaped ([1ebc195](https://github.com/showdownjs/showdown/commit/1ebc195)), closes [#345](https://github.com/showdownjs/showdown/issues/345) +* **url parsing:** fix url edge case parsing in images and links ([30aa18c](https://github.com/showdownjs/showdown/commit/30aa18c)) + + +### Features + +* **customizeHeaderId:** add option for customizing header ids ([94c570a](https://github.com/showdownjs/showdown/commit/94c570a)), closes [#383](https://github.com/showdownjs/showdown/issues/383) +* **images:** add support for image's implicit reference syntax ([0c6c07b](https://github.com/showdownjs/showdown/commit/0c6c07b)), closes [#366](https://github.com/showdownjs/showdown/issues/366) +* **literalMidWordAsterisks:** add option for mid word asterisks ([5bec8f9](https://github.com/showdownjs/showdown/commit/5bec8f9)) +* **openLinksInNewWindow:** add option to open all links in a new window ([50235d6](https://github.com/showdownjs/showdown/commit/50235d6)), closes [#362](https://github.com/showdownjs/showdown/issues/362) [#337](https://github.com/showdownjs/showdown/issues/337) [#249](https://github.com/showdownjs/showdown/issues/249) [#247](https://github.com/showdownjs/showdown/issues/247) [#222](https://github.com/showdownjs/showdown/issues/222) + + + + +## [1.6.4](https://github.com/showdownjs/showdown/compare/1.6.3...1.6.4) (2017-02-06) + + +### Bug Fixes + +* **encodeAmpsAndAngles:** fix > and < encoding ([7f43b79](https://github.com/showdownjs/showdown/commit/7f43b79)), closes [#236](https://github.com/showdownjs/showdown/issues/236) +* **encodeEmail:** now produces valid emails ([605d8b7](https://github.com/showdownjs/showdown/commit/605d8b7)), closes [#340](https://github.com/showdownjs/showdown/issues/340) +* **flavor: github:** new version of github does not use prefix 'user-content' in headers ([368f0b6](https://github.com/showdownjs/showdown/commit/368f0b6)) +* **hashCodeTags:** escape code tags ([41cb3f6](https://github.com/showdownjs/showdown/commit/41cb3f6)), closes [#339](https://github.com/showdownjs/showdown/issues/339) +* **italicsAndBold:** fix double emphasis edge case ([1832b7f](https://github.com/showdownjs/showdown/commit/1832b7f)) +* **paragraph:** workaround QML bug ([f7a429e](https://github.com/showdownjs/showdown/commit/f7a429e)), closes [#246](https://github.com/showdownjs/showdown/issues/246) [#338](https://github.com/showdownjs/showdown/issues/338) +* **prefixHeaderId:** make `prefixHeaderId` string be parsed along the generated id ([f641a7d](https://github.com/showdownjs/showdown/commit/f641a7d)) + + +### Features + +* **flavor: ghost:** add Ghost flavor ([6374b5b](https://github.com/showdownjs/showdown/commit/6374b5b)) +* **flavor: original:** add John Gruber's markdown flavor ([6374b5b](https://github.com/showdownjs/showdown/commit/6374b5b)) + + + + +## [1.6.3](https://github.com/showdownjs/showdown/compare/1.6.2...1.6.3) (2017-01-30) + + +### Bug Fixes + +* **codeSpans:** add - and = to escaped chars inside code spans ([4243a31](https://github.com/showdownjs/showdown/commit/4243a31)) +* **italicsAndBold:** fix inconsistency in italicsAndBold parsing ([a4f05d4](https://github.com/showdownjs/showdown/commit/a4f05d4)), closes [#332](https://github.com/showdownjs/showdown/issues/332) +* **literalMidWordUnderscores:** fix inconsistent behavior of emphasis and strong with literalMidWordUndescores ([0292ae0](https://github.com/showdownjs/showdown/commit/0292ae0)), closes [#333](https://github.com/showdownjs/showdown/issues/333) +* **paragraphs:** fix empty lines generating empty paragraphs ([54bf744](https://github.com/showdownjs/showdown/commit/54bf744)), closes [#334](https://github.com/showdownjs/showdown/issues/334) +* **strikethrough:** fix striketrough being wrongly parsed inside codeSpans ([169cbe8](https://github.com/showdownjs/showdown/commit/169cbe8)) + +### Features + +* **events:** add events to all subparsers ([7d63a3e](https://github.com/showdownjs/showdown/commit/7d63a3e)) + + + + +## [1.6.2](https://github.com/showdownjs/showdown/compare/1.6.1...1.6.2) (2017-01-29) + + +### Bug Fixes + +* **escapeSpecialCharsWithinTagAttributes:** add ~ and = to escaped chars ([bfcc0e4](https://github.com/showdownjs/showdown/commit/bfcc0e4)) +* **strikethrough:** allow escapinging tilde char ([24d47d7](https://github.com/showdownjs/showdown/commit/24d47d7)), closes [#331](https://github.com/showdownjs/showdown/issues/331) + +### Features + +* **ghMentionsLink:** add ability to define the generated url in @mentions ([a4c24c9](https://github.com/showdownjs/showdown/commit/a4c24c9)) + + + + +## [1.6.1](https://github.com/showdownjs/showdown/compare/1.6.0...1.6.1) (2017-01-28) + + +### Bug Fixes + +* **simplifiedAutoLink:** fix missing spaces before and after email addresses ([5190b6a](https://github.com/showdownjs/showdown/commit/5190b6a)), closes [#330](https://github.com/showdownjs/showdown/issues/330) + +### Features + +* **encodeEmail:** add option to enable/disable mail obfuscation ([90c52b8](https://github.com/showdownjs/showdown/commit/90c52b8)) + +### Notes + +This release also improves performance a bit (around 8%) + + + + +## [1.6.0](https://github.com/showdownjs/showdown/compare/1.5.5...1.6.0) (2017-01-09) + + +### Bug Fixes + +* **ghCompatibleHeaderId:** improve the number of removed chars ([d499feb](https://github.com/showdownjs/showdown/commit/d499feb)) +* **IE8:** fix for IE8 error on using isUndefined function ([561dc5f](https://github.com/showdownjs/showdown/commit/561dc5f)), closes [#280](https://github.com/showdownjs/showdown/issues/280) +* **options:** fix ghCompatibleHeaderId that was set as string instead of boolean ([de7c37e](https://github.com/showdownjs/showdown/commit/de7c37e)) +* **simpleLineBreaks:** fix simpleLineBreaks option not working with non-ASCII chars and markdown delimiters ([b1c458a](https://github.com/showdownjs/showdown/commit/b1c458a)), closes [#318](https://github.com/showdownjs/showdown/issues/318) [#323](https://github.com/showdownjs/showdown/issues/323) + +### Features + +* **CLI:** add -q (quiet) and -m (mute) mode to CLI ([f3b86f0](https://github.com/showdownjs/showdown/commit/f3b86f0)) +* **CLI:flavor:** add flavor option to CLI ([2d6cd1e](https://github.com/showdownjs/showdown/commit/2d6cd1e)) +* **getFlavor:** add getFlavor method to showdown and Converter ([0eaf105](https://github.com/showdownjs/showdown/commit/0eaf105)) +* **ghMentions:** add support for github's @mentions ([f2671c0](https://github.com/showdownjs/showdown/commit/f2671c0)), closes [#51](https://github.com/showdownjs/showdown/issues/51) + +### BREAKING CHANGES: + +* CLI tool now uses the same option defaults as showdown main library. This mean + the default flavor is vanilla and ghCodeBlocks options is enabled by default. + + To update, add `--ghCodeBlocks="false"` to the command. + + + +## [1.5.5](https://github.com/showdownjs/showdown/compare/1.5.4...1.5.5) (2016-12-30) + +### Features + +* **ghCompatibleHeaderId:** generate header ids compatible with github ([db97a90](https://github.com/showdownjs/showdown/commit/db97a90)), closes [#320](https://github.com/showdownjs/showdown/issues/320) [#321](https://github.com/showdownjs/showdown/issues/321) + + + + +## [1.5.4](https://github.com/showdownjs/showdown/compare/1.5.3...1.5.4) (2016-12-21) + + +### Bug Fixes + +* **horizontal rule:** revert backwards incompatibility change ([113f5f6](https://github.com/showdownjs/showdown/commit/113f5f6)), closes [#317](https://github.com/showdownjs/showdown/issues/317) +* **simpleLineBreaks:** fix simpleLineBreak option breaking lists html ([ed4c33f](https://github.com/showdownjs/showdown/commit/ed4c33f)), closes [#316](https://github.com/showdownjs/showdown/issues/316) + + + + +## [1.5.3](https://github.com/showdownjs/showdown/compare/1.5.2...1.5.3) (2016-12-19) + + +### Bug Fixes + +* parser slowness with certain inputs ([da8fb53](https://github.com/showdownjs/showdown/commit/da8fb53)), closes [#315](https://github.com/showdownjs/showdown/issues/315) + +### Features + +* **requireSpaceBeforeHeadingText:** option to make space between `#` and header text mandatory ([5d19877](https://github.com/showdownjs/showdown/commit/5d19877)), closes [#277](https://github.com/showdownjs/showdown/issues/277) + + + + +## [1.5.2](https://github.com/showdownjs/showdown/compare/1.5.1...1.5.2) (2016-12-17) + + +### Bug Fixes + +* **listeners:** fix listeners typo ([f0d25b7](https://github.com/showdownjs/showdown/commit/f0d25b7)), closes [#290](https://github.com/showdownjs/showdown/issues/290) +* **lists:** lines with mutiple dashes being parsed as multilists ([10b3410](https://github.com/showdownjs/showdown/commit/10b3410)), closes [#312](https://github.com/showdownjs/showdown/issues/312) +* **nbsp:** nbsp are replaced with simple spaces ([6e90f7c](https://github.com/showdownjs/showdown/commit/6e90f7c)) + + + + +## [1.5.1](https://github.com/showdownjs/showdown/compare/1.5.0...1.5.1) (2016-12-01) + + +### Features + +* **simpleLineBreaks:** option that parses linebreaks as
. This option enables linebreaks to always be treated as `
` tags + without needing to add spaces in front of the line, the same way GitHub does. ([0942b5e](https://github.com/showdownjs/showdown/commit/0942b5e)), closes [#206](https://github.com/showdownjs/showdown/issues/206) +* **excludeTrailingPunctuationFromURLs:** option that excludes trailing punctuation from auto linked URLs. ([d2fc2a0](https://github.com/showdownjs/showdown/commit/d2fc2a0)), closes [#266](https://github.com/showdownjs/showdown/issues/266) [#308](https://github.com/showdownjs/showdown/issues/308) + + + + +## [1.5.0](https://github.com/showdownjs/showdown/compare/1.4.4...1.5.0) (2016-11-11) + + +### Bug Fixes + +* **lists:** enforce 4 space indentation in sublists ([d51be6e](https://github.com/showdownjs/showdown/commit/d51be6e)) +* **lists:** fix sublists inconsistent behavior ([9cfe8b1](https://github.com/showdownjs/showdown/commit/9cfe8b1)), closes [#299](https://github.com/showdownjs/showdown/issues/299) + +### Features + +* **disableForced4SpacesIndentedSublists:** option that disables the requirement of indenting nested sublists by 4 spaces. The option is disabled by default ([0be39bc](https://github.com/showdownjs/showdown/commit/0be39bc)) + + +### BREAKING CHANGES + +* syntax for sublists is now more restrictive. Before, sublists SHOULD be indented by 4 spaces, but indenting at least 2 spaces would work. + Now, sublists MUST be indented 4 spaces or they won't work. + + With this input: + ```md + * one + * two + * three + ``` + + Before (ouput): + ```html + \n // instead of:\n //
  • - - a
\n // So, to prevent it, we will put a marker (¨A)in the beginning of the line\n // Kind of hackish/monkey patching, but seems more effective than overcomplicating the list parser\n item = item.replace(/^([-*+]|\\d\\.)[ \\t]+[\\S\\n ]*/g, function (wm2) {\n return '¨A' + wm2;\n });\n\n // m1 - Leading line or\n // Has a double return (multi paragraph) or\n // Has sublist\n if (m1 || (item.search(/\\n{2,}/) > -1)) {\n item = showdown.subParser('githubCodeBlocks')(item, options, globals);\n item = showdown.subParser('blockGamut')(item, options, globals);\n } else {\n // Recursion for sub-lists:\n item = showdown.subParser('lists')(item, options, globals);\n item = item.replace(/\\n$/, ''); // chomp(item)\n item = showdown.subParser('hashHTMLBlocks')(item, options, globals);\n\n // Colapse double linebreaks\n item = item.replace(/\\n\\n+/g, '\\n\\n');\n if (isParagraphed) {\n item = showdown.subParser('paragraphs')(item, options, globals);\n } else {\n item = showdown.subParser('spanGamut')(item, options, globals);\n }\n }\n\n // now we need to remove the marker (¨A)\n item = item.replace('¨A', '');\n // we can finally wrap the line in list item tags\n item = '' + item + '\\n';\n\n return item;\n });\n\n // attacklab: strip sentinel\n listStr = listStr.replace(/¨0/g, '');\n\n globals.gListLevel--;\n\n if (trimTrailing) {\n listStr = listStr.replace(/\\s+$/, '');\n }\n\n return listStr;\n }\n\n function styleStartNumber (list, listType) {\n // check if ol and starts by a number different than 1\n if (listType === 'ol') {\n var res = list.match(/^ *(\\d+)\\./);\n if (res && res[1] !== '1') {\n return ' start=\"' + res[1] + '\"';\n }\n }\n return '';\n }\n\n /**\n * Check and parse consecutive lists (better fix for issue #142)\n * @param {string} list\n * @param {string} listType\n * @param {boolean} trimTrailing\n * @returns {string}\n */\n function parseConsecutiveLists (list, listType, trimTrailing) {\n // check if we caught 2 or more consecutive lists by mistake\n // we use the counterRgx, meaning if listType is UL we look for OL and vice versa\n var olRgx = (options.disableForced4SpacesIndentedSublists) ? /^ ?\\d+\\.[ \\t]/gm : /^ {0,3}\\d+\\.[ \\t]/gm,\n ulRgx = (options.disableForced4SpacesIndentedSublists) ? /^ ?[*+-][ \\t]/gm : /^ {0,3}[*+-][ \\t]/gm,\n counterRxg = (listType === 'ul') ? olRgx : ulRgx,\n result = '';\n\n if (list.search(counterRxg) !== -1) {\n (function parseCL (txt) {\n var pos = txt.search(counterRxg),\n style = styleStartNumber(list, listType);\n if (pos !== -1) {\n // slice\n result += '\\n\\n<' + listType + style + '>\\n' + processListItems(txt.slice(0, pos), !!trimTrailing) + '\\n';\n\n // invert counterType and listType\n listType = (listType === 'ul') ? 'ol' : 'ul';\n counterRxg = (listType === 'ul') ? olRgx : ulRgx;\n\n //recurse\n parseCL(txt.slice(pos));\n } else {\n result += '\\n\\n<' + listType + style + '>\\n' + processListItems(txt, !!trimTrailing) + '\\n';\n }\n })(list);\n } else {\n var style = styleStartNumber(list, listType);\n result = '\\n\\n<' + listType + style + '>\\n' + processListItems(list, !!trimTrailing) + '\\n';\n }\n\n return result;\n }\n\n /** Start of list parsing **/\n text = globals.converter._dispatch('lists.before', text, options, globals);\n // add sentinel to hack around khtml/safari bug:\n // http://bugs.webkit.org/show_bug.cgi?id=11231\n text += '¨0';\n\n if (globals.gListLevel) {\n text = text.replace(/^(( {0,3}([*+-]|\\d+[.])[ \\t]+)[^\\r]+?(¨0|\\n{2,}(?=\\S)(?![ \\t]*(?:[*+-]|\\d+[.])[ \\t]+)))/gm,\n function (wholeMatch, list, m2) {\n var listType = (m2.search(/[*+-]/g) > -1) ? 'ul' : 'ol';\n return parseConsecutiveLists(list, listType, true);\n }\n );\n } else {\n text = text.replace(/(\\n\\n|^\\n?)(( {0,3}([*+-]|\\d+[.])[ \\t]+)[^\\r]+?(¨0|\\n{2,}(?=\\S)(?![ \\t]*(?:[*+-]|\\d+[.])[ \\t]+)))/gm,\n function (wholeMatch, m1, list, m3) {\n var listType = (m3.search(/[*+-]/g) > -1) ? 'ul' : 'ol';\n return parseConsecutiveLists(list, listType, false);\n }\n );\n }\n\n // strip sentinel\n text = text.replace(/¨0/, '');\n text = globals.converter._dispatch('lists.after', text, options, globals);\n return text;\n});\n","/**\n * Parse metadata at the top of the document\n */\nshowdown.subParser('metadata', function (text, options, globals) {\n 'use strict';\n\n if (!options.metadata) {\n return text;\n }\n\n text = globals.converter._dispatch('metadata.before', text, options, globals);\n\n function parseMetadataContents (content) {\n // raw is raw so it's not changed in any way\n globals.metadata.raw = content;\n\n // escape chars forbidden in html attributes\n // double quotes\n content = content\n // ampersand first\n .replace(/&/g, '&')\n // double quotes\n .replace(/\"/g, '"');\n\n content = content.replace(/\\n {4}/g, ' ');\n content.replace(/^([\\S ]+): +([\\s\\S]+?)$/gm, function (wm, key, value) {\n globals.metadata.parsed[key] = value;\n return '';\n });\n }\n\n text = text.replace(/^\\s*«««+(\\S*?)\\n([\\s\\S]+?)\\n»»»+\\n/, function (wholematch, format, content) {\n parseMetadataContents(content);\n return '¨M';\n });\n\n text = text.replace(/^\\s*---+(\\S*?)\\n([\\s\\S]+?)\\n---+\\n/, function (wholematch, format, content) {\n if (format) {\n globals.metadata.format = format;\n }\n parseMetadataContents(content);\n return '¨M';\n });\n\n text = text.replace(/¨M/g, '');\n\n text = globals.converter._dispatch('metadata.after', text, options, globals);\n return text;\n});\n","/**\n * Remove one level of line-leading tabs or spaces\n */\nshowdown.subParser('outdent', function (text, options, globals) {\n 'use strict';\n text = globals.converter._dispatch('outdent.before', text, options, globals);\n\n // attacklab: hack around Konqueror 3.5.4 bug:\n // \"----------bug\".replace(/^-/g,\"\") == \"bug\"\n text = text.replace(/^(\\t|[ ]{1,4})/gm, '¨0'); // attacklab: g_tab_width\n\n // attacklab: clean up hack\n text = text.replace(/¨0/g, '');\n\n text = globals.converter._dispatch('outdent.after', text, options, globals);\n return text;\n});\n","/**\n *\n */\nshowdown.subParser('paragraphs', function (text, options, globals) {\n 'use strict';\n\n text = globals.converter._dispatch('paragraphs.before', text, options, globals);\n // Strip leading and trailing lines:\n text = text.replace(/^\\n+/g, '');\n text = text.replace(/\\n+$/g, '');\n\n var grafs = text.split(/\\n{2,}/g),\n grafsOut = [],\n end = grafs.length; // Wrap

tags\n\n for (var i = 0; i < end; i++) {\n var str = grafs[i];\n // if this is an HTML marker, copy it\n if (str.search(/¨(K|G)(\\d+)\\1/g) >= 0) {\n grafsOut.push(str);\n\n // test for presence of characters to prevent empty lines being parsed\n // as paragraphs (resulting in undesired extra empty paragraphs)\n } else if (str.search(/\\S/) >= 0) {\n str = showdown.subParser('spanGamut')(str, options, globals);\n str = str.replace(/^([ \\t]*)/g, '

');\n str += '

';\n grafsOut.push(str);\n }\n }\n\n /** Unhashify HTML blocks */\n end = grafsOut.length;\n for (i = 0; i < end; i++) {\n var blockText = '',\n grafsOutIt = grafsOut[i],\n codeFlag = false;\n // if this is a marker for an html block...\n // use RegExp.test instead of string.search because of QML bug\n while (/¨(K|G)(\\d+)\\1/.test(grafsOutIt)) {\n var delim = RegExp.$1,\n num = RegExp.$2;\n\n if (delim === 'K') {\n blockText = globals.gHtmlBlocks[num];\n } else {\n // we need to check if ghBlock is a false positive\n if (codeFlag) {\n // use encoded version of all text\n blockText = showdown.subParser('encodeCode')(globals.ghCodeBlocks[num].text, options, globals);\n } else {\n blockText = globals.ghCodeBlocks[num].codeblock;\n }\n }\n blockText = blockText.replace(/\\$/g, '$$$$'); // Escape any dollar signs\n\n grafsOutIt = grafsOutIt.replace(/(\\n\\n)?¨(K|G)\\d+\\2(\\n\\n)?/, blockText);\n // Check if grafsOutIt is a pre->code\n if (/^]*>\\s*]*>/.test(grafsOutIt)) {\n codeFlag = true;\n }\n }\n grafsOut[i] = grafsOutIt;\n }\n text = grafsOut.join('\\n');\n // Strip leading and trailing lines:\n text = text.replace(/^\\n+/g, '');\n text = text.replace(/\\n+$/g, '');\n return globals.converter._dispatch('paragraphs.after', text, options, globals);\n});\n","/**\n * Run extension\n */\nshowdown.subParser('runExtension', function (ext, text, options, globals) {\n 'use strict';\n\n if (ext.filter) {\n text = ext.filter(text, globals.converter, options);\n\n } else if (ext.regex) {\n // TODO remove this when old extension loading mechanism is deprecated\n var re = ext.regex;\n if (!(re instanceof RegExp)) {\n re = new RegExp(re, 'g');\n }\n text = text.replace(re, ext.replace);\n }\n\n return text;\n});\n","/**\n * These are all the transformations that occur *within* block-level\n * tags like paragraphs, headers, and list items.\n */\nshowdown.subParser('spanGamut', function (text, options, globals) {\n 'use strict';\n\n text = globals.converter._dispatch('spanGamut.before', text, options, globals);\n text = showdown.subParser('codeSpans')(text, options, globals);\n text = showdown.subParser('escapeSpecialCharsWithinTagAttributes')(text, options, globals);\n text = showdown.subParser('encodeBackslashEscapes')(text, options, globals);\n\n // Process anchor and image tags. Images must come first,\n // because ![foo][f] looks like an anchor.\n text = showdown.subParser('images')(text, options, globals);\n text = showdown.subParser('anchors')(text, options, globals);\n\n // Make links out of things like ``\n // Must come after anchors, because you can use < and >\n // delimiters in inline links like [this]().\n text = showdown.subParser('autoLinks')(text, options, globals);\n text = showdown.subParser('simplifiedAutoLinks')(text, options, globals);\n text = showdown.subParser('emoji')(text, options, globals);\n text = showdown.subParser('underline')(text, options, globals);\n text = showdown.subParser('italicsAndBold')(text, options, globals);\n text = showdown.subParser('strikethrough')(text, options, globals);\n text = showdown.subParser('ellipsis')(text, options, globals);\n\n // we need to hash HTML tags inside spans\n text = showdown.subParser('hashHTMLSpans')(text, options, globals);\n\n // now we encode amps and angles\n text = showdown.subParser('encodeAmpsAndAngles')(text, options, globals);\n\n // Do hard breaks\n if (options.simpleLineBreaks) {\n // GFM style hard breaks\n // only add line breaks if the text does not contain a block (special case for lists)\n if (!/\\n\\n¨K/.test(text)) {\n text = text.replace(/\\n+/g, '
\\n');\n }\n } else {\n // Vanilla hard breaks\n text = text.replace(/ +\\n/g, '
\\n');\n }\n\n text = globals.converter._dispatch('spanGamut.after', text, options, globals);\n return text;\n});\n","showdown.subParser('strikethrough', function (text, options, globals) {\n 'use strict';\n\n function parseInside (txt) {\n if (options.simplifiedAutoLink) {\n txt = showdown.subParser('simplifiedAutoLinks')(txt, options, globals);\n }\n return '' + txt + '';\n }\n\n if (options.strikethrough) {\n text = globals.converter._dispatch('strikethrough.before', text, options, globals);\n text = text.replace(/(?:~){2}([\\s\\S]+?)(?:~){2}/g, function (wm, txt) { return parseInside(txt); });\n text = globals.converter._dispatch('strikethrough.after', text, options, globals);\n }\n\n return text;\n});\n","/**\n * Strips link definitions from text, stores the URLs and titles in\n * hash references.\n * Link defs are in the form: ^[id]: url \"optional title\"\n */\nshowdown.subParser('stripLinkDefinitions', function (text, options, globals) {\n 'use strict';\n\n var regex = /^ {0,3}\\[([^\\]]+)]:[ \\t]*\\n?[ \\t]*\\s]+)>?(?: =([*\\d]+[A-Za-z%]{0,4})x([*\\d]+[A-Za-z%]{0,4}))?[ \\t]*\\n?[ \\t]*(?:(\\n*)[\"|'(](.+?)[\"|')][ \\t]*)?(?:\\n+|(?=¨0))/gm,\n base64Regex = /^ {0,3}\\[([^\\]]+)]:[ \\t]*\\n?[ \\t]*?(?: =([*\\d]+[A-Za-z%]{0,4})x([*\\d]+[A-Za-z%]{0,4}))?[ \\t]*\\n?[ \\t]*(?:(\\n*)[\"|'(](.+?)[\"|')][ \\t]*)?(?:\\n\\n|(?=¨0)|(?=\\n\\[))/gm;\n\n // attacklab: sentinel workarounds for lack of \\A and \\Z, safari\\khtml bug\n text += '¨0';\n\n var replaceFunc = function (wholeMatch, linkId, url, width, height, blankLines, title) {\n\n // if there aren't two instances of linkId it must not be a reference link so back out\n linkId = linkId.toLowerCase();\n if (text.toLowerCase().split(linkId).length - 1 < 2) {\n return wholeMatch;\n }\n if (url.match(/^data:.+?\\/.+?;base64,/)) {\n // remove newlines\n globals.gUrls[linkId] = url.replace(/\\s/g, '');\n } else {\n globals.gUrls[linkId] = showdown.subParser('encodeAmpsAndAngles')(url, options, globals); // Link IDs are case-insensitive\n }\n\n if (blankLines) {\n // Oops, found blank lines, so it's not a title.\n // Put back the parenthetical statement we stole.\n return blankLines + title;\n\n } else {\n if (title) {\n globals.gTitles[linkId] = title.replace(/\"|'/g, '"');\n }\n if (options.parseImgDimensions && width && height) {\n globals.gDimensions[linkId] = {\n width: width,\n height: height\n };\n }\n }\n // Completely remove the definition from the text\n return '';\n };\n\n // first we try to find base64 link references\n text = text.replace(base64Regex, replaceFunc);\n\n text = text.replace(regex, replaceFunc);\n\n // attacklab: strip sentinel\n text = text.replace(/¨0/, '');\n\n return text;\n});\n","showdown.subParser('tables', function (text, options, globals) {\n 'use strict';\n\n if (!options.tables) {\n return text;\n }\n\n var tableRgx = /^ {0,3}\\|?.+\\|.+\\n {0,3}\\|?[ \\t]*:?[ \\t]*(?:[-=]){2,}[ \\t]*:?[ \\t]*\\|[ \\t]*:?[ \\t]*(?:[-=]){2,}[\\s\\S]+?(?:\\n\\n|¨0)/gm,\n //singeColTblRgx = /^ {0,3}\\|.+\\|\\n {0,3}\\|[ \\t]*:?[ \\t]*(?:[-=]){2,}[ \\t]*:?[ \\t]*\\|[ \\t]*\\n(?: {0,3}\\|.+\\|\\n)+(?:\\n\\n|¨0)/gm;\n singeColTblRgx = /^ {0,3}\\|.+\\|[ \\t]*\\n {0,3}\\|[ \\t]*:?[ \\t]*(?:[-=]){2,}[ \\t]*:?[ \\t]*\\|[ \\t]*\\n( {0,3}\\|.+\\|[ \\t]*\\n)*(?:\\n|¨0)/gm;\n\n function parseStyles (sLine) {\n if (/^:[ \\t]*--*$/.test(sLine)) {\n return ' style=\"text-align:left;\"';\n } else if (/^--*[ \\t]*:[ \\t]*$/.test(sLine)) {\n return ' style=\"text-align:right;\"';\n } else if (/^:[ \\t]*--*[ \\t]*:$/.test(sLine)) {\n return ' style=\"text-align:center;\"';\n } else {\n return '';\n }\n }\n\n function parseHeaders (header, style) {\n var id = '';\n header = header.trim();\n // support both tablesHeaderId and tableHeaderId due to error in documentation so we don't break backwards compatibility\n if (options.tablesHeaderId || options.tableHeaderId) {\n id = ' id=\"' + header.replace(/ /g, '_').toLowerCase() + '\"';\n }\n header = showdown.subParser('spanGamut')(header, options, globals);\n\n return '' + header + '\\n';\n }\n\n function parseCells (cell, style) {\n var subText = showdown.subParser('spanGamut')(cell, options, globals);\n return '' + subText + '\\n';\n }\n\n function buildTable (headers, cells) {\n var tb = '\\n\\n\\n',\n tblLgn = headers.length;\n\n for (var i = 0; i < tblLgn; ++i) {\n tb += headers[i];\n }\n tb += '\\n\\n\\n';\n\n for (i = 0; i < cells.length; ++i) {\n tb += '\\n';\n for (var ii = 0; ii < tblLgn; ++ii) {\n tb += cells[i][ii];\n }\n tb += '\\n';\n }\n tb += '\\n
\\n';\n return tb;\n }\n\n function parseTable (rawTable) {\n var i, tableLines = rawTable.split('\\n');\n\n for (i = 0; i < tableLines.length; ++i) {\n // strip wrong first and last column if wrapped tables are used\n if (/^ {0,3}\\|/.test(tableLines[i])) {\n tableLines[i] = tableLines[i].replace(/^ {0,3}\\|/, '');\n }\n if (/\\|[ \\t]*$/.test(tableLines[i])) {\n tableLines[i] = tableLines[i].replace(/\\|[ \\t]*$/, '');\n }\n // parse code spans first, but we only support one line code spans\n tableLines[i] = showdown.subParser('codeSpans')(tableLines[i], options, globals);\n }\n\n var rawHeaders = tableLines[0].split('|').map(function (s) { return s.trim();}),\n rawStyles = tableLines[1].split('|').map(function (s) { return s.trim();}),\n rawCells = [],\n headers = [],\n styles = [],\n cells = [];\n\n tableLines.shift();\n tableLines.shift();\n\n for (i = 0; i < tableLines.length; ++i) {\n if (tableLines[i].trim() === '') {\n continue;\n }\n rawCells.push(\n tableLines[i]\n .split('|')\n .map(function (s) {\n return s.trim();\n })\n );\n }\n\n if (rawHeaders.length < rawStyles.length) {\n return rawTable;\n }\n\n for (i = 0; i < rawStyles.length; ++i) {\n styles.push(parseStyles(rawStyles[i]));\n }\n\n for (i = 0; i < rawHeaders.length; ++i) {\n if (showdown.helper.isUndefined(styles[i])) {\n styles[i] = '';\n }\n headers.push(parseHeaders(rawHeaders[i], styles[i]));\n }\n\n for (i = 0; i < rawCells.length; ++i) {\n var row = [];\n for (var ii = 0; ii < headers.length; ++ii) {\n if (showdown.helper.isUndefined(rawCells[i][ii])) {\n\n }\n row.push(parseCells(rawCells[i][ii], styles[ii]));\n }\n cells.push(row);\n }\n\n return buildTable(headers, cells);\n }\n\n text = globals.converter._dispatch('tables.before', text, options, globals);\n\n // find escaped pipe characters\n text = text.replace(/\\\\(\\|)/g, showdown.helper.escapeCharactersCallback);\n\n // parse multi column tables\n text = text.replace(tableRgx, parseTable);\n\n // parse one column tables\n text = text.replace(singeColTblRgx, parseTable);\n\n text = globals.converter._dispatch('tables.after', text, options, globals);\n\n return text;\n});\n","showdown.subParser('underline', function (text, options, globals) {\n 'use strict';\n\n if (!options.underline) {\n return text;\n }\n\n text = globals.converter._dispatch('underline.before', text, options, globals);\n\n if (options.literalMidWordUnderscores) {\n text = text.replace(/\\b___(\\S[\\s\\S]*?)___\\b/g, function (wm, txt) {\n return '' + txt + '';\n });\n text = text.replace(/\\b__(\\S[\\s\\S]*?)__\\b/g, function (wm, txt) {\n return '' + txt + '';\n });\n } else {\n text = text.replace(/___(\\S[\\s\\S]*?)___/g, function (wm, m) {\n return (/\\S$/.test(m)) ? '' + m + '' : wm;\n });\n text = text.replace(/__(\\S[\\s\\S]*?)__/g, function (wm, m) {\n return (/\\S$/.test(m)) ? '' + m + '' : wm;\n });\n }\n\n // escape remaining underscores to prevent them being parsed by italic and bold\n text = text.replace(/(_)/g, showdown.helper.escapeCharactersCallback);\n\n text = globals.converter._dispatch('underline.after', text, options, globals);\n\n return text;\n});\n","/**\n * Swap back in all the special characters we've hidden.\n */\nshowdown.subParser('unescapeSpecialChars', function (text, options, globals) {\n 'use strict';\n text = globals.converter._dispatch('unescapeSpecialChars.before', text, options, globals);\n\n text = text.replace(/¨E(\\d+)E/g, function (wholeMatch, m1) {\n var charCodeToReplace = parseInt(m1);\n return String.fromCharCode(charCodeToReplace);\n });\n\n text = globals.converter._dispatch('unescapeSpecialChars.after', text, options, globals);\n return text;\n});\n","showdown.subParser('makeMarkdown.blockquote', function (node, globals) {\n 'use strict';\n\n var txt = '';\n if (node.hasChildNodes()) {\n var children = node.childNodes,\n childrenLength = children.length;\n\n for (var i = 0; i < childrenLength; ++i) {\n var innerTxt = showdown.subParser('makeMarkdown.node')(children[i], globals);\n\n if (innerTxt === '') {\n continue;\n }\n txt += innerTxt;\n }\n }\n // cleanup\n txt = txt.trim();\n txt = '> ' + txt.split('\\n').join('\\n> ');\n return txt;\n});\n","showdown.subParser('makeMarkdown.codeBlock', function (node, globals) {\n 'use strict';\n\n var lang = node.getAttribute('language'),\n num = node.getAttribute('precodenum');\n return '```' + lang + '\\n' + globals.preList[num] + '\\n```';\n});\n","showdown.subParser('makeMarkdown.codeSpan', function (node) {\n 'use strict';\n\n return '`' + node.innerHTML + '`';\n});\n","showdown.subParser('makeMarkdown.emphasis', function (node, globals) {\n 'use strict';\n\n var txt = '';\n if (node.hasChildNodes()) {\n txt += '*';\n var children = node.childNodes,\n childrenLength = children.length;\n for (var i = 0; i < childrenLength; ++i) {\n txt += showdown.subParser('makeMarkdown.node')(children[i], globals);\n }\n txt += '*';\n }\n return txt;\n});\n","showdown.subParser('makeMarkdown.header', function (node, globals, headerLevel) {\n 'use strict';\n\n var headerMark = new Array(headerLevel + 1).join('#'),\n txt = '';\n\n if (node.hasChildNodes()) {\n txt = headerMark + ' ';\n var children = node.childNodes,\n childrenLength = children.length;\n\n for (var i = 0; i < childrenLength; ++i) {\n txt += showdown.subParser('makeMarkdown.node')(children[i], globals);\n }\n }\n return txt;\n});\n","showdown.subParser('makeMarkdown.hr', function () {\n 'use strict';\n\n return '---';\n});\n","showdown.subParser('makeMarkdown.image', function (node) {\n 'use strict';\n\n var txt = '';\n if (node.hasAttribute('src')) {\n txt += '![' + node.getAttribute('alt') + '](';\n txt += '<' + node.getAttribute('src') + '>';\n if (node.hasAttribute('width') && node.hasAttribute('height')) {\n txt += ' =' + node.getAttribute('width') + 'x' + node.getAttribute('height');\n }\n\n if (node.hasAttribute('title')) {\n txt += ' \"' + node.getAttribute('title') + '\"';\n }\n txt += ')';\n }\n return txt;\n});\n","showdown.subParser('makeMarkdown.links', function (node, globals) {\n 'use strict';\n\n var txt = '';\n if (node.hasChildNodes() && node.hasAttribute('href')) {\n var children = node.childNodes,\n childrenLength = children.length;\n txt = '[';\n for (var i = 0; i < childrenLength; ++i) {\n txt += showdown.subParser('makeMarkdown.node')(children[i], globals);\n }\n txt += '](';\n txt += '<' + node.getAttribute('href') + '>';\n if (node.hasAttribute('title')) {\n txt += ' \"' + node.getAttribute('title') + '\"';\n }\n txt += ')';\n }\n return txt;\n});\n","showdown.subParser('makeMarkdown.list', function (node, globals, type) {\n 'use strict';\n\n var txt = '';\n if (!node.hasChildNodes()) {\n return '';\n }\n var listItems = node.childNodes,\n listItemsLenght = listItems.length,\n listNum = node.getAttribute('start') || 1;\n\n for (var i = 0; i < listItemsLenght; ++i) {\n if (typeof listItems[i].tagName === 'undefined' || listItems[i].tagName.toLowerCase() !== 'li') {\n continue;\n }\n\n // define the bullet to use in list\n var bullet = '';\n if (type === 'ol') {\n bullet = listNum.toString() + '. ';\n } else {\n bullet = '- ';\n }\n\n // parse list item\n txt += bullet + showdown.subParser('makeMarkdown.listItem')(listItems[i], globals);\n ++listNum;\n }\n\n // add comment at the end to prevent consecutive lists to be parsed as one\n txt += '\\n\\n';\n return txt.trim();\n});\n","showdown.subParser('makeMarkdown.listItem', function (node, globals) {\n 'use strict';\n\n var listItemTxt = '';\n\n var children = node.childNodes,\n childrenLenght = children.length;\n\n for (var i = 0; i < childrenLenght; ++i) {\n listItemTxt += showdown.subParser('makeMarkdown.node')(children[i], globals);\n }\n // if it's only one liner, we need to add a newline at the end\n if (!/\\n$/.test(listItemTxt)) {\n listItemTxt += '\\n';\n } else {\n // it's multiparagraph, so we need to indent\n listItemTxt = listItemTxt\n .split('\\n')\n .join('\\n ')\n .replace(/^ {4}$/gm, '')\n .replace(/\\n\\n+/g, '\\n\\n');\n }\n\n return listItemTxt;\n});\n","\n\nshowdown.subParser('makeMarkdown.node', function (node, globals, spansOnly) {\n 'use strict';\n\n spansOnly = spansOnly || false;\n\n var txt = '';\n\n // edge case of text without wrapper paragraph\n if (node.nodeType === 3) {\n return showdown.subParser('makeMarkdown.txt')(node, globals);\n }\n\n // HTML comment\n if (node.nodeType === 8) {\n return '\\n\\n';\n }\n\n // process only node elements\n if (node.nodeType !== 1) {\n return '';\n }\n\n var tagName = node.tagName.toLowerCase();\n\n switch (tagName) {\n\n //\n // BLOCKS\n //\n case 'h1':\n if (!spansOnly) { txt = showdown.subParser('makeMarkdown.header')(node, globals, 1) + '\\n\\n'; }\n break;\n case 'h2':\n if (!spansOnly) { txt = showdown.subParser('makeMarkdown.header')(node, globals, 2) + '\\n\\n'; }\n break;\n case 'h3':\n if (!spansOnly) { txt = showdown.subParser('makeMarkdown.header')(node, globals, 3) + '\\n\\n'; }\n break;\n case 'h4':\n if (!spansOnly) { txt = showdown.subParser('makeMarkdown.header')(node, globals, 4) + '\\n\\n'; }\n break;\n case 'h5':\n if (!spansOnly) { txt = showdown.subParser('makeMarkdown.header')(node, globals, 5) + '\\n\\n'; }\n break;\n case 'h6':\n if (!spansOnly) { txt = showdown.subParser('makeMarkdown.header')(node, globals, 6) + '\\n\\n'; }\n break;\n\n case 'p':\n if (!spansOnly) { txt = showdown.subParser('makeMarkdown.paragraph')(node, globals) + '\\n\\n'; }\n break;\n\n case 'blockquote':\n if (!spansOnly) { txt = showdown.subParser('makeMarkdown.blockquote')(node, globals) + '\\n\\n'; }\n break;\n\n case 'hr':\n if (!spansOnly) { txt = showdown.subParser('makeMarkdown.hr')(node, globals) + '\\n\\n'; }\n break;\n\n case 'ol':\n if (!spansOnly) { txt = showdown.subParser('makeMarkdown.list')(node, globals, 'ol') + '\\n\\n'; }\n break;\n\n case 'ul':\n if (!spansOnly) { txt = showdown.subParser('makeMarkdown.list')(node, globals, 'ul') + '\\n\\n'; }\n break;\n\n case 'precode':\n if (!spansOnly) { txt = showdown.subParser('makeMarkdown.codeBlock')(node, globals) + '\\n\\n'; }\n break;\n\n case 'pre':\n if (!spansOnly) { txt = showdown.subParser('makeMarkdown.pre')(node, globals) + '\\n\\n'; }\n break;\n\n case 'table':\n if (!spansOnly) { txt = showdown.subParser('makeMarkdown.table')(node, globals) + '\\n\\n'; }\n break;\n\n //\n // SPANS\n //\n case 'code':\n txt = showdown.subParser('makeMarkdown.codeSpan')(node, globals);\n break;\n\n case 'em':\n case 'i':\n txt = showdown.subParser('makeMarkdown.emphasis')(node, globals);\n break;\n\n case 'strong':\n case 'b':\n txt = showdown.subParser('makeMarkdown.strong')(node, globals);\n break;\n\n case 'del':\n txt = showdown.subParser('makeMarkdown.strikethrough')(node, globals);\n break;\n\n case 'a':\n txt = showdown.subParser('makeMarkdown.links')(node, globals);\n break;\n\n case 'img':\n txt = showdown.subParser('makeMarkdown.image')(node, globals);\n break;\n\n default:\n txt = node.outerHTML + '\\n\\n';\n }\n\n // common normalization\n // TODO eventually\n\n return txt;\n});\n","showdown.subParser('makeMarkdown.paragraph', function (node, globals) {\n 'use strict';\n\n var txt = '';\n if (node.hasChildNodes()) {\n var children = node.childNodes,\n childrenLength = children.length;\n for (var i = 0; i < childrenLength; ++i) {\n txt += showdown.subParser('makeMarkdown.node')(children[i], globals);\n }\n }\n\n // some text normalization\n txt = txt.trim();\n\n return txt;\n});\n","showdown.subParser('makeMarkdown.pre', function (node, globals) {\n 'use strict';\n\n var num = node.getAttribute('prenum');\n return '
' + globals.preList[num] + '
';\n});\n","showdown.subParser('makeMarkdown.strikethrough', function (node, globals) {\n 'use strict';\n\n var txt = '';\n if (node.hasChildNodes()) {\n txt += '~~';\n var children = node.childNodes,\n childrenLength = children.length;\n for (var i = 0; i < childrenLength; ++i) {\n txt += showdown.subParser('makeMarkdown.node')(children[i], globals);\n }\n txt += '~~';\n }\n return txt;\n});\n","showdown.subParser('makeMarkdown.strong', function (node, globals) {\n 'use strict';\n\n var txt = '';\n if (node.hasChildNodes()) {\n txt += '**';\n var children = node.childNodes,\n childrenLength = children.length;\n for (var i = 0; i < childrenLength; ++i) {\n txt += showdown.subParser('makeMarkdown.node')(children[i], globals);\n }\n txt += '**';\n }\n return txt;\n});\n","showdown.subParser('makeMarkdown.table', function (node, globals) {\n 'use strict';\n\n var txt = '',\n tableArray = [[], []],\n headings = node.querySelectorAll('thead>tr>th'),\n rows = node.querySelectorAll('tbody>tr'),\n i, ii;\n for (i = 0; i < headings.length; ++i) {\n var headContent = showdown.subParser('makeMarkdown.tableCell')(headings[i], globals),\n allign = '---';\n\n if (headings[i].hasAttribute('style')) {\n var style = headings[i].getAttribute('style').toLowerCase().replace(/\\s/g, '');\n switch (style) {\n case 'text-align:left;':\n allign = ':---';\n break;\n case 'text-align:right;':\n allign = '---:';\n break;\n case 'text-align:center;':\n allign = ':---:';\n break;\n }\n }\n tableArray[0][i] = headContent.trim();\n tableArray[1][i] = allign;\n }\n\n for (i = 0; i < rows.length; ++i) {\n var r = tableArray.push([]) - 1,\n cols = rows[i].getElementsByTagName('td');\n\n for (ii = 0; ii < headings.length; ++ii) {\n var cellContent = ' ';\n if (typeof cols[ii] !== 'undefined') {\n cellContent = showdown.subParser('makeMarkdown.tableCell')(cols[ii], globals);\n }\n tableArray[r].push(cellContent);\n }\n }\n\n var cellSpacesCount = 3;\n for (i = 0; i < tableArray.length; ++i) {\n for (ii = 0; ii < tableArray[i].length; ++ii) {\n var strLen = tableArray[i][ii].length;\n if (strLen > cellSpacesCount) {\n cellSpacesCount = strLen;\n }\n }\n }\n\n for (i = 0; i < tableArray.length; ++i) {\n for (ii = 0; ii < tableArray[i].length; ++ii) {\n if (i === 1) {\n if (tableArray[i][ii].slice(-1) === ':') {\n tableArray[i][ii] = showdown.helper.padEnd(tableArray[i][ii].slice(-1), cellSpacesCount - 1, '-') + ':';\n } else {\n tableArray[i][ii] = showdown.helper.padEnd(tableArray[i][ii], cellSpacesCount, '-');\n }\n } else {\n tableArray[i][ii] = showdown.helper.padEnd(tableArray[i][ii], cellSpacesCount);\n }\n }\n txt += '| ' + tableArray[i].join(' | ') + ' |\\n';\n }\n\n return txt.trim();\n});\n","showdown.subParser('makeMarkdown.tableCell', function (node, globals) {\n 'use strict';\n\n var txt = '';\n if (!node.hasChildNodes()) {\n return '';\n }\n var children = node.childNodes,\n childrenLength = children.length;\n\n for (var i = 0; i < childrenLength; ++i) {\n txt += showdown.subParser('makeMarkdown.node')(children[i], globals, true);\n }\n return txt.trim();\n});\n","showdown.subParser('makeMarkdown.txt', function (node) {\n 'use strict';\n\n var txt = node.nodeValue;\n\n // multiple spaces are collapsed\n txt = txt.replace(/ +/g, ' ');\n\n // replace the custom ¨NBSP; with a space\n txt = txt.replace(/¨NBSP;/g, ' ');\n\n // \", <, > and & should replace escaped html entities\n txt = showdown.helper.unescapeHTMLEntities(txt);\n\n // escape markdown magic characters\n // emphasis, strong and strikethrough - can appear everywhere\n // we also escape pipe (|) because of tables\n // and escape ` because of code blocks and spans\n txt = txt.replace(/([*_~|`])/g, '\\\\$1');\n\n // escape > because of blockquotes\n txt = txt.replace(/^(\\s*)>/g, '\\\\$1>');\n\n // hash character, only troublesome at the beginning of a line because of headers\n txt = txt.replace(/^#/gm, '\\\\#');\n\n // horizontal rules\n txt = txt.replace(/^(\\s*)([-=]{3,})(\\s*)$/, '$1\\\\$2$3');\n\n // dot, because of ordered lists, only troublesome at the beginning of a line when preceded by an integer\n txt = txt.replace(/^( {0,3}\\d+)\\./gm, '$1\\\\.');\n\n // +, * and -, at the beginning of a line becomes a list, so we need to escape them also (asterisk was already escaped)\n txt = txt.replace(/^( {0,3})([+-])/gm, '$1\\\\$2');\n\n // images and links, ] followed by ( is problematic, so we escape it\n txt = txt.replace(/]([\\s]*)\\(/g, '\\\\]$1\\\\(');\n\n // reference URIs must also be escaped\n txt = txt.replace(/^ {0,3}\\[([\\S \\t]*?)]:/gm, '\\\\[$1]:');\n\n return txt;\n});\n","var root = this;\n\n// AMD Loader\nif (typeof define === 'function' && define.amd) {\n define(function () {\n 'use strict';\n return showdown;\n });\n\n// CommonJS/nodeJS Loader\n} else if (typeof module !== 'undefined' && module.exports) {\n module.exports = showdown;\n\n// Regular Browser loader\n} else {\n root.showdown = showdown;\n}\n"]} \ No newline at end of file diff --git a/showdown/dist/showdown.min.js b/showdown/dist/showdown.min.js new file mode 100644 index 00000000..cf721d9f --- /dev/null +++ b/showdown/dist/showdown.min.js @@ -0,0 +1,3 @@ +/*! showdown v 2.1.0 - 21-04-2022 */ +!function(){function a(e){"use strict";var r={omitExtraWLInCodeBlocks:{defaultValue:!1,describe:"Omit the default extra whiteline added to code blocks",type:"boolean"},noHeaderId:{defaultValue:!1,describe:"Turn on/off generated header id",type:"boolean"},prefixHeaderId:{defaultValue:!1,describe:"Add a prefix to the generated header ids. Passing a string will prefix that string to the header id. Setting to true will add a generic 'section-' prefix",type:"string"},rawPrefixHeaderId:{defaultValue:!1,describe:'Setting this option to true will prevent showdown from modifying the prefix. This might result in malformed IDs (if, for instance, the " char is used in the prefix)',type:"boolean"},ghCompatibleHeaderId:{defaultValue:!1,describe:"Generate header ids compatible with github style (spaces are replaced with dashes, a bunch of non alphanumeric chars are removed)",type:"boolean"},rawHeaderId:{defaultValue:!1,describe:"Remove only spaces, ' and \" from generated header ids (including prefixes), replacing them with dashes (-). WARNING: This might result in malformed ids",type:"boolean"},headerLevelStart:{defaultValue:!1,describe:"The header blocks level start",type:"integer"},parseImgDimensions:{defaultValue:!1,describe:"Turn on/off image dimension parsing",type:"boolean"},simplifiedAutoLink:{defaultValue:!1,describe:"Turn on/off GFM autolink style",type:"boolean"},excludeTrailingPunctuationFromURLs:{defaultValue:!1,describe:"Excludes trailing punctuation from links generated with autoLinking",type:"boolean"},literalMidWordUnderscores:{defaultValue:!1,describe:"Parse midword underscores as literal underscores",type:"boolean"},literalMidWordAsterisks:{defaultValue:!1,describe:"Parse midword asterisks as literal asterisks",type:"boolean"},strikethrough:{defaultValue:!1,describe:"Turn on/off strikethrough support",type:"boolean"},tables:{defaultValue:!1,describe:"Turn on/off tables support",type:"boolean"},tablesHeaderId:{defaultValue:!1,describe:"Add an id to table headers",type:"boolean"},ghCodeBlocks:{defaultValue:!0,describe:"Turn on/off GFM fenced code blocks support",type:"boolean"},tasklists:{defaultValue:!1,describe:"Turn on/off GFM tasklist support",type:"boolean"},smoothLivePreview:{defaultValue:!1,describe:"Prevents weird effects in live previews due to incomplete input",type:"boolean"},smartIndentationFix:{defaultValue:!1,describe:"Tries to smartly fix indentation in es6 strings",type:"boolean"},disableForced4SpacesIndentedSublists:{defaultValue:!1,describe:"Disables the requirement of indenting nested sublists by 4 spaces",type:"boolean"},simpleLineBreaks:{defaultValue:!1,describe:"Parses simple line breaks as
(GFM Style)",type:"boolean"},requireSpaceBeforeHeadingText:{defaultValue:!1,describe:"Makes adding a space between `#` and the header text mandatory (GFM Style)",type:"boolean"},ghMentions:{defaultValue:!1,describe:"Enables github @mentions",type:"boolean"},ghMentionsLink:{defaultValue:"https://github.com/{u}",describe:"Changes the link generated by @mentions. Only applies if ghMentions option is enabled.",type:"string"},encodeEmails:{defaultValue:!0,describe:"Encode e-mail addresses through the use of Character Entities, transforming ASCII e-mail addresses into its equivalent decimal entities",type:"boolean"},openLinksInNewWindow:{defaultValue:!1,describe:"Open all links in new windows",type:"boolean"},backslashEscapesHTMLTags:{defaultValue:!1,describe:"Support for HTML Tag escaping. ex:
foo
",type:"boolean"},emoji:{defaultValue:!1,describe:"Enable emoji support. Ex: `this is a :smile: emoji`",type:"boolean"},underline:{defaultValue:!1,describe:"Enable support for underline. Syntax is double or triple underscores: `__underline word__`. With this option enabled, underscores no longer parses into `` and ``",type:"boolean"},ellipsis:{defaultValue:!0,describe:"Replaces three dots with the ellipsis unicode character",type:"boolean"},completeHTMLDocument:{defaultValue:!1,describe:"Outputs a complete html document, including ``, `` and `` tags",type:"boolean"},metadata:{defaultValue:!1,describe:"Enable support for document metadata (defined at the top of the document between `«««` and `»»»` or between `---` and `---`).",type:"boolean"},splitAdjacentBlockquotes:{defaultValue:!1,describe:"Split adjacent blockquote blocks",type:"boolean"}};if(!1===e)return JSON.parse(JSON.stringify(r));var t,a={};for(t in r)r.hasOwnProperty(t)&&(a[t]=r[t].defaultValue);return a}var x={},t={},d={},p=a(!0),h="vanilla",_={github:{omitExtraWLInCodeBlocks:!0,simplifiedAutoLink:!0,excludeTrailingPunctuationFromURLs:!0,literalMidWordUnderscores:!0,strikethrough:!0,tables:!0,tablesHeaderId:!0,ghCodeBlocks:!0,tasklists:!0,disableForced4SpacesIndentedSublists:!0,simpleLineBreaks:!0,requireSpaceBeforeHeadingText:!0,ghCompatibleHeaderId:!0,ghMentions:!0,backslashEscapesHTMLTags:!0,emoji:!0,splitAdjacentBlockquotes:!0},original:{noHeaderId:!0,ghCodeBlocks:!1},ghost:{omitExtraWLInCodeBlocks:!0,parseImgDimensions:!0,simplifiedAutoLink:!0,excludeTrailingPunctuationFromURLs:!0,literalMidWordUnderscores:!0,strikethrough:!0,tables:!0,tablesHeaderId:!0,ghCodeBlocks:!0,tasklists:!0,smoothLivePreview:!0,simpleLineBreaks:!0,requireSpaceBeforeHeadingText:!0,ghMentions:!1,encodeEmails:!0},vanilla:a(!0),allOn:function(){"use strict";var e,r=a(!0),t={};for(e in r)r.hasOwnProperty(e)&&(t[e]=!0);return t}()};function g(e,r){"use strict";var t=r?"Error in "+r+" extension->":"Error in unnamed extension",a={valid:!0,error:""};x.helper.isArray(e)||(e=[e]);for(var n=0;n").replace(/&/g,"&")};function u(e,r,t,a){"use strict";var n,s,o,i=-1<(a=a||"").indexOf("g"),l=new RegExp(r+"|"+t,"g"+a.replace(/g/g,"")),c=new RegExp(r,a.replace(/g/g,"")),u=[];do{for(n=0;p=l.exec(e);)if(c.test(p[0]))n++||(o=(s=l.lastIndex)-p[0].length);else if(n&&!--n){var d=p.index+p[0].length,p={left:{start:o,end:s},match:{start:s,end:p.index},right:{start:p.index,end:d},wholeMatch:{start:o,end:d}};if(u.push(p),!i)return u}}while(n&&(l.lastIndex=s));return u}function s(u){"use strict";return function(e,r,t,a,n,s,o){var i=t=t.replace(x.helper.regexes.asteriskDashAndColon,x.helper.escapeCharactersCallback),l="",c="",r=r||"",o=o||"";return/^www\./i.test(t)&&(t=t.replace(/^www\./i,"http://www.")),u.excludeTrailingPunctuationFromURLs&&s&&(l=s),r+'
"+i+""+l+o}}function o(n,s){"use strict";return function(e,r,t){var a="mailto:";return r=r||"",t=x.subParser("unescapeSpecialChars")(t,n,s),n.encodeEmails?(a=x.helper.encodeEmailAddress(a+t),t=x.helper.encodeEmailAddress(t)):a+=t,r+''+t+""}}x.helper.matchRecursiveRegExp=function(e,r,t,a){"use strict";for(var n=u(e,r,t,a),s=[],o=0;o>=0,t=String(t||" "),e.length>r?String(e):((r-=e.length)>t.length&&(t+=t.repeat(r/t.length)),String(e)+t.slice(0,r))},"undefined"==typeof console&&(console={warn:function(e){"use strict";alert(e)},log:function(e){"use strict";alert(e)},error:function(e){"use strict";throw e}}),x.helper.regexes={asteriskDashAndColon:/([*_:~])/g},x.helper.emojis={"+1":"👍","-1":"👎",100:"💯",1234:"🔢","1st_place_medal":"🥇","2nd_place_medal":"🥈","3rd_place_medal":"🥉","8ball":"🎱",a:"🅰️",ab:"🆎",abc:"🔤",abcd:"🔡",accept:"🉑",aerial_tramway:"🚡",airplane:"✈️",alarm_clock:"⏰",alembic:"⚗️",alien:"👽",ambulance:"🚑",amphora:"🏺",anchor:"⚓️",angel:"👼",anger:"💢",angry:"😠",anguished:"😧",ant:"🐜",apple:"🍎",aquarius:"♒️",aries:"♈️",arrow_backward:"◀️",arrow_double_down:"⏬",arrow_double_up:"⏫",arrow_down:"⬇️",arrow_down_small:"🔽",arrow_forward:"▶️",arrow_heading_down:"⤵️",arrow_heading_up:"⤴️",arrow_left:"⬅️",arrow_lower_left:"↙️",arrow_lower_right:"↘️",arrow_right:"➡️",arrow_right_hook:"↪️",arrow_up:"⬆️",arrow_up_down:"↕️",arrow_up_small:"🔼",arrow_upper_left:"↖️",arrow_upper_right:"↗️",arrows_clockwise:"🔃",arrows_counterclockwise:"🔄",art:"🎨",articulated_lorry:"🚛",artificial_satellite:"🛰",astonished:"😲",athletic_shoe:"👟",atm:"🏧",atom_symbol:"⚛️",avocado:"🥑",b:"🅱️",baby:"👶",baby_bottle:"🍼",baby_chick:"🐤",baby_symbol:"🚼",back:"🔙",bacon:"🥓",badminton:"🏸",baggage_claim:"🛄",baguette_bread:"🥖",balance_scale:"⚖️",balloon:"🎈",ballot_box:"🗳",ballot_box_with_check:"☑️",bamboo:"🎍",banana:"🍌",bangbang:"‼️",bank:"🏦",bar_chart:"📊",barber:"💈",baseball:"⚾️",basketball:"🏀",basketball_man:"⛹️",basketball_woman:"⛹️‍♀️",bat:"🦇",bath:"🛀",bathtub:"🛁",battery:"🔋",beach_umbrella:"🏖",bear:"🐻",bed:"🛏",bee:"🐝",beer:"🍺",beers:"🍻",beetle:"🐞",beginner:"🔰",bell:"🔔",bellhop_bell:"🛎",bento:"🍱",biking_man:"🚴",bike:"🚲",biking_woman:"🚴‍♀️",bikini:"👙",biohazard:"☣️",bird:"🐦",birthday:"🎂",black_circle:"⚫️",black_flag:"🏴",black_heart:"🖤",black_joker:"🃏",black_large_square:"⬛️",black_medium_small_square:"◾️",black_medium_square:"◼️",black_nib:"✒️",black_small_square:"▪️",black_square_button:"🔲",blonde_man:"👱",blonde_woman:"👱‍♀️",blossom:"🌼",blowfish:"🐡",blue_book:"📘",blue_car:"🚙",blue_heart:"💙",blush:"😊",boar:"🐗",boat:"⛵️",bomb:"💣",book:"📖",bookmark:"🔖",bookmark_tabs:"📑",books:"📚",boom:"💥",boot:"👢",bouquet:"💐",bowing_man:"🙇",bow_and_arrow:"🏹",bowing_woman:"🙇‍♀️",bowling:"🎳",boxing_glove:"🥊",boy:"👦",bread:"🍞",bride_with_veil:"👰",bridge_at_night:"🌉",briefcase:"💼",broken_heart:"💔",bug:"🐛",building_construction:"🏗",bulb:"💡",bullettrain_front:"🚅",bullettrain_side:"🚄",burrito:"🌯",bus:"🚌",business_suit_levitating:"🕴",busstop:"🚏",bust_in_silhouette:"👤",busts_in_silhouette:"👥",butterfly:"🦋",cactus:"🌵",cake:"🍰",calendar:"📆",call_me_hand:"🤙",calling:"📲",camel:"🐫",camera:"📷",camera_flash:"📸",camping:"🏕",cancer:"♋️",candle:"🕯",candy:"🍬",canoe:"🛶",capital_abcd:"🔠",capricorn:"♑️",car:"🚗",card_file_box:"🗃",card_index:"📇",card_index_dividers:"🗂",carousel_horse:"🎠",carrot:"🥕",cat:"🐱",cat2:"🐈",cd:"💿",chains:"⛓",champagne:"🍾",chart:"💹",chart_with_downwards_trend:"📉",chart_with_upwards_trend:"📈",checkered_flag:"🏁",cheese:"🧀",cherries:"🍒",cherry_blossom:"🌸",chestnut:"🌰",chicken:"🐔",children_crossing:"🚸",chipmunk:"🐿",chocolate_bar:"🍫",christmas_tree:"🎄",church:"⛪️",cinema:"🎦",circus_tent:"🎪",city_sunrise:"🌇",city_sunset:"🌆",cityscape:"🏙",cl:"🆑",clamp:"🗜",clap:"👏",clapper:"🎬",classical_building:"🏛",clinking_glasses:"🥂",clipboard:"📋",clock1:"🕐",clock10:"🕙",clock1030:"🕥",clock11:"🕚",clock1130:"🕦",clock12:"🕛",clock1230:"🕧",clock130:"🕜",clock2:"🕑",clock230:"🕝",clock3:"🕒",clock330:"🕞",clock4:"🕓",clock430:"🕟",clock5:"🕔",clock530:"🕠",clock6:"🕕",clock630:"🕡",clock7:"🕖",clock730:"🕢",clock8:"🕗",clock830:"🕣",clock9:"🕘",clock930:"🕤",closed_book:"📕",closed_lock_with_key:"🔐",closed_umbrella:"🌂",cloud:"☁️",cloud_with_lightning:"🌩",cloud_with_lightning_and_rain:"⛈",cloud_with_rain:"🌧",cloud_with_snow:"🌨",clown_face:"🤡",clubs:"♣️",cocktail:"🍸",coffee:"☕️",coffin:"⚰️",cold_sweat:"😰",comet:"☄️",computer:"💻",computer_mouse:"🖱",confetti_ball:"🎊",confounded:"😖",confused:"😕",congratulations:"㊗️",construction:"🚧",construction_worker_man:"👷",construction_worker_woman:"👷‍♀️",control_knobs:"🎛",convenience_store:"🏪",cookie:"🍪",cool:"🆒",policeman:"👮",copyright:"©️",corn:"🌽",couch_and_lamp:"🛋",couple:"👫",couple_with_heart_woman_man:"💑",couple_with_heart_man_man:"👨‍❤️‍👨",couple_with_heart_woman_woman:"👩‍❤️‍👩",couplekiss_man_man:"👨‍❤️‍💋‍👨",couplekiss_man_woman:"💏",couplekiss_woman_woman:"👩‍❤️‍💋‍👩",cow:"🐮",cow2:"🐄",cowboy_hat_face:"🤠",crab:"🦀",crayon:"🖍",credit_card:"💳",crescent_moon:"🌙",cricket:"🏏",crocodile:"🐊",croissant:"🥐",crossed_fingers:"🤞",crossed_flags:"🎌",crossed_swords:"⚔️",crown:"👑",cry:"😢",crying_cat_face:"😿",crystal_ball:"🔮",cucumber:"🥒",cupid:"💘",curly_loop:"➰",currency_exchange:"💱",curry:"🍛",custard:"🍮",customs:"🛃",cyclone:"🌀",dagger:"🗡",dancer:"💃",dancing_women:"👯",dancing_men:"👯‍♂️",dango:"🍡",dark_sunglasses:"🕶",dart:"🎯",dash:"💨",date:"📅",deciduous_tree:"🌳",deer:"🦌",department_store:"🏬",derelict_house:"🏚",desert:"🏜",desert_island:"🏝",desktop_computer:"🖥",male_detective:"🕵️",diamond_shape_with_a_dot_inside:"💠",diamonds:"♦️",disappointed:"😞",disappointed_relieved:"😥",dizzy:"💫",dizzy_face:"😵",do_not_litter:"🚯",dog:"🐶",dog2:"🐕",dollar:"💵",dolls:"🎎",dolphin:"🐬",door:"🚪",doughnut:"🍩",dove:"🕊",dragon:"🐉",dragon_face:"🐲",dress:"👗",dromedary_camel:"🐪",drooling_face:"🤤",droplet:"💧",drum:"🥁",duck:"🦆",dvd:"📀","e-mail":"📧",eagle:"🦅",ear:"👂",ear_of_rice:"🌾",earth_africa:"🌍",earth_americas:"🌎",earth_asia:"🌏",egg:"🥚",eggplant:"🍆",eight_pointed_black_star:"✴️",eight_spoked_asterisk:"✳️",electric_plug:"🔌",elephant:"🐘",email:"✉️",end:"🔚",envelope_with_arrow:"📩",euro:"💶",european_castle:"🏰",european_post_office:"🏤",evergreen_tree:"🌲",exclamation:"❗️",expressionless:"😑",eye:"👁",eye_speech_bubble:"👁‍🗨",eyeglasses:"👓",eyes:"👀",face_with_head_bandage:"🤕",face_with_thermometer:"🤒",fist_oncoming:"👊",factory:"🏭",fallen_leaf:"🍂",family_man_woman_boy:"👪",family_man_boy:"👨‍👦",family_man_boy_boy:"👨‍👦‍👦",family_man_girl:"👨‍👧",family_man_girl_boy:"👨‍👧‍👦",family_man_girl_girl:"👨‍👧‍👧",family_man_man_boy:"👨‍👨‍👦",family_man_man_boy_boy:"👨‍👨‍👦‍👦",family_man_man_girl:"👨‍👨‍👧",family_man_man_girl_boy:"👨‍👨‍👧‍👦",family_man_man_girl_girl:"👨‍👨‍👧‍👧",family_man_woman_boy_boy:"👨‍👩‍👦‍👦",family_man_woman_girl:"👨‍👩‍👧",family_man_woman_girl_boy:"👨‍👩‍👧‍👦",family_man_woman_girl_girl:"👨‍👩‍👧‍👧",family_woman_boy:"👩‍👦",family_woman_boy_boy:"👩‍👦‍👦",family_woman_girl:"👩‍👧",family_woman_girl_boy:"👩‍👧‍👦",family_woman_girl_girl:"👩‍👧‍👧",family_woman_woman_boy:"👩‍👩‍👦",family_woman_woman_boy_boy:"👩‍👩‍👦‍👦",family_woman_woman_girl:"👩‍👩‍👧",family_woman_woman_girl_boy:"👩‍👩‍👧‍👦",family_woman_woman_girl_girl:"👩‍👩‍👧‍👧",fast_forward:"⏩",fax:"📠",fearful:"😨",feet:"🐾",female_detective:"🕵️‍♀️",ferris_wheel:"🎡",ferry:"⛴",field_hockey:"🏑",file_cabinet:"🗄",file_folder:"📁",film_projector:"📽",film_strip:"🎞",fire:"🔥",fire_engine:"🚒",fireworks:"🎆",first_quarter_moon:"🌓",first_quarter_moon_with_face:"🌛",fish:"🐟",fish_cake:"🍥",fishing_pole_and_fish:"🎣",fist_raised:"✊",fist_left:"🤛",fist_right:"🤜",flags:"🎏",flashlight:"🔦",fleur_de_lis:"⚜️",flight_arrival:"🛬",flight_departure:"🛫",floppy_disk:"💾",flower_playing_cards:"🎴",flushed:"😳",fog:"🌫",foggy:"🌁",football:"🏈",footprints:"👣",fork_and_knife:"🍴",fountain:"⛲️",fountain_pen:"🖋",four_leaf_clover:"🍀",fox_face:"🦊",framed_picture:"🖼",free:"🆓",fried_egg:"🍳",fried_shrimp:"🍤",fries:"🍟",frog:"🐸",frowning:"😦",frowning_face:"☹️",frowning_man:"🙍‍♂️",frowning_woman:"🙍",middle_finger:"🖕",fuelpump:"⛽️",full_moon:"🌕",full_moon_with_face:"🌝",funeral_urn:"⚱️",game_die:"🎲",gear:"⚙️",gem:"💎",gemini:"♊️",ghost:"👻",gift:"🎁",gift_heart:"💝",girl:"👧",globe_with_meridians:"🌐",goal_net:"🥅",goat:"🐐",golf:"⛳️",golfing_man:"🏌️",golfing_woman:"🏌️‍♀️",gorilla:"🦍",grapes:"🍇",green_apple:"🍏",green_book:"📗",green_heart:"💚",green_salad:"🥗",grey_exclamation:"❕",grey_question:"❔",grimacing:"😬",grin:"😁",grinning:"😀",guardsman:"💂",guardswoman:"💂‍♀️",guitar:"🎸",gun:"🔫",haircut_woman:"💇",haircut_man:"💇‍♂️",hamburger:"🍔",hammer:"🔨",hammer_and_pick:"⚒",hammer_and_wrench:"🛠",hamster:"🐹",hand:"✋",handbag:"👜",handshake:"🤝",hankey:"💩",hatched_chick:"🐥",hatching_chick:"🐣",headphones:"🎧",hear_no_evil:"🙉",heart:"❤️",heart_decoration:"💟",heart_eyes:"😍",heart_eyes_cat:"😻",heartbeat:"💓",heartpulse:"💗",hearts:"♥️",heavy_check_mark:"✔️",heavy_division_sign:"➗",heavy_dollar_sign:"💲",heavy_heart_exclamation:"❣️",heavy_minus_sign:"➖",heavy_multiplication_x:"✖️",heavy_plus_sign:"➕",helicopter:"🚁",herb:"🌿",hibiscus:"🌺",high_brightness:"🔆",high_heel:"👠",hocho:"🔪",hole:"🕳",honey_pot:"🍯",horse:"🐴",horse_racing:"🏇",hospital:"🏥",hot_pepper:"🌶",hotdog:"🌭",hotel:"🏨",hotsprings:"♨️",hourglass:"⌛️",hourglass_flowing_sand:"⏳",house:"🏠",house_with_garden:"🏡",houses:"🏘",hugs:"🤗",hushed:"😯",ice_cream:"🍨",ice_hockey:"🏒",ice_skate:"⛸",icecream:"🍦",id:"🆔",ideograph_advantage:"🉐",imp:"👿",inbox_tray:"📥",incoming_envelope:"📨",tipping_hand_woman:"💁",information_source:"ℹ️",innocent:"😇",interrobang:"⁉️",iphone:"📱",izakaya_lantern:"🏮",jack_o_lantern:"🎃",japan:"🗾",japanese_castle:"🏯",japanese_goblin:"👺",japanese_ogre:"👹",jeans:"👖",joy:"😂",joy_cat:"😹",joystick:"🕹",kaaba:"🕋",key:"🔑",keyboard:"⌨️",keycap_ten:"🔟",kick_scooter:"🛴",kimono:"👘",kiss:"💋",kissing:"😗",kissing_cat:"😽",kissing_closed_eyes:"😚",kissing_heart:"😘",kissing_smiling_eyes:"😙",kiwi_fruit:"🥝",koala:"🐨",koko:"🈁",label:"🏷",large_blue_circle:"🔵",large_blue_diamond:"🔷",large_orange_diamond:"🔶",last_quarter_moon:"🌗",last_quarter_moon_with_face:"🌜",latin_cross:"✝️",laughing:"😆",leaves:"🍃",ledger:"📒",left_luggage:"🛅",left_right_arrow:"↔️",leftwards_arrow_with_hook:"↩️",lemon:"🍋",leo:"♌️",leopard:"🐆",level_slider:"🎚",libra:"♎️",light_rail:"🚈",link:"🔗",lion:"🦁",lips:"👄",lipstick:"💄",lizard:"🦎",lock:"🔒",lock_with_ink_pen:"🔏",lollipop:"🍭",loop:"➿",loud_sound:"🔊",loudspeaker:"📢",love_hotel:"🏩",love_letter:"💌",low_brightness:"🔅",lying_face:"🤥",m:"Ⓜ️",mag:"🔍",mag_right:"🔎",mahjong:"🀄️",mailbox:"📫",mailbox_closed:"📪",mailbox_with_mail:"📬",mailbox_with_no_mail:"📭",man:"👨",man_artist:"👨‍🎨",man_astronaut:"👨‍🚀",man_cartwheeling:"🤸‍♂️",man_cook:"👨‍🍳",man_dancing:"🕺",man_facepalming:"🤦‍♂️",man_factory_worker:"👨‍🏭",man_farmer:"👨‍🌾",man_firefighter:"👨‍🚒",man_health_worker:"👨‍⚕️",man_in_tuxedo:"🤵",man_judge:"👨‍⚖️",man_juggling:"🤹‍♂️",man_mechanic:"👨‍🔧",man_office_worker:"👨‍💼",man_pilot:"👨‍✈️",man_playing_handball:"🤾‍♂️",man_playing_water_polo:"🤽‍♂️",man_scientist:"👨‍🔬",man_shrugging:"🤷‍♂️",man_singer:"👨‍🎤",man_student:"👨‍🎓",man_teacher:"👨‍🏫",man_technologist:"👨‍💻",man_with_gua_pi_mao:"👲",man_with_turban:"👳",tangerine:"🍊",mans_shoe:"👞",mantelpiece_clock:"🕰",maple_leaf:"🍁",martial_arts_uniform:"🥋",mask:"😷",massage_woman:"💆",massage_man:"💆‍♂️",meat_on_bone:"🍖",medal_military:"🎖",medal_sports:"🏅",mega:"📣",melon:"🍈",memo:"📝",men_wrestling:"🤼‍♂️",menorah:"🕎",mens:"🚹",metal:"🤘",metro:"🚇",microphone:"🎤",microscope:"🔬",milk_glass:"🥛",milky_way:"🌌",minibus:"🚐",minidisc:"💽",mobile_phone_off:"📴",money_mouth_face:"🤑",money_with_wings:"💸",moneybag:"💰",monkey:"🐒",monkey_face:"🐵",monorail:"🚝",moon:"🌔",mortar_board:"🎓",mosque:"🕌",motor_boat:"🛥",motor_scooter:"🛵",motorcycle:"🏍",motorway:"🛣",mount_fuji:"🗻",mountain:"⛰",mountain_biking_man:"🚵",mountain_biking_woman:"🚵‍♀️",mountain_cableway:"🚠",mountain_railway:"🚞",mountain_snow:"🏔",mouse:"🐭",mouse2:"🐁",movie_camera:"🎥",moyai:"🗿",mrs_claus:"🤶",muscle:"💪",mushroom:"🍄",musical_keyboard:"🎹",musical_note:"🎵",musical_score:"🎼",mute:"🔇",nail_care:"💅",name_badge:"📛",national_park:"🏞",nauseated_face:"🤢",necktie:"👔",negative_squared_cross_mark:"❎",nerd_face:"🤓",neutral_face:"😐",new:"🆕",new_moon:"🌑",new_moon_with_face:"🌚",newspaper:"📰",newspaper_roll:"🗞",next_track_button:"⏭",ng:"🆖",no_good_man:"🙅‍♂️",no_good_woman:"🙅",night_with_stars:"🌃",no_bell:"🔕",no_bicycles:"🚳",no_entry:"⛔️",no_entry_sign:"🚫",no_mobile_phones:"📵",no_mouth:"😶",no_pedestrians:"🚷",no_smoking:"🚭","non-potable_water":"🚱",nose:"👃",notebook:"📓",notebook_with_decorative_cover:"📔",notes:"🎶",nut_and_bolt:"🔩",o:"⭕️",o2:"🅾️",ocean:"🌊",octopus:"🐙",oden:"🍢",office:"🏢",oil_drum:"🛢",ok:"🆗",ok_hand:"👌",ok_man:"🙆‍♂️",ok_woman:"🙆",old_key:"🗝",older_man:"👴",older_woman:"👵",om:"🕉",on:"🔛",oncoming_automobile:"🚘",oncoming_bus:"🚍",oncoming_police_car:"🚔",oncoming_taxi:"🚖",open_file_folder:"📂",open_hands:"👐",open_mouth:"😮",open_umbrella:"☂️",ophiuchus:"⛎",orange_book:"📙",orthodox_cross:"☦️",outbox_tray:"📤",owl:"🦉",ox:"🐂",package:"📦",page_facing_up:"📄",page_with_curl:"📃",pager:"📟",paintbrush:"🖌",palm_tree:"🌴",pancakes:"🥞",panda_face:"🐼",paperclip:"📎",paperclips:"🖇",parasol_on_ground:"⛱",parking:"🅿️",part_alternation_mark:"〽️",partly_sunny:"⛅️",passenger_ship:"🛳",passport_control:"🛂",pause_button:"⏸",peace_symbol:"☮️",peach:"🍑",peanuts:"🥜",pear:"🍐",pen:"🖊",pencil2:"✏️",penguin:"🐧",pensive:"😔",performing_arts:"🎭",persevere:"😣",person_fencing:"🤺",pouting_woman:"🙎",phone:"☎️",pick:"⛏",pig:"🐷",pig2:"🐖",pig_nose:"🐽",pill:"💊",pineapple:"🍍",ping_pong:"🏓",pisces:"♓️",pizza:"🍕",place_of_worship:"🛐",plate_with_cutlery:"🍽",play_or_pause_button:"⏯",point_down:"👇",point_left:"👈",point_right:"👉",point_up:"☝️",point_up_2:"👆",police_car:"🚓",policewoman:"👮‍♀️",poodle:"🐩",popcorn:"🍿",post_office:"🏣",postal_horn:"📯",postbox:"📮",potable_water:"🚰",potato:"🥔",pouch:"👝",poultry_leg:"🍗",pound:"💷",rage:"😡",pouting_cat:"😾",pouting_man:"🙎‍♂️",pray:"🙏",prayer_beads:"📿",pregnant_woman:"🤰",previous_track_button:"⏮",prince:"🤴",princess:"👸",printer:"🖨",purple_heart:"💜",purse:"👛",pushpin:"📌",put_litter_in_its_place:"🚮",question:"❓",rabbit:"🐰",rabbit2:"🐇",racehorse:"🐎",racing_car:"🏎",radio:"📻",radio_button:"🔘",radioactive:"☢️",railway_car:"🚃",railway_track:"🛤",rainbow:"🌈",rainbow_flag:"🏳️‍🌈",raised_back_of_hand:"🤚",raised_hand_with_fingers_splayed:"🖐",raised_hands:"🙌",raising_hand_woman:"🙋",raising_hand_man:"🙋‍♂️",ram:"🐏",ramen:"🍜",rat:"🐀",record_button:"⏺",recycle:"♻️",red_circle:"🔴",registered:"®️",relaxed:"☺️",relieved:"😌",reminder_ribbon:"🎗",repeat:"🔁",repeat_one:"🔂",rescue_worker_helmet:"⛑",restroom:"🚻",revolving_hearts:"💞",rewind:"⏪",rhinoceros:"🦏",ribbon:"🎀",rice:"🍚",rice_ball:"🍙",rice_cracker:"🍘",rice_scene:"🎑",right_anger_bubble:"🗯",ring:"💍",robot:"🤖",rocket:"🚀",rofl:"🤣",roll_eyes:"🙄",roller_coaster:"🎢",rooster:"🐓",rose:"🌹",rosette:"🏵",rotating_light:"🚨",round_pushpin:"📍",rowing_man:"🚣",rowing_woman:"🚣‍♀️",rugby_football:"🏉",running_man:"🏃",running_shirt_with_sash:"🎽",running_woman:"🏃‍♀️",sa:"🈂️",sagittarius:"♐️",sake:"🍶",sandal:"👡",santa:"🎅",satellite:"📡",saxophone:"🎷",school:"🏫",school_satchel:"🎒",scissors:"✂️",scorpion:"🦂",scorpius:"♏️",scream:"😱",scream_cat:"🙀",scroll:"📜",seat:"💺",secret:"㊙️",see_no_evil:"🙈",seedling:"🌱",selfie:"🤳",shallow_pan_of_food:"🥘",shamrock:"☘️",shark:"🦈",shaved_ice:"🍧",sheep:"🐑",shell:"🐚",shield:"🛡",shinto_shrine:"⛩",ship:"🚢",shirt:"👕",shopping:"🛍",shopping_cart:"🛒",shower:"🚿",shrimp:"🦐",signal_strength:"📶",six_pointed_star:"🔯",ski:"🎿",skier:"⛷",skull:"💀",skull_and_crossbones:"☠️",sleeping:"😴",sleeping_bed:"🛌",sleepy:"😪",slightly_frowning_face:"🙁",slightly_smiling_face:"🙂",slot_machine:"🎰",small_airplane:"🛩",small_blue_diamond:"🔹",small_orange_diamond:"🔸",small_red_triangle:"🔺",small_red_triangle_down:"🔻",smile:"😄",smile_cat:"😸",smiley:"😃",smiley_cat:"😺",smiling_imp:"😈",smirk:"😏",smirk_cat:"😼",smoking:"🚬",snail:"🐌",snake:"🐍",sneezing_face:"🤧",snowboarder:"🏂",snowflake:"❄️",snowman:"⛄️",snowman_with_snow:"☃️",sob:"😭",soccer:"⚽️",soon:"🔜",sos:"🆘",sound:"🔉",space_invader:"👾",spades:"♠️",spaghetti:"🍝",sparkle:"❇️",sparkler:"🎇",sparkles:"✨",sparkling_heart:"💖",speak_no_evil:"🙊",speaker:"🔈",speaking_head:"🗣",speech_balloon:"💬",speedboat:"🚤",spider:"🕷",spider_web:"🕸",spiral_calendar:"🗓",spiral_notepad:"🗒",spoon:"🥄",squid:"🦑",stadium:"🏟",star:"⭐️",star2:"🌟",star_and_crescent:"☪️",star_of_david:"✡️",stars:"🌠",station:"🚉",statue_of_liberty:"🗽",steam_locomotive:"🚂",stew:"🍲",stop_button:"⏹",stop_sign:"🛑",stopwatch:"⏱",straight_ruler:"📏",strawberry:"🍓",stuck_out_tongue:"😛",stuck_out_tongue_closed_eyes:"😝",stuck_out_tongue_winking_eye:"😜",studio_microphone:"🎙",stuffed_flatbread:"🥙",sun_behind_large_cloud:"🌥",sun_behind_rain_cloud:"🌦",sun_behind_small_cloud:"🌤",sun_with_face:"🌞",sunflower:"🌻",sunglasses:"😎",sunny:"☀️",sunrise:"🌅",sunrise_over_mountains:"🌄",surfing_man:"🏄",surfing_woman:"🏄‍♀️",sushi:"🍣",suspension_railway:"🚟",sweat:"😓",sweat_drops:"💦",sweat_smile:"😅",sweet_potato:"🍠",swimming_man:"🏊",swimming_woman:"🏊‍♀️",symbols:"🔣",synagogue:"🕍",syringe:"💉",taco:"🌮",tada:"🎉",tanabata_tree:"🎋",taurus:"♉️",taxi:"🚕",tea:"🍵",telephone_receiver:"📞",telescope:"🔭",tennis:"🎾",tent:"⛺️",thermometer:"🌡",thinking:"🤔",thought_balloon:"💭",ticket:"🎫",tickets:"🎟",tiger:"🐯",tiger2:"🐅",timer_clock:"⏲",tipping_hand_man:"💁‍♂️",tired_face:"😫",tm:"™️",toilet:"🚽",tokyo_tower:"🗼",tomato:"🍅",tongue:"👅",top:"🔝",tophat:"🎩",tornado:"🌪",trackball:"🖲",tractor:"🚜",traffic_light:"🚥",train:"🚋",train2:"🚆",tram:"🚊",triangular_flag_on_post:"🚩",triangular_ruler:"📐",trident:"🔱",triumph:"😤",trolleybus:"🚎",trophy:"🏆",tropical_drink:"🍹",tropical_fish:"🐠",truck:"🚚",trumpet:"🎺",tulip:"🌷",tumbler_glass:"🥃",turkey:"🦃",turtle:"🐢",tv:"📺",twisted_rightwards_arrows:"🔀",two_hearts:"💕",two_men_holding_hands:"👬",two_women_holding_hands:"👭",u5272:"🈹",u5408:"🈴",u55b6:"🈺",u6307:"🈯️",u6708:"🈷️",u6709:"🈶",u6e80:"🈵",u7121:"🈚️",u7533:"🈸",u7981:"🈲",u7a7a:"🈳",umbrella:"☔️",unamused:"😒",underage:"🔞",unicorn:"🦄",unlock:"🔓",up:"🆙",upside_down_face:"🙃",v:"✌️",vertical_traffic_light:"🚦",vhs:"📼",vibration_mode:"📳",video_camera:"📹",video_game:"🎮",violin:"🎻",virgo:"♍️",volcano:"🌋",volleyball:"🏐",vs:"🆚",vulcan_salute:"🖖",walking_man:"🚶",walking_woman:"🚶‍♀️",waning_crescent_moon:"🌘",waning_gibbous_moon:"🌖",warning:"⚠️",wastebasket:"🗑",watch:"⌚️",water_buffalo:"🐃",watermelon:"🍉",wave:"👋",wavy_dash:"〰️",waxing_crescent_moon:"🌒",wc:"🚾",weary:"😩",wedding:"💒",weight_lifting_man:"🏋️",weight_lifting_woman:"🏋️‍♀️",whale:"🐳",whale2:"🐋",wheel_of_dharma:"☸️",wheelchair:"♿️",white_check_mark:"✅",white_circle:"⚪️",white_flag:"🏳️",white_flower:"💮",white_large_square:"⬜️",white_medium_small_square:"◽️",white_medium_square:"◻️",white_small_square:"▫️",white_square_button:"🔳",wilted_flower:"🥀",wind_chime:"🎐",wind_face:"🌬",wine_glass:"🍷",wink:"😉",wolf:"🐺",woman:"👩",woman_artist:"👩‍🎨",woman_astronaut:"👩‍🚀",woman_cartwheeling:"🤸‍♀️",woman_cook:"👩‍🍳",woman_facepalming:"🤦‍♀️",woman_factory_worker:"👩‍🏭",woman_farmer:"👩‍🌾",woman_firefighter:"👩‍🚒",woman_health_worker:"👩‍⚕️",woman_judge:"👩‍⚖️",woman_juggling:"🤹‍♀️",woman_mechanic:"👩‍🔧",woman_office_worker:"👩‍💼",woman_pilot:"👩‍✈️",woman_playing_handball:"🤾‍♀️",woman_playing_water_polo:"🤽‍♀️",woman_scientist:"👩‍🔬",woman_shrugging:"🤷‍♀️",woman_singer:"👩‍🎤",woman_student:"👩‍🎓",woman_teacher:"👩‍🏫",woman_technologist:"👩‍💻",woman_with_turban:"👳‍♀️",womans_clothes:"👚",womans_hat:"👒",women_wrestling:"🤼‍♀️",womens:"🚺",world_map:"🗺",worried:"😟",wrench:"🔧",writing_hand:"✍️",x:"❌",yellow_heart:"💛",yen:"💴",yin_yang:"☯️",yum:"😋",zap:"⚡️",zipper_mouth_face:"🤐",zzz:"💤",octocat:':octocat:',showdown:"S"},x.Converter=function(e){"use strict";var r,t,n={},i=[],l=[],o={},a=h,s={parsed:{},raw:"",format:""};for(r in e=e||{},p)p.hasOwnProperty(r)&&(n[r]=p[r]);if("object"!=typeof e)throw Error("Converter expects the passed parameter to be an object, but "+typeof e+" was passed instead.");for(t in e)e.hasOwnProperty(t)&&(n[t]=e[t]);function c(e,r){if(r=r||null,x.helper.isString(e)){if(r=e=x.helper.stdExtName(e),x.extensions[e]){console.warn("DEPRECATION WARNING: "+e+" is an old extension that uses a deprecated loading method.Please inform the developer that the extension should be updated!");var t=x.extensions[e],a=e;if("function"==typeof t&&(t=t(new x.Converter)),x.helper.isArray(t)||(t=[t]),!(a=g(t,a)).valid)throw Error(a.error);for(var n=0;n[ \t]+¨NBSP;<"),!r){if(!window||!window.document)throw new Error("HTMLParser is undefined. If in a webworker or nodejs environment, you need to provide a WHATWG DOM and HTML such as JSDOM");r=window.document}for(var r=r.createElement("div"),t=(r.innerHTML=e,{preList:function(e){for(var r=e.querySelectorAll("pre"),t=[],a=0;a'}else t.push(r[a].innerHTML),r[a].innerHTML="",r[a].setAttribute("prenum",a.toString());return t}(r)}),a=(!function e(r){for(var t=0;t? ?(['"].*['"])?\)$/m))a="";else if(!a){if(a="#"+(t=t||r.toLowerCase().replace(/ ?\n/g," ")),x.helper.isUndefined(l.gUrls[t]))return e;a=l.gUrls[t],x.helper.isUndefined(l.gTitles[t])||(o=l.gTitles[t])}return e='"}return e=(e=(e=(e=(e=l.converter._dispatch("anchors.before",e,i,l)).replace(/\[((?:\[[^\]]*]|[^\[\]])*)] ?(?:\n *)?\[(.*?)]()()()()/g,r)).replace(/\[((?:\[[^\]]*]|[^\[\]])*)]()[ \t]*\([ \t]?<([^>]*)>(?:[ \t]*((["'])([^"]*?)\5))?[ \t]?\)/g,r)).replace(/\[((?:\[[^\]]*]|[^\[\]])*)]()[ \t]*\([ \t]??(?:[ \t]*((["'])([^"]*?)\5))?[ \t]?\)/g,r)).replace(/\[([^\[\]]+)]()()()()()/g,r),i.ghMentions&&(e=e.replace(/(^|\s)(\\)?(@([a-z\d]+(?:[a-z\d.-]+?[a-z\d]+)*))/gim,function(e,r,t,a,n){if("\\"===t)return r+a;if(!x.helper.isString(i.ghMentionsLink))throw new Error("ghMentionsLink option must be a string");t="";return r+'"+a+""})),e=l.converter._dispatch("anchors.after",e,i,l)});var i=/([*~_]+|\b)(((https?|ftp|dict):\/\/|www\.)[^'">\s]+?\.[^'">\s]+?)()(\1)?(?=\s|$)(?!["<>])/gi,l=/([*~_]+|\b)(((https?|ftp|dict):\/\/|www\.)[^'">\s]+\.[^'">\s]+?)([.!?,()\[\]])?(\1)?(?=\s|$)(?!["<>])/gi,c=/()<(((https?|ftp|dict):\/\/|www\.)[^'">\s]+)()>()/gi,m=/(^|\s)(?:mailto:)?([A-Za-z0-9!#$%&'*+-/=?^_`{|}~.]+@[-a-z0-9]+(\.[-a-z0-9]+)*\.[a-z]+)(?=$|\s)/gim,f=/<()(?:mailto:)?([-.\w]+@[-a-z0-9]+(\.[-a-z0-9]+)*\.[a-z]+)>/gi;x.subParser("autoLinks",function(e,r,t){"use strict";return e=(e=(e=t.converter._dispatch("autoLinks.before",e,r,t)).replace(c,s(r))).replace(f,o(r,t)),e=t.converter._dispatch("autoLinks.after",e,r,t)}),x.subParser("simplifiedAutoLinks",function(e,r,t){"use strict";return r.simplifiedAutoLink?(e=t.converter._dispatch("simplifiedAutoLinks.before",e,r,t),e=(e=r.excludeTrailingPunctuationFromURLs?e.replace(l,s(r)):e.replace(i,s(r))).replace(m,o(r,t)),t.converter._dispatch("simplifiedAutoLinks.after",e,r,t)):e}),x.subParser("blockGamut",function(e,r,t){"use strict";return e=t.converter._dispatch("blockGamut.before",e,r,t),e=x.subParser("blockQuotes")(e,r,t),e=x.subParser("headers")(e,r,t),e=x.subParser("horizontalRule")(e,r,t),e=x.subParser("lists")(e,r,t),e=x.subParser("codeBlocks")(e,r,t),e=x.subParser("tables")(e,r,t),e=x.subParser("hashHTMLBlocks")(e,r,t),e=x.subParser("paragraphs")(e,r,t),e=t.converter._dispatch("blockGamut.after",e,r,t)}),x.subParser("blockQuotes",function(e,r,t){"use strict";e=t.converter._dispatch("blockQuotes.before",e,r,t);var a=/(^ {0,3}>[ \t]?.+\n(.+\n)*\n*)+/gm;return r.splitAdjacentBlockquotes&&(a=/^ {0,3}>[\s\S]*?(?:\n\n)/gm),e=(e+="\n\n").replace(a,function(e){return e=(e=(e=e.replace(/^[ \t]*>[ \t]?/gm,"")).replace(/¨0/g,"")).replace(/^[ \t]+$/gm,""),e=x.subParser("githubCodeBlocks")(e,r,t),e=(e=(e=x.subParser("blockGamut")(e,r,t)).replace(/(^|\n)/g,"$1 ")).replace(/(\s*
[^\r]+?<\/pre>)/gm,function(e,r){return r.replace(/^  /gm,"¨0").replace(/¨0/g,"")}),x.subParser("hashBlock")("
\n"+e+"\n
",r,t)}),e=t.converter._dispatch("blockQuotes.after",e,r,t)}),x.subParser("codeBlocks",function(e,n,s){"use strict";e=s.converter._dispatch("codeBlocks.before",e,n,s);return e=(e=(e+="¨0").replace(/(?:\n\n|^)((?:(?:[ ]{4}|\t).*\n+)+)(\n*[ ]{0,3}[^ \t\n]|(?=¨0))/g,function(e,r,t){var a="\n",r=x.subParser("outdent")(r,n,s);return r=x.subParser("encodeCode")(r,n,s),r="
"+(r=(r=(r=x.subParser("detab")(r,n,s)).replace(/^\n+/g,"")).replace(/\n+$/g,""))+(a=n.omitExtraWLInCodeBlocks?"":a)+"
",x.subParser("hashBlock")(r,n,s)+t})).replace(/¨0/,""),e=s.converter._dispatch("codeBlocks.after",e,n,s)}),x.subParser("codeSpans",function(e,n,s){"use strict";return e=(e=void 0===(e=s.converter._dispatch("codeSpans.before",e,n,s))?"":e).replace(/(^|[^\\])(`+)([^\r]*?[^`])\2(?!`)/gm,function(e,r,t,a){return a=(a=a.replace(/^([ \t]*)/g,"")).replace(/[ \t]*$/g,""),a=r+""+(a=x.subParser("encodeCode")(a,n,s))+"",a=x.subParser("hashHTMLSpans")(a,n,s)}),e=s.converter._dispatch("codeSpans.after",e,n,s)}),x.subParser("completeHTMLDocument",function(e,r,t){"use strict";if(!r.completeHTMLDocument)return e;e=t.converter._dispatch("completeHTMLDocument.before",e,r,t);var a,n="html",s="\n",o="",i='\n',l="",c="";for(a in void 0!==t.metadata.parsed.doctype&&(s="\n","html"!==(n=t.metadata.parsed.doctype.toString().toLowerCase())&&"html5"!==n||(i='')),t.metadata.parsed)if(t.metadata.parsed.hasOwnProperty(a))switch(a.toLowerCase()){case"doctype":break;case"title":o=""+t.metadata.parsed.title+"\n";break;case"charset":i="html"===n||"html5"===n?'\n':'\n';break;case"language":case"lang":l=' lang="'+t.metadata.parsed[a]+'"',c+='\n';break;default:c+='\n'}return e=s+"\n\n"+o+i+c+"\n\n"+e.trim()+"\n\n",e=t.converter._dispatch("completeHTMLDocument.after",e,r,t)}),x.subParser("detab",function(e,r,t){"use strict";return e=(e=(e=(e=(e=(e=t.converter._dispatch("detab.before",e,r,t)).replace(/\t(?=\t)/g," ")).replace(/\t/g,"¨A¨B")).replace(/¨B(.+?)¨A/g,function(e,r){for(var t=r,a=4-t.length%4,n=0;n/g,">"),e=t.converter._dispatch("encodeAmpsAndAngles.after",e,r,t)}),x.subParser("encodeBackslashEscapes",function(e,r,t){"use strict";return e=(e=(e=t.converter._dispatch("encodeBackslashEscapes.before",e,r,t)).replace(/\\(\\)/g,x.helper.escapeCharactersCallback)).replace(/\\([`*_{}\[\]()>#+.!~=|:-])/g,x.helper.escapeCharactersCallback),e=t.converter._dispatch("encodeBackslashEscapes.after",e,r,t)}),x.subParser("encodeCode",function(e,r,t){"use strict";return e=(e=t.converter._dispatch("encodeCode.before",e,r,t)).replace(/&/g,"&").replace(//g,">").replace(/([*_{}\[\]\\=~-])/g,x.helper.escapeCharactersCallback),e=t.converter._dispatch("encodeCode.after",e,r,t)}),x.subParser("escapeSpecialCharsWithinTagAttributes",function(e,r,t){"use strict";return e=(e=(e=t.converter._dispatch("escapeSpecialCharsWithinTagAttributes.before",e,r,t)).replace(/<\/?[a-z\d_:-]+(?:[\s]+[\s\S]+?)?>/gi,function(e){return e.replace(/(.)<\/?code>(?=.)/g,"$1`").replace(/([\\`*_~=|])/g,x.helper.escapeCharactersCallback)})).replace(/-]|-[^>])(?:[^-]|-[^-])*)--)>/gi,function(e){return e.replace(/([\\`*_~=|])/g,x.helper.escapeCharactersCallback)}),e=t.converter._dispatch("escapeSpecialCharsWithinTagAttributes.after",e,r,t)}),x.subParser("githubCodeBlocks",function(e,s,o){"use strict";return s.ghCodeBlocks?(e=o.converter._dispatch("githubCodeBlocks.before",e,s,o),e=(e=(e+="¨0").replace(/(?:^|\n)(?: {0,3})(```+|~~~+)(?: *)([^\s`~]*)\n([\s\S]*?)\n(?: {0,3})\1/g,function(e,r,t,a){var n=s.omitExtraWLInCodeBlocks?"":"\n";return a=x.subParser("encodeCode")(a,s,o),a="
"+(a=(a=(a=x.subParser("detab")(a,s,o)).replace(/^\n+/g,"")).replace(/\n+$/g,""))+n+"
",a=x.subParser("hashBlock")(a,s,o),"\n\n¨G"+(o.ghCodeBlocks.push({text:e,codeblock:a})-1)+"G\n\n"})).replace(/¨0/,""),o.converter._dispatch("githubCodeBlocks.after",e,s,o)):e}),x.subParser("hashBlock",function(e,r,t){"use strict";return e=(e=t.converter._dispatch("hashBlock.before",e,r,t)).replace(/(^\n+|\n+$)/g,""),e="\n\n¨K"+(t.gHtmlBlocks.push(e)-1)+"K\n\n",e=t.converter._dispatch("hashBlock.after",e,r,t)}),x.subParser("hashCodeTags",function(e,n,s){"use strict";e=s.converter._dispatch("hashCodeTags.before",e,n,s);return e=x.helper.replaceRecursiveRegExp(e,function(e,r,t,a){t=t+x.subParser("encodeCode")(r,n,s)+a;return"¨C"+(s.gHtmlSpans.push(t)-1)+"C"},"]*>","
","gim"),e=s.converter._dispatch("hashCodeTags.after",e,n,s)}),x.subParser("hashElement",function(e,r,t){"use strict";return function(e,r){return r=(r=(r=r.replace(/\n\n/g,"\n")).replace(/^\n/,"")).replace(/\n+$/g,""),r="\n\n¨K"+(t.gHtmlBlocks.push(r)-1)+"K\n\n"}}),x.subParser("hashHTMLBlocks",function(e,r,n){"use strict";e=n.converter._dispatch("hashHTMLBlocks.before",e,r,n);function t(e,r,t,a){return-1!==t.search(/\bmarkdown\b/)&&(e=t+n.converter.makeHtml(r)+a),"\n\n¨K"+(n.gHtmlBlocks.push(e)-1)+"K\n\n"}var a=["pre","div","h1","h2","h3","h4","h5","h6","blockquote","table","dl","ol","ul","script","noscript","form","fieldset","iframe","math","style","section","header","footer","nav","article","aside","address","audio","canvas","figure","hgroup","output","video","p"];r.backslashEscapesHTMLTags&&(e=e.replace(/\\<(\/?[^>]+?)>/g,function(e,r){return"<"+r+">"}));for(var s=0;s]*>)","im"),i="<"+a[s]+"\\b[^>]*>",l="";-1!==(c=x.helper.regexIndexOf(e,o));){var c=x.helper.splitAtIndex(e,c),u=x.helper.replaceRecursiveRegExp(c[1],t,i,l,"im");if(u===c[1])break;e=c[0].concat(u)}return e=e.replace(/(\n {0,3}(<(hr)\b([^<>])*?\/?>)[ \t]*(?=\n{2,}))/g,x.subParser("hashElement")(e,r,n)),e=(e=x.helper.replaceRecursiveRegExp(e,function(e){return"\n\n¨K"+(n.gHtmlBlocks.push(e)-1)+"K\n\n"},"^ {0,3}\x3c!--","--\x3e","gm")).replace(/(?:\n\n)( {0,3}(?:<([?%])[^\r]*?\2>)[ \t]*(?=\n{2,}))/g,x.subParser("hashElement")(e,r,n)),e=n.converter._dispatch("hashHTMLBlocks.after",e,r,n)}),x.subParser("hashHTMLSpans",function(e,r,t){"use strict";function a(e){return"¨C"+(t.gHtmlSpans.push(e)-1)+"C"}return e=(e=(e=(e=(e=t.converter._dispatch("hashHTMLSpans.before",e,r,t)).replace(/<[^>]+?\/>/gi,a)).replace(/<([^>]+?)>[\s\S]*?<\/\1>/g,a)).replace(/<([^>]+?)\s[^>]+?>[\s\S]*?<\/\1>/g,a)).replace(/<[^>]+?>/gi,a),e=t.converter._dispatch("hashHTMLSpans.after",e,r,t)}),x.subParser("unhashHTMLSpans",function(e,r,t){"use strict";e=t.converter._dispatch("unhashHTMLSpans.before",e,r,t);for(var a=0;a]*>\\s*]*>","^ {0,3}\\s*
","gim"),e=s.converter._dispatch("hashPreCodeTags.after",e,n,s)}),x.subParser("headers",function(e,n,s){"use strict";e=s.converter._dispatch("headers.before",e,n,s);var o=isNaN(parseInt(n.headerLevelStart))?1:parseInt(n.headerLevelStart),r=n.smoothLivePreview?/^(.+)[ \t]*\n={2,}[ \t]*\n+/gm:/^(.+)[ \t]*\n=+[ \t]*\n+/gm,t=n.smoothLivePreview?/^(.+)[ \t]*\n-{2,}[ \t]*\n+/gm:/^(.+)[ \t]*\n-+[ \t]*\n+/gm,r=(e=(e=e.replace(r,function(e,r){var t=x.subParser("spanGamut")(r,n,s),r=n.noHeaderId?"":' id="'+i(r)+'"',r=""+t+"";return x.subParser("hashBlock")(r,n,s)})).replace(t,function(e,r){var t=x.subParser("spanGamut")(r,n,s),r=n.noHeaderId?"":' id="'+i(r)+'"',a=o+1,r=""+t+"";return x.subParser("hashBlock")(r,n,s)}),n.requireSpaceBeforeHeadingText?/^(#{1,6})[ \t]+(.+?)[ \t]*#*\n+/gm:/^(#{1,6})[ \t]*(.+?)[ \t]*#*\n+/gm);function i(e){var r=e=n.customizedHeaderId&&(r=e.match(/\{([^{]+?)}\s*$/))&&r[1]?r[1]:e,e=x.helper.isString(n.prefixHeaderId)?n.prefixHeaderId:!0===n.prefixHeaderId?"section-":"";return n.rawPrefixHeaderId||(r=e+r),r=(n.ghCompatibleHeaderId?r.replace(/ /g,"-").replace(/&/g,"").replace(/¨T/g,"").replace(/¨D/g,"").replace(/[&+$,\/:;=?@"#{}|^¨~\[\]`\\*)(%.!'<>]/g,""):n.rawHeaderId?r.replace(/ /g,"-").replace(/&/g,"&").replace(/¨T/g,"¨").replace(/¨D/g,"$").replace(/["']/g,"-"):r.replace(/[^\w]/g,"")).toLowerCase(),n.rawPrefixHeaderId&&(r=e+r),s.hashLinkCounts[r]?r=r+"-"+s.hashLinkCounts[r]++:s.hashLinkCounts[r]=1,r}return e=e.replace(r,function(e,r,t){var a=t,a=(n.customizedHeaderId&&(a=t.replace(/\s?\{([^{]+?)}\s*$/,"")),x.subParser("spanGamut")(a,n,s)),t=n.noHeaderId?"":' id="'+i(t)+'"',r=o-1+r.length,t=""+a+"";return x.subParser("hashBlock")(t,n,s)}),e=s.converter._dispatch("headers.after",e,n,s)}),x.subParser("horizontalRule",function(e,r,t){"use strict";e=t.converter._dispatch("horizontalRule.before",e,r,t);var a=x.subParser("hashBlock")("
",r,t);return e=(e=(e=e.replace(/^ {0,2}( ?-){3,}[ \t]*$/gm,a)).replace(/^ {0,2}( ?\*){3,}[ \t]*$/gm,a)).replace(/^ {0,2}( ?_){3,}[ \t]*$/gm,a),e=t.converter._dispatch("horizontalRule.after",e,r,t)}),x.subParser("images",function(e,r,d){"use strict";function l(e,r,t,a,n,s,o,i){var l=d.gUrls,c=d.gTitles,u=d.gDimensions;if(t=t.toLowerCase(),i=i||"",-1? ?(['"].*['"])?\)$/m))a="";else if(""===a||null===a){if(a="#"+(t=""!==t&&null!==t?t:r.toLowerCase().replace(/ ?\n/g," ")),x.helper.isUndefined(l[t]))return e;a=l[t],x.helper.isUndefined(c[t])||(i=c[t]),x.helper.isUndefined(u[t])||(n=u[t].width,s=u[t].height)}r=r.replace(/"/g,""").replace(x.helper.regexes.asteriskDashAndColon,x.helper.escapeCharactersCallback);e=''+r+'"}return e=(e=(e=(e=(e=(e=d.converter._dispatch("images.before",e,r,d)).replace(/!\[([^\]]*?)] ?(?:\n *)?\[([\s\S]*?)]()()()()()/g,l)).replace(/!\[([^\]]*?)][ \t]*()\([ \t]??(?: =([*\d]+[A-Za-z%]{0,4})x([*\d]+[A-Za-z%]{0,4}))?[ \t]*(?:(["'])([^"]*?)\6)?[ \t]?\)/g,function(e,r,t,a,n,s,o,i){return l(e,r,t,a=a.replace(/\s/g,""),n,s,0,i)})).replace(/!\[([^\]]*?)][ \t]*()\([ \t]?<([^>]*)>(?: =([*\d]+[A-Za-z%]{0,4})x([*\d]+[A-Za-z%]{0,4}))?[ \t]*(?:(?:(["'])([^"]*?)\6))?[ \t]?\)/g,l)).replace(/!\[([^\]]*?)][ \t]*()\([ \t]??(?: =([*\d]+[A-Za-z%]{0,4})x([*\d]+[A-Za-z%]{0,4}))?[ \t]*(?:(["'])([^"]*?)\6)?[ \t]?\)/g,l)).replace(/!\[([^\[\]]+)]()()()()()/g,l),e=d.converter._dispatch("images.after",e,r,d)}),x.subParser("italicsAndBold",function(e,r,t){"use strict";return e=t.converter._dispatch("italicsAndBold.before",e,r,t),e=r.literalMidWordUnderscores?(e=(e=e.replace(/\b___(\S[\s\S]*?)___\b/g,function(e,r){return""+r+""})).replace(/\b__(\S[\s\S]*?)__\b/g,function(e,r){return""+r+""})).replace(/\b_(\S[\s\S]*?)_\b/g,function(e,r){return""+r+""}):(e=(e=e.replace(/___(\S[\s\S]*?)___/g,function(e,r){return/\S$/.test(r)?""+r+"":e})).replace(/__(\S[\s\S]*?)__/g,function(e,r){return/\S$/.test(r)?""+r+"":e})).replace(/_([^\s_][\s\S]*?)_/g,function(e,r){return/\S$/.test(r)?""+r+"":e}),e=r.literalMidWordAsterisks?(e=(e=e.replace(/([^*]|^)\B\*\*\*(\S[\s\S]*?)\*\*\*\B(?!\*)/g,function(e,r,t){return r+""+t+""})).replace(/([^*]|^)\B\*\*(\S[\s\S]*?)\*\*\B(?!\*)/g,function(e,r,t){return r+""+t+""})).replace(/([^*]|^)\B\*(\S[\s\S]*?)\*\B(?!\*)/g,function(e,r,t){return r+""+t+""}):(e=(e=e.replace(/\*\*\*(\S[\s\S]*?)\*\*\*/g,function(e,r){return/\S$/.test(r)?""+r+"":e})).replace(/\*\*(\S[\s\S]*?)\*\*/g,function(e,r){return/\S$/.test(r)?""+r+"":e})).replace(/\*([^\s*][\s\S]*?)\*/g,function(e,r){return/\S$/.test(r)?""+r+"":e}),e=t.converter._dispatch("italicsAndBold.after",e,r,t)}),x.subParser("lists",function(e,d,c){"use strict";function p(e,r){c.gListLevel++,e=e.replace(/\n{2,}$/,"\n");var t=/(\n)?(^ {0,3})([*+-]|\d+[.])[ \t]+((\[(x|X| )?])?[ \t]*[^\r]+?(\n{1,2}))(?=\n*(¨0| {0,3}([*+-]|\d+[.])[ \t]+))/gm,l=/\n[ \t]*\n(?!¨0)/.test(e+="¨0");return d.disableForced4SpacesIndentedSublists&&(t=/(\n)?(^ {0,3})([*+-]|\d+[.])[ \t]+((\[(x|X| )?])?[ \t]*[^\r]+?(\n{1,2}))(?=\n*(¨0|\2([*+-]|\d+[.])[ \t]+))/gm),e=(e=e.replace(t,function(e,r,t,a,n,s,o){o=o&&""!==o.trim();var n=x.subParser("outdent")(n,d,c),i="";return s&&d.tasklists&&(i=' class="task-list-item" style="list-style-type: none;"',n=n.replace(/^[ \t]*\[(x|X| )?]/m,function(){var e='"+(n=(n=r||-1\n"})).replace(/¨0/g,""),c.gListLevel--,e=r?e.replace(/\s+$/,""):e}function h(e,r){if("ol"===r){r=e.match(/^ *(\d+)\./);if(r&&"1"!==r[1])return' start="'+r[1]+'"'}return""}function n(n,s,o){var e,i=d.disableForced4SpacesIndentedSublists?/^ ?\d+\.[ \t]/gm:/^ {0,3}\d+\.[ \t]/gm,l=d.disableForced4SpacesIndentedSublists?/^ ?[*+-][ \t]/gm:/^ {0,3}[*+-][ \t]/gm,c="ul"===s?i:l,u="";return-1!==n.search(c)?function e(r){var t=r.search(c),a=h(n,s);-1!==t?(u+="\n\n<"+s+a+">\n"+p(r.slice(0,t),!!o)+"\n",c="ul"===(s="ul"===s?"ol":"ul")?i:l,e(r.slice(t))):u+="\n\n<"+s+a+">\n"+p(r,!!o)+"\n"}(n):(e=h(n,s),u="\n\n<"+s+e+">\n"+p(n,!!o)+"\n"),u}return e=c.converter._dispatch("lists.before",e,d,c),e+="¨0",e=(e=c.gListLevel?e.replace(/^(( {0,3}([*+-]|\d+[.])[ \t]+)[^\r]+?(¨0|\n{2,}(?=\S)(?![ \t]*(?:[*+-]|\d+[.])[ \t]+)))/gm,function(e,r,t){return n(r,-1"),i+="

",n.push(i))}for(s=n.length,o=0;o]*>\s*]*>/.test(c)&&(u=!0)}n[o]=c}return e=(e=(e=n.join("\n")).replace(/^\n+/g,"")).replace(/\n+$/g,""),t.converter._dispatch("paragraphs.after",e,r,t)}),x.subParser("runExtension",function(e,r,t,a){"use strict";return e.filter?r=e.filter(r,a.converter,t):e.regex&&((a=e.regex)instanceof RegExp||(a=new RegExp(a,"g")),r=r.replace(a,e.replace)),r}),x.subParser("spanGamut",function(e,r,t){"use strict";return e=t.converter._dispatch("spanGamut.before",e,r,t),e=x.subParser("codeSpans")(e,r,t),e=x.subParser("escapeSpecialCharsWithinTagAttributes")(e,r,t),e=x.subParser("encodeBackslashEscapes")(e,r,t),e=x.subParser("images")(e,r,t),e=x.subParser("anchors")(e,r,t),e=x.subParser("autoLinks")(e,r,t),e=x.subParser("simplifiedAutoLinks")(e,r,t),e=x.subParser("emoji")(e,r,t),e=x.subParser("underline")(e,r,t),e=x.subParser("italicsAndBold")(e,r,t),e=x.subParser("strikethrough")(e,r,t),e=x.subParser("ellipsis")(e,r,t),e=x.subParser("hashHTMLSpans")(e,r,t),e=x.subParser("encodeAmpsAndAngles")(e,r,t),r.simpleLineBreaks?/\n\n¨K/.test(e)||(e=e.replace(/\n+/g,"
\n")):e=e.replace(/ +\n/g,"
\n"),e=t.converter._dispatch("spanGamut.after",e,r,t)}),x.subParser("strikethrough",function(e,t,a){"use strict";return t.strikethrough&&(e=(e=a.converter._dispatch("strikethrough.before",e,t,a)).replace(/(?:~){2}([\s\S]+?)(?:~){2}/g,function(e,r){return r=r,""+(r=t.simplifiedAutoLink?x.subParser("simplifiedAutoLinks")(r,t,a):r)+""}),e=a.converter._dispatch("strikethrough.after",e,t,a)),e}),x.subParser("stripLinkDefinitions",function(i,l,c){"use strict";function e(e,r,t,a,n,s,o){return r=r.toLowerCase(),i.toLowerCase().split(r).length-1<2?e:(t.match(/^data:.+?\/.+?;base64,/)?c.gUrls[r]=t.replace(/\s/g,""):c.gUrls[r]=x.subParser("encodeAmpsAndAngles")(t,l,c),s?s+o:(o&&(c.gTitles[r]=o.replace(/"|'/g,""")),l.parseImgDimensions&&a&&n&&(c.gDimensions[r]={width:a,height:n}),""))}return i=(i=(i=(i+="¨0").replace(/^ {0,3}\[([^\]]+)]:[ \t]*\n?[ \t]*?(?: =([*\d]+[A-Za-z%]{0,4})x([*\d]+[A-Za-z%]{0,4}))?[ \t]*\n?[ \t]*(?:(\n*)["|'(](.+?)["|')][ \t]*)?(?:\n\n|(?=¨0)|(?=\n\[))/gm,e)).replace(/^ {0,3}\[([^\]]+)]:[ \t]*\n?[ \t]*\s]+)>?(?: =([*\d]+[A-Za-z%]{0,4})x([*\d]+[A-Za-z%]{0,4}))?[ \t]*\n?[ \t]*(?:(\n*)["|'(](.+?)["|')][ \t]*)?(?:\n+|(?=¨0))/gm,e)).replace(/¨0/,"")}),x.subParser("tables",function(e,y,P){"use strict";if(!y.tables)return e;function r(e){for(var r=e.split("\n"),t=0;t"+(n=x.subParser("spanGamut")(n,y,P))+"\n"));for(t=0;t"+x.subParser("spanGamut")(i,y,P)+"\n"));h.push(_)}for(var m=d,f=h,b="\n\n\n",w=m.length,k=0;k\n\n\n",k=0;k\n";for(var v=0;v\n"}return b+="\n
\n"}return e=(e=(e=(e=P.converter._dispatch("tables.before",e,y,P)).replace(/\\(\|)/g,x.helper.escapeCharactersCallback)).replace(/^ {0,3}\|?.+\|.+\n {0,3}\|?[ \t]*:?[ \t]*(?:[-=]){2,}[ \t]*:?[ \t]*\|[ \t]*:?[ \t]*(?:[-=]){2,}[\s\S]+?(?:\n\n|¨0)/gm,r)).replace(/^ {0,3}\|.+\|[ \t]*\n {0,3}\|[ \t]*:?[ \t]*(?:[-=]){2,}[ \t]*:?[ \t]*\|[ \t]*\n( {0,3}\|.+\|[ \t]*\n)*(?:\n|¨0)/gm,r),e=P.converter._dispatch("tables.after",e,y,P)}),x.subParser("underline",function(e,r,t){"use strict";return r.underline?(e=t.converter._dispatch("underline.before",e,r,t),e=(e=r.literalMidWordUnderscores?(e=e.replace(/\b___(\S[\s\S]*?)___\b/g,function(e,r){return""+r+""})).replace(/\b__(\S[\s\S]*?)__\b/g,function(e,r){return""+r+""}):(e=e.replace(/___(\S[\s\S]*?)___/g,function(e,r){return/\S$/.test(r)?""+r+"":e})).replace(/__(\S[\s\S]*?)__/g,function(e,r){return/\S$/.test(r)?""+r+"":e})).replace(/(_)/g,x.helper.escapeCharactersCallback),t.converter._dispatch("underline.after",e,r,t)):e}),x.subParser("unescapeSpecialChars",function(e,r,t){"use strict";return e=(e=t.converter._dispatch("unescapeSpecialChars.before",e,r,t)).replace(/¨E(\d+)E/g,function(e,r){r=parseInt(r);return String.fromCharCode(r)}),e=t.converter._dispatch("unescapeSpecialChars.after",e,r,t)}),x.subParser("makeMarkdown.blockquote",function(e,r){"use strict";var t="";if(e.hasChildNodes())for(var a=e.childNodes,n=a.length,s=0;s ")}),x.subParser("makeMarkdown.codeBlock",function(e,r){"use strict";var t=e.getAttribute("language"),e=e.getAttribute("precodenum");return"```"+t+"\n"+r.preList[e]+"\n```"}),x.subParser("makeMarkdown.codeSpan",function(e){"use strict";return"`"+e.innerHTML+"`"}),x.subParser("makeMarkdown.emphasis",function(e,r){"use strict";var t="";if(e.hasChildNodes()){t+="*";for(var a=e.childNodes,n=a.length,s=0;s",e.hasAttribute("width")&&e.hasAttribute("height")&&(r+=" ="+e.getAttribute("width")+"x"+e.getAttribute("height")),e.hasAttribute("title")&&(r+=' "'+e.getAttribute("title")+'"'),r+=")"),r}),x.subParser("makeMarkdown.links",function(e,r){"use strict";var t="";if(e.hasChildNodes()&&e.hasAttribute("href")){for(var a=e.childNodes,n=a.length,t="[",s=0;s"),e.hasAttribute("title")&&(t+=' "'+e.getAttribute("title")+'"'),t+=")"}return t}),x.subParser("makeMarkdown.list",function(e,r,t){"use strict";var a="";if(!e.hasChildNodes())return"";for(var n=e.childNodes,s=n.length,o=e.getAttribute("start")||1,i=0;i"+r.preList[e]+""}),x.subParser("makeMarkdown.strikethrough",function(e,r){"use strict";var t="";if(e.hasChildNodes()){t+="~~";for(var a=e.childNodes,n=a.length,s=0;str>th"),s=e.querySelectorAll("tbody>tr"),o=0;o/g,"\\$1>")).replace(/^#/gm,"\\#")).replace(/^(\s*)([-=]{3,})(\s*)$/,"$1\\$2$3")).replace(/^( {0,3}\d+)\./gm,"$1\\.")).replace(/^( {0,3})([+-])/gm,"$1\\$2")).replace(/]([\s]*)\(/g,"\\]$1\\(")).replace(/^ {0,3}\[([\S \t]*?)]:/gm,"\\[$1]:")});"function"==typeof define&&define.amd?define(function(){"use strict";return x}):"undefined"!=typeof module&&module.exports?module.exports=x:this.showdown=x}.call(this); +//# sourceMappingURL=showdown.min.js.map diff --git a/showdown/dist/showdown.min.js.map b/showdown/dist/showdown.min.js.map new file mode 100644 index 00000000..788cc8ae --- /dev/null +++ b/showdown/dist/showdown.min.js.map @@ -0,0 +1 @@ +{"version":3,"file":"showdown.min.js","sources":["showdown.js"],"names":["getDefaultOpts","simple","defaultOptions","omitExtraWLInCodeBlocks","defaultValue","describe","type","noHeaderId","prefixHeaderId","rawPrefixHeaderId","ghCompatibleHeaderId","rawHeaderId","headerLevelStart","parseImgDimensions","simplifiedAutoLink","excludeTrailingPunctuationFromURLs","literalMidWordUnderscores","literalMidWordAsterisks","strikethrough","tables","tablesHeaderId","ghCodeBlocks","tasklists","smoothLivePreview","smartIndentationFix","disableForced4SpacesIndentedSublists","simpleLineBreaks","requireSpaceBeforeHeadingText","ghMentions","ghMentionsLink","encodeEmails","openLinksInNewWindow","backslashEscapesHTMLTags","emoji","underline","ellipsis","completeHTMLDocument","metadata","splitAdjacentBlockquotes","JSON","parse","stringify","opt","ret","hasOwnProperty","showdown","parsers","extensions","globalOptions","setFlavor","flavor","github","original","ghost","vanilla","allOn","options","allOptionsOn","validate","extension","name","errMsg","valid","error","helper","isArray","i","length","baseMsg","ext","isString","toLowerCase","isUndefined","listeners","filter","regex","ln","RegExp","replace","escapeCharactersCallback","wholeMatch","m1","charCodeAt","setOption","key","value","this","getOption","getOptions","resetOptions","Error","option","preset","getFlavor","getFlavorOptions","getDefaultOptions","subParser","func","stdExtName","validExtension","getAllExtensions","removeExtension","resetExtensions","validateExtension","console","warn","a","String","isFunction","toString","call","Array","forEach","obj","callback","prop","s","escapeCharacters","text","charsToEscape","afterBackslash","regexString","unescapeHTMLEntities","txt","rgxFindMatchPos","str","left","right","flags","t","start","g","f","indexOf","x","l","pos","m","exec","test","lastIndex","end","index","match","push","replaceLink","wm","leadingMagicChars","link","m2","m3","trailingPunctuation","trailingMagicChars","lnkTxt","regexes","asteriskDashAndColon","append","target","lmc","tmc","replaceMail","globals","b","mail","href","encodeEmailAddress","matchRecursiveRegExp","matchPos","results","slice","replaceRecursiveRegExp","replacement","repStr","finalStr","lng","bits","join","regexIndexOf","fromIndex","substring","search","splitAtIndex","encode","ch","r","Math","floor","random","padEnd","targetLength","padString","repeat","msg","alert","log","emojis","+1","-1","100","1234","1st_place_medal","2nd_place_medal","3rd_place_medal","8ball","ab","abc","abcd","accept","aerial_tramway","airplane","alarm_clock","alembic","alien","ambulance","amphora","anchor","angel","anger","angry","anguished","ant","apple","aquarius","aries","arrow_backward","arrow_double_down","arrow_double_up","arrow_down","arrow_down_small","arrow_forward","arrow_heading_down","arrow_heading_up","arrow_left","arrow_lower_left","arrow_lower_right","arrow_right","arrow_right_hook","arrow_up","arrow_up_down","arrow_up_small","arrow_upper_left","arrow_upper_right","arrows_clockwise","arrows_counterclockwise","art","articulated_lorry","artificial_satellite","astonished","athletic_shoe","atm","atom_symbol","avocado","baby","baby_bottle","baby_chick","baby_symbol","back","bacon","badminton","baggage_claim","baguette_bread","balance_scale","balloon","ballot_box","ballot_box_with_check","bamboo","banana","bangbang","bank","bar_chart","barber","baseball","basketball","basketball_man","basketball_woman","bat","bath","bathtub","battery","beach_umbrella","bear","bed","bee","beer","beers","beetle","beginner","bell","bellhop_bell","bento","biking_man","bike","biking_woman","bikini","biohazard","bird","birthday","black_circle","black_flag","black_heart","black_joker","black_large_square","black_medium_small_square","black_medium_square","black_nib","black_small_square","black_square_button","blonde_man","blonde_woman","blossom","blowfish","blue_book","blue_car","blue_heart","blush","boar","boat","bomb","book","bookmark","bookmark_tabs","books","boom","boot","bouquet","bowing_man","bow_and_arrow","bowing_woman","bowling","boxing_glove","boy","bread","bride_with_veil","bridge_at_night","briefcase","broken_heart","bug","building_construction","bulb","bullettrain_front","bullettrain_side","burrito","bus","business_suit_levitating","busstop","bust_in_silhouette","busts_in_silhouette","butterfly","cactus","cake","calendar","call_me_hand","calling","camel","camera","camera_flash","camping","cancer","candle","candy","canoe","capital_abcd","capricorn","car","card_file_box","card_index","card_index_dividers","carousel_horse","carrot","cat","cat2","cd","chains","champagne","chart","chart_with_downwards_trend","chart_with_upwards_trend","checkered_flag","cheese","cherries","cherry_blossom","chestnut","chicken","children_crossing","chipmunk","chocolate_bar","christmas_tree","church","cinema","circus_tent","city_sunrise","city_sunset","cityscape","cl","clamp","clap","clapper","classical_building","clinking_glasses","clipboard","clock1","clock10","clock1030","clock11","clock1130","clock12","clock1230","clock130","clock2","clock230","clock3","clock330","clock4","clock430","clock5","clock530","clock6","clock630","clock7","clock730","clock8","clock830","clock9","clock930","closed_book","closed_lock_with_key","closed_umbrella","cloud","cloud_with_lightning","cloud_with_lightning_and_rain","cloud_with_rain","cloud_with_snow","clown_face","clubs","cocktail","coffee","coffin","cold_sweat","comet","computer","computer_mouse","confetti_ball","confounded","confused","congratulations","construction","construction_worker_man","construction_worker_woman","control_knobs","convenience_store","cookie","cool","policeman","copyright","corn","couch_and_lamp","couple","couple_with_heart_woman_man","couple_with_heart_man_man","couple_with_heart_woman_woman","couplekiss_man_man","couplekiss_man_woman","couplekiss_woman_woman","cow","cow2","cowboy_hat_face","crab","crayon","credit_card","crescent_moon","cricket","crocodile","croissant","crossed_fingers","crossed_flags","crossed_swords","crown","cry","crying_cat_face","crystal_ball","cucumber","cupid","curly_loop","currency_exchange","curry","custard","customs","cyclone","dagger","dancer","dancing_women","dancing_men","dango","dark_sunglasses","dart","dash","date","deciduous_tree","deer","department_store","derelict_house","desert","desert_island","desktop_computer","male_detective","diamond_shape_with_a_dot_inside","diamonds","disappointed","disappointed_relieved","dizzy","dizzy_face","do_not_litter","dog","dog2","dollar","dolls","dolphin","door","doughnut","dove","dragon","dragon_face","dress","dromedary_camel","drooling_face","droplet","drum","duck","dvd","e-mail","eagle","ear","ear_of_rice","earth_africa","earth_americas","earth_asia","egg","eggplant","eight_pointed_black_star","eight_spoked_asterisk","electric_plug","elephant","email","envelope_with_arrow","euro","european_castle","european_post_office","evergreen_tree","exclamation","expressionless","eye","eye_speech_bubble","eyeglasses","eyes","face_with_head_bandage","face_with_thermometer","fist_oncoming","factory","fallen_leaf","family_man_woman_boy","family_man_boy","family_man_boy_boy","family_man_girl","family_man_girl_boy","family_man_girl_girl","family_man_man_boy","family_man_man_boy_boy","family_man_man_girl","family_man_man_girl_boy","family_man_man_girl_girl","family_man_woman_boy_boy","family_man_woman_girl","family_man_woman_girl_boy","family_man_woman_girl_girl","family_woman_boy","family_woman_boy_boy","family_woman_girl","family_woman_girl_boy","family_woman_girl_girl","family_woman_woman_boy","family_woman_woman_boy_boy","family_woman_woman_girl","family_woman_woman_girl_boy","family_woman_woman_girl_girl","fast_forward","fax","fearful","feet","female_detective","ferris_wheel","ferry","field_hockey","file_cabinet","file_folder","film_projector","film_strip","fire","fire_engine","fireworks","first_quarter_moon","first_quarter_moon_with_face","fish","fish_cake","fishing_pole_and_fish","fist_raised","fist_left","fist_right","flashlight","fleur_de_lis","flight_arrival","flight_departure","floppy_disk","flower_playing_cards","flushed","fog","foggy","football","footprints","fork_and_knife","fountain","fountain_pen","four_leaf_clover","fox_face","framed_picture","free","fried_egg","fried_shrimp","fries","frog","frowning","frowning_face","frowning_man","frowning_woman","middle_finger","fuelpump","full_moon","full_moon_with_face","funeral_urn","game_die","gear","gem","gemini","gift","gift_heart","girl","globe_with_meridians","goal_net","goat","golf","golfing_man","golfing_woman","gorilla","grapes","green_apple","green_book","green_heart","green_salad","grey_exclamation","grey_question","grimacing","grin","grinning","guardsman","guardswoman","guitar","gun","haircut_woman","haircut_man","hamburger","hammer","hammer_and_pick","hammer_and_wrench","hamster","hand","handbag","handshake","hankey","hatched_chick","hatching_chick","headphones","hear_no_evil","heart","heart_decoration","heart_eyes","heart_eyes_cat","heartbeat","heartpulse","hearts","heavy_check_mark","heavy_division_sign","heavy_dollar_sign","heavy_heart_exclamation","heavy_minus_sign","heavy_multiplication_x","heavy_plus_sign","helicopter","herb","hibiscus","high_brightness","high_heel","hocho","hole","honey_pot","horse","horse_racing","hospital","hot_pepper","hotdog","hotel","hotsprings","hourglass","hourglass_flowing_sand","house","house_with_garden","houses","hugs","hushed","ice_cream","ice_hockey","ice_skate","icecream","id","ideograph_advantage","imp","inbox_tray","incoming_envelope","tipping_hand_woman","information_source","innocent","interrobang","iphone","izakaya_lantern","jack_o_lantern","japan","japanese_castle","japanese_goblin","japanese_ogre","jeans","joy","joy_cat","joystick","kaaba","keyboard","keycap_ten","kick_scooter","kimono","kiss","kissing","kissing_cat","kissing_closed_eyes","kissing_heart","kissing_smiling_eyes","kiwi_fruit","koala","koko","label","large_blue_circle","large_blue_diamond","large_orange_diamond","last_quarter_moon","last_quarter_moon_with_face","latin_cross","laughing","leaves","ledger","left_luggage","left_right_arrow","leftwards_arrow_with_hook","lemon","leo","leopard","level_slider","libra","light_rail","lion","lips","lipstick","lizard","lock","lock_with_ink_pen","lollipop","loop","loud_sound","loudspeaker","love_hotel","love_letter","low_brightness","lying_face","mag","mag_right","mahjong","mailbox","mailbox_closed","mailbox_with_mail","mailbox_with_no_mail","man","man_artist","man_astronaut","man_cartwheeling","man_cook","man_dancing","man_facepalming","man_factory_worker","man_farmer","man_firefighter","man_health_worker","man_in_tuxedo","man_judge","man_juggling","man_mechanic","man_office_worker","man_pilot","man_playing_handball","man_playing_water_polo","man_scientist","man_shrugging","man_singer","man_student","man_teacher","man_technologist","man_with_gua_pi_mao","man_with_turban","tangerine","mans_shoe","mantelpiece_clock","maple_leaf","martial_arts_uniform","mask","massage_woman","massage_man","meat_on_bone","medal_military","medal_sports","mega","melon","memo","men_wrestling","menorah","mens","metal","metro","microphone","microscope","milk_glass","milky_way","minibus","minidisc","mobile_phone_off","money_mouth_face","money_with_wings","moneybag","monkey","monkey_face","monorail","moon","mortar_board","mosque","motor_boat","motor_scooter","motorcycle","motorway","mount_fuji","mountain","mountain_biking_man","mountain_biking_woman","mountain_cableway","mountain_railway","mountain_snow","mouse","mouse2","movie_camera","moyai","mrs_claus","muscle","mushroom","musical_keyboard","musical_note","musical_score","mute","nail_care","name_badge","national_park","nauseated_face","necktie","negative_squared_cross_mark","nerd_face","neutral_face","new","new_moon","new_moon_with_face","newspaper","newspaper_roll","next_track_button","ng","no_good_man","no_good_woman","night_with_stars","no_bell","no_bicycles","no_entry","no_entry_sign","no_mobile_phones","no_mouth","no_pedestrians","no_smoking","non-potable_water","nose","notebook","notebook_with_decorative_cover","notes","nut_and_bolt","o","o2","ocean","octopus","oden","office","oil_drum","ok","ok_hand","ok_man","ok_woman","old_key","older_man","older_woman","om","on","oncoming_automobile","oncoming_bus","oncoming_police_car","oncoming_taxi","open_file_folder","open_hands","open_mouth","open_umbrella","ophiuchus","orange_book","orthodox_cross","outbox_tray","owl","ox","package","page_facing_up","page_with_curl","pager","paintbrush","palm_tree","pancakes","panda_face","paperclip","paperclips","parasol_on_ground","parking","part_alternation_mark","partly_sunny","passenger_ship","passport_control","pause_button","peace_symbol","peach","peanuts","pear","pen","pencil2","penguin","pensive","performing_arts","persevere","person_fencing","pouting_woman","phone","pick","pig","pig2","pig_nose","pill","pineapple","ping_pong","pisces","pizza","place_of_worship","plate_with_cutlery","play_or_pause_button","point_down","point_left","point_right","point_up","point_up_2","police_car","policewoman","poodle","popcorn","post_office","postal_horn","postbox","potable_water","potato","pouch","poultry_leg","pound","rage","pouting_cat","pouting_man","pray","prayer_beads","pregnant_woman","previous_track_button","prince","princess","printer","purple_heart","purse","pushpin","put_litter_in_its_place","question","rabbit","rabbit2","racehorse","racing_car","radio","radio_button","radioactive","railway_car","railway_track","rainbow","rainbow_flag","raised_back_of_hand","raised_hand_with_fingers_splayed","raised_hands","raising_hand_woman","raising_hand_man","ram","ramen","rat","record_button","recycle","red_circle","registered","relaxed","relieved","reminder_ribbon","repeat_one","rescue_worker_helmet","restroom","revolving_hearts","rewind","rhinoceros","ribbon","rice","rice_ball","rice_cracker","rice_scene","right_anger_bubble","ring","robot","rocket","rofl","roll_eyes","roller_coaster","rooster","rose","rosette","rotating_light","round_pushpin","rowing_man","rowing_woman","rugby_football","running_man","running_shirt_with_sash","running_woman","sa","sagittarius","sake","sandal","santa","satellite","saxophone","school","school_satchel","scissors","scorpion","scorpius","scream","scream_cat","scroll","seat","secret","see_no_evil","seedling","selfie","shallow_pan_of_food","shamrock","shark","shaved_ice","sheep","shell","shield","shinto_shrine","ship","shirt","shopping","shopping_cart","shower","shrimp","signal_strength","six_pointed_star","ski","skier","skull","skull_and_crossbones","sleeping","sleeping_bed","sleepy","slightly_frowning_face","slightly_smiling_face","slot_machine","small_airplane","small_blue_diamond","small_orange_diamond","small_red_triangle","small_red_triangle_down","smile","smile_cat","smiley","smiley_cat","smiling_imp","smirk","smirk_cat","smoking","snail","snake","sneezing_face","snowboarder","snowflake","snowman","snowman_with_snow","sob","soccer","soon","sos","sound","space_invader","spades","spaghetti","sparkle","sparkler","sparkles","sparkling_heart","speak_no_evil","speaker","speaking_head","speech_balloon","speedboat","spider","spider_web","spiral_calendar","spiral_notepad","spoon","squid","stadium","star","star2","star_and_crescent","star_of_david","stars","station","statue_of_liberty","steam_locomotive","stew","stop_button","stop_sign","stopwatch","straight_ruler","strawberry","stuck_out_tongue","stuck_out_tongue_closed_eyes","stuck_out_tongue_winking_eye","studio_microphone","stuffed_flatbread","sun_behind_large_cloud","sun_behind_rain_cloud","sun_behind_small_cloud","sun_with_face","sunflower","sunglasses","sunny","sunrise","sunrise_over_mountains","surfing_man","surfing_woman","sushi","suspension_railway","sweat","sweat_drops","sweat_smile","sweet_potato","swimming_man","swimming_woman","symbols","synagogue","syringe","taco","tada","tanabata_tree","taurus","taxi","tea","telephone_receiver","telescope","tennis","tent","thermometer","thinking","thought_balloon","ticket","tickets","tiger","tiger2","timer_clock","tipping_hand_man","tired_face","tm","toilet","tokyo_tower","tomato","tongue","top","tophat","tornado","trackball","tractor","traffic_light","train","train2","tram","triangular_flag_on_post","triangular_ruler","trident","triumph","trolleybus","trophy","tropical_drink","tropical_fish","truck","trumpet","tulip","tumbler_glass","turkey","turtle","tv","twisted_rightwards_arrows","two_hearts","two_men_holding_hands","two_women_holding_hands","u5272","u5408","u55b6","u6307","u6708","u6709","u6e80","u7121","u7533","u7981","u7a7a","umbrella","unamused","underage","unicorn","unlock","up","upside_down_face","v","vertical_traffic_light","vhs","vibration_mode","video_camera","video_game","violin","virgo","volcano","volleyball","vs","vulcan_salute","walking_man","walking_woman","waning_crescent_moon","waning_gibbous_moon","warning","wastebasket","watch","water_buffalo","watermelon","wave","wavy_dash","waxing_crescent_moon","wc","weary","wedding","weight_lifting_man","weight_lifting_woman","whale","whale2","wheel_of_dharma","wheelchair","white_check_mark","white_circle","white_flag","white_flower","white_large_square","white_medium_small_square","white_medium_square","white_small_square","white_square_button","wilted_flower","wind_chime","wind_face","wine_glass","wink","wolf","woman","woman_artist","woman_astronaut","woman_cartwheeling","woman_cook","woman_facepalming","woman_factory_worker","woman_farmer","woman_firefighter","woman_health_worker","woman_judge","woman_juggling","woman_mechanic","woman_office_worker","woman_pilot","woman_playing_handball","woman_playing_water_polo","woman_scientist","woman_shrugging","woman_singer","woman_student","woman_teacher","woman_technologist","woman_with_turban","womans_clothes","womans_hat","women_wrestling","womens","world_map","worried","wrench","writing_hand","yellow_heart","yen","yin_yang","yum","zap","zipper_mouth_face","zzz","octocat","Converter","converterOptions","gOpt","langExtensions","outputModifiers","setConvFlavor","parsed","raw","format","_parseExtension","legacyExtensionLoading","validExt","listen","_dispatch","evtName","ei","nText","makeHtml","rsp","gHtmlBlocks","gHtmlMdBlocks","gHtmlSpans","gUrls","gTitles","gDimensions","gListLevel","hashLinkCounts","converter","rgx","makeMarkdown","makeMd","src","HTMLParser","window","document","doc","createElement","innerHTML","preList","pres","querySelectorAll","presPH","childElementCount","firstChild","tagName","content","trim","language","getAttribute","classes","className","split","c","matches","outerHTML","setAttribute","substitutePreCodeTags","nodes","clean","node","n","childNodes","child","nodeType","nodeValue","removeChild","mdDoc","addExtension","useExtension","extensionName","splice","ii","output","getMetadata","getMetadataFormat","_setMetadataPair","_setMetadataFormat","_setMetadataRaw","writeAnchorTag","linkText","linkId","url","m5","m6","title","result","st","escape","mentions","username","simpleURLRegex","simpleURLRegex2","delimUrlRegex","simpleMailRegex","delimMailRegex","bq","codeblock","nextChar","meta","doctype","doctypeParsed","charset","lang","leadingText","numSpaces","emojiCode","delim","blockText","repFunc","blockTags","inside","rgx1","patLeft","patRight","opTagPos","subTexts","newSubText1","concat","hashHTMLSpan","html","repText","limit","num","$1","isNaN","parseInt","setextRegexH1","setextRegexH2","atxStyle","spanGamut","hID","headerId","hashBlock","matchFound","hLevel","customizedHeaderId","prefix","hText","span","header","writeImageTag","altText","width","height","gDims","lead","processListItems","listStr","trimTrailing","isParagraphed","m4","taskbtn","checked","item","bulletStyle","otp","wm2","styleStartNumber","list","listType","res","parseConsecutiveLists","style","olRgx","ulRgx","counterRxg","parseCL","wholematch","parseMetadataContents","grafs","grafsOut","grafsOutIt","codeFlag","$2","re","replaceFunc","blankLines","parseTable","rawTable","tableLines","sLine","cell","rawHeaders","map","rawStyles","rawCells","headers","styles","cells","shift","tableHeaderId","row","buildTable","tb","tblLgn","charCodeToReplace","fromCharCode","hasChildNodes","children","childrenLength","innerTxt","headerLevel","headerMark","hasAttribute","listItems","listItemsLenght","listNum","listItemTxt","childrenLenght","spansOnly","data","tableArray","headings","rows","headContent","allign","cols","getElementsByTagName","cellContent","cellSpacesCount","strLen","define","amd","module","exports"],"mappings":"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"} \ No newline at end of file diff --git a/showdown/package-lock.json b/showdown/package-lock.json new file mode 100644 index 00000000..57aa3bb7 --- /dev/null +++ b/showdown/package-lock.json @@ -0,0 +1,10078 @@ +{ + "name": "showdown", + "version": "2.0.2", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "showdown", + "version": "2.0.2", + "license": "MIT", + "dependencies": { + "commander": "^9.0.0" + }, + "bin": { + "showdown": "bin/showdown.js" + }, + "devDependencies": { + "chai": "*", + "chai-match": "*", + "grunt": "^1.4.1", + "grunt-contrib-clean": "^2.0.0", + "grunt-contrib-concat": "^2.0.0", + "grunt-contrib-jshint": "^3.1.0", + "grunt-contrib-uglify": "^5.0.1", + "grunt-conventional-changelog": "^6.1.0", + "grunt-conventional-github-releaser": "^1.0.0", + "grunt-endline": "^0.7.0", + "grunt-eslint": "^24.0.0", + "grunt-simple-mocha": "^0.4.0", + "jsdom": "^19.0.0", + "load-grunt-tasks": "^5.1.0", + "performance-now": "^2.1.0", + "quiet-grunt": "^0.2.0", + "semver": "^7.3.0", + "semver-sort": "^0.0.4", + "sinon": "*", + "source-map-support": "^0.5.20" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.0.tgz", + "integrity": "sha512-igm9SjJHNEJRiUnecP/1R5T3wKLEJ7pL6e2P+GUSfCd0dGjPYYZve08uzw8L2J8foVHFz+NGu12JxRcU2gGo6w==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.3.1", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/@eslint/eslintrc/node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/@eslint/eslintrc/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz", + "integrity": "sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "node_modules/@sinonjs/commons": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", + "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.0.tgz", + "integrity": "sha512-M8vapsv9qQupMdzrVzkn5rb9jG7aUTEPAZdMtME2PuBaefksFZVE2C1g4LBRTkF/k3nRDNbDc5tp5NFC1PEYxA==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.7.0" + } + }, + "node_modules/@sinonjs/samsam": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-6.1.1.tgz", + "integrity": "sha512-cZ7rKJTLiE7u7Wi/v9Hc2fs3Ucc3jrWeMgPHbbTCeVAB2S0wOBbYlkJVeNSL04i7fdhT8wIbDq1zhC/PXTD2SA==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.6.0", + "lodash.get": "^4.4.2", + "type-detect": "^4.0.8" + } + }, + "node_modules/@sinonjs/text-encoding": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz", + "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==", + "dev": true + }, + "node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@types/minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", + "dev": true + }, + "node_modules/@ungap/promise-all-settled": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", + "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", + "dev": true + }, + "node_modules/abab": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", + "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", + "dev": true + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "node_modules/acorn": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", + "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "dev": true, + "dependencies": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + } + }, + "node_modules/acorn-globals/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/array-differ": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-3.0.0.tgz", + "integrity": "sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/array-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", + "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-ify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", + "integrity": "sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4=", + "dev": true + }, + "node_modules/array-slice": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", + "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dev": true, + "dependencies": { + "lodash": "^4.17.14" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "dev": true + }, + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/camelcase-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", + "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", + "dev": true, + "dependencies": { + "camelcase": "^4.1.0", + "map-obj": "^2.0.0", + "quick-lru": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chai": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.6.tgz", + "integrity": "sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q==", + "dev": true, + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^3.0.1", + "get-func-name": "^2.0.0", + "loupe": "^2.3.1", + "pathval": "^1.1.1", + "type-detect": "^4.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chai-match": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/chai-match/-/chai-match-1.1.1.tgz", + "integrity": "sha1-OfsKLmt8j2OG3P6tSNFIqRX6bEY=", + "dev": true + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/cli": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz", + "integrity": "sha1-IoF1NPJL+klQw01TLUjsvGIbjBQ=", + "dev": true, + "dependencies": { + "exit": "0.1.2", + "glob": "^7.1.1" + }, + "engines": { + "node": ">=0.2.5" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/colors": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", + "dev": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.0.0.tgz", + "integrity": "sha512-JJfP2saEKbQqvW+FI93OYUB4ByV5cizMpFMiiJI8xDbBvQvSkIk0VvQdn1CZ8mqAO8Loq2h0gYTYtDFUZUeERw==", + "engines": { + "node": "^12.20.0 || >=14" + } + }, + "node_modules/compare-func": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-1.3.4.tgz", + "integrity": "sha512-sq2sWtrqKPkEXAC8tEJA1+BqAH9GbFkGBtUOqrUX57VSfwp8xyktctk+uLoRy5eccTdxzDcVIztlYDpKs3Jv1Q==", + "dev": true, + "dependencies": { + "array-ify": "^1.0.0", + "dot-prop": "^3.0.0" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/console-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "dev": true, + "dependencies": { + "date-now": "^0.1.4" + } + }, + "node_modules/conventional-changelog": { + "version": "1.1.24", + "resolved": "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-1.1.24.tgz", + "integrity": "sha512-2WcSUst4Y3Z4hHvoMTWXMJr/DmgVdLiMOVY1Kak2LfFz+GIz2KDp5naqbFesYbfXPmaZ5p491dO0FWZIJoJw1Q==", + "dev": true, + "dependencies": { + "conventional-changelog-angular": "^1.6.6", + "conventional-changelog-atom": "^0.2.8", + "conventional-changelog-codemirror": "^0.3.8", + "conventional-changelog-core": "^2.0.11", + "conventional-changelog-ember": "^0.3.12", + "conventional-changelog-eslint": "^1.0.9", + "conventional-changelog-express": "^0.3.6", + "conventional-changelog-jquery": "^0.1.0", + "conventional-changelog-jscs": "^0.1.0", + "conventional-changelog-jshint": "^0.3.8", + "conventional-changelog-preset-loader": "^1.1.8" + } + }, + "node_modules/conventional-changelog-angular": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-1.6.6.tgz", + "integrity": "sha512-suQnFSqCxRwyBxY68pYTsFkG0taIdinHLNEAX5ivtw8bCRnIgnpvcHmlR/yjUyZIrNPYAoXlY1WiEKWgSE4BNg==", + "dev": true, + "dependencies": { + "compare-func": "^1.3.1", + "q": "^1.5.1" + } + }, + "node_modules/conventional-changelog-atom": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/conventional-changelog-atom/-/conventional-changelog-atom-0.2.8.tgz", + "integrity": "sha512-8pPZqhMbrnltNBizjoDCb/Sz85KyUXNDQxuAEYAU5V/eHn0okMBVjqc8aHWYpHrytyZWvMGbayOlDv7i8kEf6g==", + "dev": true, + "dependencies": { + "q": "^1.5.1" + } + }, + "node_modules/conventional-changelog-codemirror": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/conventional-changelog-codemirror/-/conventional-changelog-codemirror-0.3.8.tgz", + "integrity": "sha512-3HFZKtBXTaUCHvz7ai6nk2+psRIkldDoNzCsom0egDtVmPsvvHZkzjynhdQyULfacRSsBTaiQ0ol6nBOL4dDiQ==", + "dev": true, + "dependencies": { + "q": "^1.5.1" + } + }, + "node_modules/conventional-changelog-core": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-2.0.11.tgz", + "integrity": "sha512-HvTE6RlqeEZ/NFPtQeFLsIDOLrGP3bXYr7lFLMhCVsbduF1MXIe8OODkwMFyo1i9ku9NWBwVnVn0jDmIFXjDRg==", + "dev": true, + "dependencies": { + "conventional-changelog-writer": "^3.0.9", + "conventional-commits-parser": "^2.1.7", + "dateformat": "^3.0.0", + "get-pkg-repo": "^1.0.0", + "git-raw-commits": "^1.3.6", + "git-remote-origin-url": "^2.0.0", + "git-semver-tags": "^1.3.6", + "lodash": "^4.2.1", + "normalize-package-data": "^2.3.5", + "q": "^1.5.1", + "read-pkg": "^1.1.0", + "read-pkg-up": "^1.0.1", + "through2": "^2.0.0" + } + }, + "node_modules/conventional-changelog-ember": { + "version": "0.3.12", + "resolved": "https://registry.npmjs.org/conventional-changelog-ember/-/conventional-changelog-ember-0.3.12.tgz", + "integrity": "sha512-mmJzA7uzbrOqeF89dMMi6z17O07ORTXlTMArnLG9ZTX4oLaKNolUlxFUFlFm9JUoVWajVpaHQWjxH1EOQ+ARoQ==", + "dev": true, + "dependencies": { + "q": "^1.5.1" + } + }, + "node_modules/conventional-changelog-eslint": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/conventional-changelog-eslint/-/conventional-changelog-eslint-1.0.9.tgz", + "integrity": "sha512-h87nfVh2fdk9fJIvz26wCBsbDC/KxqCc5wSlNMZbXcARtbgNbNDIF7Y7ctokFdnxkzVdaHsbINkh548T9eBA7Q==", + "dev": true, + "dependencies": { + "q": "^1.5.1" + } + }, + "node_modules/conventional-changelog-express": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/conventional-changelog-express/-/conventional-changelog-express-0.3.6.tgz", + "integrity": "sha512-3iWVtBJZ9RnRnZveNDzOD8QRn6g6vUif0qVTWWyi5nUIAbuN1FfPVyKdAlJJfp5Im+dE8Kiy/d2SpaX/0X678Q==", + "dev": true, + "dependencies": { + "q": "^1.5.1" + } + }, + "node_modules/conventional-changelog-jquery": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-jquery/-/conventional-changelog-jquery-0.1.0.tgz", + "integrity": "sha1-Agg5cWLjhGmG5xJztsecW1+A9RA=", + "dev": true, + "dependencies": { + "q": "^1.4.1" + } + }, + "node_modules/conventional-changelog-jscs": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-jscs/-/conventional-changelog-jscs-0.1.0.tgz", + "integrity": "sha1-BHnrRDzH1yxYvwvPDvHURKkvDlw=", + "dev": true, + "dependencies": { + "q": "^1.4.1" + } + }, + "node_modules/conventional-changelog-jshint": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/conventional-changelog-jshint/-/conventional-changelog-jshint-0.3.8.tgz", + "integrity": "sha512-hn9QU4ZI/5V50wKPJNPGT4gEWgiBFpV6adieILW4MaUFynuDYOvQ71EMSj3EznJyKi/KzuXpc9dGmX8njZMjig==", + "dev": true, + "dependencies": { + "compare-func": "^1.3.1", + "q": "^1.5.1" + } + }, + "node_modules/conventional-changelog-preset-loader": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-1.1.8.tgz", + "integrity": "sha512-MkksM4G4YdrMlT2MbTsV2F6LXu/hZR0Tc/yenRrDIKRwBl/SP7ER4ZDlglqJsCzLJi4UonBc52Bkm5hzrOVCcw==", + "dev": true + }, + "node_modules/conventional-changelog-writer": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-3.0.9.tgz", + "integrity": "sha512-n9KbsxlJxRQsUnK6wIBRnARacvNnN4C/nxnxCkH+B/R1JS2Fa+DiP1dU4I59mEDEjgnFaN2+9wr1P1s7GYB5/Q==", + "dev": true, + "dependencies": { + "compare-func": "^1.3.1", + "conventional-commits-filter": "^1.1.6", + "dateformat": "^3.0.0", + "handlebars": "^4.0.2", + "json-stringify-safe": "^5.0.1", + "lodash": "^4.2.1", + "meow": "^4.0.0", + "semver": "^5.5.0", + "split": "^1.0.0", + "through2": "^2.0.0" + }, + "bin": { + "conventional-changelog-writer": "cli.js" + } + }, + "node_modules/conventional-changelog-writer/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/conventional-commits-filter": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-1.1.6.tgz", + "integrity": "sha512-KcDgtCRKJCQhyk6VLT7zR+ZOyCnerfemE/CsR3iQpzRRFbLEs0Y6rwk3mpDvtOh04X223z+1xyJ582Stfct/0Q==", + "dev": true, + "dependencies": { + "is-subset": "^0.1.1", + "modify-values": "^1.0.0" + } + }, + "node_modules/conventional-commits-parser": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-2.1.7.tgz", + "integrity": "sha512-BoMaddIEJ6B4QVMSDu9IkVImlGOSGA1I2BQyOZHeLQ6qVOJLcLKn97+fL6dGbzWEiqDzfH4OkcveULmeq2MHFQ==", + "dev": true, + "dependencies": { + "is-text-path": "^1.0.0", + "JSONStream": "^1.0.4", + "lodash": "^4.2.1", + "meow": "^4.0.0", + "split2": "^2.0.0", + "through2": "^2.0.0", + "trim-off-newlines": "^1.0.0" + }, + "bin": { + "conventional-commits-parser": "cli.js" + } + }, + "node_modules/conventional-github-releaser": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/conventional-github-releaser/-/conventional-github-releaser-1.1.13.tgz", + "integrity": "sha1-C+ezp8eGfoiL5SZHWlkP9ZMDUXw=", + "dev": true, + "dependencies": { + "conventional-changelog": "^1.1.0", + "dateformat": "^1.0.11", + "git-semver-tags": "^1.0.0", + "github": "^0.2.4", + "lodash.merge": "^4.0.2", + "meow": "^3.3.0", + "object-assign": "^4.0.1", + "q": "^1.4.1", + "semver": "^5.0.1", + "semver-regex": "^1.0.0", + "through2": "^2.0.0" + }, + "bin": { + "conventional-github-releaser": "src/cli.js" + }, + "engines": { + "node": ">=4.2.0", + "npm": ">=2.1.9" + } + }, + "node_modules/conventional-github-releaser/node_modules/camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/conventional-github-releaser/node_modules/camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "dev": true, + "dependencies": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/conventional-github-releaser/node_modules/dateformat": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", + "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=", + "dev": true, + "dependencies": { + "get-stdin": "^4.0.1", + "meow": "^3.3.0" + }, + "bin": { + "dateformat": "bin/cli.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/conventional-github-releaser/node_modules/indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "dependencies": { + "repeating": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/conventional-github-releaser/node_modules/map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/conventional-github-releaser/node_modules/meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "dev": true, + "dependencies": { + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/conventional-github-releaser/node_modules/redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "dev": true, + "dependencies": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/conventional-github-releaser/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/conventional-github-releaser/node_modules/strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "dev": true, + "dependencies": { + "get-stdin": "^4.0.1" + }, + "bin": { + "strip-indent": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/conventional-github-releaser/node_modules/trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cssom": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", + "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", + "dev": true + }, + "node_modules/cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dev": true, + "dependencies": { + "cssom": "~0.3.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + }, + "node_modules/currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "dev": true, + "dependencies": { + "array-find-index": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dargs": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-4.1.0.tgz", + "integrity": "sha1-A6nbtLXC8Tm/FK5T8LiipqhvThc=", + "dev": true, + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/data-urls": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.1.tgz", + "integrity": "sha512-Ds554NeT5Gennfoo9KN50Vh6tpgtvYEwraYjejXnyTpu1C7oXKxdFk75REooENHE8ndTVOJuv+BEs4/J/xcozw==", + "dev": true, + "dependencies": { + "abab": "^2.0.3", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^10.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/date-now": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", + "dev": true + }, + "node_modules/dateformat": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", + "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decamelize-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", + "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", + "dev": true, + "dependencies": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decamelize-keys/node_modules/map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decimal.js": { + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz", + "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==", + "dev": true + }, + "node_modules/deep-eql": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "dev": true, + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dev": true, + "dependencies": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + } + }, + "node_modules/dom-serializer/node_modules/domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/dom-serializer/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true + }, + "node_modules/domexception": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", + "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", + "dev": true, + "dependencies": { + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/domhandler": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", + "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=", + "dev": true, + "dependencies": { + "domelementtype": "1" + } + }, + "node_modules/domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "dev": true, + "dependencies": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "node_modules/dot-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-3.0.0.tgz", + "integrity": "sha1-G3CK8JSknJoOfbyteQq6U52sEXc=", + "dev": true, + "dependencies": { + "is-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/entities": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", + "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=", + "dev": true + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/escodegen": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", + "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", + "dev": true, + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/escodegen/node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/escodegen/node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/eslint": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.10.0.tgz", + "integrity": "sha512-tcI1D9lfVec+R4LE1mNDnzoJ/f71Kl/9Cv4nG47jOueCMBrCCKYXr4AUVS7go6mWYGFD4+EoN6+eXSrEbRzXVw==", + "dev": true, + "dependencies": { + "@eslint/eslintrc": "^1.2.0", + "@humanwhocodes/config-array": "^0.9.2", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.1.1", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.3.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^6.0.1", + "globals": "^13.6.0", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "regexpp": "^3.2.0", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-scope": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" + } + }, + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/eslint/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/espree": { + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.1.tgz", + "integrity": "sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ==", + "dev": true, + "dependencies": { + "acorn": "^8.7.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eventemitter2": { + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz", + "integrity": "sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas=", + "dev": true + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "dev": true, + "dependencies": { + "homedir-polyfill": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "node_modules/figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/figures/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/findup-sync": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz", + "integrity": "sha1-N5MKpdgWt3fANEXhlmzGeQpMCxY=", + "dev": true, + "dependencies": { + "glob": "~5.0.0" + }, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/findup-sync/node_modules/glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "dev": true, + "dependencies": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/fined": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", + "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", + "dev": true, + "dependencies": { + "expand-tilde": "^2.0.2", + "is-plain-object": "^2.0.3", + "object.defaults": "^1.1.0", + "object.pick": "^1.2.0", + "parse-filepath": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/flagged-respawn": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", + "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "bin": { + "flat": "cli.js" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", + "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", + "dev": true + }, + "node_modules/for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "dev": true, + "dependencies": { + "for-in": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/get-pkg-repo": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-1.4.0.tgz", + "integrity": "sha1-xztInAbYDMVTbCyFP54FIyBWly0=", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "meow": "^3.3.0", + "normalize-package-data": "^2.3.0", + "parse-github-repo-url": "^1.3.0", + "through2": "^2.0.0" + }, + "bin": { + "get-pkg-repo": "cli.js" + } + }, + "node_modules/get-pkg-repo/node_modules/camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/get-pkg-repo/node_modules/camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "dev": true, + "dependencies": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/get-pkg-repo/node_modules/indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "dependencies": { + "repeating": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/get-pkg-repo/node_modules/map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/get-pkg-repo/node_modules/meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "dev": true, + "dependencies": { + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/get-pkg-repo/node_modules/redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "dev": true, + "dependencies": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/get-pkg-repo/node_modules/strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "dev": true, + "dependencies": { + "get-stdin": "^4.0.1" + }, + "bin": { + "strip-indent": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/get-pkg-repo/node_modules/trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/getobject": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/getobject/-/getobject-1.0.2.tgz", + "integrity": "sha512-2zblDBaFcb3rB4rF77XVnuINOE2h2k/OnqXAiy0IrTxUfV1iFp3la33oAQVY9pCpWU268WFYVt2t71hlMuLsOg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/git-raw-commits": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-1.3.6.tgz", + "integrity": "sha512-svsK26tQ8vEKnMshTDatSIQSMDdz8CxIIqKsvPqbtV23Etmw6VNaFAitu8zwZ0VrOne7FztwPyRLxK7/DIUTQg==", + "dev": true, + "dependencies": { + "dargs": "^4.0.1", + "lodash.template": "^4.0.2", + "meow": "^4.0.0", + "split2": "^2.0.0", + "through2": "^2.0.0" + }, + "bin": { + "git-raw-commits": "cli.js" + } + }, + "node_modules/git-remote-origin-url": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz", + "integrity": "sha1-UoJlna4hBxRaERJhEq0yFuxfpl8=", + "dev": true, + "dependencies": { + "gitconfiglocal": "^1.0.0", + "pify": "^2.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/git-semver-tags": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-1.3.6.tgz", + "integrity": "sha512-2jHlJnln4D/ECk9FxGEBh3k44wgYdWjWDtMmJPaecjoRmxKo3Y1Lh8GMYuOPu04CHw86NTAODchYjC5pnpMQig==", + "dev": true, + "dependencies": { + "meow": "^4.0.0", + "semver": "^5.5.0" + }, + "bin": { + "git-semver-tags": "cli.js" + } + }, + "node_modules/git-semver-tags/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/gitconfiglocal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz", + "integrity": "sha1-QdBF84UaXqiPA/JMocYXgRRGS5s=", + "dev": true, + "dependencies": { + "ini": "^1.3.2" + } + }, + "node_modules/github": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/github/-/github-0.2.4.tgz", + "integrity": "sha1-JPp/DhP6EblGr5ETTFGYKpHOU4s=", + "deprecated": "'github' has been renamed to '@octokit/rest' (https://git.io/vNB11)", + "dev": true, + "dependencies": { + "mime": "^1.2.11" + } + }, + "node_modules/glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "dependencies": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "dev": true, + "dependencies": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/globals": { + "version": "13.12.1", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.1.tgz", + "integrity": "sha512-317dFlgY2pdJZ9rspXDks7073GpDmXdfbM3vYYp0HAMKGDh1FfWPleI2ljVNLQX5M5lXcAslTcPTrOrMEFOjyw==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.9", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", + "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==", + "dev": true + }, + "node_modules/growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true, + "engines": { + "node": ">=4.x" + } + }, + "node_modules/grunt": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.4.1.tgz", + "integrity": "sha512-ZXIYXTsAVrA7sM+jZxjQdrBOAg7DyMUplOMhTaspMRExei+fD0BTwdWXnn0W5SXqhb/Q/nlkzXclSi3IH55PIA==", + "dev": true, + "dependencies": { + "dateformat": "~3.0.3", + "eventemitter2": "~0.4.13", + "exit": "~0.1.2", + "findup-sync": "~0.3.0", + "glob": "~7.1.6", + "grunt-cli": "~1.4.2", + "grunt-known-options": "~2.0.0", + "grunt-legacy-log": "~3.0.0", + "grunt-legacy-util": "~2.0.1", + "iconv-lite": "~0.4.13", + "js-yaml": "~3.14.0", + "minimatch": "~3.0.4", + "mkdirp": "~1.0.4", + "nopt": "~3.0.6", + "rimraf": "~3.0.2" + }, + "bin": { + "grunt": "bin/grunt" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/grunt-cli": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.4.3.tgz", + "integrity": "sha512-9Dtx/AhVeB4LYzsViCjUQkd0Kw0McN2gYpdmGYKtE2a5Yt7v1Q+HYZVWhqXc/kGnxlMtqKDxSwotiGeFmkrCoQ==", + "dev": true, + "dependencies": { + "grunt-known-options": "~2.0.0", + "interpret": "~1.1.0", + "liftup": "~3.0.1", + "nopt": "~4.0.1", + "v8flags": "~3.2.0" + }, + "bin": { + "grunt": "bin/grunt" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/grunt-cli/node_modules/nopt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", + "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", + "dev": true, + "dependencies": { + "abbrev": "1", + "osenv": "^0.1.4" + }, + "bin": { + "nopt": "bin/nopt.js" + } + }, + "node_modules/grunt-contrib-clean": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/grunt-contrib-clean/-/grunt-contrib-clean-2.0.0.tgz", + "integrity": "sha512-g5ZD3ORk6gMa5ugZosLDQl3dZO7cI3R14U75hTM+dVLVxdMNJCPVmwf9OUt4v4eWgpKKWWoVK9DZc1amJp4nQw==", + "dev": true, + "dependencies": { + "async": "^2.6.1", + "rimraf": "^2.6.2" + }, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "grunt": ">=0.4.5" + } + }, + "node_modules/grunt-contrib-clean/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/grunt-contrib-concat": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/grunt-contrib-concat/-/grunt-contrib-concat-2.0.0.tgz", + "integrity": "sha512-/cfWwsGiprVTOl7c2bZwMdQ8hIf3e1f4szm1i7qhY9hOnR/X2KL+Xe7dynNweTYHa6aWPZx2B5GPsUpxAXNCaA==", + "dev": true, + "dependencies": { + "chalk": "^4.1.2", + "source-map": "^0.5.3" + }, + "engines": { + "node": ">=0.12.0" + }, + "peerDependencies": { + "grunt": ">=1.4.1" + } + }, + "node_modules/grunt-contrib-jshint": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/grunt-contrib-jshint/-/grunt-contrib-jshint-3.2.0.tgz", + "integrity": "sha512-pcXWCSZWfoMSvcV4BwH21TUtLtcX0Ms8IGuOPIcLeXK3fud9KclY7iqMKY94jFx8TxZzh028YYtpR+io8DiEaQ==", + "dev": true, + "dependencies": { + "chalk": "~4.1.2", + "hooker": "^0.2.3", + "jshint": "~2.13.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/grunt-contrib-uglify": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/grunt-contrib-uglify/-/grunt-contrib-uglify-5.0.1.tgz", + "integrity": "sha512-T/aXZ4WIpAtoswZqb6HROKg7uq9QbKwl+lUuOwK4eoFj3tFv9/a/oMyd3/qvetV29Pbf8P1YYda1gDwZppr60A==", + "dev": true, + "dependencies": { + "chalk": "^2.4.1", + "maxmin": "^2.1.0", + "uglify-js": "^3.13.3", + "uri-path": "^1.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/grunt-contrib-uglify/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/grunt-contrib-uglify/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/grunt-contrib-uglify/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/grunt-contrib-uglify/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/grunt-contrib-uglify/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/grunt-contrib-uglify/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/grunt-contrib-uglify/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/grunt-conventional-changelog": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/grunt-conventional-changelog/-/grunt-conventional-changelog-6.1.0.tgz", + "integrity": "sha1-mL1b37Kw3mMWwFx8b6ykziTdFDU=", + "dev": true, + "dependencies": { + "chalk": "^1.1.0", + "concat-stream": "^1.5.0", + "conventional-changelog": "^1.1.0", + "plur": "^2.0.0", + "q": "^1.4.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/grunt-conventional-changelog/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/grunt-conventional-changelog/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/grunt-conventional-changelog/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/grunt-conventional-changelog/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/grunt-conventional-changelog/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/grunt-conventional-changelog/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/grunt-conventional-github-releaser": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/grunt-conventional-github-releaser/-/grunt-conventional-github-releaser-1.0.0.tgz", + "integrity": "sha1-7Tbg9V1orq6FrxSEBsPXAYJnuHU=", + "dev": true, + "dependencies": { + "chalk": "^1.1.0", + "conventional-github-releaser": "^1.1.0", + "plur": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/grunt-conventional-github-releaser/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/grunt-conventional-github-releaser/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/grunt-conventional-github-releaser/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/grunt-conventional-github-releaser/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/grunt-conventional-github-releaser/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/grunt-conventional-github-releaser/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/grunt-endline": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/grunt-endline/-/grunt-endline-0.7.0.tgz", + "integrity": "sha512-NP2ABzCRBpuNfKgteVSEOR26zsph0oEFPVvEmSldkvxBHeSpUPOpIVxvrDnRHyKoV9hBuszGvVjHovjnG3aUBw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/grunt-eslint": { + "version": "24.0.0", + "resolved": "https://registry.npmjs.org/grunt-eslint/-/grunt-eslint-24.0.0.tgz", + "integrity": "sha512-WpTeBBFweyhMuPjGwRSQV9JFJ+EczIdlsc7Dd/1g78QVI1aZsk4g/H3e+3S5HEwsS1RKL2YZIrGj8hMLlBfN8w==", + "dev": true, + "dependencies": { + "chalk": "^4.1.2", + "eslint": "^8.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + }, + "peerDependencies": { + "grunt": ">=1" + } + }, + "node_modules/grunt-known-options": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-2.0.0.tgz", + "integrity": "sha512-GD7cTz0I4SAede1/+pAbmJRG44zFLPipVtdL9o3vqx9IEyb7b4/Y3s7r6ofI3CchR5GvYJ+8buCSioDv5dQLiA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/grunt-legacy-log": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-3.0.0.tgz", + "integrity": "sha512-GHZQzZmhyq0u3hr7aHW4qUH0xDzwp2YXldLPZTCjlOeGscAOWWPftZG3XioW8MasGp+OBRIu39LFx14SLjXRcA==", + "dev": true, + "dependencies": { + "colors": "~1.1.2", + "grunt-legacy-log-utils": "~2.1.0", + "hooker": "~0.2.3", + "lodash": "~4.17.19" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/grunt-legacy-log-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-2.1.0.tgz", + "integrity": "sha512-lwquaPXJtKQk0rUM1IQAop5noEpwFqOXasVoedLeNzaibf/OPWjKYvvdqnEHNmU+0T0CaReAXIbGo747ZD+Aaw==", + "dev": true, + "dependencies": { + "chalk": "~4.1.0", + "lodash": "~4.17.19" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/grunt-legacy-util": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-2.0.1.tgz", + "integrity": "sha512-2bQiD4fzXqX8rhNdXkAywCadeqiPiay0oQny77wA2F3WF4grPJXCvAcyoWUJV+po/b15glGkxuSiQCK299UC2w==", + "dev": true, + "dependencies": { + "async": "~3.2.0", + "exit": "~0.1.2", + "getobject": "~1.0.0", + "hooker": "~0.2.3", + "lodash": "~4.17.21", + "underscore.string": "~3.3.5", + "which": "~2.0.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/grunt-legacy-util/node_modules/async": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", + "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==", + "dev": true + }, + "node_modules/grunt-simple-mocha": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/grunt-simple-mocha/-/grunt-simple-mocha-0.4.1.tgz", + "integrity": "sha1-V5RJJJ6vCoGHj6cvPtq1FF1F/Xc=", + "dev": true, + "dependencies": { + "mocha": "*" + }, + "bin": { + "grunt-simple-mocha": "bin/grunt-simple-mocha" + }, + "engines": { + "node": "*" + } + }, + "node_modules/gzip-size": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-3.0.0.tgz", + "integrity": "sha1-VGGI6b3DN/Zzdy+BZgRks4nc5SA=", + "dev": true, + "dependencies": { + "duplexer": "^0.1.1" + }, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/handlebars": { + "version": "4.7.7", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", + "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.0", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/handlebars/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-ansi/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "dependencies": { + "parse-passwd": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/hooker": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz", + "integrity": "sha1-uDT3I8xKJCqmWWNFnfbZhMXT2Vk=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/html-encoding-sniffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", + "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", + "dev": true, + "dependencies": { + "whatwg-encoding": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/htmlparser2": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", + "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=", + "dev": true, + "dependencies": { + "domelementtype": "1", + "domhandler": "2.3", + "domutils": "1.5", + "entities": "1.0", + "readable-stream": "1.1" + } + }, + "node_modules/htmlparser2/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "node_modules/htmlparser2/node_modules/readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/htmlparser2/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "dev": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", + "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "node_modules/interpret": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", + "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", + "dev": true + }, + "node_modules/irregular-plurals": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-1.4.0.tgz", + "integrity": "sha1-LKmwM2UREYVUEvFr5dd8YqRYp2Y=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "dev": true, + "dependencies": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", + "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finite": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", + "dev": true, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true + }, + "node_modules/is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "dev": true, + "dependencies": { + "is-unc-path": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-subset": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-subset/-/is-subset-0.1.1.tgz", + "integrity": "sha1-ilkRfZMt4d4A8kX83TnOQ/HpOaY=", + "dev": true + }, + "node_modules/is-text-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", + "integrity": "sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4=", + "dev": true, + "dependencies": { + "text-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "dev": true, + "dependencies": { + "unc-path-regex": "^0.1.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsdom": { + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-19.0.0.tgz", + "integrity": "sha512-RYAyjCbxy/vri/CfnjUWJQQtZ3LKlLnDqj+9XLNnJPgEGeirZs3hllKR20re8LUZ6o1b1X4Jat+Qd26zmP41+A==", + "dev": true, + "dependencies": { + "abab": "^2.0.5", + "acorn": "^8.5.0", + "acorn-globals": "^6.0.0", + "cssom": "^0.5.0", + "cssstyle": "^2.3.0", + "data-urls": "^3.0.1", + "decimal.js": "^10.3.1", + "domexception": "^4.0.0", + "escodegen": "^2.0.0", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^3.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^2.0.0", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^10.0.0", + "ws": "^8.2.3", + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jshint": { + "version": "2.13.4", + "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.13.4.tgz", + "integrity": "sha512-HO3bosL84b2qWqI0q+kpT/OpRJwo0R4ivgmxaO848+bo10rc50SkPnrtwSFXttW0ym4np8jbJvLwk5NziB7jIw==", + "dev": true, + "dependencies": { + "cli": "~1.0.0", + "console-browserify": "1.1.x", + "exit": "0.1.x", + "htmlparser2": "3.8.x", + "lodash": "~4.17.21", + "minimatch": "~3.0.2", + "strip-json-comments": "1.0.x" + }, + "bin": { + "jshint": "bin/jshint" + } + }, + "node_modules/jshint/node_modules/strip-json-comments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", + "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=", + "dev": true, + "bin": { + "strip-json-comments": "cli.js" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "node_modules/jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "dev": true, + "engines": [ + "node >= 0.2.0" + ] + }, + "node_modules/JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dev": true, + "dependencies": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + }, + "bin": { + "JSONStream": "bin.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/just-extend": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", + "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", + "dev": true + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/liftup": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/liftup/-/liftup-3.0.1.tgz", + "integrity": "sha512-yRHaiQDizWSzoXk3APcA71eOI/UuhEkNN9DiW2Tt44mhYzX4joFoCZlxsSOF7RyeLlfqzFLQI1ngFq3ggMPhOw==", + "dev": true, + "dependencies": { + "extend": "^3.0.2", + "findup-sync": "^4.0.0", + "fined": "^1.2.0", + "flagged-respawn": "^1.0.1", + "is-plain-object": "^2.0.4", + "object.map": "^1.0.1", + "rechoir": "^0.7.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/liftup/node_modules/findup-sync": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-4.0.0.tgz", + "integrity": "sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==", + "dev": true, + "dependencies": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^4.0.2", + "resolve-dir": "^1.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/load-grunt-tasks": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/load-grunt-tasks/-/load-grunt-tasks-5.1.0.tgz", + "integrity": "sha512-oNj0Jlka1TsfDe+9He0kcA1cRln+TMoTsEByW7ij6kyktNLxBKJtslCFEvFrLC2Dj0S19IWJh3fOCIjLby2Xrg==", + "dev": true, + "dependencies": { + "arrify": "^2.0.1", + "multimatch": "^4.0.0", + "pkg-up": "^3.1.0", + "resolve-pkg": "^2.0.0" + }, + "engines": { + "node": ">=8" + }, + "peerDependencies": { + "grunt": ">=1" + } + }, + "node_modules/load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", + "dev": true + }, + "node_modules/lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", + "dev": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/lodash.template": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", + "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", + "dev": true, + "dependencies": { + "lodash._reinterpolate": "^3.0.0", + "lodash.templatesettings": "^4.0.0" + } + }, + "node_modules/lodash.templatesettings": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", + "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", + "dev": true, + "dependencies": { + "lodash._reinterpolate": "^3.0.0" + } + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "dev": true, + "dependencies": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/loupe": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.4.tgz", + "integrity": "sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ==", + "dev": true, + "dependencies": { + "get-func-name": "^2.0.0" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-iterator": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", + "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/map-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", + "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/maxmin": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/maxmin/-/maxmin-2.1.0.tgz", + "integrity": "sha1-TTsiCQPZXu5+t6x/qGTnLcCaMWY=", + "dev": true, + "dependencies": { + "chalk": "^1.0.0", + "figures": "^1.0.1", + "gzip-size": "^3.0.0", + "pretty-bytes": "^3.0.0" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/maxmin/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/maxmin/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/maxmin/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/maxmin/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/maxmin/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/maxmin/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/meow": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.1.tgz", + "integrity": "sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A==", + "dev": true, + "dependencies": { + "camelcase-keys": "^4.0.0", + "decamelize-keys": "^1.0.0", + "loud-rejection": "^1.0.0", + "minimist": "^1.1.3", + "minimist-options": "^3.0.1", + "normalize-package-data": "^2.3.4", + "read-pkg-up": "^3.0.0", + "redent": "^2.0.0", + "trim-newlines": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/meow/node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/meow/node_modules/load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/meow/node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/meow/node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/meow/node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/meow/node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/meow/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/meow/node_modules/path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/meow/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/meow/node_modules/read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "dependencies": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/meow/node_modules/read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", + "dev": true, + "dependencies": { + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/meow/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.51.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", + "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.34", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", + "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", + "dev": true, + "dependencies": { + "mime-db": "1.51.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", + "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "node_modules/minimist-options": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", + "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", + "dev": true, + "dependencies": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/minimist-options/node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.2.1.tgz", + "integrity": "sha512-T7uscqjJVS46Pq1XDXyo9Uvey9gd3huT/DD9cYBb4K2Xc/vbKRPUWK067bxDQRK0yIz6Jxk73IrnimvASzBNAQ==", + "dev": true, + "dependencies": { + "@ungap/promise-all-settled": "1.1.2", + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.3", + "debug": "4.3.3", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.2.0", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "3.0.4", + "ms": "2.1.3", + "nanoid": "3.2.0", + "serialize-javascript": "6.0.0", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "which": "2.0.2", + "workerpool": "6.2.0", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mochajs" + } + }, + "node_modules/mocha/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/mocha/node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/mocha/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/mocha/node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mocha/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/mocha/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/modify-values": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz", + "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/multimatch": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-4.0.0.tgz", + "integrity": "sha512-lDmx79y1z6i7RNx0ZGCPq1bzJ6ZoDDKbvh7jxr9SJcWLkShMzXrHbYVpTdnhNM5MXpDUxCQ4DgqVttVXlBgiBQ==", + "dev": true, + "dependencies": { + "@types/minimatch": "^3.0.3", + "array-differ": "^3.0.0", + "array-union": "^2.1.0", + "arrify": "^2.0.1", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nanoid": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.2.0.tgz", + "integrity": "sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA==", + "dev": true, + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "node_modules/nise": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.1.tgz", + "integrity": "sha512-yr5kW2THW1AkxVmCnKEh4nbYkJdB3I7LUkiUgOvEkOp414mc2UMaHMA7pjq1nYowhdoJZGwEKGaQVbxfpWj10A==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.8.3", + "@sinonjs/fake-timers": ">=5", + "@sinonjs/text-encoding": "^0.7.1", + "just-extend": "^4.0.2", + "path-to-regexp": "^1.7.0" + } + }, + "node_modules/nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "dev": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + } + }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nwsapi": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", + "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", + "dev": true + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.defaults": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", + "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", + "dev": true, + "dependencies": { + "array-each": "^1.0.1", + "array-slice": "^1.0.0", + "for-own": "^1.0.0", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", + "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", + "dev": true, + "dependencies": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "dev": true, + "dependencies": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-filepath": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", + "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", + "dev": true, + "dependencies": { + "is-absolute": "^1.0.0", + "map-cache": "^0.2.0", + "path-root": "^0.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/parse-github-repo-url": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/parse-github-repo-url/-/parse-github-repo-url-1.4.1.tgz", + "integrity": "sha1-nn2LslKmy2ukJZUGC3v23z28H1A=", + "dev": true + }, + "node_modules/parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "dependencies": { + "error-ex": "^1.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-root": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", + "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", + "dev": true, + "dependencies": { + "path-root-regex": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-root-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", + "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "dev": true, + "dependencies": { + "isarray": "0.0.1" + } + }, + "node_modules/path-to-regexp/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "node_modules/path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "dependencies": { + "pinkie": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pkg-up": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "dev": true, + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-up/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-up/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/plur": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/plur/-/plur-2.1.2.tgz", + "integrity": "sha1-dIJFLBoPUI4+NE6uwxLJHCncZVo=", + "dev": true, + "dependencies": { + "irregular-plurals": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/pretty-bytes": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-3.0.1.tgz", + "integrity": "sha1-J9AAjXeAY6C0gRuzXHnxvV1fvM8=", + "dev": true, + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "node_modules/psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "dev": true + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "dev": true, + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/quick-lru": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", + "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/quiet-grunt": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/quiet-grunt/-/quiet-grunt-0.2.3.tgz", + "integrity": "sha1-8JCJeal9JCrC2NbuvP5Vj1nAYYQ=", + "dev": true + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "dependencies": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "dependencies": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg-up/node_modules/find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "dependencies": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg-up/node_modules/path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "dependencies": { + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/rechoir": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", + "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", + "dev": true, + "dependencies": { + "resolve": "^1.9.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/redent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", + "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", + "dev": true, + "dependencies": { + "indent-string": "^3.0.0", + "strip-indent": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "dependencies": { + "is-finite": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", + "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.8.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "dev": true, + "dependencies": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg/-/resolve-pkg-2.0.0.tgz", + "integrity": "sha512-+1lzwXehGCXSeryaISr6WujZzowloigEofRB+dj75y9RRa/obVcYgbHJd53tdYw8pvZj8GojXaaENws8Ktw/hQ==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-pkg/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "dev": true, + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-1.0.0.tgz", + "integrity": "sha1-kqSWkGX5xwxpR1PVUkj8aPj2Usk=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/semver-sort": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/semver-sort/-/semver-sort-0.0.4.tgz", + "integrity": "sha1-NP293GprK0FhOYw8TbpWJDv+qos=", + "dev": true, + "dependencies": { + "semver": "^5.0.3", + "semver-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/semver-sort/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/sinon": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-13.0.1.tgz", + "integrity": "sha512-8yx2wIvkBjIq/MGY1D9h1LMraYW+z1X0mb648KZnKSdvLasvDu7maa0dFaNYdTDczFgbjNw2tOmWdTk9saVfwQ==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.8.3", + "@sinonjs/fake-timers": "^9.0.0", + "@sinonjs/samsam": "^6.1.1", + "diff": "^5.0.0", + "nise": "^5.1.1", + "supports-color": "^7.2.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/sinon" + } + }, + "node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz", + "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==", + "dev": true + }, + "node_modules/split": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", + "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", + "dev": true, + "dependencies": { + "through": "2" + }, + "engines": { + "node": "*" + } + }, + "node_modules/split2": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-2.2.0.tgz", + "integrity": "sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw==", + "dev": true, + "dependencies": { + "through2": "^2.0.2" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "dependencies": { + "is-utf8": "^0.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-indent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", + "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true + }, + "node_modules/text-extensions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", + "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tough-cookie": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", + "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", + "dev": true, + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.1.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tr46": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", + "dev": true, + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/trim-newlines": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", + "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/trim-off-newlines": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/trim-off-newlines/-/trim-off-newlines-1.0.3.tgz", + "integrity": "sha512-kh6Tu6GbeSNMGfrrZh6Bb/4ZEHV1QlB4xNDBeog8Y9/QwFlKTRyWvY3Fs9tRDAMZliVUwieMgEdIeL/FtqjkJg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "node_modules/uglify-js": { + "version": "3.15.2", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.15.2.tgz", + "integrity": "sha512-peeoTk3hSwYdoc9nrdiEJk+gx1ALCtTjdYuKSXMTDqq7n1W7dHPqWDdSi+BPL0ni2YMeHD7hKUSdbj3TZauY2A==", + "dev": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/underscore.string": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.6.tgz", + "integrity": "sha512-VoC83HWXmCrF6rgkyxS9GHv8W9Q5nhMKho+OadDJGzL2oDYbYEppBaCMH6pFlwLeqj2QS+hhkw2kpXkSdD1JxQ==", + "dev": true, + "dependencies": { + "sprintf-js": "^1.1.1", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": "*" + } + }, + "node_modules/underscore.string/node_modules/sprintf-js": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", + "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", + "dev": true + }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/uri-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/uri-path/-/uri-path-1.0.0.tgz", + "integrity": "sha1-l0fwGDWJM8Md4PzP2C0TjmcmLjI=", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "node_modules/v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, + "node_modules/v8flags": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz", + "integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==", + "dev": true, + "dependencies": { + "homedir-polyfill": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "dev": true, + "dependencies": { + "browser-process-hrtime": "^1.0.0" + } + }, + "node_modules/w3c-xmlserializer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-3.0.0.tgz", + "integrity": "sha512-3WFqGEgSXIyGhOmAFtlicJNMjEps8b1MG31NCA0/vOF9+nKMUW1ckhi9cnNHmf88Rzw5V+dwIwsm2C7X8k9aQg==", + "dev": true, + "dependencies": { + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", + "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", + "dev": true, + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/whatwg-mimetype": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", + "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-url": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-10.0.0.tgz", + "integrity": "sha512-CLxxCmdUby142H5FZzn4D8ikO1cmypvXVQktsgosNy4a4BHrDHeciBBGZhb0bNoR5/MltoCatso+vFjjGx8t0w==", + "dev": true, + "dependencies": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + }, + "node_modules/workerpool": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.0.tgz", + "integrity": "sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==", + "dev": true + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "node_modules/ws": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", + "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xml-name-validator": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "dependencies": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-unparser/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yargs-unparser/node_modules/decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yargs-unparser/node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + }, + "dependencies": { + "@eslint/eslintrc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.0.tgz", + "integrity": "sha512-igm9SjJHNEJRiUnecP/1R5T3wKLEJ7pL6e2P+GUSfCd0dGjPYYZve08uzw8L2J8foVHFz+NGu12JxRcU2gGo6w==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.3.1", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + } + } + }, + "@humanwhocodes/config-array": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz", + "integrity": "sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + } + }, + "@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "@sinonjs/commons": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", + "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + }, + "@sinonjs/fake-timers": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.0.tgz", + "integrity": "sha512-M8vapsv9qQupMdzrVzkn5rb9jG7aUTEPAZdMtME2PuBaefksFZVE2C1g4LBRTkF/k3nRDNbDc5tp5NFC1PEYxA==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.7.0" + } + }, + "@sinonjs/samsam": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-6.1.1.tgz", + "integrity": "sha512-cZ7rKJTLiE7u7Wi/v9Hc2fs3Ucc3jrWeMgPHbbTCeVAB2S0wOBbYlkJVeNSL04i7fdhT8wIbDq1zhC/PXTD2SA==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.6.0", + "lodash.get": "^4.4.2", + "type-detect": "^4.0.8" + } + }, + "@sinonjs/text-encoding": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz", + "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==", + "dev": true + }, + "@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true + }, + "@types/minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", + "dev": true + }, + "@ungap/promise-all-settled": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", + "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", + "dev": true + }, + "abab": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", + "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", + "dev": true + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "acorn": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", + "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", + "dev": true + }, + "acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "dev": true, + "requires": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + }, + "dependencies": { + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + } + } + }, + "acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "requires": {} + }, + "acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true + }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "requires": { + "debug": "4" + } + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "array-differ": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-3.0.0.tgz", + "integrity": "sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==", + "dev": true + }, + "array-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", + "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", + "dev": true + }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "dev": true + }, + "array-ify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", + "integrity": "sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4=", + "dev": true + }, + "array-slice": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", + "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", + "dev": true + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", + "dev": true + }, + "assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true + }, + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "dev": true + }, + "browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "camelcase-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", + "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", + "dev": true, + "requires": { + "camelcase": "^4.1.0", + "map-obj": "^2.0.0", + "quick-lru": "^1.0.0" + } + }, + "chai": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.6.tgz", + "integrity": "sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q==", + "dev": true, + "requires": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^3.0.1", + "get-func-name": "^2.0.0", + "loupe": "^2.3.1", + "pathval": "^1.1.1", + "type-detect": "^4.0.5" + } + }, + "chai-match": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/chai-match/-/chai-match-1.1.1.tgz", + "integrity": "sha1-OfsKLmt8j2OG3P6tSNFIqRX6bEY=", + "dev": true + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", + "dev": true + }, + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "dependencies": { + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + } + } + }, + "cli": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz", + "integrity": "sha1-IoF1NPJL+klQw01TLUjsvGIbjBQ=", + "dev": true, + "requires": { + "exit": "0.1.2", + "glob": "^7.1.1" + } + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "colors": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", + "dev": true + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.0.0.tgz", + "integrity": "sha512-JJfP2saEKbQqvW+FI93OYUB4ByV5cizMpFMiiJI8xDbBvQvSkIk0VvQdn1CZ8mqAO8Loq2h0gYTYtDFUZUeERw==" + }, + "compare-func": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-1.3.4.tgz", + "integrity": "sha512-sq2sWtrqKPkEXAC8tEJA1+BqAH9GbFkGBtUOqrUX57VSfwp8xyktctk+uLoRy5eccTdxzDcVIztlYDpKs3Jv1Q==", + "dev": true, + "requires": { + "array-ify": "^1.0.0", + "dot-prop": "^3.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "console-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "dev": true, + "requires": { + "date-now": "^0.1.4" + } + }, + "conventional-changelog": { + "version": "1.1.24", + "resolved": "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-1.1.24.tgz", + "integrity": "sha512-2WcSUst4Y3Z4hHvoMTWXMJr/DmgVdLiMOVY1Kak2LfFz+GIz2KDp5naqbFesYbfXPmaZ5p491dO0FWZIJoJw1Q==", + "dev": true, + "requires": { + "conventional-changelog-angular": "^1.6.6", + "conventional-changelog-atom": "^0.2.8", + "conventional-changelog-codemirror": "^0.3.8", + "conventional-changelog-core": "^2.0.11", + "conventional-changelog-ember": "^0.3.12", + "conventional-changelog-eslint": "^1.0.9", + "conventional-changelog-express": "^0.3.6", + "conventional-changelog-jquery": "^0.1.0", + "conventional-changelog-jscs": "^0.1.0", + "conventional-changelog-jshint": "^0.3.8", + "conventional-changelog-preset-loader": "^1.1.8" + } + }, + "conventional-changelog-angular": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-1.6.6.tgz", + "integrity": "sha512-suQnFSqCxRwyBxY68pYTsFkG0taIdinHLNEAX5ivtw8bCRnIgnpvcHmlR/yjUyZIrNPYAoXlY1WiEKWgSE4BNg==", + "dev": true, + "requires": { + "compare-func": "^1.3.1", + "q": "^1.5.1" + } + }, + "conventional-changelog-atom": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/conventional-changelog-atom/-/conventional-changelog-atom-0.2.8.tgz", + "integrity": "sha512-8pPZqhMbrnltNBizjoDCb/Sz85KyUXNDQxuAEYAU5V/eHn0okMBVjqc8aHWYpHrytyZWvMGbayOlDv7i8kEf6g==", + "dev": true, + "requires": { + "q": "^1.5.1" + } + }, + "conventional-changelog-codemirror": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/conventional-changelog-codemirror/-/conventional-changelog-codemirror-0.3.8.tgz", + "integrity": "sha512-3HFZKtBXTaUCHvz7ai6nk2+psRIkldDoNzCsom0egDtVmPsvvHZkzjynhdQyULfacRSsBTaiQ0ol6nBOL4dDiQ==", + "dev": true, + "requires": { + "q": "^1.5.1" + } + }, + "conventional-changelog-core": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-2.0.11.tgz", + "integrity": "sha512-HvTE6RlqeEZ/NFPtQeFLsIDOLrGP3bXYr7lFLMhCVsbduF1MXIe8OODkwMFyo1i9ku9NWBwVnVn0jDmIFXjDRg==", + "dev": true, + "requires": { + "conventional-changelog-writer": "^3.0.9", + "conventional-commits-parser": "^2.1.7", + "dateformat": "^3.0.0", + "get-pkg-repo": "^1.0.0", + "git-raw-commits": "^1.3.6", + "git-remote-origin-url": "^2.0.0", + "git-semver-tags": "^1.3.6", + "lodash": "^4.2.1", + "normalize-package-data": "^2.3.5", + "q": "^1.5.1", + "read-pkg": "^1.1.0", + "read-pkg-up": "^1.0.1", + "through2": "^2.0.0" + } + }, + "conventional-changelog-ember": { + "version": "0.3.12", + "resolved": "https://registry.npmjs.org/conventional-changelog-ember/-/conventional-changelog-ember-0.3.12.tgz", + "integrity": "sha512-mmJzA7uzbrOqeF89dMMi6z17O07ORTXlTMArnLG9ZTX4oLaKNolUlxFUFlFm9JUoVWajVpaHQWjxH1EOQ+ARoQ==", + "dev": true, + "requires": { + "q": "^1.5.1" + } + }, + "conventional-changelog-eslint": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/conventional-changelog-eslint/-/conventional-changelog-eslint-1.0.9.tgz", + "integrity": "sha512-h87nfVh2fdk9fJIvz26wCBsbDC/KxqCc5wSlNMZbXcARtbgNbNDIF7Y7ctokFdnxkzVdaHsbINkh548T9eBA7Q==", + "dev": true, + "requires": { + "q": "^1.5.1" + } + }, + "conventional-changelog-express": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/conventional-changelog-express/-/conventional-changelog-express-0.3.6.tgz", + "integrity": "sha512-3iWVtBJZ9RnRnZveNDzOD8QRn6g6vUif0qVTWWyi5nUIAbuN1FfPVyKdAlJJfp5Im+dE8Kiy/d2SpaX/0X678Q==", + "dev": true, + "requires": { + "q": "^1.5.1" + } + }, + "conventional-changelog-jquery": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-jquery/-/conventional-changelog-jquery-0.1.0.tgz", + "integrity": "sha1-Agg5cWLjhGmG5xJztsecW1+A9RA=", + "dev": true, + "requires": { + "q": "^1.4.1" + } + }, + "conventional-changelog-jscs": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-jscs/-/conventional-changelog-jscs-0.1.0.tgz", + "integrity": "sha1-BHnrRDzH1yxYvwvPDvHURKkvDlw=", + "dev": true, + "requires": { + "q": "^1.4.1" + } + }, + "conventional-changelog-jshint": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/conventional-changelog-jshint/-/conventional-changelog-jshint-0.3.8.tgz", + "integrity": "sha512-hn9QU4ZI/5V50wKPJNPGT4gEWgiBFpV6adieILW4MaUFynuDYOvQ71EMSj3EznJyKi/KzuXpc9dGmX8njZMjig==", + "dev": true, + "requires": { + "compare-func": "^1.3.1", + "q": "^1.5.1" + } + }, + "conventional-changelog-preset-loader": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-1.1.8.tgz", + "integrity": "sha512-MkksM4G4YdrMlT2MbTsV2F6LXu/hZR0Tc/yenRrDIKRwBl/SP7ER4ZDlglqJsCzLJi4UonBc52Bkm5hzrOVCcw==", + "dev": true + }, + "conventional-changelog-writer": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-3.0.9.tgz", + "integrity": "sha512-n9KbsxlJxRQsUnK6wIBRnARacvNnN4C/nxnxCkH+B/R1JS2Fa+DiP1dU4I59mEDEjgnFaN2+9wr1P1s7GYB5/Q==", + "dev": true, + "requires": { + "compare-func": "^1.3.1", + "conventional-commits-filter": "^1.1.6", + "dateformat": "^3.0.0", + "handlebars": "^4.0.2", + "json-stringify-safe": "^5.0.1", + "lodash": "^4.2.1", + "meow": "^4.0.0", + "semver": "^5.5.0", + "split": "^1.0.0", + "through2": "^2.0.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "conventional-commits-filter": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-1.1.6.tgz", + "integrity": "sha512-KcDgtCRKJCQhyk6VLT7zR+ZOyCnerfemE/CsR3iQpzRRFbLEs0Y6rwk3mpDvtOh04X223z+1xyJ582Stfct/0Q==", + "dev": true, + "requires": { + "is-subset": "^0.1.1", + "modify-values": "^1.0.0" + } + }, + "conventional-commits-parser": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-2.1.7.tgz", + "integrity": "sha512-BoMaddIEJ6B4QVMSDu9IkVImlGOSGA1I2BQyOZHeLQ6qVOJLcLKn97+fL6dGbzWEiqDzfH4OkcveULmeq2MHFQ==", + "dev": true, + "requires": { + "is-text-path": "^1.0.0", + "JSONStream": "^1.0.4", + "lodash": "^4.2.1", + "meow": "^4.0.0", + "split2": "^2.0.0", + "through2": "^2.0.0", + "trim-off-newlines": "^1.0.0" + } + }, + "conventional-github-releaser": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/conventional-github-releaser/-/conventional-github-releaser-1.1.13.tgz", + "integrity": "sha1-C+ezp8eGfoiL5SZHWlkP9ZMDUXw=", + "dev": true, + "requires": { + "conventional-changelog": "^1.1.0", + "dateformat": "^1.0.11", + "git-semver-tags": "^1.0.0", + "github": "^0.2.4", + "lodash.merge": "^4.0.2", + "meow": "^3.3.0", + "object-assign": "^4.0.1", + "q": "^1.4.1", + "semver": "^5.0.1", + "semver-regex": "^1.0.0", + "through2": "^2.0.0" + }, + "dependencies": { + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "dev": true, + "requires": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + } + }, + "dateformat": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", + "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=", + "dev": true, + "requires": { + "get-stdin": "^4.0.1", + "meow": "^3.3.0" + } + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "requires": { + "repeating": "^2.0.0" + } + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "dev": true, + "requires": { + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" + } + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "dev": true, + "requires": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "dev": true, + "requires": { + "get-stdin": "^4.0.1" + } + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "dev": true + } + } + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "cssom": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", + "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", + "dev": true + }, + "cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dev": true, + "requires": { + "cssom": "~0.3.6" + }, + "dependencies": { + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + } + } + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "dev": true, + "requires": { + "array-find-index": "^1.0.1" + } + }, + "dargs": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-4.1.0.tgz", + "integrity": "sha1-A6nbtLXC8Tm/FK5T8LiipqhvThc=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "data-urls": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.1.tgz", + "integrity": "sha512-Ds554NeT5Gennfoo9KN50Vh6tpgtvYEwraYjejXnyTpu1C7oXKxdFk75REooENHE8ndTVOJuv+BEs4/J/xcozw==", + "dev": true, + "requires": { + "abab": "^2.0.3", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^10.0.0" + } + }, + "date-now": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", + "dev": true + }, + "dateformat": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", + "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", + "dev": true + }, + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decamelize-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", + "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", + "dev": true, + "requires": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "dependencies": { + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + } + } + }, + "decimal.js": { + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz", + "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==", + "dev": true + }, + "deep-eql": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "dev": true, + "requires": { + "type-detect": "^4.0.0" + } + }, + "deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", + "dev": true + }, + "diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "dev": true + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + }, + "dependencies": { + "domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "dev": true + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true + } + } + }, + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true + }, + "domexception": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", + "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", + "dev": true, + "requires": { + "webidl-conversions": "^7.0.0" + } + }, + "domhandler": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", + "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=", + "dev": true, + "requires": { + "domelementtype": "1" + } + }, + "domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "dev": true, + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "dot-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-3.0.0.tgz", + "integrity": "sha1-G3CK8JSknJoOfbyteQq6U52sEXc=", + "dev": true, + "requires": { + "is-obj": "^1.0.0" + } + }, + "duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "entities": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", + "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=", + "dev": true + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "escodegen": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", + "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", + "dev": true, + "requires": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + } + } + }, + "eslint": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.10.0.tgz", + "integrity": "sha512-tcI1D9lfVec+R4LE1mNDnzoJ/f71Kl/9Cv4nG47jOueCMBrCCKYXr4AUVS7go6mWYGFD4+EoN6+eXSrEbRzXVw==", + "dev": true, + "requires": { + "@eslint/eslintrc": "^1.2.0", + "@humanwhocodes/config-array": "^0.9.2", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.1.1", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.3.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^6.0.1", + "globals": "^13.6.0", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "regexpp": "^3.2.0", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + } + } + }, + "eslint-scope": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + } + }, + "eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^2.0.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true + } + } + }, + "eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dev": true + }, + "espree": { + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.1.tgz", + "integrity": "sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ==", + "dev": true, + "requires": { + "acorn": "^8.7.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^3.3.0" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + } + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "eventemitter2": { + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz", + "integrity": "sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas=", + "dev": true + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true + }, + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + } + } + }, + "file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "requires": { + "flat-cache": "^3.0.4" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "findup-sync": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz", + "integrity": "sha1-N5MKpdgWt3fANEXhlmzGeQpMCxY=", + "dev": true, + "requires": { + "glob": "~5.0.0" + }, + "dependencies": { + "glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "dev": true, + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } + } + }, + "fined": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", + "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", + "dev": true, + "requires": { + "expand-tilde": "^2.0.2", + "is-plain-object": "^2.0.3", + "object.defaults": "^1.1.0", + "object.pick": "^1.2.0", + "parse-filepath": "^1.0.1" + } + }, + "flagged-respawn": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", + "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", + "dev": true + }, + "flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true + }, + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + } + }, + "flatted": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", + "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", + "dev": true + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "dev": true, + "requires": { + "for-in": "^1.0.1" + } + }, + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", + "dev": true + }, + "get-pkg-repo": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-1.4.0.tgz", + "integrity": "sha1-xztInAbYDMVTbCyFP54FIyBWly0=", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "meow": "^3.3.0", + "normalize-package-data": "^2.3.0", + "parse-github-repo-url": "^1.3.0", + "through2": "^2.0.0" + }, + "dependencies": { + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "dev": true, + "requires": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + } + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "requires": { + "repeating": "^2.0.0" + } + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "dev": true, + "requires": { + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" + } + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "dev": true, + "requires": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + } + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "dev": true, + "requires": { + "get-stdin": "^4.0.1" + } + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "dev": true + } + } + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "dev": true + }, + "getobject": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/getobject/-/getobject-1.0.2.tgz", + "integrity": "sha512-2zblDBaFcb3rB4rF77XVnuINOE2h2k/OnqXAiy0IrTxUfV1iFp3la33oAQVY9pCpWU268WFYVt2t71hlMuLsOg==", + "dev": true + }, + "git-raw-commits": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-1.3.6.tgz", + "integrity": "sha512-svsK26tQ8vEKnMshTDatSIQSMDdz8CxIIqKsvPqbtV23Etmw6VNaFAitu8zwZ0VrOne7FztwPyRLxK7/DIUTQg==", + "dev": true, + "requires": { + "dargs": "^4.0.1", + "lodash.template": "^4.0.2", + "meow": "^4.0.0", + "split2": "^2.0.0", + "through2": "^2.0.0" + } + }, + "git-remote-origin-url": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz", + "integrity": "sha1-UoJlna4hBxRaERJhEq0yFuxfpl8=", + "dev": true, + "requires": { + "gitconfiglocal": "^1.0.0", + "pify": "^2.3.0" + } + }, + "git-semver-tags": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-1.3.6.tgz", + "integrity": "sha512-2jHlJnln4D/ECk9FxGEBh3k44wgYdWjWDtMmJPaecjoRmxKo3Y1Lh8GMYuOPu04CHw86NTAODchYjC5pnpMQig==", + "dev": true, + "requires": { + "meow": "^4.0.0", + "semver": "^5.5.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "gitconfiglocal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz", + "integrity": "sha1-QdBF84UaXqiPA/JMocYXgRRGS5s=", + "dev": true, + "requires": { + "ini": "^1.3.2" + } + }, + "github": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/github/-/github-0.2.4.tgz", + "integrity": "sha1-JPp/DhP6EblGr5ETTFGYKpHOU4s=", + "dev": true, + "requires": { + "mime": "^1.2.11" + } + }, + "glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + } + }, + "global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "requires": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + } + }, + "global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + }, + "dependencies": { + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "globals": { + "version": "13.12.1", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.1.tgz", + "integrity": "sha512-317dFlgY2pdJZ9rspXDks7073GpDmXdfbM3vYYp0HAMKGDh1FfWPleI2ljVNLQX5M5lXcAslTcPTrOrMEFOjyw==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "graceful-fs": { + "version": "4.2.9", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", + "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==", + "dev": true + }, + "growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true + }, + "grunt": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.4.1.tgz", + "integrity": "sha512-ZXIYXTsAVrA7sM+jZxjQdrBOAg7DyMUplOMhTaspMRExei+fD0BTwdWXnn0W5SXqhb/Q/nlkzXclSi3IH55PIA==", + "dev": true, + "requires": { + "dateformat": "~3.0.3", + "eventemitter2": "~0.4.13", + "exit": "~0.1.2", + "findup-sync": "~0.3.0", + "glob": "~7.1.6", + "grunt-cli": "~1.4.2", + "grunt-known-options": "~2.0.0", + "grunt-legacy-log": "~3.0.0", + "grunt-legacy-util": "~2.0.1", + "iconv-lite": "~0.4.13", + "js-yaml": "~3.14.0", + "minimatch": "~3.0.4", + "mkdirp": "~1.0.4", + "nopt": "~3.0.6", + "rimraf": "~3.0.2" + } + }, + "grunt-cli": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.4.3.tgz", + "integrity": "sha512-9Dtx/AhVeB4LYzsViCjUQkd0Kw0McN2gYpdmGYKtE2a5Yt7v1Q+HYZVWhqXc/kGnxlMtqKDxSwotiGeFmkrCoQ==", + "dev": true, + "requires": { + "grunt-known-options": "~2.0.0", + "interpret": "~1.1.0", + "liftup": "~3.0.1", + "nopt": "~4.0.1", + "v8flags": "~3.2.0" + }, + "dependencies": { + "nopt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", + "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", + "dev": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + } + } + }, + "grunt-contrib-clean": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/grunt-contrib-clean/-/grunt-contrib-clean-2.0.0.tgz", + "integrity": "sha512-g5ZD3ORk6gMa5ugZosLDQl3dZO7cI3R14U75hTM+dVLVxdMNJCPVmwf9OUt4v4eWgpKKWWoVK9DZc1amJp4nQw==", + "dev": true, + "requires": { + "async": "^2.6.1", + "rimraf": "^2.6.2" + }, + "dependencies": { + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "grunt-contrib-concat": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/grunt-contrib-concat/-/grunt-contrib-concat-2.0.0.tgz", + "integrity": "sha512-/cfWwsGiprVTOl7c2bZwMdQ8hIf3e1f4szm1i7qhY9hOnR/X2KL+Xe7dynNweTYHa6aWPZx2B5GPsUpxAXNCaA==", + "dev": true, + "requires": { + "chalk": "^4.1.2", + "source-map": "^0.5.3" + } + }, + "grunt-contrib-jshint": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/grunt-contrib-jshint/-/grunt-contrib-jshint-3.2.0.tgz", + "integrity": "sha512-pcXWCSZWfoMSvcV4BwH21TUtLtcX0Ms8IGuOPIcLeXK3fud9KclY7iqMKY94jFx8TxZzh028YYtpR+io8DiEaQ==", + "dev": true, + "requires": { + "chalk": "~4.1.2", + "hooker": "^0.2.3", + "jshint": "~2.13.4" + } + }, + "grunt-contrib-uglify": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/grunt-contrib-uglify/-/grunt-contrib-uglify-5.0.1.tgz", + "integrity": "sha512-T/aXZ4WIpAtoswZqb6HROKg7uq9QbKwl+lUuOwK4eoFj3tFv9/a/oMyd3/qvetV29Pbf8P1YYda1gDwZppr60A==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "maxmin": "^2.1.0", + "uglify-js": "^3.13.3", + "uri-path": "^1.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "grunt-conventional-changelog": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/grunt-conventional-changelog/-/grunt-conventional-changelog-6.1.0.tgz", + "integrity": "sha1-mL1b37Kw3mMWwFx8b6ykziTdFDU=", + "dev": true, + "requires": { + "chalk": "^1.1.0", + "concat-stream": "^1.5.0", + "conventional-changelog": "^1.1.0", + "plur": "^2.0.0", + "q": "^1.4.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "grunt-conventional-github-releaser": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/grunt-conventional-github-releaser/-/grunt-conventional-github-releaser-1.0.0.tgz", + "integrity": "sha1-7Tbg9V1orq6FrxSEBsPXAYJnuHU=", + "dev": true, + "requires": { + "chalk": "^1.1.0", + "conventional-github-releaser": "^1.1.0", + "plur": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "grunt-endline": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/grunt-endline/-/grunt-endline-0.7.0.tgz", + "integrity": "sha512-NP2ABzCRBpuNfKgteVSEOR26zsph0oEFPVvEmSldkvxBHeSpUPOpIVxvrDnRHyKoV9hBuszGvVjHovjnG3aUBw==", + "dev": true + }, + "grunt-eslint": { + "version": "24.0.0", + "resolved": "https://registry.npmjs.org/grunt-eslint/-/grunt-eslint-24.0.0.tgz", + "integrity": "sha512-WpTeBBFweyhMuPjGwRSQV9JFJ+EczIdlsc7Dd/1g78QVI1aZsk4g/H3e+3S5HEwsS1RKL2YZIrGj8hMLlBfN8w==", + "dev": true, + "requires": { + "chalk": "^4.1.2", + "eslint": "^8.0.1" + } + }, + "grunt-known-options": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-2.0.0.tgz", + "integrity": "sha512-GD7cTz0I4SAede1/+pAbmJRG44zFLPipVtdL9o3vqx9IEyb7b4/Y3s7r6ofI3CchR5GvYJ+8buCSioDv5dQLiA==", + "dev": true + }, + "grunt-legacy-log": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-3.0.0.tgz", + "integrity": "sha512-GHZQzZmhyq0u3hr7aHW4qUH0xDzwp2YXldLPZTCjlOeGscAOWWPftZG3XioW8MasGp+OBRIu39LFx14SLjXRcA==", + "dev": true, + "requires": { + "colors": "~1.1.2", + "grunt-legacy-log-utils": "~2.1.0", + "hooker": "~0.2.3", + "lodash": "~4.17.19" + } + }, + "grunt-legacy-log-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-2.1.0.tgz", + "integrity": "sha512-lwquaPXJtKQk0rUM1IQAop5noEpwFqOXasVoedLeNzaibf/OPWjKYvvdqnEHNmU+0T0CaReAXIbGo747ZD+Aaw==", + "dev": true, + "requires": { + "chalk": "~4.1.0", + "lodash": "~4.17.19" + } + }, + "grunt-legacy-util": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-2.0.1.tgz", + "integrity": "sha512-2bQiD4fzXqX8rhNdXkAywCadeqiPiay0oQny77wA2F3WF4grPJXCvAcyoWUJV+po/b15glGkxuSiQCK299UC2w==", + "dev": true, + "requires": { + "async": "~3.2.0", + "exit": "~0.1.2", + "getobject": "~1.0.0", + "hooker": "~0.2.3", + "lodash": "~4.17.21", + "underscore.string": "~3.3.5", + "which": "~2.0.2" + }, + "dependencies": { + "async": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", + "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==", + "dev": true + } + } + }, + "grunt-simple-mocha": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/grunt-simple-mocha/-/grunt-simple-mocha-0.4.1.tgz", + "integrity": "sha1-V5RJJJ6vCoGHj6cvPtq1FF1F/Xc=", + "dev": true, + "requires": { + "mocha": "*" + } + }, + "gzip-size": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-3.0.0.tgz", + "integrity": "sha1-VGGI6b3DN/Zzdy+BZgRks4nc5SA=", + "dev": true, + "requires": { + "duplexer": "^0.1.1" + } + }, + "handlebars": { + "version": "4.7.7", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", + "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", + "dev": true, + "requires": { + "minimist": "^1.2.5", + "neo-async": "^2.6.0", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4", + "wordwrap": "^1.0.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + } + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true + }, + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "requires": { + "parse-passwd": "^1.0.0" + } + }, + "hooker": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz", + "integrity": "sha1-uDT3I8xKJCqmWWNFnfbZhMXT2Vk=", + "dev": true + }, + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "html-encoding-sniffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", + "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", + "dev": true, + "requires": { + "whatwg-encoding": "^2.0.0" + } + }, + "htmlparser2": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", + "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=", + "dev": true, + "requires": { + "domelementtype": "1", + "domhandler": "2.3", + "domutils": "1.5", + "entities": "1.0", + "readable-stream": "1.1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, + "http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "requires": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + } + }, + "https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "dev": true, + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "dev": true + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indent-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", + "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "interpret": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", + "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", + "dev": true + }, + "irregular-plurals": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-1.4.0.tgz", + "integrity": "sha1-LKmwM2UREYVUEvFr5dd8YqRYp2Y=", + "dev": true + }, + "is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "dev": true, + "requires": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-core-module": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", + "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-finite": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true + }, + "is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "dev": true, + "requires": { + "is-unc-path": "^1.0.0" + } + }, + "is-subset": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-subset/-/is-subset-0.1.1.tgz", + "integrity": "sha1-ilkRfZMt4d4A8kX83TnOQ/HpOaY=", + "dev": true + }, + "is-text-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", + "integrity": "sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4=", + "dev": true, + "requires": { + "text-extensions": "^1.0.0" + } + }, + "is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "dev": true, + "requires": { + "unc-path-regex": "^0.1.2" + } + }, + "is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsdom": { + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-19.0.0.tgz", + "integrity": "sha512-RYAyjCbxy/vri/CfnjUWJQQtZ3LKlLnDqj+9XLNnJPgEGeirZs3hllKR20re8LUZ6o1b1X4Jat+Qd26zmP41+A==", + "dev": true, + "requires": { + "abab": "^2.0.5", + "acorn": "^8.5.0", + "acorn-globals": "^6.0.0", + "cssom": "^0.5.0", + "cssstyle": "^2.3.0", + "data-urls": "^3.0.1", + "decimal.js": "^10.3.1", + "domexception": "^4.0.0", + "escodegen": "^2.0.0", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^3.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^2.0.0", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^10.0.0", + "ws": "^8.2.3", + "xml-name-validator": "^4.0.0" + } + }, + "jshint": { + "version": "2.13.4", + "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.13.4.tgz", + "integrity": "sha512-HO3bosL84b2qWqI0q+kpT/OpRJwo0R4ivgmxaO848+bo10rc50SkPnrtwSFXttW0ym4np8jbJvLwk5NziB7jIw==", + "dev": true, + "requires": { + "cli": "~1.0.0", + "console-browserify": "1.1.x", + "exit": "0.1.x", + "htmlparser2": "3.8.x", + "lodash": "~4.17.21", + "minimatch": "~3.0.2", + "strip-json-comments": "1.0.x" + }, + "dependencies": { + "strip-json-comments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", + "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=", + "dev": true + } + } + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "dev": true + }, + "JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dev": true, + "requires": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + } + }, + "just-extend": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", + "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", + "dev": true + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "liftup": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/liftup/-/liftup-3.0.1.tgz", + "integrity": "sha512-yRHaiQDizWSzoXk3APcA71eOI/UuhEkNN9DiW2Tt44mhYzX4joFoCZlxsSOF7RyeLlfqzFLQI1ngFq3ggMPhOw==", + "dev": true, + "requires": { + "extend": "^3.0.2", + "findup-sync": "^4.0.0", + "fined": "^1.2.0", + "flagged-respawn": "^1.0.1", + "is-plain-object": "^2.0.4", + "object.map": "^1.0.1", + "rechoir": "^0.7.0", + "resolve": "^1.19.0" + }, + "dependencies": { + "findup-sync": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-4.0.0.tgz", + "integrity": "sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==", + "dev": true, + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^4.0.2", + "resolve-dir": "^1.0.1" + } + } + } + }, + "load-grunt-tasks": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/load-grunt-tasks/-/load-grunt-tasks-5.1.0.tgz", + "integrity": "sha512-oNj0Jlka1TsfDe+9He0kcA1cRln+TMoTsEByW7ij6kyktNLxBKJtslCFEvFrLC2Dj0S19IWJh3fOCIjLby2Xrg==", + "dev": true, + "requires": { + "arrify": "^2.0.1", + "multimatch": "^4.0.0", + "pkg-up": "^3.1.0", + "resolve-pkg": "^2.0.0" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", + "dev": true + }, + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", + "dev": true + }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "lodash.template": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", + "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", + "dev": true, + "requires": { + "lodash._reinterpolate": "^3.0.0", + "lodash.templatesettings": "^4.0.0" + } + }, + "lodash.templatesettings": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", + "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", + "dev": true, + "requires": { + "lodash._reinterpolate": "^3.0.0" + } + }, + "log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + } + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "dev": true, + "requires": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + } + }, + "loupe": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.4.tgz", + "integrity": "sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ==", + "dev": true, + "requires": { + "get-func-name": "^2.0.0" + } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "make-iterator": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", + "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", + "dev": true, + "requires": { + "kind-of": "^6.0.2" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", + "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=", + "dev": true + }, + "maxmin": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/maxmin/-/maxmin-2.1.0.tgz", + "integrity": "sha1-TTsiCQPZXu5+t6x/qGTnLcCaMWY=", + "dev": true, + "requires": { + "chalk": "^1.0.0", + "figures": "^1.0.1", + "gzip-size": "^3.0.0", + "pretty-bytes": "^3.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "meow": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.1.tgz", + "integrity": "sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A==", + "dev": true, + "requires": { + "camelcase-keys": "^4.0.0", + "decamelize-keys": "^1.0.0", + "loud-rejection": "^1.0.0", + "minimist": "^1.1.3", + "minimist-options": "^3.0.1", + "normalize-package-data": "^2.3.4", + "read-pkg-up": "^3.0.0", + "redent": "^2.0.0", + "trim-newlines": "^2.0.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + } + }, + "read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + } + } + }, + "micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, + "mime-db": { + "version": "1.51.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", + "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", + "dev": true + }, + "mime-types": { + "version": "2.1.34", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", + "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", + "dev": true, + "requires": { + "mime-db": "1.51.0" + } + }, + "minimatch": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", + "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "minimist-options": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", + "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0" + }, + "dependencies": { + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + } + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, + "mocha": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.2.1.tgz", + "integrity": "sha512-T7uscqjJVS46Pq1XDXyo9Uvey9gd3huT/DD9cYBb4K2Xc/vbKRPUWK067bxDQRK0yIz6Jxk73IrnimvASzBNAQ==", + "dev": true, + "requires": { + "@ungap/promise-all-settled": "1.1.2", + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.3", + "debug": "4.3.3", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.2.0", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "3.0.4", + "ms": "2.1.3", + "nanoid": "3.2.0", + "serialize-javascript": "6.0.0", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "which": "2.0.2", + "workerpool": "6.2.0", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "dependencies": { + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "modify-values": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz", + "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "multimatch": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-4.0.0.tgz", + "integrity": "sha512-lDmx79y1z6i7RNx0ZGCPq1bzJ6ZoDDKbvh7jxr9SJcWLkShMzXrHbYVpTdnhNM5MXpDUxCQ4DgqVttVXlBgiBQ==", + "dev": true, + "requires": { + "@types/minimatch": "^3.0.3", + "array-differ": "^3.0.0", + "array-union": "^2.1.0", + "arrify": "^2.0.1", + "minimatch": "^3.0.4" + } + }, + "nanoid": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.2.0.tgz", + "integrity": "sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA==", + "dev": true + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "nise": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.1.tgz", + "integrity": "sha512-yr5kW2THW1AkxVmCnKEh4nbYkJdB3I7LUkiUgOvEkOp414mc2UMaHMA7pjq1nYowhdoJZGwEKGaQVbxfpWj10A==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.8.3", + "@sinonjs/fake-timers": ">=5", + "@sinonjs/text-encoding": "^0.7.1", + "just-extend": "^4.0.2", + "path-to-regexp": "^1.7.0" + } + }, + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "nwsapi": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", + "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object.defaults": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", + "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", + "dev": true, + "requires": { + "array-each": "^1.0.1", + "array-slice": "^1.0.0", + "for-own": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "object.map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", + "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", + "dev": true, + "requires": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "dev": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-filepath": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", + "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", + "dev": true, + "requires": { + "is-absolute": "^1.0.0", + "map-cache": "^0.2.0", + "path-root": "^0.1.1" + } + }, + "parse-github-repo-url": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/parse-github-repo-url/-/parse-github-repo-url-1.4.1.tgz", + "integrity": "sha1-nn2LslKmy2ukJZUGC3v23z28H1A=", + "dev": true + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true + }, + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "path-root": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", + "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", + "dev": true, + "requires": { + "path-root-regex": "^0.1.0" + } + }, + "path-root-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", + "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", + "dev": true + }, + "path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "dev": true, + "requires": { + "isarray": "0.0.1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + } + } + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, + "pkg-up": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + } + } + }, + "plur": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/plur/-/plur-2.1.2.tgz", + "integrity": "sha1-dIJFLBoPUI4+NE6uwxLJHCncZVo=", + "dev": true, + "requires": { + "irregular-plurals": "^1.0.0" + } + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true + }, + "pretty-bytes": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-3.0.1.tgz", + "integrity": "sha1-J9AAjXeAY6C0gRuzXHnxvV1fvM8=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "dev": true + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "dev": true + }, + "quick-lru": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", + "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=", + "dev": true + }, + "quiet-grunt": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/quiet-grunt/-/quiet-grunt-0.2.3.tgz", + "integrity": "sha1-8JCJeal9JCrC2NbuvP5Vj1nAYYQ=", + "dev": true + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + } + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "rechoir": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", + "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", + "dev": true, + "requires": { + "resolve": "^1.9.0" + } + }, + "redent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", + "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", + "dev": true, + "requires": { + "indent-string": "^3.0.0", + "strip-indent": "^2.0.0" + } + }, + "regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "^1.0.0" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "resolve": { + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", + "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", + "dev": true, + "requires": { + "is-core-module": "^2.8.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "resolve-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg/-/resolve-pkg-2.0.0.tgz", + "integrity": "sha512-+1lzwXehGCXSeryaISr6WujZzowloigEofRB+dj75y9RRa/obVcYgbHJd53tdYw8pvZj8GojXaaENws8Ktw/hQ==", + "dev": true, + "requires": { + "resolve-from": "^5.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + } + } + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "dev": true, + "requires": { + "xmlchars": "^2.2.0" + } + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "semver-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-1.0.0.tgz", + "integrity": "sha1-kqSWkGX5xwxpR1PVUkj8aPj2Usk=", + "dev": true + }, + "semver-sort": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/semver-sort/-/semver-sort-0.0.4.tgz", + "integrity": "sha1-NP293GprK0FhOYw8TbpWJDv+qos=", + "dev": true, + "requires": { + "semver": "^5.0.3", + "semver-regex": "^1.0.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "sinon": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-13.0.1.tgz", + "integrity": "sha512-8yx2wIvkBjIq/MGY1D9h1LMraYW+z1X0mb648KZnKSdvLasvDu7maa0dFaNYdTDczFgbjNw2tOmWdTk9saVfwQ==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.8.3", + "@sinonjs/fake-timers": "^9.0.0", + "@sinonjs/samsam": "^6.1.1", + "diff": "^5.0.0", + "nise": "^5.1.1", + "supports-color": "^7.2.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz", + "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==", + "dev": true + }, + "split": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", + "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", + "dev": true, + "requires": { + "through": "2" + } + }, + "split2": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-2.2.0.tgz", + "integrity": "sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw==", + "dev": true, + "requires": { + "through2": "^2.0.2" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } + }, + "strip-indent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", + "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", + "dev": true + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true + }, + "symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true + }, + "text-extensions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", + "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", + "dev": true + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "tough-cookie": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", + "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", + "dev": true, + "requires": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.1.2" + } + }, + "tr46": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", + "dev": true, + "requires": { + "punycode": "^2.1.1" + } + }, + "trim-newlines": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", + "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=", + "dev": true + }, + "trim-off-newlines": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/trim-off-newlines/-/trim-off-newlines-1.0.3.tgz", + "integrity": "sha512-kh6Tu6GbeSNMGfrrZh6Bb/4ZEHV1QlB4xNDBeog8Y9/QwFlKTRyWvY3Fs9tRDAMZliVUwieMgEdIeL/FtqjkJg==", + "dev": true + }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "uglify-js": { + "version": "3.15.2", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.15.2.tgz", + "integrity": "sha512-peeoTk3hSwYdoc9nrdiEJk+gx1ALCtTjdYuKSXMTDqq7n1W7dHPqWDdSi+BPL0ni2YMeHD7hKUSdbj3TZauY2A==", + "dev": true + }, + "unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", + "dev": true + }, + "underscore.string": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.6.tgz", + "integrity": "sha512-VoC83HWXmCrF6rgkyxS9GHv8W9Q5nhMKho+OadDJGzL2oDYbYEppBaCMH6pFlwLeqj2QS+hhkw2kpXkSdD1JxQ==", + "dev": true, + "requires": { + "sprintf-js": "^1.1.1", + "util-deprecate": "^1.0.2" + }, + "dependencies": { + "sprintf-js": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", + "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", + "dev": true + } + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "uri-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/uri-path/-/uri-path-1.0.0.tgz", + "integrity": "sha1-l0fwGDWJM8Md4PzP2C0TjmcmLjI=", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, + "v8flags": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz", + "integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "dev": true, + "requires": { + "browser-process-hrtime": "^1.0.0" + } + }, + "w3c-xmlserializer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-3.0.0.tgz", + "integrity": "sha512-3WFqGEgSXIyGhOmAFtlicJNMjEps8b1MG31NCA0/vOF9+nKMUW1ckhi9cnNHmf88Rzw5V+dwIwsm2C7X8k9aQg==", + "dev": true, + "requires": { + "xml-name-validator": "^4.0.0" + } + }, + "webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true + }, + "whatwg-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", + "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", + "dev": true, + "requires": { + "iconv-lite": "0.6.3" + }, + "dependencies": { + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + } + } + }, + "whatwg-mimetype": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", + "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", + "dev": true + }, + "whatwg-url": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-10.0.0.tgz", + "integrity": "sha512-CLxxCmdUby142H5FZzn4D8ikO1cmypvXVQktsgosNy4a4BHrDHeciBBGZhb0bNoR5/MltoCatso+vFjjGx8t0w==", + "dev": true, + "requires": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + }, + "workerpool": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.0.tgz", + "integrity": "sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==", + "dev": true + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "ws": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", + "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", + "dev": true, + "requires": {} + }, + "xml-name-validator": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "dev": true + }, + "xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + }, + "yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true + }, + "yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "requires": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "dependencies": { + "camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true + }, + "decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true + }, + "is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true + } + } + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true + } + } +} diff --git a/showdown/package.json b/showdown/package.json new file mode 100644 index 00000000..e7e25526 --- /dev/null +++ b/showdown/package.json @@ -0,0 +1,74 @@ +{ + "name": "showdown", + "version": "2.1.0", + "description": "A Markdown to HTML converter written in Javascript", + "author": "Estevão Santos", + "homepage": "http://showdownjs.com/", + "keywords": [ + "markdown", + "converter" + ], + "contributors": [ + "John Gruber", + "John Fraser", + "Corey Innis", + "Remy Sharp", + "Konstantin Käfer", + "Roger Braun", + "Dominic Tarr", + "Cat Chen", + "Titus Stone", + "Rob Sutherland", + "Pavel Lang", + "Ben Combee", + "Adam Backstrom", + "Pascal Deschênes", + "Estevão Santos" + ], + "repository": { + "type": "git", + "url": "https://github.com/showdownjs/showdown.git", + "web": "https://github.com/showdownjs/showdown" + }, + "funding": { + "type" : "individual", + "url" : "https://www.paypal.me/tiviesantos" + }, + "license": "MIT", + "main": "./dist/showdown.js", + "scripts": { + "test": "grunt test" + }, + "bin": { + "showdown": "bin/showdown.js" + }, + "files": [ + "bin", + "dist" + ], + "devDependencies": { + "chai": "*", + "chai-match": "*", + "grunt": "^1.4.1", + "grunt-contrib-clean": "^2.0.0", + "grunt-contrib-concat": "^2.0.0", + "grunt-contrib-jshint": "^3.1.0", + "grunt-contrib-uglify": "^5.0.1", + "grunt-conventional-changelog": "^6.1.0", + "grunt-conventional-github-releaser": "^1.0.0", + "grunt-endline": "^0.7.0", + "grunt-eslint": "^24.0.0", + "grunt-simple-mocha": "^0.4.0", + "jsdom": "^19.0.0", + "load-grunt-tasks": "^5.1.0", + "performance-now": "^2.1.0", + "quiet-grunt": "^0.2.0", + "semver": "^7.3.0", + "semver-sort": "^0.0.4", + "sinon": "*", + "source-map-support": "^0.5.20" + }, + "dependencies": { + "commander": "^9.0.0" + } +} diff --git a/showdown/src/cli/cli.js b/showdown/src/cli/cli.js new file mode 100644 index 00000000..f16e6f94 --- /dev/null +++ b/showdown/src/cli/cli.js @@ -0,0 +1,330 @@ +/** + * Created by tivie + */ +var fs = require('fs'), + path = require('path'), + Command = require('commander').Command, + program = new Command(), + path1 = path.resolve(__dirname + '/../dist/showdown.js'), + path2 = path.resolve(__dirname + '/../../.build/showdown.js'), + showdown, + version; + +// require shodown. We use conditional loading for each use case +if (fs.existsSync(path1)) { + // production. File lives in bin directory + showdown = require(path1); + version = require(path.resolve(__dirname + '/../package.json')).version; +} else if (fs.existsSync(path2)) { + // testing envo, uses the concatenated stuff for testing + showdown = require(path2); + version = require(path.resolve(__dirname + '/../../package.json')).version; +} else { + // cold testing (manual) of cli.js in the src file. We load the dist file + showdown = require('../../dist/showdown'); + version = require('../../package.json'); +} + + +program + .name('showdown') + .description('CLI to Showdownjs markdown parser v' + version) + .version(version) + .usage(' [options]') + .option('-q, --quiet', 'Quiet mode. Only print errors') + .option('-m, --mute', 'Mute mode. Does not print anything'); + +program.command('makehtml') + .description('Converts markdown into html') + + .addHelpText('after', '\n\nExamples:') + .addHelpText('after', ' showdown makehtml -i Reads from stdin and outputs to stdout') + .addHelpText('after', ' showdown makehtml -i foo.md -o bar.html Reads \'foo.md\' and writes to \'bar.html\'') + .addHelpText('after', ' showdown makehtml -i --flavor="github" Parses stdin using GFM style') + + .addHelpText('after', '\nNote for windows users:') + .addHelpText('after', 'When reading from stdin, use option -u to set the proper encoding or run `chcp 65001` prior to calling showdown cli to set the command line to utf-8') + + .option('-i, --input [file]', 'Input source. Usually a md file. If omitted or empty, reads from stdin. Windows users see note below.', true) + .option('-o, --output [file]', 'Output target. Usually a html file. If omitted or empty, writes to stdout', true) + .option('-u, --encoding ', 'Sets the input encoding', 'utf8') + .option('-y, --output-encoding ', 'Sets the output encoding', 'utf8') + .option('-a, --append', 'Append data to output instead of overwriting. Ignored if writing to stdout', false) + .option('-e, --extensions ', 'Load the specified extensions. Should be valid paths to node compatible extensions') + .option('-p, --flavor ', 'Run with a predetermined flavor of options. Default is vanilla', 'vanilla') + .option('-c, --config ', 'Enables showdown makehtml parser config options (example: strikethrough). Overrides flavor') + .option('--config-help', 'Shows configuration options for showdown parser') + .action(makehtmlCommand); + +program.parse(); + + +// +// HELPER FUCNTIONS +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/** + * Messenger helper object to the CLI + * @param {string} writeMode + * @param {boolean} supress + * @param {boolean} mute + * @constructor + */ +function Messenger (writeMode, supress, mute) { + 'use strict'; + writeMode = writeMode || 'stderr'; + supress = (!!supress || !!mute); + mute = !!mute; + this._print = (writeMode === 'stdout') ? console.log : console.error; + + this.errorExit = function (e) { + if (!mute) { + console.error('ERROR: ' + e.message); + console.error('Run \'showdown -h\' for help'); + } + process.exit(1); + }; + + this.okExit = function () { + if (!mute) { + this._print('\n'); + this._print('DONE!'); + } + process.exit(0); + }; + + this.printMsg = function (msg) { + if (supress || mute || !msg) { + return; + } + this._print(msg); + }; + + this.printError = function (msg) { + if (mute) { + return; + } + console.error(msg); + }; + +} + +/** + * Helper function to show Showdown Options + */ +function showShowdownOptions () { + 'use strict'; + var showdownOptions = showdown.getDefaultOptions(false); + console.log('\nshowdown makehtml config options:'); + // show showdown options + for (var sopt in showdownOptions) { + if (showdownOptions.hasOwnProperty(sopt)) { + console.log(' ' + sopt + ':', '[default=' + showdownOptions[sopt].defaultValue + ']',showdownOptions[sopt].describe); + } + } + console.log('\n\nExample: showdown makehtml -c openLinksInNewWindow ghMentions ghMentionsLink="https://google.com"'); +} + +/** + * Helper function to parse showdown options + * @param {{}} configOptions + * @param {{}} defaultOptions + * @returns {{}} + */ +function parseShowdownOptions (configOptions, defaultOptions) { + 'use strict'; + var shOpt = defaultOptions; + + // first prepare passed options + if (configOptions) { + for (var i = 0; i < configOptions.length; ++i) { + var opt = configOptions[i], + key = configOptions[i], + val = true; + if (/=/.test(opt)) { + key = opt.split('=')[0]; + val = opt.split('=')[1]; + } + shOpt[key] = val; + } + } + return shOpt; +} + +/** + * Reads stdin + * @returns {string} + */ +function readFromStdIn (encoding) { + 'use strict'; + var size = fs.fstatSync(process.stdin.fd).size; + if (size <= 0) { + throw new Error('Could not read from stdin, reason: stdin is empty'); + } + encoding = encoding || 'utf8'; + try { + return size > 0 ? fs.readFileSync(process.stdin.fd, encoding).toString() : ''; + } catch (e) { + throw new Error('Could not read from stdin, reason: ' + e.message); + } +} + +/** + * Reads from a file + * @param {string} file Filepath to dile + * @param {string} encoding Encoding of the file + * @returns {Buffer} + */ +function readFromFile (file, encoding) { + 'use strict'; + try { + return fs.readFileSync(file, encoding); + } catch (err) { + throw new Error('Could not read from file ' + file + ', reason: ' + err.message); + } +} + +/** + * Writes to stdout + * @param {string} html + * @returns {boolean} + */ +function writeToStdOut (html) { + 'use strict'; + if (!process.stdout.write(html)) { + throw new Error('Could not write to StdOut'); + } +} + +/** + * Writes to file + * @param {string} html HTML to write + * @param {string} file Filepath + * @param {boolean} append If the result should be appended + */ +function writeToFile (html, file, append) { + 'use strict'; + // If a flag is passed, it means we should append instead of overwriting. + // Only works with files, obviously + var write = (append) ? fs.appendFileSync : fs.writeFileSync; + try { + write(file, html); + } catch (err) { + throw new Error('Could not write to file ' + file + ', readon: ' + err.message); + } +} + +/** + * makehtml command + * @param {{}} options + * @param {Command} cmd + */ +function makehtmlCommand (options, cmd) { + 'use strict'; + + // show configuration options for showdown helper if configHelp was passed + if (options.configHelp) { + showShowdownOptions(); + return; + } + + var quiet = !!(cmd.parent._optionValues.quiet), + mute = !!(cmd.parent._optionValues.mute), + readMode = (!options.input || options.input === '' || options.input === true) ? 'stdin' : 'file', + writeMode = (!options.output || options.output === '' || options.output === true) ? 'stdout' : 'file', + msgMode = (writeMode === 'file') ? 'stdout' : 'stderr', + // initiate Messenger helper, can maybe be replaced with commanderjs internal stuff + messenger = new Messenger(msgMode, quiet, mute), + defaultOptions = showdown.getDefaultOptions(true), + md, html; + + // deal with flavor first since config flag overrides flavor individual options + if (options.flavor) { + messenger.printMsg('Enabling flavor ' + options.flavor + '...'); + defaultOptions = showdown.getFlavorOptions(options.flavor); + if (!defaultOptions) { + messenger.errorExit(new Error('Flavor ' + options.flavor + ' is not recognised')); + return; + } + messenger.printMsg('OK!'); + } + // store config options in the options.config as an object + options.config = parseShowdownOptions(options.config, defaultOptions); + + // print enabled options + for (var o in options.config) { + if (options.config.hasOwnProperty(o) && options.config[o] === true) { + messenger.printMsg('Enabling option ' + o); + } + } + + // initialize the converter + messenger.printMsg('\nInitializing converter...'); + var converter; + try { + converter = new showdown.Converter(options.config); + } catch (e) { + messenger.errorExit(e); + return; + } + messenger.printMsg('OK!'); + + // load extensions + if (options.extensions) { + messenger.printMsg('\nLoading extensions...'); + for (var i = 0; i < options.extensions.length; ++i) { + try { + messenger.printMsg(options.extensions[i]); + var ext = require(options.extensions[i]); + converter.addExtension(ext, options.extensions[i]); + messenger.printMsg(options.extensions[i] + ' loaded...'); + } catch (e) { + messenger.printError('Could not load extension ' + options.extensions[i] + '. Reason:'); + messenger.errorExit(e); + } + } + } + + messenger.printMsg('...'); + // read the input + messenger.printMsg('Reading data from ' + readMode + '...'); + + if (readMode === 'stdin') { + try { + md = readFromStdIn(options.encoding); + } catch (err) { + messenger.errorExit(err); + return; + } + } else { + try { + md = readFromFile(options.input, options.encoding); + } catch (err) { + messenger.errorExit(err); + return; + } + } + + // process the input + messenger.printMsg('Parsing markdown...'); + html = converter.makeHtml(md); + + // write the output + messenger.printMsg('Writing data to ' + writeMode + '...'); + if (writeMode === 'stdout') { + try { + writeToStdOut(html); + } catch (err) { + messenger.errorExit(err); + return; + } + } else { + try { + writeToFile(html, options.output, options.append); + } catch (err) { + messenger.errorExit(err); + return; + } + } + messenger.okExit(); +} diff --git a/showdown/src/converter.js b/showdown/src/converter.js new file mode 100644 index 00000000..f597cb64 --- /dev/null +++ b/showdown/src/converter.js @@ -0,0 +1,602 @@ +/** + * Created by Estevao on 31-05-2015. + */ + +/** + * Showdown Converter class + * @class + * @param {object} [converterOptions] + * @returns {Converter} + */ +showdown.Converter = function (converterOptions) { + 'use strict'; + + var + /** + * Options used by this converter + * @private + * @type {{}} + */ + options = {}, + + /** + * Language extensions used by this converter + * @private + * @type {Array} + */ + langExtensions = [], + + /** + * Output modifiers extensions used by this converter + * @private + * @type {Array} + */ + outputModifiers = [], + + /** + * Event listeners + * @private + * @type {{}} + */ + listeners = {}, + + /** + * The flavor set in this converter + */ + setConvFlavor = setFlavor, + + /** + * Metadata of the document + * @type {{parsed: {}, raw: string, format: string}} + */ + metadata = { + parsed: {}, + raw: '', + format: '' + }; + + _constructor(); + + /** + * Converter constructor + * @private + */ + function _constructor () { + converterOptions = converterOptions || {}; + + for (var gOpt in globalOptions) { + if (globalOptions.hasOwnProperty(gOpt)) { + options[gOpt] = globalOptions[gOpt]; + } + } + + // Merge options + if (typeof converterOptions === 'object') { + for (var opt in converterOptions) { + if (converterOptions.hasOwnProperty(opt)) { + options[opt] = converterOptions[opt]; + } + } + } else { + throw Error('Converter expects the passed parameter to be an object, but ' + typeof converterOptions + + ' was passed instead.'); + } + + if (options.extensions) { + showdown.helper.forEach(options.extensions, _parseExtension); + } + } + + /** + * Parse extension + * @param {*} ext + * @param {string} [name=''] + * @private + */ + function _parseExtension (ext, name) { + + name = name || null; + // If it's a string, the extension was previously loaded + if (showdown.helper.isString(ext)) { + ext = showdown.helper.stdExtName(ext); + name = ext; + + // LEGACY_SUPPORT CODE + if (showdown.extensions[ext]) { + console.warn('DEPRECATION WARNING: ' + ext + ' is an old extension that uses a deprecated loading method.' + + 'Please inform the developer that the extension should be updated!'); + legacyExtensionLoading(showdown.extensions[ext], ext); + return; + // END LEGACY SUPPORT CODE + + } else if (!showdown.helper.isUndefined(extensions[ext])) { + ext = extensions[ext]; + + } else { + throw Error('Extension "' + ext + '" could not be loaded. It was either not found or is not a valid extension.'); + } + } + + if (typeof ext === 'function') { + ext = ext(); + } + + if (!showdown.helper.isArray(ext)) { + ext = [ext]; + } + + var validExt = validate(ext, name); + if (!validExt.valid) { + throw Error(validExt.error); + } + + for (var i = 0; i < ext.length; ++i) { + switch (ext[i].type) { + + case 'lang': + langExtensions.push(ext[i]); + break; + + case 'output': + outputModifiers.push(ext[i]); + break; + } + if (ext[i].hasOwnProperty('listeners')) { + for (var ln in ext[i].listeners) { + if (ext[i].listeners.hasOwnProperty(ln)) { + listen(ln, ext[i].listeners[ln]); + } + } + } + } + + } + + /** + * LEGACY_SUPPORT + * @param {*} ext + * @param {string} name + */ + function legacyExtensionLoading (ext, name) { + if (typeof ext === 'function') { + ext = ext(new showdown.Converter()); + } + if (!showdown.helper.isArray(ext)) { + ext = [ext]; + } + var valid = validate(ext, name); + + if (!valid.valid) { + throw Error(valid.error); + } + + for (var i = 0; i < ext.length; ++i) { + switch (ext[i].type) { + case 'lang': + langExtensions.push(ext[i]); + break; + case 'output': + outputModifiers.push(ext[i]); + break; + default:// should never reach here + throw Error('Extension loader error: Type unrecognized!!!'); + } + } + } + + /** + * Listen to an event + * @param {string} name + * @param {function} callback + */ + function listen (name, callback) { + if (!showdown.helper.isString(name)) { + throw Error('Invalid argument in converter.listen() method: name must be a string, but ' + typeof name + ' given'); + } + + if (typeof callback !== 'function') { + throw Error('Invalid argument in converter.listen() method: callback must be a function, but ' + typeof callback + ' given'); + } + + if (!listeners.hasOwnProperty(name)) { + listeners[name] = []; + } + listeners[name].push(callback); + } + + function rTrimInputText (text) { + var rsp = text.match(/^\s*/)[0].length, + rgx = new RegExp('^\\s{0,' + rsp + '}', 'gm'); + return text.replace(rgx, ''); + } + + /** + * Dispatch an event + * @private + * @param {string} evtName Event name + * @param {string} text Text + * @param {{}} options Converter Options + * @param {{}} globals + * @returns {string} + */ + this._dispatch = function dispatch (evtName, text, options, globals) { + if (listeners.hasOwnProperty(evtName)) { + for (var ei = 0; ei < listeners[evtName].length; ++ei) { + var nText = listeners[evtName][ei](evtName, text, this, options, globals); + if (nText && typeof nText !== 'undefined') { + text = nText; + } + } + } + return text; + }; + + /** + * Listen to an event + * @param {string} name + * @param {function} callback + * @returns {showdown.Converter} + */ + this.listen = function (name, callback) { + listen(name, callback); + return this; + }; + + /** + * Converts a markdown string into HTML + * @param {string} text + * @returns {*} + */ + this.makeHtml = function (text) { + //check if text is not falsy + if (!text) { + return text; + } + + var globals = { + gHtmlBlocks: [], + gHtmlMdBlocks: [], + gHtmlSpans: [], + gUrls: {}, + gTitles: {}, + gDimensions: {}, + gListLevel: 0, + hashLinkCounts: {}, + langExtensions: langExtensions, + outputModifiers: outputModifiers, + converter: this, + ghCodeBlocks: [], + metadata: { + parsed: {}, + raw: '', + format: '' + } + }; + + // This lets us use ¨ trema as an escape char to avoid md5 hashes + // The choice of character is arbitrary; anything that isn't + // magic in Markdown will work. + text = text.replace(/¨/g, '¨T'); + + // Replace $ with ¨D + // RegExp interprets $ as a special character + // when it's in a replacement string + text = text.replace(/\$/g, '¨D'); + + // Standardize line endings + text = text.replace(/\r\n/g, '\n'); // DOS to Unix + text = text.replace(/\r/g, '\n'); // Mac to Unix + + // Stardardize line spaces + text = text.replace(/\u00A0/g, ' '); + + if (options.smartIndentationFix) { + text = rTrimInputText(text); + } + + // Make sure text begins and ends with a couple of newlines: + text = '\n\n' + text + '\n\n'; + + // detab + text = showdown.subParser('detab')(text, options, globals); + + /** + * Strip any lines consisting only of spaces and tabs. + * This makes subsequent regexs easier to write, because we can + * match consecutive blank lines with /\n+/ instead of something + * contorted like /[ \t]*\n+/ + */ + text = text.replace(/^[ \t]+$/mg, ''); + + //run languageExtensions + showdown.helper.forEach(langExtensions, function (ext) { + text = showdown.subParser('runExtension')(ext, text, options, globals); + }); + + // run the sub parsers + text = showdown.subParser('metadata')(text, options, globals); + text = showdown.subParser('hashPreCodeTags')(text, options, globals); + text = showdown.subParser('githubCodeBlocks')(text, options, globals); + text = showdown.subParser('hashHTMLBlocks')(text, options, globals); + text = showdown.subParser('hashCodeTags')(text, options, globals); + text = showdown.subParser('stripLinkDefinitions')(text, options, globals); + text = showdown.subParser('blockGamut')(text, options, globals); + text = showdown.subParser('unhashHTMLSpans')(text, options, globals); + text = showdown.subParser('unescapeSpecialChars')(text, options, globals); + + // attacklab: Restore dollar signs + text = text.replace(/¨D/g, '$$'); + + // attacklab: Restore tremas + text = text.replace(/¨T/g, '¨'); + + // render a complete html document instead of a partial if the option is enabled + text = showdown.subParser('completeHTMLDocument')(text, options, globals); + + // Run output modifiers + showdown.helper.forEach(outputModifiers, function (ext) { + text = showdown.subParser('runExtension')(ext, text, options, globals); + }); + + // update metadata + metadata = globals.metadata; + return text; + }; + + /** + * Converts an HTML string into a markdown string + * @param src + * @param [HTMLParser] A WHATWG DOM and HTML parser, such as JSDOM. If none is supplied, window.document will be used. + * @returns {string} + */ + this.makeMarkdown = this.makeMd = function (src, HTMLParser) { + + // replace \r\n with \n + src = src.replace(/\r\n/g, '\n'); + src = src.replace(/\r/g, '\n'); // old macs + + // due to an edge case, we need to find this: > < + // to prevent removing of non silent white spaces + // ex: this is sparta + src = src.replace(/>[ \t]+¨NBSP;<'); + + if (!HTMLParser) { + if (window && window.document) { + HTMLParser = window.document; + } else { + throw new Error('HTMLParser is undefined. If in a webworker or nodejs environment, you need to provide a WHATWG DOM and HTML such as JSDOM'); + } + } + + var doc = HTMLParser.createElement('div'); + doc.innerHTML = src; + + var globals = { + preList: substitutePreCodeTags(doc) + }; + + // remove all newlines and collapse spaces + clean(doc); + + // some stuff, like accidental reference links must now be escaped + // TODO + // doc.innerHTML = doc.innerHTML.replace(/\[[\S\t ]]/); + + var nodes = doc.childNodes, + mdDoc = ''; + + for (var i = 0; i < nodes.length; i++) { + mdDoc += showdown.subParser('makeMarkdown.node')(nodes[i], globals); + } + + function clean (node) { + for (var n = 0; n < node.childNodes.length; ++n) { + var child = node.childNodes[n]; + if (child.nodeType === 3) { + if (!/\S/.test(child.nodeValue) && !/^[ ]+$/.test(child.nodeValue)) { + node.removeChild(child); + --n; + } else { + child.nodeValue = child.nodeValue.split('\n').join(' '); + child.nodeValue = child.nodeValue.replace(/(\s)+/g, '$1'); + } + } else if (child.nodeType === 1) { + clean(child); + } + } + } + + // find all pre tags and replace contents with placeholder + // we need this so that we can remove all indentation from html + // to ease up parsing + function substitutePreCodeTags (doc) { + + var pres = doc.querySelectorAll('pre'), + presPH = []; + + for (var i = 0; i < pres.length; ++i) { + + if (pres[i].childElementCount === 1 && pres[i].firstChild.tagName.toLowerCase() === 'code') { + var content = pres[i].firstChild.innerHTML.trim(), + language = pres[i].firstChild.getAttribute('data-language') || ''; + + // if data-language attribute is not defined, then we look for class language-* + if (language === '') { + var classes = pres[i].firstChild.className.split(' '); + for (var c = 0; c < classes.length; ++c) { + var matches = classes[c].match(/^language-(.+)$/); + if (matches !== null) { + language = matches[1]; + break; + } + } + } + + // unescape html entities in content + content = showdown.helper.unescapeHTMLEntities(content); + + presPH.push(content); + pres[i].outerHTML = ''; + } else { + presPH.push(pres[i].innerHTML); + pres[i].innerHTML = ''; + pres[i].setAttribute('prenum', i.toString()); + } + } + return presPH; + } + + return mdDoc; + }; + + /** + * Set an option of this Converter instance + * @param {string} key + * @param {*} value + */ + this.setOption = function (key, value) { + options[key] = value; + }; + + /** + * Get the option of this Converter instance + * @param {string} key + * @returns {*} + */ + this.getOption = function (key) { + return options[key]; + }; + + /** + * Get the options of this Converter instance + * @returns {{}} + */ + this.getOptions = function () { + return options; + }; + + /** + * Add extension to THIS converter + * @param {{}} extension + * @param {string} [name=null] + */ + this.addExtension = function (extension, name) { + name = name || null; + _parseExtension(extension, name); + }; + + /** + * Use a global registered extension with THIS converter + * @param {string} extensionName Name of the previously registered extension + */ + this.useExtension = function (extensionName) { + _parseExtension(extensionName); + }; + + /** + * Set the flavor THIS converter should use + * @param {string} name + */ + this.setFlavor = function (name) { + if (!flavor.hasOwnProperty(name)) { + throw Error(name + ' flavor was not found'); + } + var preset = flavor[name]; + setConvFlavor = name; + for (var option in preset) { + if (preset.hasOwnProperty(option)) { + options[option] = preset[option]; + } + } + }; + + /** + * Get the currently set flavor of this converter + * @returns {string} + */ + this.getFlavor = function () { + return setConvFlavor; + }; + + /** + * Remove an extension from THIS converter. + * Note: This is a costly operation. It's better to initialize a new converter + * and specify the extensions you wish to use + * @param {Array} extension + */ + this.removeExtension = function (extension) { + if (!showdown.helper.isArray(extension)) { + extension = [extension]; + } + for (var a = 0; a < extension.length; ++a) { + var ext = extension[a]; + for (var i = 0; i < langExtensions.length; ++i) { + if (langExtensions[i] === ext) { + langExtensions.splice(i, 1); + } + } + for (var ii = 0; ii < outputModifiers.length; ++ii) { + if (outputModifiers[ii] === ext) { + outputModifiers.splice(ii, 1); + } + } + } + }; + + /** + * Get all extension of THIS converter + * @returns {{language: Array, output: Array}} + */ + this.getAllExtensions = function () { + return { + language: langExtensions, + output: outputModifiers + }; + }; + + /** + * Get the metadata of the previously parsed document + * @param raw + * @returns {string|{}} + */ + this.getMetadata = function (raw) { + if (raw) { + return metadata.raw; + } else { + return metadata.parsed; + } + }; + + /** + * Get the metadata format of the previously parsed document + * @returns {string} + */ + this.getMetadataFormat = function () { + return metadata.format; + }; + + /** + * Private: set a single key, value metadata pair + * @param {string} key + * @param {string} value + */ + this._setMetadataPair = function (key, value) { + metadata.parsed[key] = value; + }; + + /** + * Private: set metadata format + * @param {string} format + */ + this._setMetadataFormat = function (format) { + metadata.format = format; + }; + + /** + * Private: set metadata raw text + * @param {string} raw + */ + this._setMetadataRaw = function (raw) { + metadata.raw = raw; + }; +}; diff --git a/showdown/src/helpers.js b/showdown/src/helpers.js new file mode 100644 index 00000000..4fbeacd6 --- /dev/null +++ b/showdown/src/helpers.js @@ -0,0 +1,1603 @@ +/** + * showdownjs helper functions + */ + +if (!showdown.hasOwnProperty('helper')) { + showdown.helper = {}; +} + +/** + * Check if var is string + * @static + * @param {string} a + * @returns {boolean} + */ +showdown.helper.isString = function (a) { + 'use strict'; + return (typeof a === 'string' || a instanceof String); +}; + +/** + * Check if var is a function + * @static + * @param {*} a + * @returns {boolean} + */ +showdown.helper.isFunction = function (a) { + 'use strict'; + var getType = {}; + return a && getType.toString.call(a) === '[object Function]'; +}; + +/** + * isArray helper function + * @static + * @param {*} a + * @returns {boolean} + */ +showdown.helper.isArray = function (a) { + 'use strict'; + return Array.isArray(a); +}; + +/** + * Check if value is undefined + * @static + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`. + */ +showdown.helper.isUndefined = function (value) { + 'use strict'; + return typeof value === 'undefined'; +}; + +/** + * ForEach helper function + * Iterates over Arrays and Objects (own properties only) + * @static + * @param {*} obj + * @param {function} callback Accepts 3 params: 1. value, 2. key, 3. the original array/object + */ +showdown.helper.forEach = function (obj, callback) { + 'use strict'; + // check if obj is defined + if (showdown.helper.isUndefined(obj)) { + throw new Error('obj param is required'); + } + + if (showdown.helper.isUndefined(callback)) { + throw new Error('callback param is required'); + } + + if (!showdown.helper.isFunction(callback)) { + throw new Error('callback param must be a function/closure'); + } + + if (typeof obj.forEach === 'function') { + obj.forEach(callback); + } else if (showdown.helper.isArray(obj)) { + for (var i = 0; i < obj.length; i++) { + callback(obj[i], i, obj); + } + } else if (typeof (obj) === 'object') { + for (var prop in obj) { + if (obj.hasOwnProperty(prop)) { + callback(obj[prop], prop, obj); + } + } + } else { + throw new Error('obj does not seem to be an array or an iterable object'); + } +}; + +/** + * Standardidize extension name + * @static + * @param {string} s extension name + * @returns {string} + */ +showdown.helper.stdExtName = function (s) { + 'use strict'; + return s.replace(/[_?*+\/\\.^-]/g, '').replace(/\s/g, '').toLowerCase(); +}; + +function escapeCharactersCallback (wholeMatch, m1) { + 'use strict'; + var charCodeToEscape = m1.charCodeAt(0); + return '¨E' + charCodeToEscape + 'E'; +} + +/** + * Callback used to escape characters when passing through String.replace + * @static + * @param {string} wholeMatch + * @param {string} m1 + * @returns {string} + */ +showdown.helper.escapeCharactersCallback = escapeCharactersCallback; + +/** + * Escape characters in a string + * @static + * @param {string} text + * @param {string} charsToEscape + * @param {boolean} afterBackslash + * @returns {XML|string|void|*} + */ +showdown.helper.escapeCharacters = function (text, charsToEscape, afterBackslash) { + 'use strict'; + // First we have to escape the escape characters so that + // we can build a character class out of them + var regexString = '([' + charsToEscape.replace(/([\[\]\\])/g, '\\$1') + '])'; + + if (afterBackslash) { + regexString = '\\\\' + regexString; + } + + var regex = new RegExp(regexString, 'g'); + text = text.replace(regex, escapeCharactersCallback); + + return text; +}; + +/** + * Unescape HTML entities + * @param txt + * @returns {string} + */ +showdown.helper.unescapeHTMLEntities = function (txt) { + 'use strict'; + + return txt + .replace(/"/g, '"') + .replace(/</g, '<') + .replace(/>/g, '>') + .replace(/&/g, '&'); +}; + +var rgxFindMatchPos = function (str, left, right, flags) { + 'use strict'; + var f = flags || '', + g = f.indexOf('g') > -1, + x = new RegExp(left + '|' + right, 'g' + f.replace(/g/g, '')), + l = new RegExp(left, f.replace(/g/g, '')), + pos = [], + t, s, m, start, end; + + do { + t = 0; + while ((m = x.exec(str))) { + if (l.test(m[0])) { + if (!(t++)) { + s = x.lastIndex; + start = s - m[0].length; + } + } else if (t) { + if (!--t) { + end = m.index + m[0].length; + var obj = { + left: {start: start, end: s}, + match: {start: s, end: m.index}, + right: {start: m.index, end: end}, + wholeMatch: {start: start, end: end} + }; + pos.push(obj); + if (!g) { + return pos; + } + } + } + } + } while (t && (x.lastIndex = s)); + + return pos; +}; + +/** + * matchRecursiveRegExp + * + * (c) 2007 Steven Levithan + * MIT License + * + * Accepts a string to search, a left and right format delimiter + * as regex patterns, and optional regex flags. Returns an array + * of matches, allowing nested instances of left/right delimiters. + * Use the "g" flag to return all matches, otherwise only the + * first is returned. Be careful to ensure that the left and + * right format delimiters produce mutually exclusive matches. + * Backreferences are not supported within the right delimiter + * due to how it is internally combined with the left delimiter. + * When matching strings whose format delimiters are unbalanced + * to the left or right, the output is intentionally as a + * conventional regex library with recursion support would + * produce, e.g. "<" and ">" both produce ["x"] when using + * "<" and ">" as the delimiters (both strings contain a single, + * balanced instance of ""). + * + * examples: + * matchRecursiveRegExp("test", "\\(", "\\)") + * returns: [] + * matchRecursiveRegExp(">>t<>", "<", ">", "g") + * returns: ["t<>", ""] + * matchRecursiveRegExp("
test
", "]*>", "", "gi") + * returns: ["test"] + */ +showdown.helper.matchRecursiveRegExp = function (str, left, right, flags) { + 'use strict'; + + var matchPos = rgxFindMatchPos (str, left, right, flags), + results = []; + + for (var i = 0; i < matchPos.length; ++i) { + results.push([ + str.slice(matchPos[i].wholeMatch.start, matchPos[i].wholeMatch.end), + str.slice(matchPos[i].match.start, matchPos[i].match.end), + str.slice(matchPos[i].left.start, matchPos[i].left.end), + str.slice(matchPos[i].right.start, matchPos[i].right.end) + ]); + } + return results; +}; + +/** + * + * @param {string} str + * @param {string|function} replacement + * @param {string} left + * @param {string} right + * @param {string} flags + * @returns {string} + */ +showdown.helper.replaceRecursiveRegExp = function (str, replacement, left, right, flags) { + 'use strict'; + + if (!showdown.helper.isFunction(replacement)) { + var repStr = replacement; + replacement = function () { + return repStr; + }; + } + + var matchPos = rgxFindMatchPos(str, left, right, flags), + finalStr = str, + lng = matchPos.length; + + if (lng > 0) { + var bits = []; + if (matchPos[0].wholeMatch.start !== 0) { + bits.push(str.slice(0, matchPos[0].wholeMatch.start)); + } + for (var i = 0; i < lng; ++i) { + bits.push( + replacement( + str.slice(matchPos[i].wholeMatch.start, matchPos[i].wholeMatch.end), + str.slice(matchPos[i].match.start, matchPos[i].match.end), + str.slice(matchPos[i].left.start, matchPos[i].left.end), + str.slice(matchPos[i].right.start, matchPos[i].right.end) + ) + ); + if (i < lng - 1) { + bits.push(str.slice(matchPos[i].wholeMatch.end, matchPos[i + 1].wholeMatch.start)); + } + } + if (matchPos[lng - 1].wholeMatch.end < str.length) { + bits.push(str.slice(matchPos[lng - 1].wholeMatch.end)); + } + finalStr = bits.join(''); + } + return finalStr; +}; + +/** + * Returns the index within the passed String object of the first occurrence of the specified regex, + * starting the search at fromIndex. Returns -1 if the value is not found. + * + * @param {string} str string to search + * @param {RegExp} regex Regular expression to search + * @param {int} [fromIndex = 0] Index to start the search + * @returns {Number} + * @throws InvalidArgumentError + */ +showdown.helper.regexIndexOf = function (str, regex, fromIndex) { + 'use strict'; + if (!showdown.helper.isString(str)) { + throw 'InvalidArgumentError: first parameter of showdown.helper.regexIndexOf function must be a string'; + } + if (regex instanceof RegExp === false) { + throw 'InvalidArgumentError: second parameter of showdown.helper.regexIndexOf function must be an instance of RegExp'; + } + var indexOf = str.substring(fromIndex || 0).search(regex); + return (indexOf >= 0) ? (indexOf + (fromIndex || 0)) : indexOf; +}; + +/** + * Splits the passed string object at the defined index, and returns an array composed of the two substrings + * @param {string} str string to split + * @param {int} index index to split string at + * @returns {[string,string]} + * @throws InvalidArgumentError + */ +showdown.helper.splitAtIndex = function (str, index) { + 'use strict'; + if (!showdown.helper.isString(str)) { + throw 'InvalidArgumentError: first parameter of showdown.helper.regexIndexOf function must be a string'; + } + return [str.substring(0, index), str.substring(index)]; +}; + +/** + * Obfuscate an e-mail address through the use of Character Entities, + * transforming ASCII characters into their equivalent decimal or hex entities. + * + * Since it has a random component, subsequent calls to this function produce different results + * + * @param {string} mail + * @returns {string} + */ +showdown.helper.encodeEmailAddress = function (mail) { + 'use strict'; + var encode = [ + function (ch) { + return '&#' + ch.charCodeAt(0) + ';'; + }, + function (ch) { + return '&#x' + ch.charCodeAt(0).toString(16) + ';'; + }, + function (ch) { + return ch; + } + ]; + + mail = mail.replace(/./g, function (ch) { + if (ch === '@') { + // this *must* be encoded. I insist. + ch = encode[Math.floor(Math.random() * 2)](ch); + } else { + var r = Math.random(); + // roughly 10% raw, 45% hex, 45% dec + ch = ( + r > 0.9 ? encode[2](ch) : r > 0.45 ? encode[1](ch) : encode[0](ch) + ); + } + return ch; + }); + + return mail; +}; + +/** + * + * @param str + * @param targetLength + * @param padString + * @returns {string} + */ +showdown.helper.padEnd = function padEnd (str, targetLength, padString) { + 'use strict'; + /*jshint bitwise: false*/ + // eslint-disable-next-line space-infix-ops + targetLength = targetLength>>0; //floor if number or convert non-number to 0; + /*jshint bitwise: true*/ + padString = String(padString || ' '); + if (str.length > targetLength) { + return String(str); + } else { + targetLength = targetLength - str.length; + if (targetLength > padString.length) { + padString += padString.repeat(targetLength / padString.length); //append to original to ensure we are longer than needed + } + return String(str) + padString.slice(0,targetLength); + } +}; + +/** + * POLYFILLS + */ +// use this instead of builtin is undefined for IE8 compatibility +if (typeof (console) === 'undefined') { + console = { + warn: function (msg) { + 'use strict'; + alert(msg); + }, + log: function (msg) { + 'use strict'; + alert(msg); + }, + error: function (msg) { + 'use strict'; + throw msg; + } + }; +} + +/** + * Common regexes. + * We declare some common regexes to improve performance + */ +showdown.helper.regexes = { + asteriskDashAndColon: /([*_:~])/g +}; + +/** + * EMOJIS LIST + */ +showdown.helper.emojis = { + '+1':'\ud83d\udc4d', + '-1':'\ud83d\udc4e', + '100':'\ud83d\udcaf', + '1234':'\ud83d\udd22', + '1st_place_medal':'\ud83e\udd47', + '2nd_place_medal':'\ud83e\udd48', + '3rd_place_medal':'\ud83e\udd49', + '8ball':'\ud83c\udfb1', + 'a':'\ud83c\udd70\ufe0f', + 'ab':'\ud83c\udd8e', + 'abc':'\ud83d\udd24', + 'abcd':'\ud83d\udd21', + 'accept':'\ud83c\ude51', + 'aerial_tramway':'\ud83d\udea1', + 'airplane':'\u2708\ufe0f', + 'alarm_clock':'\u23f0', + 'alembic':'\u2697\ufe0f', + 'alien':'\ud83d\udc7d', + 'ambulance':'\ud83d\ude91', + 'amphora':'\ud83c\udffa', + 'anchor':'\u2693\ufe0f', + 'angel':'\ud83d\udc7c', + 'anger':'\ud83d\udca2', + 'angry':'\ud83d\ude20', + 'anguished':'\ud83d\ude27', + 'ant':'\ud83d\udc1c', + 'apple':'\ud83c\udf4e', + 'aquarius':'\u2652\ufe0f', + 'aries':'\u2648\ufe0f', + 'arrow_backward':'\u25c0\ufe0f', + 'arrow_double_down':'\u23ec', + 'arrow_double_up':'\u23eb', + 'arrow_down':'\u2b07\ufe0f', + 'arrow_down_small':'\ud83d\udd3d', + 'arrow_forward':'\u25b6\ufe0f', + 'arrow_heading_down':'\u2935\ufe0f', + 'arrow_heading_up':'\u2934\ufe0f', + 'arrow_left':'\u2b05\ufe0f', + 'arrow_lower_left':'\u2199\ufe0f', + 'arrow_lower_right':'\u2198\ufe0f', + 'arrow_right':'\u27a1\ufe0f', + 'arrow_right_hook':'\u21aa\ufe0f', + 'arrow_up':'\u2b06\ufe0f', + 'arrow_up_down':'\u2195\ufe0f', + 'arrow_up_small':'\ud83d\udd3c', + 'arrow_upper_left':'\u2196\ufe0f', + 'arrow_upper_right':'\u2197\ufe0f', + 'arrows_clockwise':'\ud83d\udd03', + 'arrows_counterclockwise':'\ud83d\udd04', + 'art':'\ud83c\udfa8', + 'articulated_lorry':'\ud83d\ude9b', + 'artificial_satellite':'\ud83d\udef0', + 'astonished':'\ud83d\ude32', + 'athletic_shoe':'\ud83d\udc5f', + 'atm':'\ud83c\udfe7', + 'atom_symbol':'\u269b\ufe0f', + 'avocado':'\ud83e\udd51', + 'b':'\ud83c\udd71\ufe0f', + 'baby':'\ud83d\udc76', + 'baby_bottle':'\ud83c\udf7c', + 'baby_chick':'\ud83d\udc24', + 'baby_symbol':'\ud83d\udebc', + 'back':'\ud83d\udd19', + 'bacon':'\ud83e\udd53', + 'badminton':'\ud83c\udff8', + 'baggage_claim':'\ud83d\udec4', + 'baguette_bread':'\ud83e\udd56', + 'balance_scale':'\u2696\ufe0f', + 'balloon':'\ud83c\udf88', + 'ballot_box':'\ud83d\uddf3', + 'ballot_box_with_check':'\u2611\ufe0f', + 'bamboo':'\ud83c\udf8d', + 'banana':'\ud83c\udf4c', + 'bangbang':'\u203c\ufe0f', + 'bank':'\ud83c\udfe6', + 'bar_chart':'\ud83d\udcca', + 'barber':'\ud83d\udc88', + 'baseball':'\u26be\ufe0f', + 'basketball':'\ud83c\udfc0', + 'basketball_man':'\u26f9\ufe0f', + 'basketball_woman':'\u26f9\ufe0f‍\u2640\ufe0f', + 'bat':'\ud83e\udd87', + 'bath':'\ud83d\udec0', + 'bathtub':'\ud83d\udec1', + 'battery':'\ud83d\udd0b', + 'beach_umbrella':'\ud83c\udfd6', + 'bear':'\ud83d\udc3b', + 'bed':'\ud83d\udecf', + 'bee':'\ud83d\udc1d', + 'beer':'\ud83c\udf7a', + 'beers':'\ud83c\udf7b', + 'beetle':'\ud83d\udc1e', + 'beginner':'\ud83d\udd30', + 'bell':'\ud83d\udd14', + 'bellhop_bell':'\ud83d\udece', + 'bento':'\ud83c\udf71', + 'biking_man':'\ud83d\udeb4', + 'bike':'\ud83d\udeb2', + 'biking_woman':'\ud83d\udeb4‍\u2640\ufe0f', + 'bikini':'\ud83d\udc59', + 'biohazard':'\u2623\ufe0f', + 'bird':'\ud83d\udc26', + 'birthday':'\ud83c\udf82', + 'black_circle':'\u26ab\ufe0f', + 'black_flag':'\ud83c\udff4', + 'black_heart':'\ud83d\udda4', + 'black_joker':'\ud83c\udccf', + 'black_large_square':'\u2b1b\ufe0f', + 'black_medium_small_square':'\u25fe\ufe0f', + 'black_medium_square':'\u25fc\ufe0f', + 'black_nib':'\u2712\ufe0f', + 'black_small_square':'\u25aa\ufe0f', + 'black_square_button':'\ud83d\udd32', + 'blonde_man':'\ud83d\udc71', + 'blonde_woman':'\ud83d\udc71‍\u2640\ufe0f', + 'blossom':'\ud83c\udf3c', + 'blowfish':'\ud83d\udc21', + 'blue_book':'\ud83d\udcd8', + 'blue_car':'\ud83d\ude99', + 'blue_heart':'\ud83d\udc99', + 'blush':'\ud83d\ude0a', + 'boar':'\ud83d\udc17', + 'boat':'\u26f5\ufe0f', + 'bomb':'\ud83d\udca3', + 'book':'\ud83d\udcd6', + 'bookmark':'\ud83d\udd16', + 'bookmark_tabs':'\ud83d\udcd1', + 'books':'\ud83d\udcda', + 'boom':'\ud83d\udca5', + 'boot':'\ud83d\udc62', + 'bouquet':'\ud83d\udc90', + 'bowing_man':'\ud83d\ude47', + 'bow_and_arrow':'\ud83c\udff9', + 'bowing_woman':'\ud83d\ude47‍\u2640\ufe0f', + 'bowling':'\ud83c\udfb3', + 'boxing_glove':'\ud83e\udd4a', + 'boy':'\ud83d\udc66', + 'bread':'\ud83c\udf5e', + 'bride_with_veil':'\ud83d\udc70', + 'bridge_at_night':'\ud83c\udf09', + 'briefcase':'\ud83d\udcbc', + 'broken_heart':'\ud83d\udc94', + 'bug':'\ud83d\udc1b', + 'building_construction':'\ud83c\udfd7', + 'bulb':'\ud83d\udca1', + 'bullettrain_front':'\ud83d\ude85', + 'bullettrain_side':'\ud83d\ude84', + 'burrito':'\ud83c\udf2f', + 'bus':'\ud83d\ude8c', + 'business_suit_levitating':'\ud83d\udd74', + 'busstop':'\ud83d\ude8f', + 'bust_in_silhouette':'\ud83d\udc64', + 'busts_in_silhouette':'\ud83d\udc65', + 'butterfly':'\ud83e\udd8b', + 'cactus':'\ud83c\udf35', + 'cake':'\ud83c\udf70', + 'calendar':'\ud83d\udcc6', + 'call_me_hand':'\ud83e\udd19', + 'calling':'\ud83d\udcf2', + 'camel':'\ud83d\udc2b', + 'camera':'\ud83d\udcf7', + 'camera_flash':'\ud83d\udcf8', + 'camping':'\ud83c\udfd5', + 'cancer':'\u264b\ufe0f', + 'candle':'\ud83d\udd6f', + 'candy':'\ud83c\udf6c', + 'canoe':'\ud83d\udef6', + 'capital_abcd':'\ud83d\udd20', + 'capricorn':'\u2651\ufe0f', + 'car':'\ud83d\ude97', + 'card_file_box':'\ud83d\uddc3', + 'card_index':'\ud83d\udcc7', + 'card_index_dividers':'\ud83d\uddc2', + 'carousel_horse':'\ud83c\udfa0', + 'carrot':'\ud83e\udd55', + 'cat':'\ud83d\udc31', + 'cat2':'\ud83d\udc08', + 'cd':'\ud83d\udcbf', + 'chains':'\u26d3', + 'champagne':'\ud83c\udf7e', + 'chart':'\ud83d\udcb9', + 'chart_with_downwards_trend':'\ud83d\udcc9', + 'chart_with_upwards_trend':'\ud83d\udcc8', + 'checkered_flag':'\ud83c\udfc1', + 'cheese':'\ud83e\uddc0', + 'cherries':'\ud83c\udf52', + 'cherry_blossom':'\ud83c\udf38', + 'chestnut':'\ud83c\udf30', + 'chicken':'\ud83d\udc14', + 'children_crossing':'\ud83d\udeb8', + 'chipmunk':'\ud83d\udc3f', + 'chocolate_bar':'\ud83c\udf6b', + 'christmas_tree':'\ud83c\udf84', + 'church':'\u26ea\ufe0f', + 'cinema':'\ud83c\udfa6', + 'circus_tent':'\ud83c\udfaa', + 'city_sunrise':'\ud83c\udf07', + 'city_sunset':'\ud83c\udf06', + 'cityscape':'\ud83c\udfd9', + 'cl':'\ud83c\udd91', + 'clamp':'\ud83d\udddc', + 'clap':'\ud83d\udc4f', + 'clapper':'\ud83c\udfac', + 'classical_building':'\ud83c\udfdb', + 'clinking_glasses':'\ud83e\udd42', + 'clipboard':'\ud83d\udccb', + 'clock1':'\ud83d\udd50', + 'clock10':'\ud83d\udd59', + 'clock1030':'\ud83d\udd65', + 'clock11':'\ud83d\udd5a', + 'clock1130':'\ud83d\udd66', + 'clock12':'\ud83d\udd5b', + 'clock1230':'\ud83d\udd67', + 'clock130':'\ud83d\udd5c', + 'clock2':'\ud83d\udd51', + 'clock230':'\ud83d\udd5d', + 'clock3':'\ud83d\udd52', + 'clock330':'\ud83d\udd5e', + 'clock4':'\ud83d\udd53', + 'clock430':'\ud83d\udd5f', + 'clock5':'\ud83d\udd54', + 'clock530':'\ud83d\udd60', + 'clock6':'\ud83d\udd55', + 'clock630':'\ud83d\udd61', + 'clock7':'\ud83d\udd56', + 'clock730':'\ud83d\udd62', + 'clock8':'\ud83d\udd57', + 'clock830':'\ud83d\udd63', + 'clock9':'\ud83d\udd58', + 'clock930':'\ud83d\udd64', + 'closed_book':'\ud83d\udcd5', + 'closed_lock_with_key':'\ud83d\udd10', + 'closed_umbrella':'\ud83c\udf02', + 'cloud':'\u2601\ufe0f', + 'cloud_with_lightning':'\ud83c\udf29', + 'cloud_with_lightning_and_rain':'\u26c8', + 'cloud_with_rain':'\ud83c\udf27', + 'cloud_with_snow':'\ud83c\udf28', + 'clown_face':'\ud83e\udd21', + 'clubs':'\u2663\ufe0f', + 'cocktail':'\ud83c\udf78', + 'coffee':'\u2615\ufe0f', + 'coffin':'\u26b0\ufe0f', + 'cold_sweat':'\ud83d\ude30', + 'comet':'\u2604\ufe0f', + 'computer':'\ud83d\udcbb', + 'computer_mouse':'\ud83d\uddb1', + 'confetti_ball':'\ud83c\udf8a', + 'confounded':'\ud83d\ude16', + 'confused':'\ud83d\ude15', + 'congratulations':'\u3297\ufe0f', + 'construction':'\ud83d\udea7', + 'construction_worker_man':'\ud83d\udc77', + 'construction_worker_woman':'\ud83d\udc77‍\u2640\ufe0f', + 'control_knobs':'\ud83c\udf9b', + 'convenience_store':'\ud83c\udfea', + 'cookie':'\ud83c\udf6a', + 'cool':'\ud83c\udd92', + 'policeman':'\ud83d\udc6e', + 'copyright':'\u00a9\ufe0f', + 'corn':'\ud83c\udf3d', + 'couch_and_lamp':'\ud83d\udecb', + 'couple':'\ud83d\udc6b', + 'couple_with_heart_woman_man':'\ud83d\udc91', + 'couple_with_heart_man_man':'\ud83d\udc68‍\u2764\ufe0f‍\ud83d\udc68', + 'couple_with_heart_woman_woman':'\ud83d\udc69‍\u2764\ufe0f‍\ud83d\udc69', + 'couplekiss_man_man':'\ud83d\udc68‍\u2764\ufe0f‍\ud83d\udc8b‍\ud83d\udc68', + 'couplekiss_man_woman':'\ud83d\udc8f', + 'couplekiss_woman_woman':'\ud83d\udc69‍\u2764\ufe0f‍\ud83d\udc8b‍\ud83d\udc69', + 'cow':'\ud83d\udc2e', + 'cow2':'\ud83d\udc04', + 'cowboy_hat_face':'\ud83e\udd20', + 'crab':'\ud83e\udd80', + 'crayon':'\ud83d\udd8d', + 'credit_card':'\ud83d\udcb3', + 'crescent_moon':'\ud83c\udf19', + 'cricket':'\ud83c\udfcf', + 'crocodile':'\ud83d\udc0a', + 'croissant':'\ud83e\udd50', + 'crossed_fingers':'\ud83e\udd1e', + 'crossed_flags':'\ud83c\udf8c', + 'crossed_swords':'\u2694\ufe0f', + 'crown':'\ud83d\udc51', + 'cry':'\ud83d\ude22', + 'crying_cat_face':'\ud83d\ude3f', + 'crystal_ball':'\ud83d\udd2e', + 'cucumber':'\ud83e\udd52', + 'cupid':'\ud83d\udc98', + 'curly_loop':'\u27b0', + 'currency_exchange':'\ud83d\udcb1', + 'curry':'\ud83c\udf5b', + 'custard':'\ud83c\udf6e', + 'customs':'\ud83d\udec3', + 'cyclone':'\ud83c\udf00', + 'dagger':'\ud83d\udde1', + 'dancer':'\ud83d\udc83', + 'dancing_women':'\ud83d\udc6f', + 'dancing_men':'\ud83d\udc6f‍\u2642\ufe0f', + 'dango':'\ud83c\udf61', + 'dark_sunglasses':'\ud83d\udd76', + 'dart':'\ud83c\udfaf', + 'dash':'\ud83d\udca8', + 'date':'\ud83d\udcc5', + 'deciduous_tree':'\ud83c\udf33', + 'deer':'\ud83e\udd8c', + 'department_store':'\ud83c\udfec', + 'derelict_house':'\ud83c\udfda', + 'desert':'\ud83c\udfdc', + 'desert_island':'\ud83c\udfdd', + 'desktop_computer':'\ud83d\udda5', + 'male_detective':'\ud83d\udd75\ufe0f', + 'diamond_shape_with_a_dot_inside':'\ud83d\udca0', + 'diamonds':'\u2666\ufe0f', + 'disappointed':'\ud83d\ude1e', + 'disappointed_relieved':'\ud83d\ude25', + 'dizzy':'\ud83d\udcab', + 'dizzy_face':'\ud83d\ude35', + 'do_not_litter':'\ud83d\udeaf', + 'dog':'\ud83d\udc36', + 'dog2':'\ud83d\udc15', + 'dollar':'\ud83d\udcb5', + 'dolls':'\ud83c\udf8e', + 'dolphin':'\ud83d\udc2c', + 'door':'\ud83d\udeaa', + 'doughnut':'\ud83c\udf69', + 'dove':'\ud83d\udd4a', + 'dragon':'\ud83d\udc09', + 'dragon_face':'\ud83d\udc32', + 'dress':'\ud83d\udc57', + 'dromedary_camel':'\ud83d\udc2a', + 'drooling_face':'\ud83e\udd24', + 'droplet':'\ud83d\udca7', + 'drum':'\ud83e\udd41', + 'duck':'\ud83e\udd86', + 'dvd':'\ud83d\udcc0', + 'e-mail':'\ud83d\udce7', + 'eagle':'\ud83e\udd85', + 'ear':'\ud83d\udc42', + 'ear_of_rice':'\ud83c\udf3e', + 'earth_africa':'\ud83c\udf0d', + 'earth_americas':'\ud83c\udf0e', + 'earth_asia':'\ud83c\udf0f', + 'egg':'\ud83e\udd5a', + 'eggplant':'\ud83c\udf46', + 'eight_pointed_black_star':'\u2734\ufe0f', + 'eight_spoked_asterisk':'\u2733\ufe0f', + 'electric_plug':'\ud83d\udd0c', + 'elephant':'\ud83d\udc18', + 'email':'\u2709\ufe0f', + 'end':'\ud83d\udd1a', + 'envelope_with_arrow':'\ud83d\udce9', + 'euro':'\ud83d\udcb6', + 'european_castle':'\ud83c\udff0', + 'european_post_office':'\ud83c\udfe4', + 'evergreen_tree':'\ud83c\udf32', + 'exclamation':'\u2757\ufe0f', + 'expressionless':'\ud83d\ude11', + 'eye':'\ud83d\udc41', + 'eye_speech_bubble':'\ud83d\udc41‍\ud83d\udde8', + 'eyeglasses':'\ud83d\udc53', + 'eyes':'\ud83d\udc40', + 'face_with_head_bandage':'\ud83e\udd15', + 'face_with_thermometer':'\ud83e\udd12', + 'fist_oncoming':'\ud83d\udc4a', + 'factory':'\ud83c\udfed', + 'fallen_leaf':'\ud83c\udf42', + 'family_man_woman_boy':'\ud83d\udc6a', + 'family_man_boy':'\ud83d\udc68‍\ud83d\udc66', + 'family_man_boy_boy':'\ud83d\udc68‍\ud83d\udc66‍\ud83d\udc66', + 'family_man_girl':'\ud83d\udc68‍\ud83d\udc67', + 'family_man_girl_boy':'\ud83d\udc68‍\ud83d\udc67‍\ud83d\udc66', + 'family_man_girl_girl':'\ud83d\udc68‍\ud83d\udc67‍\ud83d\udc67', + 'family_man_man_boy':'\ud83d\udc68‍\ud83d\udc68‍\ud83d\udc66', + 'family_man_man_boy_boy':'\ud83d\udc68‍\ud83d\udc68‍\ud83d\udc66‍\ud83d\udc66', + 'family_man_man_girl':'\ud83d\udc68‍\ud83d\udc68‍\ud83d\udc67', + 'family_man_man_girl_boy':'\ud83d\udc68‍\ud83d\udc68‍\ud83d\udc67‍\ud83d\udc66', + 'family_man_man_girl_girl':'\ud83d\udc68‍\ud83d\udc68‍\ud83d\udc67‍\ud83d\udc67', + 'family_man_woman_boy_boy':'\ud83d\udc68‍\ud83d\udc69‍\ud83d\udc66‍\ud83d\udc66', + 'family_man_woman_girl':'\ud83d\udc68‍\ud83d\udc69‍\ud83d\udc67', + 'family_man_woman_girl_boy':'\ud83d\udc68‍\ud83d\udc69‍\ud83d\udc67‍\ud83d\udc66', + 'family_man_woman_girl_girl':'\ud83d\udc68‍\ud83d\udc69‍\ud83d\udc67‍\ud83d\udc67', + 'family_woman_boy':'\ud83d\udc69‍\ud83d\udc66', + 'family_woman_boy_boy':'\ud83d\udc69‍\ud83d\udc66‍\ud83d\udc66', + 'family_woman_girl':'\ud83d\udc69‍\ud83d\udc67', + 'family_woman_girl_boy':'\ud83d\udc69‍\ud83d\udc67‍\ud83d\udc66', + 'family_woman_girl_girl':'\ud83d\udc69‍\ud83d\udc67‍\ud83d\udc67', + 'family_woman_woman_boy':'\ud83d\udc69‍\ud83d\udc69‍\ud83d\udc66', + 'family_woman_woman_boy_boy':'\ud83d\udc69‍\ud83d\udc69‍\ud83d\udc66‍\ud83d\udc66', + 'family_woman_woman_girl':'\ud83d\udc69‍\ud83d\udc69‍\ud83d\udc67', + 'family_woman_woman_girl_boy':'\ud83d\udc69‍\ud83d\udc69‍\ud83d\udc67‍\ud83d\udc66', + 'family_woman_woman_girl_girl':'\ud83d\udc69‍\ud83d\udc69‍\ud83d\udc67‍\ud83d\udc67', + 'fast_forward':'\u23e9', + 'fax':'\ud83d\udce0', + 'fearful':'\ud83d\ude28', + 'feet':'\ud83d\udc3e', + 'female_detective':'\ud83d\udd75\ufe0f‍\u2640\ufe0f', + 'ferris_wheel':'\ud83c\udfa1', + 'ferry':'\u26f4', + 'field_hockey':'\ud83c\udfd1', + 'file_cabinet':'\ud83d\uddc4', + 'file_folder':'\ud83d\udcc1', + 'film_projector':'\ud83d\udcfd', + 'film_strip':'\ud83c\udf9e', + 'fire':'\ud83d\udd25', + 'fire_engine':'\ud83d\ude92', + 'fireworks':'\ud83c\udf86', + 'first_quarter_moon':'\ud83c\udf13', + 'first_quarter_moon_with_face':'\ud83c\udf1b', + 'fish':'\ud83d\udc1f', + 'fish_cake':'\ud83c\udf65', + 'fishing_pole_and_fish':'\ud83c\udfa3', + 'fist_raised':'\u270a', + 'fist_left':'\ud83e\udd1b', + 'fist_right':'\ud83e\udd1c', + 'flags':'\ud83c\udf8f', + 'flashlight':'\ud83d\udd26', + 'fleur_de_lis':'\u269c\ufe0f', + 'flight_arrival':'\ud83d\udeec', + 'flight_departure':'\ud83d\udeeb', + 'floppy_disk':'\ud83d\udcbe', + 'flower_playing_cards':'\ud83c\udfb4', + 'flushed':'\ud83d\ude33', + 'fog':'\ud83c\udf2b', + 'foggy':'\ud83c\udf01', + 'football':'\ud83c\udfc8', + 'footprints':'\ud83d\udc63', + 'fork_and_knife':'\ud83c\udf74', + 'fountain':'\u26f2\ufe0f', + 'fountain_pen':'\ud83d\udd8b', + 'four_leaf_clover':'\ud83c\udf40', + 'fox_face':'\ud83e\udd8a', + 'framed_picture':'\ud83d\uddbc', + 'free':'\ud83c\udd93', + 'fried_egg':'\ud83c\udf73', + 'fried_shrimp':'\ud83c\udf64', + 'fries':'\ud83c\udf5f', + 'frog':'\ud83d\udc38', + 'frowning':'\ud83d\ude26', + 'frowning_face':'\u2639\ufe0f', + 'frowning_man':'\ud83d\ude4d‍\u2642\ufe0f', + 'frowning_woman':'\ud83d\ude4d', + 'middle_finger':'\ud83d\udd95', + 'fuelpump':'\u26fd\ufe0f', + 'full_moon':'\ud83c\udf15', + 'full_moon_with_face':'\ud83c\udf1d', + 'funeral_urn':'\u26b1\ufe0f', + 'game_die':'\ud83c\udfb2', + 'gear':'\u2699\ufe0f', + 'gem':'\ud83d\udc8e', + 'gemini':'\u264a\ufe0f', + 'ghost':'\ud83d\udc7b', + 'gift':'\ud83c\udf81', + 'gift_heart':'\ud83d\udc9d', + 'girl':'\ud83d\udc67', + 'globe_with_meridians':'\ud83c\udf10', + 'goal_net':'\ud83e\udd45', + 'goat':'\ud83d\udc10', + 'golf':'\u26f3\ufe0f', + 'golfing_man':'\ud83c\udfcc\ufe0f', + 'golfing_woman':'\ud83c\udfcc\ufe0f‍\u2640\ufe0f', + 'gorilla':'\ud83e\udd8d', + 'grapes':'\ud83c\udf47', + 'green_apple':'\ud83c\udf4f', + 'green_book':'\ud83d\udcd7', + 'green_heart':'\ud83d\udc9a', + 'green_salad':'\ud83e\udd57', + 'grey_exclamation':'\u2755', + 'grey_question':'\u2754', + 'grimacing':'\ud83d\ude2c', + 'grin':'\ud83d\ude01', + 'grinning':'\ud83d\ude00', + 'guardsman':'\ud83d\udc82', + 'guardswoman':'\ud83d\udc82‍\u2640\ufe0f', + 'guitar':'\ud83c\udfb8', + 'gun':'\ud83d\udd2b', + 'haircut_woman':'\ud83d\udc87', + 'haircut_man':'\ud83d\udc87‍\u2642\ufe0f', + 'hamburger':'\ud83c\udf54', + 'hammer':'\ud83d\udd28', + 'hammer_and_pick':'\u2692', + 'hammer_and_wrench':'\ud83d\udee0', + 'hamster':'\ud83d\udc39', + 'hand':'\u270b', + 'handbag':'\ud83d\udc5c', + 'handshake':'\ud83e\udd1d', + 'hankey':'\ud83d\udca9', + 'hatched_chick':'\ud83d\udc25', + 'hatching_chick':'\ud83d\udc23', + 'headphones':'\ud83c\udfa7', + 'hear_no_evil':'\ud83d\ude49', + 'heart':'\u2764\ufe0f', + 'heart_decoration':'\ud83d\udc9f', + 'heart_eyes':'\ud83d\ude0d', + 'heart_eyes_cat':'\ud83d\ude3b', + 'heartbeat':'\ud83d\udc93', + 'heartpulse':'\ud83d\udc97', + 'hearts':'\u2665\ufe0f', + 'heavy_check_mark':'\u2714\ufe0f', + 'heavy_division_sign':'\u2797', + 'heavy_dollar_sign':'\ud83d\udcb2', + 'heavy_heart_exclamation':'\u2763\ufe0f', + 'heavy_minus_sign':'\u2796', + 'heavy_multiplication_x':'\u2716\ufe0f', + 'heavy_plus_sign':'\u2795', + 'helicopter':'\ud83d\ude81', + 'herb':'\ud83c\udf3f', + 'hibiscus':'\ud83c\udf3a', + 'high_brightness':'\ud83d\udd06', + 'high_heel':'\ud83d\udc60', + 'hocho':'\ud83d\udd2a', + 'hole':'\ud83d\udd73', + 'honey_pot':'\ud83c\udf6f', + 'horse':'\ud83d\udc34', + 'horse_racing':'\ud83c\udfc7', + 'hospital':'\ud83c\udfe5', + 'hot_pepper':'\ud83c\udf36', + 'hotdog':'\ud83c\udf2d', + 'hotel':'\ud83c\udfe8', + 'hotsprings':'\u2668\ufe0f', + 'hourglass':'\u231b\ufe0f', + 'hourglass_flowing_sand':'\u23f3', + 'house':'\ud83c\udfe0', + 'house_with_garden':'\ud83c\udfe1', + 'houses':'\ud83c\udfd8', + 'hugs':'\ud83e\udd17', + 'hushed':'\ud83d\ude2f', + 'ice_cream':'\ud83c\udf68', + 'ice_hockey':'\ud83c\udfd2', + 'ice_skate':'\u26f8', + 'icecream':'\ud83c\udf66', + 'id':'\ud83c\udd94', + 'ideograph_advantage':'\ud83c\ude50', + 'imp':'\ud83d\udc7f', + 'inbox_tray':'\ud83d\udce5', + 'incoming_envelope':'\ud83d\udce8', + 'tipping_hand_woman':'\ud83d\udc81', + 'information_source':'\u2139\ufe0f', + 'innocent':'\ud83d\ude07', + 'interrobang':'\u2049\ufe0f', + 'iphone':'\ud83d\udcf1', + 'izakaya_lantern':'\ud83c\udfee', + 'jack_o_lantern':'\ud83c\udf83', + 'japan':'\ud83d\uddfe', + 'japanese_castle':'\ud83c\udfef', + 'japanese_goblin':'\ud83d\udc7a', + 'japanese_ogre':'\ud83d\udc79', + 'jeans':'\ud83d\udc56', + 'joy':'\ud83d\ude02', + 'joy_cat':'\ud83d\ude39', + 'joystick':'\ud83d\udd79', + 'kaaba':'\ud83d\udd4b', + 'key':'\ud83d\udd11', + 'keyboard':'\u2328\ufe0f', + 'keycap_ten':'\ud83d\udd1f', + 'kick_scooter':'\ud83d\udef4', + 'kimono':'\ud83d\udc58', + 'kiss':'\ud83d\udc8b', + 'kissing':'\ud83d\ude17', + 'kissing_cat':'\ud83d\ude3d', + 'kissing_closed_eyes':'\ud83d\ude1a', + 'kissing_heart':'\ud83d\ude18', + 'kissing_smiling_eyes':'\ud83d\ude19', + 'kiwi_fruit':'\ud83e\udd5d', + 'koala':'\ud83d\udc28', + 'koko':'\ud83c\ude01', + 'label':'\ud83c\udff7', + 'large_blue_circle':'\ud83d\udd35', + 'large_blue_diamond':'\ud83d\udd37', + 'large_orange_diamond':'\ud83d\udd36', + 'last_quarter_moon':'\ud83c\udf17', + 'last_quarter_moon_with_face':'\ud83c\udf1c', + 'latin_cross':'\u271d\ufe0f', + 'laughing':'\ud83d\ude06', + 'leaves':'\ud83c\udf43', + 'ledger':'\ud83d\udcd2', + 'left_luggage':'\ud83d\udec5', + 'left_right_arrow':'\u2194\ufe0f', + 'leftwards_arrow_with_hook':'\u21a9\ufe0f', + 'lemon':'\ud83c\udf4b', + 'leo':'\u264c\ufe0f', + 'leopard':'\ud83d\udc06', + 'level_slider':'\ud83c\udf9a', + 'libra':'\u264e\ufe0f', + 'light_rail':'\ud83d\ude88', + 'link':'\ud83d\udd17', + 'lion':'\ud83e\udd81', + 'lips':'\ud83d\udc44', + 'lipstick':'\ud83d\udc84', + 'lizard':'\ud83e\udd8e', + 'lock':'\ud83d\udd12', + 'lock_with_ink_pen':'\ud83d\udd0f', + 'lollipop':'\ud83c\udf6d', + 'loop':'\u27bf', + 'loud_sound':'\ud83d\udd0a', + 'loudspeaker':'\ud83d\udce2', + 'love_hotel':'\ud83c\udfe9', + 'love_letter':'\ud83d\udc8c', + 'low_brightness':'\ud83d\udd05', + 'lying_face':'\ud83e\udd25', + 'm':'\u24c2\ufe0f', + 'mag':'\ud83d\udd0d', + 'mag_right':'\ud83d\udd0e', + 'mahjong':'\ud83c\udc04\ufe0f', + 'mailbox':'\ud83d\udceb', + 'mailbox_closed':'\ud83d\udcea', + 'mailbox_with_mail':'\ud83d\udcec', + 'mailbox_with_no_mail':'\ud83d\udced', + 'man':'\ud83d\udc68', + 'man_artist':'\ud83d\udc68‍\ud83c\udfa8', + 'man_astronaut':'\ud83d\udc68‍\ud83d\ude80', + 'man_cartwheeling':'\ud83e\udd38‍\u2642\ufe0f', + 'man_cook':'\ud83d\udc68‍\ud83c\udf73', + 'man_dancing':'\ud83d\udd7a', + 'man_facepalming':'\ud83e\udd26‍\u2642\ufe0f', + 'man_factory_worker':'\ud83d\udc68‍\ud83c\udfed', + 'man_farmer':'\ud83d\udc68‍\ud83c\udf3e', + 'man_firefighter':'\ud83d\udc68‍\ud83d\ude92', + 'man_health_worker':'\ud83d\udc68‍\u2695\ufe0f', + 'man_in_tuxedo':'\ud83e\udd35', + 'man_judge':'\ud83d\udc68‍\u2696\ufe0f', + 'man_juggling':'\ud83e\udd39‍\u2642\ufe0f', + 'man_mechanic':'\ud83d\udc68‍\ud83d\udd27', + 'man_office_worker':'\ud83d\udc68‍\ud83d\udcbc', + 'man_pilot':'\ud83d\udc68‍\u2708\ufe0f', + 'man_playing_handball':'\ud83e\udd3e‍\u2642\ufe0f', + 'man_playing_water_polo':'\ud83e\udd3d‍\u2642\ufe0f', + 'man_scientist':'\ud83d\udc68‍\ud83d\udd2c', + 'man_shrugging':'\ud83e\udd37‍\u2642\ufe0f', + 'man_singer':'\ud83d\udc68‍\ud83c\udfa4', + 'man_student':'\ud83d\udc68‍\ud83c\udf93', + 'man_teacher':'\ud83d\udc68‍\ud83c\udfeb', + 'man_technologist':'\ud83d\udc68‍\ud83d\udcbb', + 'man_with_gua_pi_mao':'\ud83d\udc72', + 'man_with_turban':'\ud83d\udc73', + 'tangerine':'\ud83c\udf4a', + 'mans_shoe':'\ud83d\udc5e', + 'mantelpiece_clock':'\ud83d\udd70', + 'maple_leaf':'\ud83c\udf41', + 'martial_arts_uniform':'\ud83e\udd4b', + 'mask':'\ud83d\ude37', + 'massage_woman':'\ud83d\udc86', + 'massage_man':'\ud83d\udc86‍\u2642\ufe0f', + 'meat_on_bone':'\ud83c\udf56', + 'medal_military':'\ud83c\udf96', + 'medal_sports':'\ud83c\udfc5', + 'mega':'\ud83d\udce3', + 'melon':'\ud83c\udf48', + 'memo':'\ud83d\udcdd', + 'men_wrestling':'\ud83e\udd3c‍\u2642\ufe0f', + 'menorah':'\ud83d\udd4e', + 'mens':'\ud83d\udeb9', + 'metal':'\ud83e\udd18', + 'metro':'\ud83d\ude87', + 'microphone':'\ud83c\udfa4', + 'microscope':'\ud83d\udd2c', + 'milk_glass':'\ud83e\udd5b', + 'milky_way':'\ud83c\udf0c', + 'minibus':'\ud83d\ude90', + 'minidisc':'\ud83d\udcbd', + 'mobile_phone_off':'\ud83d\udcf4', + 'money_mouth_face':'\ud83e\udd11', + 'money_with_wings':'\ud83d\udcb8', + 'moneybag':'\ud83d\udcb0', + 'monkey':'\ud83d\udc12', + 'monkey_face':'\ud83d\udc35', + 'monorail':'\ud83d\ude9d', + 'moon':'\ud83c\udf14', + 'mortar_board':'\ud83c\udf93', + 'mosque':'\ud83d\udd4c', + 'motor_boat':'\ud83d\udee5', + 'motor_scooter':'\ud83d\udef5', + 'motorcycle':'\ud83c\udfcd', + 'motorway':'\ud83d\udee3', + 'mount_fuji':'\ud83d\uddfb', + 'mountain':'\u26f0', + 'mountain_biking_man':'\ud83d\udeb5', + 'mountain_biking_woman':'\ud83d\udeb5‍\u2640\ufe0f', + 'mountain_cableway':'\ud83d\udea0', + 'mountain_railway':'\ud83d\ude9e', + 'mountain_snow':'\ud83c\udfd4', + 'mouse':'\ud83d\udc2d', + 'mouse2':'\ud83d\udc01', + 'movie_camera':'\ud83c\udfa5', + 'moyai':'\ud83d\uddff', + 'mrs_claus':'\ud83e\udd36', + 'muscle':'\ud83d\udcaa', + 'mushroom':'\ud83c\udf44', + 'musical_keyboard':'\ud83c\udfb9', + 'musical_note':'\ud83c\udfb5', + 'musical_score':'\ud83c\udfbc', + 'mute':'\ud83d\udd07', + 'nail_care':'\ud83d\udc85', + 'name_badge':'\ud83d\udcdb', + 'national_park':'\ud83c\udfde', + 'nauseated_face':'\ud83e\udd22', + 'necktie':'\ud83d\udc54', + 'negative_squared_cross_mark':'\u274e', + 'nerd_face':'\ud83e\udd13', + 'neutral_face':'\ud83d\ude10', + 'new':'\ud83c\udd95', + 'new_moon':'\ud83c\udf11', + 'new_moon_with_face':'\ud83c\udf1a', + 'newspaper':'\ud83d\udcf0', + 'newspaper_roll':'\ud83d\uddde', + 'next_track_button':'\u23ed', + 'ng':'\ud83c\udd96', + 'no_good_man':'\ud83d\ude45‍\u2642\ufe0f', + 'no_good_woman':'\ud83d\ude45', + 'night_with_stars':'\ud83c\udf03', + 'no_bell':'\ud83d\udd15', + 'no_bicycles':'\ud83d\udeb3', + 'no_entry':'\u26d4\ufe0f', + 'no_entry_sign':'\ud83d\udeab', + 'no_mobile_phones':'\ud83d\udcf5', + 'no_mouth':'\ud83d\ude36', + 'no_pedestrians':'\ud83d\udeb7', + 'no_smoking':'\ud83d\udead', + 'non-potable_water':'\ud83d\udeb1', + 'nose':'\ud83d\udc43', + 'notebook':'\ud83d\udcd3', + 'notebook_with_decorative_cover':'\ud83d\udcd4', + 'notes':'\ud83c\udfb6', + 'nut_and_bolt':'\ud83d\udd29', + 'o':'\u2b55\ufe0f', + 'o2':'\ud83c\udd7e\ufe0f', + 'ocean':'\ud83c\udf0a', + 'octopus':'\ud83d\udc19', + 'oden':'\ud83c\udf62', + 'office':'\ud83c\udfe2', + 'oil_drum':'\ud83d\udee2', + 'ok':'\ud83c\udd97', + 'ok_hand':'\ud83d\udc4c', + 'ok_man':'\ud83d\ude46‍\u2642\ufe0f', + 'ok_woman':'\ud83d\ude46', + 'old_key':'\ud83d\udddd', + 'older_man':'\ud83d\udc74', + 'older_woman':'\ud83d\udc75', + 'om':'\ud83d\udd49', + 'on':'\ud83d\udd1b', + 'oncoming_automobile':'\ud83d\ude98', + 'oncoming_bus':'\ud83d\ude8d', + 'oncoming_police_car':'\ud83d\ude94', + 'oncoming_taxi':'\ud83d\ude96', + 'open_file_folder':'\ud83d\udcc2', + 'open_hands':'\ud83d\udc50', + 'open_mouth':'\ud83d\ude2e', + 'open_umbrella':'\u2602\ufe0f', + 'ophiuchus':'\u26ce', + 'orange_book':'\ud83d\udcd9', + 'orthodox_cross':'\u2626\ufe0f', + 'outbox_tray':'\ud83d\udce4', + 'owl':'\ud83e\udd89', + 'ox':'\ud83d\udc02', + 'package':'\ud83d\udce6', + 'page_facing_up':'\ud83d\udcc4', + 'page_with_curl':'\ud83d\udcc3', + 'pager':'\ud83d\udcdf', + 'paintbrush':'\ud83d\udd8c', + 'palm_tree':'\ud83c\udf34', + 'pancakes':'\ud83e\udd5e', + 'panda_face':'\ud83d\udc3c', + 'paperclip':'\ud83d\udcce', + 'paperclips':'\ud83d\udd87', + 'parasol_on_ground':'\u26f1', + 'parking':'\ud83c\udd7f\ufe0f', + 'part_alternation_mark':'\u303d\ufe0f', + 'partly_sunny':'\u26c5\ufe0f', + 'passenger_ship':'\ud83d\udef3', + 'passport_control':'\ud83d\udec2', + 'pause_button':'\u23f8', + 'peace_symbol':'\u262e\ufe0f', + 'peach':'\ud83c\udf51', + 'peanuts':'\ud83e\udd5c', + 'pear':'\ud83c\udf50', + 'pen':'\ud83d\udd8a', + 'pencil2':'\u270f\ufe0f', + 'penguin':'\ud83d\udc27', + 'pensive':'\ud83d\ude14', + 'performing_arts':'\ud83c\udfad', + 'persevere':'\ud83d\ude23', + 'person_fencing':'\ud83e\udd3a', + 'pouting_woman':'\ud83d\ude4e', + 'phone':'\u260e\ufe0f', + 'pick':'\u26cf', + 'pig':'\ud83d\udc37', + 'pig2':'\ud83d\udc16', + 'pig_nose':'\ud83d\udc3d', + 'pill':'\ud83d\udc8a', + 'pineapple':'\ud83c\udf4d', + 'ping_pong':'\ud83c\udfd3', + 'pisces':'\u2653\ufe0f', + 'pizza':'\ud83c\udf55', + 'place_of_worship':'\ud83d\uded0', + 'plate_with_cutlery':'\ud83c\udf7d', + 'play_or_pause_button':'\u23ef', + 'point_down':'\ud83d\udc47', + 'point_left':'\ud83d\udc48', + 'point_right':'\ud83d\udc49', + 'point_up':'\u261d\ufe0f', + 'point_up_2':'\ud83d\udc46', + 'police_car':'\ud83d\ude93', + 'policewoman':'\ud83d\udc6e‍\u2640\ufe0f', + 'poodle':'\ud83d\udc29', + 'popcorn':'\ud83c\udf7f', + 'post_office':'\ud83c\udfe3', + 'postal_horn':'\ud83d\udcef', + 'postbox':'\ud83d\udcee', + 'potable_water':'\ud83d\udeb0', + 'potato':'\ud83e\udd54', + 'pouch':'\ud83d\udc5d', + 'poultry_leg':'\ud83c\udf57', + 'pound':'\ud83d\udcb7', + 'rage':'\ud83d\ude21', + 'pouting_cat':'\ud83d\ude3e', + 'pouting_man':'\ud83d\ude4e‍\u2642\ufe0f', + 'pray':'\ud83d\ude4f', + 'prayer_beads':'\ud83d\udcff', + 'pregnant_woman':'\ud83e\udd30', + 'previous_track_button':'\u23ee', + 'prince':'\ud83e\udd34', + 'princess':'\ud83d\udc78', + 'printer':'\ud83d\udda8', + 'purple_heart':'\ud83d\udc9c', + 'purse':'\ud83d\udc5b', + 'pushpin':'\ud83d\udccc', + 'put_litter_in_its_place':'\ud83d\udeae', + 'question':'\u2753', + 'rabbit':'\ud83d\udc30', + 'rabbit2':'\ud83d\udc07', + 'racehorse':'\ud83d\udc0e', + 'racing_car':'\ud83c\udfce', + 'radio':'\ud83d\udcfb', + 'radio_button':'\ud83d\udd18', + 'radioactive':'\u2622\ufe0f', + 'railway_car':'\ud83d\ude83', + 'railway_track':'\ud83d\udee4', + 'rainbow':'\ud83c\udf08', + 'rainbow_flag':'\ud83c\udff3\ufe0f‍\ud83c\udf08', + 'raised_back_of_hand':'\ud83e\udd1a', + 'raised_hand_with_fingers_splayed':'\ud83d\udd90', + 'raised_hands':'\ud83d\ude4c', + 'raising_hand_woman':'\ud83d\ude4b', + 'raising_hand_man':'\ud83d\ude4b‍\u2642\ufe0f', + 'ram':'\ud83d\udc0f', + 'ramen':'\ud83c\udf5c', + 'rat':'\ud83d\udc00', + 'record_button':'\u23fa', + 'recycle':'\u267b\ufe0f', + 'red_circle':'\ud83d\udd34', + 'registered':'\u00ae\ufe0f', + 'relaxed':'\u263a\ufe0f', + 'relieved':'\ud83d\ude0c', + 'reminder_ribbon':'\ud83c\udf97', + 'repeat':'\ud83d\udd01', + 'repeat_one':'\ud83d\udd02', + 'rescue_worker_helmet':'\u26d1', + 'restroom':'\ud83d\udebb', + 'revolving_hearts':'\ud83d\udc9e', + 'rewind':'\u23ea', + 'rhinoceros':'\ud83e\udd8f', + 'ribbon':'\ud83c\udf80', + 'rice':'\ud83c\udf5a', + 'rice_ball':'\ud83c\udf59', + 'rice_cracker':'\ud83c\udf58', + 'rice_scene':'\ud83c\udf91', + 'right_anger_bubble':'\ud83d\uddef', + 'ring':'\ud83d\udc8d', + 'robot':'\ud83e\udd16', + 'rocket':'\ud83d\ude80', + 'rofl':'\ud83e\udd23', + 'roll_eyes':'\ud83d\ude44', + 'roller_coaster':'\ud83c\udfa2', + 'rooster':'\ud83d\udc13', + 'rose':'\ud83c\udf39', + 'rosette':'\ud83c\udff5', + 'rotating_light':'\ud83d\udea8', + 'round_pushpin':'\ud83d\udccd', + 'rowing_man':'\ud83d\udea3', + 'rowing_woman':'\ud83d\udea3‍\u2640\ufe0f', + 'rugby_football':'\ud83c\udfc9', + 'running_man':'\ud83c\udfc3', + 'running_shirt_with_sash':'\ud83c\udfbd', + 'running_woman':'\ud83c\udfc3‍\u2640\ufe0f', + 'sa':'\ud83c\ude02\ufe0f', + 'sagittarius':'\u2650\ufe0f', + 'sake':'\ud83c\udf76', + 'sandal':'\ud83d\udc61', + 'santa':'\ud83c\udf85', + 'satellite':'\ud83d\udce1', + 'saxophone':'\ud83c\udfb7', + 'school':'\ud83c\udfeb', + 'school_satchel':'\ud83c\udf92', + 'scissors':'\u2702\ufe0f', + 'scorpion':'\ud83e\udd82', + 'scorpius':'\u264f\ufe0f', + 'scream':'\ud83d\ude31', + 'scream_cat':'\ud83d\ude40', + 'scroll':'\ud83d\udcdc', + 'seat':'\ud83d\udcba', + 'secret':'\u3299\ufe0f', + 'see_no_evil':'\ud83d\ude48', + 'seedling':'\ud83c\udf31', + 'selfie':'\ud83e\udd33', + 'shallow_pan_of_food':'\ud83e\udd58', + 'shamrock':'\u2618\ufe0f', + 'shark':'\ud83e\udd88', + 'shaved_ice':'\ud83c\udf67', + 'sheep':'\ud83d\udc11', + 'shell':'\ud83d\udc1a', + 'shield':'\ud83d\udee1', + 'shinto_shrine':'\u26e9', + 'ship':'\ud83d\udea2', + 'shirt':'\ud83d\udc55', + 'shopping':'\ud83d\udecd', + 'shopping_cart':'\ud83d\uded2', + 'shower':'\ud83d\udebf', + 'shrimp':'\ud83e\udd90', + 'signal_strength':'\ud83d\udcf6', + 'six_pointed_star':'\ud83d\udd2f', + 'ski':'\ud83c\udfbf', + 'skier':'\u26f7', + 'skull':'\ud83d\udc80', + 'skull_and_crossbones':'\u2620\ufe0f', + 'sleeping':'\ud83d\ude34', + 'sleeping_bed':'\ud83d\udecc', + 'sleepy':'\ud83d\ude2a', + 'slightly_frowning_face':'\ud83d\ude41', + 'slightly_smiling_face':'\ud83d\ude42', + 'slot_machine':'\ud83c\udfb0', + 'small_airplane':'\ud83d\udee9', + 'small_blue_diamond':'\ud83d\udd39', + 'small_orange_diamond':'\ud83d\udd38', + 'small_red_triangle':'\ud83d\udd3a', + 'small_red_triangle_down':'\ud83d\udd3b', + 'smile':'\ud83d\ude04', + 'smile_cat':'\ud83d\ude38', + 'smiley':'\ud83d\ude03', + 'smiley_cat':'\ud83d\ude3a', + 'smiling_imp':'\ud83d\ude08', + 'smirk':'\ud83d\ude0f', + 'smirk_cat':'\ud83d\ude3c', + 'smoking':'\ud83d\udeac', + 'snail':'\ud83d\udc0c', + 'snake':'\ud83d\udc0d', + 'sneezing_face':'\ud83e\udd27', + 'snowboarder':'\ud83c\udfc2', + 'snowflake':'\u2744\ufe0f', + 'snowman':'\u26c4\ufe0f', + 'snowman_with_snow':'\u2603\ufe0f', + 'sob':'\ud83d\ude2d', + 'soccer':'\u26bd\ufe0f', + 'soon':'\ud83d\udd1c', + 'sos':'\ud83c\udd98', + 'sound':'\ud83d\udd09', + 'space_invader':'\ud83d\udc7e', + 'spades':'\u2660\ufe0f', + 'spaghetti':'\ud83c\udf5d', + 'sparkle':'\u2747\ufe0f', + 'sparkler':'\ud83c\udf87', + 'sparkles':'\u2728', + 'sparkling_heart':'\ud83d\udc96', + 'speak_no_evil':'\ud83d\ude4a', + 'speaker':'\ud83d\udd08', + 'speaking_head':'\ud83d\udde3', + 'speech_balloon':'\ud83d\udcac', + 'speedboat':'\ud83d\udea4', + 'spider':'\ud83d\udd77', + 'spider_web':'\ud83d\udd78', + 'spiral_calendar':'\ud83d\uddd3', + 'spiral_notepad':'\ud83d\uddd2', + 'spoon':'\ud83e\udd44', + 'squid':'\ud83e\udd91', + 'stadium':'\ud83c\udfdf', + 'star':'\u2b50\ufe0f', + 'star2':'\ud83c\udf1f', + 'star_and_crescent':'\u262a\ufe0f', + 'star_of_david':'\u2721\ufe0f', + 'stars':'\ud83c\udf20', + 'station':'\ud83d\ude89', + 'statue_of_liberty':'\ud83d\uddfd', + 'steam_locomotive':'\ud83d\ude82', + 'stew':'\ud83c\udf72', + 'stop_button':'\u23f9', + 'stop_sign':'\ud83d\uded1', + 'stopwatch':'\u23f1', + 'straight_ruler':'\ud83d\udccf', + 'strawberry':'\ud83c\udf53', + 'stuck_out_tongue':'\ud83d\ude1b', + 'stuck_out_tongue_closed_eyes':'\ud83d\ude1d', + 'stuck_out_tongue_winking_eye':'\ud83d\ude1c', + 'studio_microphone':'\ud83c\udf99', + 'stuffed_flatbread':'\ud83e\udd59', + 'sun_behind_large_cloud':'\ud83c\udf25', + 'sun_behind_rain_cloud':'\ud83c\udf26', + 'sun_behind_small_cloud':'\ud83c\udf24', + 'sun_with_face':'\ud83c\udf1e', + 'sunflower':'\ud83c\udf3b', + 'sunglasses':'\ud83d\ude0e', + 'sunny':'\u2600\ufe0f', + 'sunrise':'\ud83c\udf05', + 'sunrise_over_mountains':'\ud83c\udf04', + 'surfing_man':'\ud83c\udfc4', + 'surfing_woman':'\ud83c\udfc4‍\u2640\ufe0f', + 'sushi':'\ud83c\udf63', + 'suspension_railway':'\ud83d\ude9f', + 'sweat':'\ud83d\ude13', + 'sweat_drops':'\ud83d\udca6', + 'sweat_smile':'\ud83d\ude05', + 'sweet_potato':'\ud83c\udf60', + 'swimming_man':'\ud83c\udfca', + 'swimming_woman':'\ud83c\udfca‍\u2640\ufe0f', + 'symbols':'\ud83d\udd23', + 'synagogue':'\ud83d\udd4d', + 'syringe':'\ud83d\udc89', + 'taco':'\ud83c\udf2e', + 'tada':'\ud83c\udf89', + 'tanabata_tree':'\ud83c\udf8b', + 'taurus':'\u2649\ufe0f', + 'taxi':'\ud83d\ude95', + 'tea':'\ud83c\udf75', + 'telephone_receiver':'\ud83d\udcde', + 'telescope':'\ud83d\udd2d', + 'tennis':'\ud83c\udfbe', + 'tent':'\u26fa\ufe0f', + 'thermometer':'\ud83c\udf21', + 'thinking':'\ud83e\udd14', + 'thought_balloon':'\ud83d\udcad', + 'ticket':'\ud83c\udfab', + 'tickets':'\ud83c\udf9f', + 'tiger':'\ud83d\udc2f', + 'tiger2':'\ud83d\udc05', + 'timer_clock':'\u23f2', + 'tipping_hand_man':'\ud83d\udc81‍\u2642\ufe0f', + 'tired_face':'\ud83d\ude2b', + 'tm':'\u2122\ufe0f', + 'toilet':'\ud83d\udebd', + 'tokyo_tower':'\ud83d\uddfc', + 'tomato':'\ud83c\udf45', + 'tongue':'\ud83d\udc45', + 'top':'\ud83d\udd1d', + 'tophat':'\ud83c\udfa9', + 'tornado':'\ud83c\udf2a', + 'trackball':'\ud83d\uddb2', + 'tractor':'\ud83d\ude9c', + 'traffic_light':'\ud83d\udea5', + 'train':'\ud83d\ude8b', + 'train2':'\ud83d\ude86', + 'tram':'\ud83d\ude8a', + 'triangular_flag_on_post':'\ud83d\udea9', + 'triangular_ruler':'\ud83d\udcd0', + 'trident':'\ud83d\udd31', + 'triumph':'\ud83d\ude24', + 'trolleybus':'\ud83d\ude8e', + 'trophy':'\ud83c\udfc6', + 'tropical_drink':'\ud83c\udf79', + 'tropical_fish':'\ud83d\udc20', + 'truck':'\ud83d\ude9a', + 'trumpet':'\ud83c\udfba', + 'tulip':'\ud83c\udf37', + 'tumbler_glass':'\ud83e\udd43', + 'turkey':'\ud83e\udd83', + 'turtle':'\ud83d\udc22', + 'tv':'\ud83d\udcfa', + 'twisted_rightwards_arrows':'\ud83d\udd00', + 'two_hearts':'\ud83d\udc95', + 'two_men_holding_hands':'\ud83d\udc6c', + 'two_women_holding_hands':'\ud83d\udc6d', + 'u5272':'\ud83c\ude39', + 'u5408':'\ud83c\ude34', + 'u55b6':'\ud83c\ude3a', + 'u6307':'\ud83c\ude2f\ufe0f', + 'u6708':'\ud83c\ude37\ufe0f', + 'u6709':'\ud83c\ude36', + 'u6e80':'\ud83c\ude35', + 'u7121':'\ud83c\ude1a\ufe0f', + 'u7533':'\ud83c\ude38', + 'u7981':'\ud83c\ude32', + 'u7a7a':'\ud83c\ude33', + 'umbrella':'\u2614\ufe0f', + 'unamused':'\ud83d\ude12', + 'underage':'\ud83d\udd1e', + 'unicorn':'\ud83e\udd84', + 'unlock':'\ud83d\udd13', + 'up':'\ud83c\udd99', + 'upside_down_face':'\ud83d\ude43', + 'v':'\u270c\ufe0f', + 'vertical_traffic_light':'\ud83d\udea6', + 'vhs':'\ud83d\udcfc', + 'vibration_mode':'\ud83d\udcf3', + 'video_camera':'\ud83d\udcf9', + 'video_game':'\ud83c\udfae', + 'violin':'\ud83c\udfbb', + 'virgo':'\u264d\ufe0f', + 'volcano':'\ud83c\udf0b', + 'volleyball':'\ud83c\udfd0', + 'vs':'\ud83c\udd9a', + 'vulcan_salute':'\ud83d\udd96', + 'walking_man':'\ud83d\udeb6', + 'walking_woman':'\ud83d\udeb6‍\u2640\ufe0f', + 'waning_crescent_moon':'\ud83c\udf18', + 'waning_gibbous_moon':'\ud83c\udf16', + 'warning':'\u26a0\ufe0f', + 'wastebasket':'\ud83d\uddd1', + 'watch':'\u231a\ufe0f', + 'water_buffalo':'\ud83d\udc03', + 'watermelon':'\ud83c\udf49', + 'wave':'\ud83d\udc4b', + 'wavy_dash':'\u3030\ufe0f', + 'waxing_crescent_moon':'\ud83c\udf12', + 'wc':'\ud83d\udebe', + 'weary':'\ud83d\ude29', + 'wedding':'\ud83d\udc92', + 'weight_lifting_man':'\ud83c\udfcb\ufe0f', + 'weight_lifting_woman':'\ud83c\udfcb\ufe0f‍\u2640\ufe0f', + 'whale':'\ud83d\udc33', + 'whale2':'\ud83d\udc0b', + 'wheel_of_dharma':'\u2638\ufe0f', + 'wheelchair':'\u267f\ufe0f', + 'white_check_mark':'\u2705', + 'white_circle':'\u26aa\ufe0f', + 'white_flag':'\ud83c\udff3\ufe0f', + 'white_flower':'\ud83d\udcae', + 'white_large_square':'\u2b1c\ufe0f', + 'white_medium_small_square':'\u25fd\ufe0f', + 'white_medium_square':'\u25fb\ufe0f', + 'white_small_square':'\u25ab\ufe0f', + 'white_square_button':'\ud83d\udd33', + 'wilted_flower':'\ud83e\udd40', + 'wind_chime':'\ud83c\udf90', + 'wind_face':'\ud83c\udf2c', + 'wine_glass':'\ud83c\udf77', + 'wink':'\ud83d\ude09', + 'wolf':'\ud83d\udc3a', + 'woman':'\ud83d\udc69', + 'woman_artist':'\ud83d\udc69‍\ud83c\udfa8', + 'woman_astronaut':'\ud83d\udc69‍\ud83d\ude80', + 'woman_cartwheeling':'\ud83e\udd38‍\u2640\ufe0f', + 'woman_cook':'\ud83d\udc69‍\ud83c\udf73', + 'woman_facepalming':'\ud83e\udd26‍\u2640\ufe0f', + 'woman_factory_worker':'\ud83d\udc69‍\ud83c\udfed', + 'woman_farmer':'\ud83d\udc69‍\ud83c\udf3e', + 'woman_firefighter':'\ud83d\udc69‍\ud83d\ude92', + 'woman_health_worker':'\ud83d\udc69‍\u2695\ufe0f', + 'woman_judge':'\ud83d\udc69‍\u2696\ufe0f', + 'woman_juggling':'\ud83e\udd39‍\u2640\ufe0f', + 'woman_mechanic':'\ud83d\udc69‍\ud83d\udd27', + 'woman_office_worker':'\ud83d\udc69‍\ud83d\udcbc', + 'woman_pilot':'\ud83d\udc69‍\u2708\ufe0f', + 'woman_playing_handball':'\ud83e\udd3e‍\u2640\ufe0f', + 'woman_playing_water_polo':'\ud83e\udd3d‍\u2640\ufe0f', + 'woman_scientist':'\ud83d\udc69‍\ud83d\udd2c', + 'woman_shrugging':'\ud83e\udd37‍\u2640\ufe0f', + 'woman_singer':'\ud83d\udc69‍\ud83c\udfa4', + 'woman_student':'\ud83d\udc69‍\ud83c\udf93', + 'woman_teacher':'\ud83d\udc69‍\ud83c\udfeb', + 'woman_technologist':'\ud83d\udc69‍\ud83d\udcbb', + 'woman_with_turban':'\ud83d\udc73‍\u2640\ufe0f', + 'womans_clothes':'\ud83d\udc5a', + 'womans_hat':'\ud83d\udc52', + 'women_wrestling':'\ud83e\udd3c‍\u2640\ufe0f', + 'womens':'\ud83d\udeba', + 'world_map':'\ud83d\uddfa', + 'worried':'\ud83d\ude1f', + 'wrench':'\ud83d\udd27', + 'writing_hand':'\u270d\ufe0f', + 'x':'\u274c', + 'yellow_heart':'\ud83d\udc9b', + 'yen':'\ud83d\udcb4', + 'yin_yang':'\u262f\ufe0f', + 'yum':'\ud83d\ude0b', + 'zap':'\u26a1\ufe0f', + 'zipper_mouth_face':'\ud83e\udd10', + 'zzz':'\ud83d\udca4', + + /* special emojis :P */ + 'octocat': ':octocat:', + 'showdown': 'S' +}; diff --git a/showdown/src/loader.js b/showdown/src/loader.js new file mode 100644 index 00000000..f26cf73c --- /dev/null +++ b/showdown/src/loader.js @@ -0,0 +1,17 @@ +var root = this; + +// AMD Loader +if (typeof define === 'function' && define.amd) { + define(function () { + 'use strict'; + return showdown; + }); + +// CommonJS/nodeJS Loader +} else if (typeof module !== 'undefined' && module.exports) { + module.exports = showdown; + +// Regular Browser loader +} else { + root.showdown = showdown; +} diff --git a/showdown/src/options.js b/showdown/src/options.js new file mode 100644 index 00000000..4bf33f51 --- /dev/null +++ b/showdown/src/options.js @@ -0,0 +1,197 @@ +/** + * Created by Tivie on 13-07-2015. + */ + +function getDefaultOpts (simple) { + 'use strict'; + + var defaultOptions = { + omitExtraWLInCodeBlocks: { + defaultValue: false, + describe: 'Omit the default extra whiteline added to code blocks', + type: 'boolean' + }, + noHeaderId: { + defaultValue: false, + describe: 'Turn on/off generated header id', + type: 'boolean' + }, + prefixHeaderId: { + defaultValue: false, + describe: 'Add a prefix to the generated header ids. Passing a string will prefix that string to the header id. Setting to true will add a generic \'section-\' prefix', + type: 'string' + }, + rawPrefixHeaderId: { + defaultValue: false, + describe: 'Setting this option to true will prevent showdown from modifying the prefix. This might result in malformed IDs (if, for instance, the " char is used in the prefix)', + type: 'boolean' + }, + ghCompatibleHeaderId: { + defaultValue: false, + describe: 'Generate header ids compatible with github style (spaces are replaced with dashes, a bunch of non alphanumeric chars are removed)', + type: 'boolean' + }, + rawHeaderId: { + defaultValue: false, + describe: 'Remove only spaces, \' and " from generated header ids (including prefixes), replacing them with dashes (-). WARNING: This might result in malformed ids', + type: 'boolean' + }, + headerLevelStart: { + defaultValue: false, + describe: 'The header blocks level start', + type: 'integer' + }, + parseImgDimensions: { + defaultValue: false, + describe: 'Turn on/off image dimension parsing', + type: 'boolean' + }, + simplifiedAutoLink: { + defaultValue: false, + describe: 'Turn on/off GFM autolink style', + type: 'boolean' + }, + excludeTrailingPunctuationFromURLs: { + defaultValue: false, + describe: 'Excludes trailing punctuation from links generated with autoLinking', + type: 'boolean' + }, + literalMidWordUnderscores: { + defaultValue: false, + describe: 'Parse midword underscores as literal underscores', + type: 'boolean' + }, + literalMidWordAsterisks: { + defaultValue: false, + describe: 'Parse midword asterisks as literal asterisks', + type: 'boolean' + }, + strikethrough: { + defaultValue: false, + describe: 'Turn on/off strikethrough support', + type: 'boolean' + }, + tables: { + defaultValue: false, + describe: 'Turn on/off tables support', + type: 'boolean' + }, + tablesHeaderId: { + defaultValue: false, + describe: 'Add an id to table headers', + type: 'boolean' + }, + ghCodeBlocks: { + defaultValue: true, + describe: 'Turn on/off GFM fenced code blocks support', + type: 'boolean' + }, + tasklists: { + defaultValue: false, + describe: 'Turn on/off GFM tasklist support', + type: 'boolean' + }, + smoothLivePreview: { + defaultValue: false, + describe: 'Prevents weird effects in live previews due to incomplete input', + type: 'boolean' + }, + smartIndentationFix: { + defaultValue: false, + describe: 'Tries to smartly fix indentation in es6 strings', + type: 'boolean' + }, + disableForced4SpacesIndentedSublists: { + defaultValue: false, + describe: 'Disables the requirement of indenting nested sublists by 4 spaces', + type: 'boolean' + }, + simpleLineBreaks: { + defaultValue: false, + describe: 'Parses simple line breaks as
(GFM Style)', + type: 'boolean' + }, + requireSpaceBeforeHeadingText: { + defaultValue: false, + describe: 'Makes adding a space between `#` and the header text mandatory (GFM Style)', + type: 'boolean' + }, + ghMentions: { + defaultValue: false, + describe: 'Enables github @mentions', + type: 'boolean' + }, + ghMentionsLink: { + defaultValue: 'https://github.com/{u}', + describe: 'Changes the link generated by @mentions. Only applies if ghMentions option is enabled.', + type: 'string' + }, + encodeEmails: { + defaultValue: true, + describe: 'Encode e-mail addresses through the use of Character Entities, transforming ASCII e-mail addresses into its equivalent decimal entities', + type: 'boolean' + }, + openLinksInNewWindow: { + defaultValue: false, + describe: 'Open all links in new windows', + type: 'boolean' + }, + backslashEscapesHTMLTags: { + defaultValue: false, + describe: 'Support for HTML Tag escaping. ex: \
foo\
', + type: 'boolean' + }, + emoji: { + defaultValue: false, + describe: 'Enable emoji support. Ex: `this is a :smile: emoji`', + type: 'boolean' + }, + underline: { + defaultValue: false, + describe: 'Enable support for underline. Syntax is double or triple underscores: `__underline word__`. With this option enabled, underscores no longer parses into `` and ``', + type: 'boolean' + }, + ellipsis: { + defaultValue: true, + describe: 'Replaces three dots with the ellipsis unicode character', + type: 'boolean' + }, + completeHTMLDocument: { + defaultValue: false, + describe: 'Outputs a complete html document, including ``, `` and `` tags', + type: 'boolean' + }, + metadata: { + defaultValue: false, + describe: 'Enable support for document metadata (defined at the top of the document between `«««` and `»»»` or between `---` and `---`).', + type: 'boolean' + }, + splitAdjacentBlockquotes: { + defaultValue: false, + describe: 'Split adjacent blockquote blocks', + type: 'boolean' + } + }; + if (simple === false) { + return JSON.parse(JSON.stringify(defaultOptions)); + } + var ret = {}; + for (var opt in defaultOptions) { + if (defaultOptions.hasOwnProperty(opt)) { + ret[opt] = defaultOptions[opt].defaultValue; + } + } + return ret; +} + +function allOptionsOn () { + 'use strict'; + var options = getDefaultOpts(true), + ret = {}; + for (var opt in options) { + if (options.hasOwnProperty(opt)) { + ret[opt] = true; + } + } + return ret; +} diff --git a/showdown/src/showdown.js b/showdown/src/showdown.js new file mode 100644 index 00000000..c061523b --- /dev/null +++ b/showdown/src/showdown.js @@ -0,0 +1,380 @@ +/** + * Created by Tivie on 06-01-2015. + */ + +// Private properties +var showdown = {}, + parsers = {}, + extensions = {}, + globalOptions = getDefaultOpts(true), + setFlavor = 'vanilla', + flavor = { + github: { + omitExtraWLInCodeBlocks: true, + simplifiedAutoLink: true, + excludeTrailingPunctuationFromURLs: true, + literalMidWordUnderscores: true, + strikethrough: true, + tables: true, + tablesHeaderId: true, + ghCodeBlocks: true, + tasklists: true, + disableForced4SpacesIndentedSublists: true, + simpleLineBreaks: true, + requireSpaceBeforeHeadingText: true, + ghCompatibleHeaderId: true, + ghMentions: true, + backslashEscapesHTMLTags: true, + emoji: true, + splitAdjacentBlockquotes: true + }, + original: { + noHeaderId: true, + ghCodeBlocks: false + }, + ghost: { + omitExtraWLInCodeBlocks: true, + parseImgDimensions: true, + simplifiedAutoLink: true, + excludeTrailingPunctuationFromURLs: true, + literalMidWordUnderscores: true, + strikethrough: true, + tables: true, + tablesHeaderId: true, + ghCodeBlocks: true, + tasklists: true, + smoothLivePreview: true, + simpleLineBreaks: true, + requireSpaceBeforeHeadingText: true, + ghMentions: false, + encodeEmails: true + }, + vanilla: getDefaultOpts(true), + allOn: allOptionsOn() + }; + +/** + * helper namespace + * @type {{}} + */ +showdown.helper = {}; + +/** + * TODO LEGACY SUPPORT CODE + * @type {{}} + */ +showdown.extensions = {}; + +/** + * Set a global option + * @static + * @param {string} key + * @param {*} value + * @returns {showdown} + */ +showdown.setOption = function (key, value) { + 'use strict'; + globalOptions[key] = value; + return this; +}; + +/** + * Get a global option + * @static + * @param {string} key + * @returns {*} + */ +showdown.getOption = function (key) { + 'use strict'; + return globalOptions[key]; +}; + +/** + * Get the global options + * @static + * @returns {{}} + */ +showdown.getOptions = function () { + 'use strict'; + return globalOptions; +}; + +/** + * Reset global options to the default values + * @static + */ +showdown.resetOptions = function () { + 'use strict'; + globalOptions = getDefaultOpts(true); +}; + +/** + * Set the flavor showdown should use as default + * @param {string} name + */ +showdown.setFlavor = function (name) { + 'use strict'; + if (!flavor.hasOwnProperty(name)) { + throw Error(name + ' flavor was not found'); + } + showdown.resetOptions(); + var preset = flavor[name]; + setFlavor = name; + for (var option in preset) { + if (preset.hasOwnProperty(option)) { + globalOptions[option] = preset[option]; + } + } +}; + +/** + * Get the currently set flavor + * @returns {string} + */ +showdown.getFlavor = function () { + 'use strict'; + return setFlavor; +}; + +/** + * Get the options of a specified flavor. Returns undefined if the flavor was not found + * @param {string} name Name of the flavor + * @returns {{}|undefined} + */ +showdown.getFlavorOptions = function (name) { + 'use strict'; + if (flavor.hasOwnProperty(name)) { + return flavor[name]; + } +}; + +/** + * Get the default options + * @static + * @param {boolean} [simple=true] + * @returns {{}} + */ +showdown.getDefaultOptions = function (simple) { + 'use strict'; + return getDefaultOpts(simple); +}; + +/** + * Get or set a subParser + * + * subParser(name) - Get a registered subParser + * subParser(name, func) - Register a subParser + * @static + * @param {string} name + * @param {function} [func] + * @returns {*} + */ +showdown.subParser = function (name, func) { + 'use strict'; + if (showdown.helper.isString(name)) { + if (typeof func !== 'undefined') { + parsers[name] = func; + } else { + if (parsers.hasOwnProperty(name)) { + return parsers[name]; + } else { + throw Error('SubParser named ' + name + ' not registered!'); + } + } + } +}; + +/** + * Gets or registers an extension + * @static + * @param {string} name + * @param {object|object[]|function=} ext + * @returns {*} + */ +showdown.extension = function (name, ext) { + 'use strict'; + + if (!showdown.helper.isString(name)) { + throw Error('Extension \'name\' must be a string'); + } + + name = showdown.helper.stdExtName(name); + + // Getter + if (showdown.helper.isUndefined(ext)) { + if (!extensions.hasOwnProperty(name)) { + throw Error('Extension named ' + name + ' is not registered!'); + } + return extensions[name]; + + // Setter + } else { + // Expand extension if it's wrapped in a function + if (typeof ext === 'function') { + ext = ext(); + } + + // Ensure extension is an array + if (!showdown.helper.isArray(ext)) { + ext = [ext]; + } + + var validExtension = validate(ext, name); + + if (validExtension.valid) { + extensions[name] = ext; + } else { + throw Error(validExtension.error); + } + } +}; + +/** + * Gets all extensions registered + * @returns {{}} + */ +showdown.getAllExtensions = function () { + 'use strict'; + return extensions; +}; + +/** + * Remove an extension + * @param {string} name + */ +showdown.removeExtension = function (name) { + 'use strict'; + delete extensions[name]; +}; + +/** + * Removes all extensions + */ +showdown.resetExtensions = function () { + 'use strict'; + extensions = {}; +}; + +/** + * Validate extension + * @param {array} extension + * @param {string} name + * @returns {{valid: boolean, error: string}} + */ +function validate (extension, name) { + 'use strict'; + + var errMsg = (name) ? 'Error in ' + name + ' extension->' : 'Error in unnamed extension', + ret = { + valid: true, + error: '' + }; + + if (!showdown.helper.isArray(extension)) { + extension = [extension]; + } + + for (var i = 0; i < extension.length; ++i) { + var baseMsg = errMsg + ' sub-extension ' + i + ': ', + ext = extension[i]; + if (typeof ext !== 'object') { + ret.valid = false; + ret.error = baseMsg + 'must be an object, but ' + typeof ext + ' given'; + return ret; + } + + if (!showdown.helper.isString(ext.type)) { + ret.valid = false; + ret.error = baseMsg + 'property "type" must be a string, but ' + typeof ext.type + ' given'; + return ret; + } + + var type = ext.type = ext.type.toLowerCase(); + + // normalize extension type + if (type === 'language') { + type = ext.type = 'lang'; + } + + if (type === 'html') { + type = ext.type = 'output'; + } + + if (type !== 'lang' && type !== 'output' && type !== 'listener') { + ret.valid = false; + ret.error = baseMsg + 'type ' + type + ' is not recognized. Valid values: "lang/language", "output/html" or "listener"'; + return ret; + } + + if (type === 'listener') { + if (showdown.helper.isUndefined(ext.listeners)) { + ret.valid = false; + ret.error = baseMsg + '. Extensions of type "listener" must have a property called "listeners"'; + return ret; + } + } else { + if (showdown.helper.isUndefined(ext.filter) && showdown.helper.isUndefined(ext.regex)) { + ret.valid = false; + ret.error = baseMsg + type + ' extensions must define either a "regex" property or a "filter" method'; + return ret; + } + } + + if (ext.listeners) { + if (typeof ext.listeners !== 'object') { + ret.valid = false; + ret.error = baseMsg + '"listeners" property must be an object but ' + typeof ext.listeners + ' given'; + return ret; + } + for (var ln in ext.listeners) { + if (ext.listeners.hasOwnProperty(ln)) { + if (typeof ext.listeners[ln] !== 'function') { + ret.valid = false; + ret.error = baseMsg + '"listeners" property must be an hash of [event name]: [callback]. listeners.' + ln + + ' must be a function but ' + typeof ext.listeners[ln] + ' given'; + return ret; + } + } + } + } + + if (ext.filter) { + if (typeof ext.filter !== 'function') { + ret.valid = false; + ret.error = baseMsg + '"filter" must be a function, but ' + typeof ext.filter + ' given'; + return ret; + } + } else if (ext.regex) { + if (showdown.helper.isString(ext.regex)) { + ext.regex = new RegExp(ext.regex, 'g'); + } + if (!(ext.regex instanceof RegExp)) { + ret.valid = false; + ret.error = baseMsg + '"regex" property must either be a string or a RegExp object, but ' + typeof ext.regex + ' given'; + return ret; + } + if (showdown.helper.isUndefined(ext.replace)) { + ret.valid = false; + ret.error = baseMsg + '"regex" extensions must implement a replace string or function'; + return ret; + } + } + } + return ret; +} + +/** + * Validate extension + * @param {object} ext + * @returns {boolean} + */ +showdown.validateExtension = function (ext) { + 'use strict'; + + var validateExtension = validate(ext, null); + if (!validateExtension.valid) { + console.warn(validateExtension.error); + return false; + } + return true; +}; diff --git a/showdown/src/subParsers/anchors.js b/showdown/src/subParsers/anchors.js new file mode 100644 index 00000000..efa2954e --- /dev/null +++ b/showdown/src/subParsers/anchors.js @@ -0,0 +1,98 @@ +/** + * Turn Markdown link shortcuts into XHTML tags. + */ +showdown.subParser('anchors', function (text, options, globals) { + 'use strict'; + + text = globals.converter._dispatch('anchors.before', text, options, globals); + + var writeAnchorTag = function (wholeMatch, linkText, linkId, url, m5, m6, title) { + if (showdown.helper.isUndefined(title)) { + title = ''; + } + linkId = linkId.toLowerCase(); + + // Special case for explicit empty url + if (wholeMatch.search(/\(? ?(['"].*['"])?\)$/m) > -1) { + url = ''; + } else if (!url) { + if (!linkId) { + // lower-case and turn embedded newlines into spaces + linkId = linkText.toLowerCase().replace(/ ?\n/g, ' '); + } + url = '#' + linkId; + + if (!showdown.helper.isUndefined(globals.gUrls[linkId])) { + url = globals.gUrls[linkId]; + if (!showdown.helper.isUndefined(globals.gTitles[linkId])) { + title = globals.gTitles[linkId]; + } + } else { + return wholeMatch; + } + } + + //url = showdown.helper.escapeCharacters(url, '*_', false); // replaced line to improve performance + url = url.replace(showdown.helper.regexes.asteriskDashAndColon, showdown.helper.escapeCharactersCallback); + + var result = ''; + + return result; + }; + + // First, handle reference-style links: [link text] [id] + text = text.replace(/\[((?:\[[^\]]*]|[^\[\]])*)] ?(?:\n *)?\[(.*?)]()()()()/g, writeAnchorTag); + + // Next, inline-style links: [link text](url "optional title") + // cases with crazy urls like ./image/cat1).png + text = text.replace(/\[((?:\[[^\]]*]|[^\[\]])*)]()[ \t]*\([ \t]?<([^>]*)>(?:[ \t]*((["'])([^"]*?)\5))?[ \t]?\)/g, + writeAnchorTag); + + // normal cases + text = text.replace(/\[((?:\[[^\]]*]|[^\[\]])*)]()[ \t]*\([ \t]??(?:[ \t]*((["'])([^"]*?)\5))?[ \t]?\)/g, + writeAnchorTag); + + // handle reference-style shortcuts: [link text] + // These must come last in case you've also got [link test][1] + // or [link test](/foo) + text = text.replace(/\[([^\[\]]+)]()()()()()/g, writeAnchorTag); + + // Lastly handle GithubMentions if option is enabled + if (options.ghMentions) { + text = text.replace(/(^|\s)(\\)?(@([a-z\d]+(?:[a-z\d.-]+?[a-z\d]+)*))/gmi, function (wm, st, escape, mentions, username) { + if (escape === '\\') { + return st + mentions; + } + + //check if options.ghMentionsLink is a string + if (!showdown.helper.isString(options.ghMentionsLink)) { + throw new Error('ghMentionsLink option must be a string'); + } + var lnk = options.ghMentionsLink.replace(/\{u}/g, username), + target = ''; + if (options.openLinksInNewWindow) { + target = ' rel="noopener noreferrer" target="¨E95Eblank"'; + } + return st + '' + mentions + ''; + }); + } + + text = globals.converter._dispatch('anchors.after', text, options, globals); + return text; +}); diff --git a/showdown/src/subParsers/autoLinks.js b/showdown/src/subParsers/autoLinks.js new file mode 100644 index 00000000..fa49b529 --- /dev/null +++ b/showdown/src/subParsers/autoLinks.js @@ -0,0 +1,79 @@ +// url allowed chars [a-z\d_.~:/?#[]@!$&'()*+,;=-] + +var simpleURLRegex = /([*~_]+|\b)(((https?|ftp|dict):\/\/|www\.)[^'">\s]+?\.[^'">\s]+?)()(\1)?(?=\s|$)(?!["<>])/gi, + simpleURLRegex2 = /([*~_]+|\b)(((https?|ftp|dict):\/\/|www\.)[^'">\s]+\.[^'">\s]+?)([.!?,()\[\]])?(\1)?(?=\s|$)(?!["<>])/gi, + delimUrlRegex = /()<(((https?|ftp|dict):\/\/|www\.)[^'">\s]+)()>()/gi, + simpleMailRegex = /(^|\s)(?:mailto:)?([A-Za-z0-9!#$%&'*+-/=?^_`{|}~.]+@[-a-z0-9]+(\.[-a-z0-9]+)*\.[a-z]+)(?=$|\s)/gmi, + delimMailRegex = /<()(?:mailto:)?([-.\w]+@[-a-z0-9]+(\.[-a-z0-9]+)*\.[a-z]+)>/gi, + + replaceLink = function (options) { + 'use strict'; + return function (wm, leadingMagicChars, link, m2, m3, trailingPunctuation, trailingMagicChars) { + link = link.replace(showdown.helper.regexes.asteriskDashAndColon, showdown.helper.escapeCharactersCallback); + var lnkTxt = link, + append = '', + target = '', + lmc = leadingMagicChars || '', + tmc = trailingMagicChars || ''; + if (/^www\./i.test(link)) { + link = link.replace(/^www\./i, 'http://www.'); + } + if (options.excludeTrailingPunctuationFromURLs && trailingPunctuation) { + append = trailingPunctuation; + } + if (options.openLinksInNewWindow) { + target = ' rel="noopener noreferrer" target="¨E95Eblank"'; + } + return lmc + '' + lnkTxt + '' + append + tmc; + }; + }, + + replaceMail = function (options, globals) { + 'use strict'; + return function (wholeMatch, b, mail) { + var href = 'mailto:'; + b = b || ''; + mail = showdown.subParser('unescapeSpecialChars')(mail, options, globals); + if (options.encodeEmails) { + href = showdown.helper.encodeEmailAddress(href + mail); + mail = showdown.helper.encodeEmailAddress(mail); + } else { + href = href + mail; + } + return b + '' + mail + ''; + }; + }; + +showdown.subParser('autoLinks', function (text, options, globals) { + 'use strict'; + + text = globals.converter._dispatch('autoLinks.before', text, options, globals); + + text = text.replace(delimUrlRegex, replaceLink(options)); + text = text.replace(delimMailRegex, replaceMail(options, globals)); + + text = globals.converter._dispatch('autoLinks.after', text, options, globals); + + return text; +}); + +showdown.subParser('simplifiedAutoLinks', function (text, options, globals) { + 'use strict'; + + if (!options.simplifiedAutoLink) { + return text; + } + + text = globals.converter._dispatch('simplifiedAutoLinks.before', text, options, globals); + + if (options.excludeTrailingPunctuationFromURLs) { + text = text.replace(simpleURLRegex2, replaceLink(options)); + } else { + text = text.replace(simpleURLRegex, replaceLink(options)); + } + text = text.replace(simpleMailRegex, replaceMail(options, globals)); + + text = globals.converter._dispatch('simplifiedAutoLinks.after', text, options, globals); + + return text; +}); diff --git a/showdown/src/subParsers/blockGamut.js b/showdown/src/subParsers/blockGamut.js new file mode 100644 index 00000000..b9de6fdb --- /dev/null +++ b/showdown/src/subParsers/blockGamut.js @@ -0,0 +1,32 @@ +/** + * These are all the transformations that form block-level + * tags like paragraphs, headers, and list items. + */ +showdown.subParser('blockGamut', function (text, options, globals) { + 'use strict'; + + text = globals.converter._dispatch('blockGamut.before', text, options, globals); + + // we parse blockquotes first so that we can have headings and hrs + // inside blockquotes + text = showdown.subParser('blockQuotes')(text, options, globals); + text = showdown.subParser('headers')(text, options, globals); + + // Do Horizontal Rules: + text = showdown.subParser('horizontalRule')(text, options, globals); + + text = showdown.subParser('lists')(text, options, globals); + text = showdown.subParser('codeBlocks')(text, options, globals); + text = showdown.subParser('tables')(text, options, globals); + + // We already ran _HashHTMLBlocks() before, in Markdown(), but that + // was to escape raw HTML in the original Markdown source. This time, + // we're escaping the markup we've just created, so that we don't wrap + //

tags around block-level tags. + text = showdown.subParser('hashHTMLBlocks')(text, options, globals); + text = showdown.subParser('paragraphs')(text, options, globals); + + text = globals.converter._dispatch('blockGamut.after', text, options, globals); + + return text; +}); diff --git a/showdown/src/subParsers/blockQuotes.js b/showdown/src/subParsers/blockQuotes.js new file mode 100644 index 00000000..2cf41748 --- /dev/null +++ b/showdown/src/subParsers/blockQuotes.js @@ -0,0 +1,42 @@ +showdown.subParser('blockQuotes', function (text, options, globals) { + 'use strict'; + + text = globals.converter._dispatch('blockQuotes.before', text, options, globals); + + // add a couple extra lines after the text and endtext mark + text = text + '\n\n'; + + var rgx = /(^ {0,3}>[ \t]?.+\n(.+\n)*\n*)+/gm; + + if (options.splitAdjacentBlockquotes) { + rgx = /^ {0,3}>[\s\S]*?(?:\n\n)/gm; + } + + text = text.replace(rgx, function (bq) { + // attacklab: hack around Konqueror 3.5.4 bug: + // "----------bug".replace(/^-/g,"") == "bug" + bq = bq.replace(/^[ \t]*>[ \t]?/gm, ''); // trim one level of quoting + + // attacklab: clean up hack + bq = bq.replace(/¨0/g, ''); + + bq = bq.replace(/^[ \t]+$/gm, ''); // trim whitespace-only lines + bq = showdown.subParser('githubCodeBlocks')(bq, options, globals); + bq = showdown.subParser('blockGamut')(bq, options, globals); // recurse + + bq = bq.replace(/(^|\n)/g, '$1 '); + // These leading spaces screw with

 content, so we need to fix that:
+    bq = bq.replace(/(\s*
[^\r]+?<\/pre>)/gm, function (wholeMatch, m1) {
+      var pre = m1;
+      // attacklab: hack around Konqueror 3.5.4 bug:
+      pre = pre.replace(/^  /mg, '¨0');
+      pre = pre.replace(/¨0/g, '');
+      return pre;
+    });
+
+    return showdown.subParser('hashBlock')('
\n' + bq + '\n
', options, globals); + }); + + text = globals.converter._dispatch('blockQuotes.after', text, options, globals); + return text; +}); diff --git a/showdown/src/subParsers/codeBlocks.js b/showdown/src/subParsers/codeBlocks.js new file mode 100644 index 00000000..7099d82e --- /dev/null +++ b/showdown/src/subParsers/codeBlocks.js @@ -0,0 +1,38 @@ +/** + * Process Markdown `
` blocks.
+ */
+showdown.subParser('codeBlocks', function (text, options, globals) {
+  'use strict';
+
+  text = globals.converter._dispatch('codeBlocks.before', text, options, globals);
+
+  // sentinel workarounds for lack of \A and \Z, safari\khtml bug
+  text += '¨0';
+
+  var pattern = /(?:\n\n|^)((?:(?:[ ]{4}|\t).*\n+)+)(\n*[ ]{0,3}[^ \t\n]|(?=¨0))/g;
+  text = text.replace(pattern, function (wholeMatch, m1, m2) {
+    var codeblock = m1,
+        nextChar = m2,
+        end = '\n';
+
+    codeblock = showdown.subParser('outdent')(codeblock, options, globals);
+    codeblock = showdown.subParser('encodeCode')(codeblock, options, globals);
+    codeblock = showdown.subParser('detab')(codeblock, options, globals);
+    codeblock = codeblock.replace(/^\n+/g, ''); // trim leading newlines
+    codeblock = codeblock.replace(/\n+$/g, ''); // trim trailing newlines
+
+    if (options.omitExtraWLInCodeBlocks) {
+      end = '';
+    }
+
+    codeblock = '
' + codeblock + end + '
'; + + return showdown.subParser('hashBlock')(codeblock, options, globals) + nextChar; + }); + + // strip sentinel + text = text.replace(/¨0/, ''); + + text = globals.converter._dispatch('codeBlocks.after', text, options, globals); + return text; +}); diff --git a/showdown/src/subParsers/codeSpans.js b/showdown/src/subParsers/codeSpans.js new file mode 100644 index 00000000..adb70f15 --- /dev/null +++ b/showdown/src/subParsers/codeSpans.js @@ -0,0 +1,48 @@ +/** + * + * * Backtick quotes are used for spans. + * + * * You can use multiple backticks as the delimiters if you want to + * include literal backticks in the code span. So, this input: + * + * Just type ``foo `bar` baz`` at the prompt. + * + * Will translate to: + * + *

Just type foo `bar` baz at the prompt.

+ * + * There's no arbitrary limit to the number of backticks you + * can use as delimters. If you need three consecutive backticks + * in your code, use four for delimiters, etc. + * + * * You can use spaces to get literal backticks at the edges: + * + * ... type `` `bar` `` ... + * + * Turns to: + * + * ... type `bar` ... + */ +showdown.subParser('codeSpans', function (text, options, globals) { + 'use strict'; + + text = globals.converter._dispatch('codeSpans.before', text, options, globals); + + if (typeof (text) === 'undefined') { + text = ''; + } + text = text.replace(/(^|[^\\])(`+)([^\r]*?[^`])\2(?!`)/gm, + function (wholeMatch, m1, m2, m3) { + var c = m3; + c = c.replace(/^([ \t]*)/g, ''); // leading whitespace + c = c.replace(/[ \t]*$/g, ''); // trailing whitespace + c = showdown.subParser('encodeCode')(c, options, globals); + c = m1 + '' + c + ''; + c = showdown.subParser('hashHTMLSpans')(c, options, globals); + return c; + } + ); + + text = globals.converter._dispatch('codeSpans.after', text, options, globals); + return text; +}); diff --git a/showdown/src/subParsers/completeHTMLDocument.js b/showdown/src/subParsers/completeHTMLDocument.js new file mode 100644 index 00000000..5252796c --- /dev/null +++ b/showdown/src/subParsers/completeHTMLDocument.js @@ -0,0 +1,62 @@ +/** + * Create a full HTML document from the processed markdown + */ +showdown.subParser('completeHTMLDocument', function (text, options, globals) { + 'use strict'; + + if (!options.completeHTMLDocument) { + return text; + } + + text = globals.converter._dispatch('completeHTMLDocument.before', text, options, globals); + + var doctype = 'html', + doctypeParsed = '\n', + title = '', + charset = '\n', + lang = '', + metadata = ''; + + if (typeof globals.metadata.parsed.doctype !== 'undefined') { + doctypeParsed = '\n'; + doctype = globals.metadata.parsed.doctype.toString().toLowerCase(); + if (doctype === 'html' || doctype === 'html5') { + charset = ''; + } + } + + for (var meta in globals.metadata.parsed) { + if (globals.metadata.parsed.hasOwnProperty(meta)) { + switch (meta.toLowerCase()) { + case 'doctype': + break; + + case 'title': + title = '' + globals.metadata.parsed.title + '\n'; + break; + + case 'charset': + if (doctype === 'html' || doctype === 'html5') { + charset = '\n'; + } else { + charset = '\n'; + } + break; + + case 'language': + case 'lang': + lang = ' lang="' + globals.metadata.parsed[meta] + '"'; + metadata += '\n'; + break; + + default: + metadata += '\n'; + } + } + } + + text = doctypeParsed + '\n\n' + title + charset + metadata + '\n\n' + text.trim() + '\n\n'; + + text = globals.converter._dispatch('completeHTMLDocument.after', text, options, globals); + return text; +}); diff --git a/showdown/src/subParsers/detab.js b/showdown/src/subParsers/detab.js new file mode 100644 index 00000000..1fad02d9 --- /dev/null +++ b/showdown/src/subParsers/detab.js @@ -0,0 +1,33 @@ +/** + * Convert all tabs to spaces + */ +showdown.subParser('detab', function (text, options, globals) { + 'use strict'; + text = globals.converter._dispatch('detab.before', text, options, globals); + + // expand first n-1 tabs + text = text.replace(/\t(?=\t)/g, ' '); // g_tab_width + + // replace the nth with two sentinels + text = text.replace(/\t/g, '¨A¨B'); + + // use the sentinel to anchor our regex so it doesn't explode + text = text.replace(/¨B(.+?)¨A/g, function (wholeMatch, m1) { + var leadingText = m1, + numSpaces = 4 - leadingText.length % 4; // g_tab_width + + // there *must* be a better way to do this: + for (var i = 0; i < numSpaces; i++) { + leadingText += ' '; + } + + return leadingText; + }); + + // clean up sentinels + text = text.replace(/¨A/g, ' '); // g_tab_width + text = text.replace(/¨B/g, ''); + + text = globals.converter._dispatch('detab.after', text, options, globals); + return text; +}); diff --git a/showdown/src/subParsers/ellipsis.js b/showdown/src/subParsers/ellipsis.js new file mode 100644 index 00000000..640309ca --- /dev/null +++ b/showdown/src/subParsers/ellipsis.js @@ -0,0 +1,15 @@ +showdown.subParser('ellipsis', function (text, options, globals) { + 'use strict'; + + if (!options.ellipsis) { + return text; + } + + text = globals.converter._dispatch('ellipsis.before', text, options, globals); + + text = text.replace(/\.\.\./g, '…'); + + text = globals.converter._dispatch('ellipsis.after', text, options, globals); + + return text; +}); diff --git a/showdown/src/subParsers/emoji.js b/showdown/src/subParsers/emoji.js new file mode 100644 index 00000000..838b3ccc --- /dev/null +++ b/showdown/src/subParsers/emoji.js @@ -0,0 +1,27 @@ +/** + * Turn emoji codes into emojis + * + * List of supported emojis: https://github.com/showdownjs/showdown/wiki/Emojis + */ +showdown.subParser('emoji', function (text, options, globals) { + 'use strict'; + + if (!options.emoji) { + return text; + } + + text = globals.converter._dispatch('emoji.before', text, options, globals); + + var emojiRgx = /:([\S]+?):/g; + + text = text.replace(emojiRgx, function (wm, emojiCode) { + if (showdown.helper.emojis.hasOwnProperty(emojiCode)) { + return showdown.helper.emojis[emojiCode]; + } + return wm; + }); + + text = globals.converter._dispatch('emoji.after', text, options, globals); + + return text; +}); diff --git a/showdown/src/subParsers/encodeAmpsAndAngles.js b/showdown/src/subParsers/encodeAmpsAndAngles.js new file mode 100644 index 00000000..b6f69d1d --- /dev/null +++ b/showdown/src/subParsers/encodeAmpsAndAngles.js @@ -0,0 +1,23 @@ +/** + * Smart processing for ampersands and angle brackets that need to be encoded. + */ +showdown.subParser('encodeAmpsAndAngles', function (text, options, globals) { + 'use strict'; + text = globals.converter._dispatch('encodeAmpsAndAngles.before', text, options, globals); + + // Ampersand-encoding based entirely on Nat Irons's Amputator MT plugin: + // http://bumppo.net/projects/amputator/ + text = text.replace(/&(?!#?[xX]?(?:[0-9a-fA-F]+|\w+);)/g, '&'); + + // Encode naked <'s + text = text.replace(/<(?![a-z\/?$!])/gi, '<'); + + // Encode < + text = text.replace(/ + text = text.replace(/>/g, '>'); + + text = globals.converter._dispatch('encodeAmpsAndAngles.after', text, options, globals); + return text; +}); diff --git a/showdown/src/subParsers/encodeBackslashEscapes.js b/showdown/src/subParsers/encodeBackslashEscapes.js new file mode 100644 index 00000000..1c0876d1 --- /dev/null +++ b/showdown/src/subParsers/encodeBackslashEscapes.js @@ -0,0 +1,21 @@ +/** + * Returns the string, with after processing the following backslash escape sequences. + * + * attacklab: The polite way to do this is with the new escapeCharacters() function: + * + * text = escapeCharacters(text,"\\",true); + * text = escapeCharacters(text,"`*_{}[]()>#+-.!",true); + * + * ...but we're sidestepping its use of the (slow) RegExp constructor + * as an optimization for Firefox. This function gets called a LOT. + */ +showdown.subParser('encodeBackslashEscapes', function (text, options, globals) { + 'use strict'; + text = globals.converter._dispatch('encodeBackslashEscapes.before', text, options, globals); + + text = text.replace(/\\(\\)/g, showdown.helper.escapeCharactersCallback); + text = text.replace(/\\([`*_{}\[\]()>#+.!~=|:-])/g, showdown.helper.escapeCharactersCallback); + + text = globals.converter._dispatch('encodeBackslashEscapes.after', text, options, globals); + return text; +}); diff --git a/showdown/src/subParsers/encodeCode.js b/showdown/src/subParsers/encodeCode.js new file mode 100644 index 00000000..debda4d4 --- /dev/null +++ b/showdown/src/subParsers/encodeCode.js @@ -0,0 +1,23 @@ +/** + * Encode/escape certain characters inside Markdown code runs. + * The point is that in code, these characters are literals, + * and lose their special Markdown meanings. + */ +showdown.subParser('encodeCode', function (text, options, globals) { + 'use strict'; + + text = globals.converter._dispatch('encodeCode.before', text, options, globals); + + // Encode all ampersands; HTML entities are not + // entities within a Markdown code span. + text = text + .replace(/&/g, '&') + // Do the angle bracket song and dance: + .replace(//g, '>') + // Now, escape characters that are magic in Markdown: + .replace(/([*_{}\[\]\\=~-])/g, showdown.helper.escapeCharactersCallback); + + text = globals.converter._dispatch('encodeCode.after', text, options, globals); + return text; +}); diff --git a/showdown/src/subParsers/escapeSpecialCharsWithinTagAttributes.js b/showdown/src/subParsers/escapeSpecialCharsWithinTagAttributes.js new file mode 100644 index 00000000..80ff99dd --- /dev/null +++ b/showdown/src/subParsers/escapeSpecialCharsWithinTagAttributes.js @@ -0,0 +1,26 @@ +/** + * Within tags -- meaning between < and > -- encode [\ ` * _ ~ =] so they + * don't conflict with their use in Markdown for code, italics and strong. + */ +showdown.subParser('escapeSpecialCharsWithinTagAttributes', function (text, options, globals) { + 'use strict'; + text = globals.converter._dispatch('escapeSpecialCharsWithinTagAttributes.before', text, options, globals); + + // Build a regex to find HTML tags. + var tags = /<\/?[a-z\d_:-]+(?:[\s]+[\s\S]+?)?>/gi, + comments = /-]|-[^>])(?:[^-]|-[^-])*)--)>/gi; + + text = text.replace(tags, function (wholeMatch) { + return wholeMatch + .replace(/(.)<\/?code>(?=.)/g, '$1`') + .replace(/([\\`*_~=|])/g, showdown.helper.escapeCharactersCallback); + }); + + text = text.replace(comments, function (wholeMatch) { + return wholeMatch + .replace(/([\\`*_~=|])/g, showdown.helper.escapeCharactersCallback); + }); + + text = globals.converter._dispatch('escapeSpecialCharsWithinTagAttributes.after', text, options, globals); + return text; +}); diff --git a/showdown/src/subParsers/githubCodeBlocks.js b/showdown/src/subParsers/githubCodeBlocks.js new file mode 100644 index 00000000..e5a2f1d4 --- /dev/null +++ b/showdown/src/subParsers/githubCodeBlocks.js @@ -0,0 +1,46 @@ +/** + * Handle github codeblocks prior to running HashHTML so that + * HTML contained within the codeblock gets escaped properly + * Example: + * ```ruby + * def hello_world(x) + * puts "Hello, #{x}" + * end + * ``` + */ +showdown.subParser('githubCodeBlocks', function (text, options, globals) { + 'use strict'; + + // early exit if option is not enabled + if (!options.ghCodeBlocks) { + return text; + } + + text = globals.converter._dispatch('githubCodeBlocks.before', text, options, globals); + + text += '¨0'; + + text = text.replace(/(?:^|\n)(?: {0,3})(```+|~~~+)(?: *)([^\s`~]*)\n([\s\S]*?)\n(?: {0,3})\1/g, function (wholeMatch, delim, language, codeblock) { + var end = (options.omitExtraWLInCodeBlocks) ? '' : '\n'; + + // First parse the github code block + codeblock = showdown.subParser('encodeCode')(codeblock, options, globals); + codeblock = showdown.subParser('detab')(codeblock, options, globals); + codeblock = codeblock.replace(/^\n+/g, ''); // trim leading newlines + codeblock = codeblock.replace(/\n+$/g, ''); // trim trailing whitespace + + codeblock = '
' + codeblock + end + '
'; + + codeblock = showdown.subParser('hashBlock')(codeblock, options, globals); + + // Since GHCodeblocks can be false positives, we need to + // store the primitive text and the parsed text in a global var, + // and then return a token + return '\n\n¨G' + (globals.ghCodeBlocks.push({text: wholeMatch, codeblock: codeblock}) - 1) + 'G\n\n'; + }); + + // attacklab: strip sentinel + text = text.replace(/¨0/, ''); + + return globals.converter._dispatch('githubCodeBlocks.after', text, options, globals); +}); diff --git a/showdown/src/subParsers/hashBlock.js b/showdown/src/subParsers/hashBlock.js new file mode 100644 index 00000000..ab166c34 --- /dev/null +++ b/showdown/src/subParsers/hashBlock.js @@ -0,0 +1,8 @@ +showdown.subParser('hashBlock', function (text, options, globals) { + 'use strict'; + text = globals.converter._dispatch('hashBlock.before', text, options, globals); + text = text.replace(/(^\n+|\n+$)/g, ''); + text = '\n\n¨K' + (globals.gHtmlBlocks.push(text) - 1) + 'K\n\n'; + text = globals.converter._dispatch('hashBlock.after', text, options, globals); + return text; +}); diff --git a/showdown/src/subParsers/hashCodeTags.js b/showdown/src/subParsers/hashCodeTags.js new file mode 100644 index 00000000..93a2c116 --- /dev/null +++ b/showdown/src/subParsers/hashCodeTags.js @@ -0,0 +1,18 @@ +/** + * Hash and escape elements that should not be parsed as markdown + */ +showdown.subParser('hashCodeTags', function (text, options, globals) { + 'use strict'; + text = globals.converter._dispatch('hashCodeTags.before', text, options, globals); + + var repFunc = function (wholeMatch, match, left, right) { + var codeblock = left + showdown.subParser('encodeCode')(match, options, globals) + right; + return '¨C' + (globals.gHtmlSpans.push(codeblock) - 1) + 'C'; + }; + + // Hash naked + text = showdown.helper.replaceRecursiveRegExp(text, repFunc, ']*>', '', 'gim'); + + text = globals.converter._dispatch('hashCodeTags.after', text, options, globals); + return text; +}); diff --git a/showdown/src/subParsers/hashElement.js b/showdown/src/subParsers/hashElement.js new file mode 100644 index 00000000..80ad42d4 --- /dev/null +++ b/showdown/src/subParsers/hashElement.js @@ -0,0 +1,19 @@ +showdown.subParser('hashElement', function (text, options, globals) { + 'use strict'; + + return function (wholeMatch, m1) { + var blockText = m1; + + // Undo double lines + blockText = blockText.replace(/\n\n/g, '\n'); + blockText = blockText.replace(/^\n/, ''); + + // strip trailing blank lines + blockText = blockText.replace(/\n+$/g, ''); + + // Replace the element text with a marker ("¨KxK" where x is its key) + blockText = '\n\n¨K' + (globals.gHtmlBlocks.push(blockText) - 1) + 'K\n\n'; + + return blockText; + }; +}); diff --git a/showdown/src/subParsers/hashHTMLBlocks.js b/showdown/src/subParsers/hashHTMLBlocks.js new file mode 100644 index 00000000..43e38b50 --- /dev/null +++ b/showdown/src/subParsers/hashHTMLBlocks.js @@ -0,0 +1,98 @@ +showdown.subParser('hashHTMLBlocks', function (text, options, globals) { + 'use strict'; + text = globals.converter._dispatch('hashHTMLBlocks.before', text, options, globals); + + var blockTags = [ + 'pre', + 'div', + 'h1', + 'h2', + 'h3', + 'h4', + 'h5', + 'h6', + 'blockquote', + 'table', + 'dl', + 'ol', + 'ul', + 'script', + 'noscript', + 'form', + 'fieldset', + 'iframe', + 'math', + 'style', + 'section', + 'header', + 'footer', + 'nav', + 'article', + 'aside', + 'address', + 'audio', + 'canvas', + 'figure', + 'hgroup', + 'output', + 'video', + 'p' + ], + repFunc = function (wholeMatch, match, left, right) { + var txt = wholeMatch; + // check if this html element is marked as markdown + // if so, it's contents should be parsed as markdown + if (left.search(/\bmarkdown\b/) !== -1) { + txt = left + globals.converter.makeHtml(match) + right; + } + return '\n\n¨K' + (globals.gHtmlBlocks.push(txt) - 1) + 'K\n\n'; + }; + + if (options.backslashEscapesHTMLTags) { + // encode backslash escaped HTML tags + text = text.replace(/\\<(\/?[^>]+?)>/g, function (wm, inside) { + return '<' + inside + '>'; + }); + } + + // hash HTML Blocks + for (var i = 0; i < blockTags.length; ++i) { + + var opTagPos, + rgx1 = new RegExp('^ {0,3}(<' + blockTags[i] + '\\b[^>]*>)', 'im'), + patLeft = '<' + blockTags[i] + '\\b[^>]*>', + patRight = ''; + // 1. Look for the first position of the first opening HTML tag in the text + while ((opTagPos = showdown.helper.regexIndexOf(text, rgx1)) !== -1) { + + // if the HTML tag is \ escaped, we need to escape it and break + + + //2. Split the text in that position + var subTexts = showdown.helper.splitAtIndex(text, opTagPos), + //3. Match recursively + newSubText1 = showdown.helper.replaceRecursiveRegExp(subTexts[1], repFunc, patLeft, patRight, 'im'); + + // prevent an infinite loop + if (newSubText1 === subTexts[1]) { + break; + } + text = subTexts[0].concat(newSubText1); + } + } + // HR SPECIAL CASE + text = text.replace(/(\n {0,3}(<(hr)\b([^<>])*?\/?>)[ \t]*(?=\n{2,}))/g, + showdown.subParser('hashElement')(text, options, globals)); + + // Special case for standalone HTML comments + text = showdown.helper.replaceRecursiveRegExp(text, function (txt) { + return '\n\n¨K' + (globals.gHtmlBlocks.push(txt) - 1) + 'K\n\n'; + }, '^ {0,3}', 'gm'); + + // PHP and ASP-style processor instructions ( and <%...%>) + text = text.replace(/(?:\n\n)( {0,3}(?:<([?%])[^\r]*?\2>)[ \t]*(?=\n{2,}))/g, + showdown.subParser('hashElement')(text, options, globals)); + + text = globals.converter._dispatch('hashHTMLBlocks.after', text, options, globals); + return text; +}); diff --git a/showdown/src/subParsers/hashHTMLSpans.js b/showdown/src/subParsers/hashHTMLSpans.js new file mode 100644 index 00000000..545aa922 --- /dev/null +++ b/showdown/src/subParsers/hashHTMLSpans.js @@ -0,0 +1,64 @@ +/** + * Hash span elements that should not be parsed as markdown + */ +showdown.subParser('hashHTMLSpans', function (text, options, globals) { + 'use strict'; + text = globals.converter._dispatch('hashHTMLSpans.before', text, options, globals); + + function hashHTMLSpan (html) { + return '¨C' + (globals.gHtmlSpans.push(html) - 1) + 'C'; + } + + // Hash Self Closing tags + text = text.replace(/<[^>]+?\/>/gi, function (wm) { + return hashHTMLSpan(wm); + }); + + // Hash tags without properties + text = text.replace(/<([^>]+?)>[\s\S]*?<\/\1>/g, function (wm) { + return hashHTMLSpan(wm); + }); + + // Hash tags with properties + text = text.replace(/<([^>]+?)\s[^>]+?>[\s\S]*?<\/\1>/g, function (wm) { + return hashHTMLSpan(wm); + }); + + // Hash self closing tags without /> + text = text.replace(/<[^>]+?>/gi, function (wm) { + return hashHTMLSpan(wm); + }); + + /*showdown.helper.matchRecursiveRegExp(text, ']*>', '', 'gi');*/ + + text = globals.converter._dispatch('hashHTMLSpans.after', text, options, globals); + return text; +}); + +/** + * Unhash HTML spans + */ +showdown.subParser('unhashHTMLSpans', function (text, options, globals) { + 'use strict'; + text = globals.converter._dispatch('unhashHTMLSpans.before', text, options, globals); + + for (var i = 0; i < globals.gHtmlSpans.length; ++i) { + var repText = globals.gHtmlSpans[i], + // limiter to prevent infinite loop (assume 10 as limit for recurse) + limit = 0; + + while (/¨C(\d+)C/.test(repText)) { + var num = RegExp.$1; + repText = repText.replace('¨C' + num + 'C', globals.gHtmlSpans[num]); + if (limit === 10) { + console.error('maximum nesting of 10 spans reached!!!'); + break; + } + ++limit; + } + text = text.replace('¨C' + i + 'C', repText); + } + + text = globals.converter._dispatch('unhashHTMLSpans.after', text, options, globals); + return text; +}); diff --git a/showdown/src/subParsers/hashPreCodeTags.js b/showdown/src/subParsers/hashPreCodeTags.js new file mode 100644 index 00000000..87113f3d --- /dev/null +++ b/showdown/src/subParsers/hashPreCodeTags.js @@ -0,0 +1,19 @@ +/** + * Hash and escape
 elements that should not be parsed as markdown
+ */
+showdown.subParser('hashPreCodeTags', function (text, options, globals) {
+  'use strict';
+  text = globals.converter._dispatch('hashPreCodeTags.before', text, options, globals);
+
+  var repFunc = function (wholeMatch, match, left, right) {
+    // encode html entities
+    var codeblock = left + showdown.subParser('encodeCode')(match, options, globals) + right;
+    return '\n\n¨G' + (globals.ghCodeBlocks.push({text: wholeMatch, codeblock: codeblock}) - 1) + 'G\n\n';
+  };
+
+  // Hash 

+  text = showdown.helper.replaceRecursiveRegExp(text, repFunc, '^ {0,3}]*>\\s*]*>', '^ {0,3}\\s*
', 'gim'); + + text = globals.converter._dispatch('hashPreCodeTags.after', text, options, globals); + return text; +}); diff --git a/showdown/src/subParsers/headers.js b/showdown/src/subParsers/headers.js new file mode 100644 index 00000000..b08c4d7a --- /dev/null +++ b/showdown/src/subParsers/headers.js @@ -0,0 +1,126 @@ +showdown.subParser('headers', function (text, options, globals) { + 'use strict'; + + text = globals.converter._dispatch('headers.before', text, options, globals); + + var headerLevelStart = (isNaN(parseInt(options.headerLevelStart))) ? 1 : parseInt(options.headerLevelStart), + + // Set text-style headers: + // Header 1 + // ======== + // + // Header 2 + // -------- + // + setextRegexH1 = (options.smoothLivePreview) ? /^(.+)[ \t]*\n={2,}[ \t]*\n+/gm : /^(.+)[ \t]*\n=+[ \t]*\n+/gm, + setextRegexH2 = (options.smoothLivePreview) ? /^(.+)[ \t]*\n-{2,}[ \t]*\n+/gm : /^(.+)[ \t]*\n-+[ \t]*\n+/gm; + + text = text.replace(setextRegexH1, function (wholeMatch, m1) { + + var spanGamut = showdown.subParser('spanGamut')(m1, options, globals), + hID = (options.noHeaderId) ? '' : ' id="' + headerId(m1) + '"', + hLevel = headerLevelStart, + hashBlock = '' + spanGamut + ''; + return showdown.subParser('hashBlock')(hashBlock, options, globals); + }); + + text = text.replace(setextRegexH2, function (matchFound, m1) { + var spanGamut = showdown.subParser('spanGamut')(m1, options, globals), + hID = (options.noHeaderId) ? '' : ' id="' + headerId(m1) + '"', + hLevel = headerLevelStart + 1, + hashBlock = '' + spanGamut + ''; + return showdown.subParser('hashBlock')(hashBlock, options, globals); + }); + + // atx-style headers: + // # Header 1 + // ## Header 2 + // ## Header 2 with closing hashes ## + // ... + // ###### Header 6 + // + var atxStyle = (options.requireSpaceBeforeHeadingText) ? /^(#{1,6})[ \t]+(.+?)[ \t]*#*\n+/gm : /^(#{1,6})[ \t]*(.+?)[ \t]*#*\n+/gm; + + text = text.replace(atxStyle, function (wholeMatch, m1, m2) { + var hText = m2; + if (options.customizedHeaderId) { + hText = m2.replace(/\s?\{([^{]+?)}\s*$/, ''); + } + + var span = showdown.subParser('spanGamut')(hText, options, globals), + hID = (options.noHeaderId) ? '' : ' id="' + headerId(m2) + '"', + hLevel = headerLevelStart - 1 + m1.length, + header = '' + span + ''; + + return showdown.subParser('hashBlock')(header, options, globals); + }); + + function headerId (m) { + var title, + prefix; + + // It is separate from other options to allow combining prefix and customized + if (options.customizedHeaderId) { + var match = m.match(/\{([^{]+?)}\s*$/); + if (match && match[1]) { + m = match[1]; + } + } + + title = m; + + // Prefix id to prevent causing inadvertent pre-existing style matches. + if (showdown.helper.isString(options.prefixHeaderId)) { + prefix = options.prefixHeaderId; + } else if (options.prefixHeaderId === true) { + prefix = 'section-'; + } else { + prefix = ''; + } + + if (!options.rawPrefixHeaderId) { + title = prefix + title; + } + + if (options.ghCompatibleHeaderId) { + title = title + .replace(/ /g, '-') + // replace previously escaped chars (&, ¨ and $) + .replace(/&/g, '') + .replace(/¨T/g, '') + .replace(/¨D/g, '') + // replace rest of the chars (&~$ are repeated as they might have been escaped) + // borrowed from github's redcarpet (some they should produce similar results) + .replace(/[&+$,\/:;=?@"#{}|^¨~\[\]`\\*)(%.!'<>]/g, '') + .toLowerCase(); + } else if (options.rawHeaderId) { + title = title + .replace(/ /g, '-') + // replace previously escaped chars (&, ¨ and $) + .replace(/&/g, '&') + .replace(/¨T/g, '¨') + .replace(/¨D/g, '$') + // replace " and ' + .replace(/["']/g, '-') + .toLowerCase(); + } else { + title = title + .replace(/[^\w]/g, '') + .toLowerCase(); + } + + if (options.rawPrefixHeaderId) { + title = prefix + title; + } + + if (globals.hashLinkCounts[title]) { + title = title + '-' + (globals.hashLinkCounts[title]++); + } else { + globals.hashLinkCounts[title] = 1; + } + return title; + } + + text = globals.converter._dispatch('headers.after', text, options, globals); + return text; +}); diff --git a/showdown/src/subParsers/horizontalRule.js b/showdown/src/subParsers/horizontalRule.js new file mode 100644 index 00000000..e8e98e2c --- /dev/null +++ b/showdown/src/subParsers/horizontalRule.js @@ -0,0 +1,15 @@ +/** + * Turn Markdown link shortcuts into XHTML tags. + */ +showdown.subParser('horizontalRule', function (text, options, globals) { + 'use strict'; + text = globals.converter._dispatch('horizontalRule.before', text, options, globals); + + var key = showdown.subParser('hashBlock')('
', options, globals); + text = text.replace(/^ {0,2}( ?-){3,}[ \t]*$/gm, key); + text = text.replace(/^ {0,2}( ?\*){3,}[ \t]*$/gm, key); + text = text.replace(/^ {0,2}( ?_){3,}[ \t]*$/gm, key); + + text = globals.converter._dispatch('horizontalRule.after', text, options, globals); + return text; +}); diff --git a/showdown/src/subParsers/images.js b/showdown/src/subParsers/images.js new file mode 100644 index 00000000..e3d8e061 --- /dev/null +++ b/showdown/src/subParsers/images.js @@ -0,0 +1,104 @@ +/** + * Turn Markdown image shortcuts into tags. + */ +showdown.subParser('images', function (text, options, globals) { + 'use strict'; + + text = globals.converter._dispatch('images.before', text, options, globals); + + var inlineRegExp = /!\[([^\]]*?)][ \t]*()\([ \t]??(?: =([*\d]+[A-Za-z%]{0,4})x([*\d]+[A-Za-z%]{0,4}))?[ \t]*(?:(["'])([^"]*?)\6)?[ \t]?\)/g, + crazyRegExp = /!\[([^\]]*?)][ \t]*()\([ \t]?<([^>]*)>(?: =([*\d]+[A-Za-z%]{0,4})x([*\d]+[A-Za-z%]{0,4}))?[ \t]*(?:(?:(["'])([^"]*?)\6))?[ \t]?\)/g, + base64RegExp = /!\[([^\]]*?)][ \t]*()\([ \t]??(?: =([*\d]+[A-Za-z%]{0,4})x([*\d]+[A-Za-z%]{0,4}))?[ \t]*(?:(["'])([^"]*?)\6)?[ \t]?\)/g, + referenceRegExp = /!\[([^\]]*?)] ?(?:\n *)?\[([\s\S]*?)]()()()()()/g, + refShortcutRegExp = /!\[([^\[\]]+)]()()()()()/g; + + function writeImageTagBase64 (wholeMatch, altText, linkId, url, width, height, m5, title) { + url = url.replace(/\s/g, ''); + return writeImageTag (wholeMatch, altText, linkId, url, width, height, m5, title); + } + + function writeImageTag (wholeMatch, altText, linkId, url, width, height, m5, title) { + + var gUrls = globals.gUrls, + gTitles = globals.gTitles, + gDims = globals.gDimensions; + + linkId = linkId.toLowerCase(); + + if (!title) { + title = ''; + } + // Special case for explicit empty url + if (wholeMatch.search(/\(? ?(['"].*['"])?\)$/m) > -1) { + url = ''; + + } else if (url === '' || url === null) { + if (linkId === '' || linkId === null) { + // lower-case and turn embedded newlines into spaces + linkId = altText.toLowerCase().replace(/ ?\n/g, ' '); + } + url = '#' + linkId; + + if (!showdown.helper.isUndefined(gUrls[linkId])) { + url = gUrls[linkId]; + if (!showdown.helper.isUndefined(gTitles[linkId])) { + title = gTitles[linkId]; + } + if (!showdown.helper.isUndefined(gDims[linkId])) { + width = gDims[linkId].width; + height = gDims[linkId].height; + } + } else { + return wholeMatch; + } + } + + altText = altText + .replace(/"/g, '"') + //altText = showdown.helper.escapeCharacters(altText, '*_', false); + .replace(showdown.helper.regexes.asteriskDashAndColon, showdown.helper.escapeCharactersCallback); + //url = showdown.helper.escapeCharacters(url, '*_', false); + url = url.replace(showdown.helper.regexes.asteriskDashAndColon, showdown.helper.escapeCharactersCallback); + var result = '' + altText + 'x "optional title") + + // base64 encoded images + text = text.replace(base64RegExp, writeImageTagBase64); + + // cases with crazy urls like ./image/cat1).png + text = text.replace(crazyRegExp, writeImageTag); + + // normal cases + text = text.replace(inlineRegExp, writeImageTag); + + // handle reference-style shortcuts: ![img text] + text = text.replace(refShortcutRegExp, writeImageTag); + + text = globals.converter._dispatch('images.after', text, options, globals); + return text; +}); diff --git a/showdown/src/subParsers/italicsAndBold.js b/showdown/src/subParsers/italicsAndBold.js new file mode 100644 index 00000000..11842da5 --- /dev/null +++ b/showdown/src/subParsers/italicsAndBold.js @@ -0,0 +1,70 @@ +showdown.subParser('italicsAndBold', function (text, options, globals) { + 'use strict'; + + text = globals.converter._dispatch('italicsAndBold.before', text, options, globals); + + // it's faster to have 3 separate regexes for each case than have just one + // because of backtracing, in some cases, it could lead to an exponential effect + // called "catastrophic backtrace". Ominous! + + function parseInside (txt, left, right) { + /* + if (options.simplifiedAutoLink) { + txt = showdown.subParser('simplifiedAutoLinks')(txt, options, globals); + } + */ + return left + txt + right; + } + + // Parse underscores + if (options.literalMidWordUnderscores) { + text = text.replace(/\b___(\S[\s\S]*?)___\b/g, function (wm, txt) { + return parseInside (txt, '', ''); + }); + text = text.replace(/\b__(\S[\s\S]*?)__\b/g, function (wm, txt) { + return parseInside (txt, '', ''); + }); + text = text.replace(/\b_(\S[\s\S]*?)_\b/g, function (wm, txt) { + return parseInside (txt, '', ''); + }); + } else { + text = text.replace(/___(\S[\s\S]*?)___/g, function (wm, m) { + return (/\S$/.test(m)) ? parseInside (m, '', '') : wm; + }); + text = text.replace(/__(\S[\s\S]*?)__/g, function (wm, m) { + return (/\S$/.test(m)) ? parseInside (m, '', '') : wm; + }); + text = text.replace(/_([^\s_][\s\S]*?)_/g, function (wm, m) { + // !/^_[^_]/.test(m) - test if it doesn't start with __ (since it seems redundant, we removed it) + return (/\S$/.test(m)) ? parseInside (m, '', '') : wm; + }); + } + + // Now parse asterisks + if (options.literalMidWordAsterisks) { + text = text.replace(/([^*]|^)\B\*\*\*(\S[\s\S]*?)\*\*\*\B(?!\*)/g, function (wm, lead, txt) { + return parseInside (txt, lead + '', ''); + }); + text = text.replace(/([^*]|^)\B\*\*(\S[\s\S]*?)\*\*\B(?!\*)/g, function (wm, lead, txt) { + return parseInside (txt, lead + '', ''); + }); + text = text.replace(/([^*]|^)\B\*(\S[\s\S]*?)\*\B(?!\*)/g, function (wm, lead, txt) { + return parseInside (txt, lead + '', ''); + }); + } else { + text = text.replace(/\*\*\*(\S[\s\S]*?)\*\*\*/g, function (wm, m) { + return (/\S$/.test(m)) ? parseInside (m, '', '') : wm; + }); + text = text.replace(/\*\*(\S[\s\S]*?)\*\*/g, function (wm, m) { + return (/\S$/.test(m)) ? parseInside (m, '', '') : wm; + }); + text = text.replace(/\*([^\s*][\s\S]*?)\*/g, function (wm, m) { + // !/^\*[^*]/.test(m) - test if it doesn't start with ** (since it seems redundant, we removed it) + return (/\S$/.test(m)) ? parseInside (m, '', '') : wm; + }); + } + + + text = globals.converter._dispatch('italicsAndBold.after', text, options, globals); + return text; +}); diff --git a/showdown/src/subParsers/lists.js b/showdown/src/subParsers/lists.js new file mode 100644 index 00000000..d9556ff9 --- /dev/null +++ b/showdown/src/subParsers/lists.js @@ -0,0 +1,203 @@ +/** + * Form HTML ordered (numbered) and unordered (bulleted) lists. + */ +showdown.subParser('lists', function (text, options, globals) { + 'use strict'; + + /** + * Process the contents of a single ordered or unordered list, splitting it + * into individual list items. + * @param {string} listStr + * @param {boolean} trimTrailing + * @returns {string} + */ + function processListItems (listStr, trimTrailing) { + // The $g_list_level global keeps track of when we're inside a list. + // Each time we enter a list, we increment it; when we leave a list, + // we decrement. If it's zero, we're not in a list anymore. + // + // We do this because when we're not inside a list, we want to treat + // something like this: + // + // I recommend upgrading to version + // 8. Oops, now this line is treated + // as a sub-list. + // + // As a single paragraph, despite the fact that the second line starts + // with a digit-period-space sequence. + // + // Whereas when we're inside a list (or sub-list), that line will be + // treated as the start of a sub-list. What a kludge, huh? This is + // an aspect of Markdown's syntax that's hard to parse perfectly + // without resorting to mind-reading. Perhaps the solution is to + // change the syntax rules such that sub-lists must start with a + // starting cardinal number; e.g. "1." or "a.". + globals.gListLevel++; + + // trim trailing blank lines: + listStr = listStr.replace(/\n{2,}$/, '\n'); + + // attacklab: add sentinel to emulate \z + listStr += '¨0'; + + var rgx = /(\n)?(^ {0,3})([*+-]|\d+[.])[ \t]+((\[(x|X| )?])?[ \t]*[^\r]+?(\n{1,2}))(?=\n*(¨0| {0,3}([*+-]|\d+[.])[ \t]+))/gm, + isParagraphed = (/\n[ \t]*\n(?!¨0)/.test(listStr)); + + // Since version 1.5, nesting sublists requires 4 spaces (or 1 tab) indentation, + // which is a syntax breaking change + // activating this option reverts to old behavior + if (options.disableForced4SpacesIndentedSublists) { + rgx = /(\n)?(^ {0,3})([*+-]|\d+[.])[ \t]+((\[(x|X| )?])?[ \t]*[^\r]+?(\n{1,2}))(?=\n*(¨0|\2([*+-]|\d+[.])[ \t]+))/gm; + } + + listStr = listStr.replace(rgx, function (wholeMatch, m1, m2, m3, m4, taskbtn, checked) { + checked = (checked && checked.trim() !== ''); + + var item = showdown.subParser('outdent')(m4, options, globals), + bulletStyle = ''; + + // Support for github tasklists + if (taskbtn && options.tasklists) { + bulletStyle = ' class="task-list-item" style="list-style-type: none;"'; + item = item.replace(/^[ \t]*\[(x|X| )?]/m, function () { + var otp = '
  • a
  • + // instead of: + //
    • - - a
    + // So, to prevent it, we will put a marker (¨A)in the beginning of the line + // Kind of hackish/monkey patching, but seems more effective than overcomplicating the list parser + item = item.replace(/^([-*+]|\d\.)[ \t]+[\S\n ]*/g, function (wm2) { + return '¨A' + wm2; + }); + + // m1 - Leading line or + // Has a double return (multi paragraph) or + // Has sublist + if (m1 || (item.search(/\n{2,}/) > -1)) { + item = showdown.subParser('githubCodeBlocks')(item, options, globals); + item = showdown.subParser('blockGamut')(item, options, globals); + } else { + // Recursion for sub-lists: + item = showdown.subParser('lists')(item, options, globals); + item = item.replace(/\n$/, ''); // chomp(item) + item = showdown.subParser('hashHTMLBlocks')(item, options, globals); + + // Colapse double linebreaks + item = item.replace(/\n\n+/g, '\n\n'); + if (isParagraphed) { + item = showdown.subParser('paragraphs')(item, options, globals); + } else { + item = showdown.subParser('spanGamut')(item, options, globals); + } + } + + // now we need to remove the marker (¨A) + item = item.replace('¨A', ''); + // we can finally wrap the line in list item tags + item = '' + item + '\n'; + + return item; + }); + + // attacklab: strip sentinel + listStr = listStr.replace(/¨0/g, ''); + + globals.gListLevel--; + + if (trimTrailing) { + listStr = listStr.replace(/\s+$/, ''); + } + + return listStr; + } + + function styleStartNumber (list, listType) { + // check if ol and starts by a number different than 1 + if (listType === 'ol') { + var res = list.match(/^ *(\d+)\./); + if (res && res[1] !== '1') { + return ' start="' + res[1] + '"'; + } + } + return ''; + } + + /** + * Check and parse consecutive lists (better fix for issue #142) + * @param {string} list + * @param {string} listType + * @param {boolean} trimTrailing + * @returns {string} + */ + function parseConsecutiveLists (list, listType, trimTrailing) { + // check if we caught 2 or more consecutive lists by mistake + // we use the counterRgx, meaning if listType is UL we look for OL and vice versa + var olRgx = (options.disableForced4SpacesIndentedSublists) ? /^ ?\d+\.[ \t]/gm : /^ {0,3}\d+\.[ \t]/gm, + ulRgx = (options.disableForced4SpacesIndentedSublists) ? /^ ?[*+-][ \t]/gm : /^ {0,3}[*+-][ \t]/gm, + counterRxg = (listType === 'ul') ? olRgx : ulRgx, + result = ''; + + if (list.search(counterRxg) !== -1) { + (function parseCL (txt) { + var pos = txt.search(counterRxg), + style = styleStartNumber(list, listType); + if (pos !== -1) { + // slice + result += '\n\n<' + listType + style + '>\n' + processListItems(txt.slice(0, pos), !!trimTrailing) + '\n'; + + // invert counterType and listType + listType = (listType === 'ul') ? 'ol' : 'ul'; + counterRxg = (listType === 'ul') ? olRgx : ulRgx; + + //recurse + parseCL(txt.slice(pos)); + } else { + result += '\n\n<' + listType + style + '>\n' + processListItems(txt, !!trimTrailing) + '\n'; + } + })(list); + } else { + var style = styleStartNumber(list, listType); + result = '\n\n<' + listType + style + '>\n' + processListItems(list, !!trimTrailing) + '\n'; + } + + return result; + } + + /** Start of list parsing **/ + text = globals.converter._dispatch('lists.before', text, options, globals); + // add sentinel to hack around khtml/safari bug: + // http://bugs.webkit.org/show_bug.cgi?id=11231 + text += '¨0'; + + if (globals.gListLevel) { + text = text.replace(/^(( {0,3}([*+-]|\d+[.])[ \t]+)[^\r]+?(¨0|\n{2,}(?=\S)(?![ \t]*(?:[*+-]|\d+[.])[ \t]+)))/gm, + function (wholeMatch, list, m2) { + var listType = (m2.search(/[*+-]/g) > -1) ? 'ul' : 'ol'; + return parseConsecutiveLists(list, listType, true); + } + ); + } else { + text = text.replace(/(\n\n|^\n?)(( {0,3}([*+-]|\d+[.])[ \t]+)[^\r]+?(¨0|\n{2,}(?=\S)(?![ \t]*(?:[*+-]|\d+[.])[ \t]+)))/gm, + function (wholeMatch, m1, list, m3) { + var listType = (m3.search(/[*+-]/g) > -1) ? 'ul' : 'ol'; + return parseConsecutiveLists(list, listType, false); + } + ); + } + + // strip sentinel + text = text.replace(/¨0/, ''); + text = globals.converter._dispatch('lists.after', text, options, globals); + return text; +}); diff --git a/showdown/src/subParsers/makeMarkdown/blockquote.js b/showdown/src/subParsers/makeMarkdown/blockquote.js new file mode 100644 index 00000000..143e5a8f --- /dev/null +++ b/showdown/src/subParsers/makeMarkdown/blockquote.js @@ -0,0 +1,22 @@ +showdown.subParser('makeMarkdown.blockquote', function (node, globals) { + 'use strict'; + + var txt = ''; + if (node.hasChildNodes()) { + var children = node.childNodes, + childrenLength = children.length; + + for (var i = 0; i < childrenLength; ++i) { + var innerTxt = showdown.subParser('makeMarkdown.node')(children[i], globals); + + if (innerTxt === '') { + continue; + } + txt += innerTxt; + } + } + // cleanup + txt = txt.trim(); + txt = '> ' + txt.split('\n').join('\n> '); + return txt; +}); diff --git a/showdown/src/subParsers/makeMarkdown/codeBlock.js b/showdown/src/subParsers/makeMarkdown/codeBlock.js new file mode 100644 index 00000000..bf8cf173 --- /dev/null +++ b/showdown/src/subParsers/makeMarkdown/codeBlock.js @@ -0,0 +1,7 @@ +showdown.subParser('makeMarkdown.codeBlock', function (node, globals) { + 'use strict'; + + var lang = node.getAttribute('language'), + num = node.getAttribute('precodenum'); + return '```' + lang + '\n' + globals.preList[num] + '\n```'; +}); diff --git a/showdown/src/subParsers/makeMarkdown/codeSpan.js b/showdown/src/subParsers/makeMarkdown/codeSpan.js new file mode 100644 index 00000000..da904295 --- /dev/null +++ b/showdown/src/subParsers/makeMarkdown/codeSpan.js @@ -0,0 +1,5 @@ +showdown.subParser('makeMarkdown.codeSpan', function (node) { + 'use strict'; + + return '`' + node.innerHTML + '`'; +}); diff --git a/showdown/src/subParsers/makeMarkdown/emphasis.js b/showdown/src/subParsers/makeMarkdown/emphasis.js new file mode 100644 index 00000000..283cd02b --- /dev/null +++ b/showdown/src/subParsers/makeMarkdown/emphasis.js @@ -0,0 +1,15 @@ +showdown.subParser('makeMarkdown.emphasis', function (node, globals) { + 'use strict'; + + var txt = ''; + if (node.hasChildNodes()) { + txt += '*'; + var children = node.childNodes, + childrenLength = children.length; + for (var i = 0; i < childrenLength; ++i) { + txt += showdown.subParser('makeMarkdown.node')(children[i], globals); + } + txt += '*'; + } + return txt; +}); diff --git a/showdown/src/subParsers/makeMarkdown/header.js b/showdown/src/subParsers/makeMarkdown/header.js new file mode 100644 index 00000000..9a1b0c52 --- /dev/null +++ b/showdown/src/subParsers/makeMarkdown/header.js @@ -0,0 +1,17 @@ +showdown.subParser('makeMarkdown.header', function (node, globals, headerLevel) { + 'use strict'; + + var headerMark = new Array(headerLevel + 1).join('#'), + txt = ''; + + if (node.hasChildNodes()) { + txt = headerMark + ' '; + var children = node.childNodes, + childrenLength = children.length; + + for (var i = 0; i < childrenLength; ++i) { + txt += showdown.subParser('makeMarkdown.node')(children[i], globals); + } + } + return txt; +}); diff --git a/showdown/src/subParsers/makeMarkdown/hr.js b/showdown/src/subParsers/makeMarkdown/hr.js new file mode 100644 index 00000000..555451f1 --- /dev/null +++ b/showdown/src/subParsers/makeMarkdown/hr.js @@ -0,0 +1,5 @@ +showdown.subParser('makeMarkdown.hr', function () { + 'use strict'; + + return '---'; +}); diff --git a/showdown/src/subParsers/makeMarkdown/image.js b/showdown/src/subParsers/makeMarkdown/image.js new file mode 100644 index 00000000..b5fa0393 --- /dev/null +++ b/showdown/src/subParsers/makeMarkdown/image.js @@ -0,0 +1,18 @@ +showdown.subParser('makeMarkdown.image', function (node) { + 'use strict'; + + var txt = ''; + if (node.hasAttribute('src')) { + txt += '![' + node.getAttribute('alt') + ']('; + txt += '<' + node.getAttribute('src') + '>'; + if (node.hasAttribute('width') && node.hasAttribute('height')) { + txt += ' =' + node.getAttribute('width') + 'x' + node.getAttribute('height'); + } + + if (node.hasAttribute('title')) { + txt += ' "' + node.getAttribute('title') + '"'; + } + txt += ')'; + } + return txt; +}); diff --git a/showdown/src/subParsers/makeMarkdown/links.js b/showdown/src/subParsers/makeMarkdown/links.js new file mode 100644 index 00000000..6b23255a --- /dev/null +++ b/showdown/src/subParsers/makeMarkdown/links.js @@ -0,0 +1,20 @@ +showdown.subParser('makeMarkdown.links', function (node, globals) { + 'use strict'; + + var txt = ''; + if (node.hasChildNodes() && node.hasAttribute('href')) { + var children = node.childNodes, + childrenLength = children.length; + txt = '['; + for (var i = 0; i < childrenLength; ++i) { + txt += showdown.subParser('makeMarkdown.node')(children[i], globals); + } + txt += ']('; + txt += '<' + node.getAttribute('href') + '>'; + if (node.hasAttribute('title')) { + txt += ' "' + node.getAttribute('title') + '"'; + } + txt += ')'; + } + return txt; +}); diff --git a/showdown/src/subParsers/makeMarkdown/list.js b/showdown/src/subParsers/makeMarkdown/list.js new file mode 100644 index 00000000..7882e1b5 --- /dev/null +++ b/showdown/src/subParsers/makeMarkdown/list.js @@ -0,0 +1,33 @@ +showdown.subParser('makeMarkdown.list', function (node, globals, type) { + 'use strict'; + + var txt = ''; + if (!node.hasChildNodes()) { + return ''; + } + var listItems = node.childNodes, + listItemsLenght = listItems.length, + listNum = node.getAttribute('start') || 1; + + for (var i = 0; i < listItemsLenght; ++i) { + if (typeof listItems[i].tagName === 'undefined' || listItems[i].tagName.toLowerCase() !== 'li') { + continue; + } + + // define the bullet to use in list + var bullet = ''; + if (type === 'ol') { + bullet = listNum.toString() + '. '; + } else { + bullet = '- '; + } + + // parse list item + txt += bullet + showdown.subParser('makeMarkdown.listItem')(listItems[i], globals); + ++listNum; + } + + // add comment at the end to prevent consecutive lists to be parsed as one + txt += '\n\n'; + return txt.trim(); +}); diff --git a/showdown/src/subParsers/makeMarkdown/listItem.js b/showdown/src/subParsers/makeMarkdown/listItem.js new file mode 100644 index 00000000..bccd2a07 --- /dev/null +++ b/showdown/src/subParsers/makeMarkdown/listItem.js @@ -0,0 +1,25 @@ +showdown.subParser('makeMarkdown.listItem', function (node, globals) { + 'use strict'; + + var listItemTxt = ''; + + var children = node.childNodes, + childrenLenght = children.length; + + for (var i = 0; i < childrenLenght; ++i) { + listItemTxt += showdown.subParser('makeMarkdown.node')(children[i], globals); + } + // if it's only one liner, we need to add a newline at the end + if (!/\n$/.test(listItemTxt)) { + listItemTxt += '\n'; + } else { + // it's multiparagraph, so we need to indent + listItemTxt = listItemTxt + .split('\n') + .join('\n ') + .replace(/^ {4}$/gm, '') + .replace(/\n\n+/g, '\n\n'); + } + + return listItemTxt; +}); diff --git a/showdown/src/subParsers/makeMarkdown/node.js b/showdown/src/subParsers/makeMarkdown/node.js new file mode 100644 index 00000000..67ab5852 --- /dev/null +++ b/showdown/src/subParsers/makeMarkdown/node.js @@ -0,0 +1,120 @@ + + +showdown.subParser('makeMarkdown.node', function (node, globals, spansOnly) { + 'use strict'; + + spansOnly = spansOnly || false; + + var txt = ''; + + // edge case of text without wrapper paragraph + if (node.nodeType === 3) { + return showdown.subParser('makeMarkdown.txt')(node, globals); + } + + // HTML comment + if (node.nodeType === 8) { + return '\n\n'; + } + + // process only node elements + if (node.nodeType !== 1) { + return ''; + } + + var tagName = node.tagName.toLowerCase(); + + switch (tagName) { + + // + // BLOCKS + // + case 'h1': + if (!spansOnly) { txt = showdown.subParser('makeMarkdown.header')(node, globals, 1) + '\n\n'; } + break; + case 'h2': + if (!spansOnly) { txt = showdown.subParser('makeMarkdown.header')(node, globals, 2) + '\n\n'; } + break; + case 'h3': + if (!spansOnly) { txt = showdown.subParser('makeMarkdown.header')(node, globals, 3) + '\n\n'; } + break; + case 'h4': + if (!spansOnly) { txt = showdown.subParser('makeMarkdown.header')(node, globals, 4) + '\n\n'; } + break; + case 'h5': + if (!spansOnly) { txt = showdown.subParser('makeMarkdown.header')(node, globals, 5) + '\n\n'; } + break; + case 'h6': + if (!spansOnly) { txt = showdown.subParser('makeMarkdown.header')(node, globals, 6) + '\n\n'; } + break; + + case 'p': + if (!spansOnly) { txt = showdown.subParser('makeMarkdown.paragraph')(node, globals) + '\n\n'; } + break; + + case 'blockquote': + if (!spansOnly) { txt = showdown.subParser('makeMarkdown.blockquote')(node, globals) + '\n\n'; } + break; + + case 'hr': + if (!spansOnly) { txt = showdown.subParser('makeMarkdown.hr')(node, globals) + '\n\n'; } + break; + + case 'ol': + if (!spansOnly) { txt = showdown.subParser('makeMarkdown.list')(node, globals, 'ol') + '\n\n'; } + break; + + case 'ul': + if (!spansOnly) { txt = showdown.subParser('makeMarkdown.list')(node, globals, 'ul') + '\n\n'; } + break; + + case 'precode': + if (!spansOnly) { txt = showdown.subParser('makeMarkdown.codeBlock')(node, globals) + '\n\n'; } + break; + + case 'pre': + if (!spansOnly) { txt = showdown.subParser('makeMarkdown.pre')(node, globals) + '\n\n'; } + break; + + case 'table': + if (!spansOnly) { txt = showdown.subParser('makeMarkdown.table')(node, globals) + '\n\n'; } + break; + + // + // SPANS + // + case 'code': + txt = showdown.subParser('makeMarkdown.codeSpan')(node, globals); + break; + + case 'em': + case 'i': + txt = showdown.subParser('makeMarkdown.emphasis')(node, globals); + break; + + case 'strong': + case 'b': + txt = showdown.subParser('makeMarkdown.strong')(node, globals); + break; + + case 'del': + txt = showdown.subParser('makeMarkdown.strikethrough')(node, globals); + break; + + case 'a': + txt = showdown.subParser('makeMarkdown.links')(node, globals); + break; + + case 'img': + txt = showdown.subParser('makeMarkdown.image')(node, globals); + break; + + default: + txt = node.outerHTML + '\n\n'; + } + + // common normalization + // TODO eventually + + return txt; +}); diff --git a/showdown/src/subParsers/makeMarkdown/paragraph.js b/showdown/src/subParsers/makeMarkdown/paragraph.js new file mode 100644 index 00000000..f899d597 --- /dev/null +++ b/showdown/src/subParsers/makeMarkdown/paragraph.js @@ -0,0 +1,17 @@ +showdown.subParser('makeMarkdown.paragraph', function (node, globals) { + 'use strict'; + + var txt = ''; + if (node.hasChildNodes()) { + var children = node.childNodes, + childrenLength = children.length; + for (var i = 0; i < childrenLength; ++i) { + txt += showdown.subParser('makeMarkdown.node')(children[i], globals); + } + } + + // some text normalization + txt = txt.trim(); + + return txt; +}); diff --git a/showdown/src/subParsers/makeMarkdown/pre.js b/showdown/src/subParsers/makeMarkdown/pre.js new file mode 100644 index 00000000..621701a9 --- /dev/null +++ b/showdown/src/subParsers/makeMarkdown/pre.js @@ -0,0 +1,6 @@ +showdown.subParser('makeMarkdown.pre', function (node, globals) { + 'use strict'; + + var num = node.getAttribute('prenum'); + return '
    ' + globals.preList[num] + '
    '; +}); diff --git a/showdown/src/subParsers/makeMarkdown/strikethrough.js b/showdown/src/subParsers/makeMarkdown/strikethrough.js new file mode 100644 index 00000000..0676b86c --- /dev/null +++ b/showdown/src/subParsers/makeMarkdown/strikethrough.js @@ -0,0 +1,15 @@ +showdown.subParser('makeMarkdown.strikethrough', function (node, globals) { + 'use strict'; + + var txt = ''; + if (node.hasChildNodes()) { + txt += '~~'; + var children = node.childNodes, + childrenLength = children.length; + for (var i = 0; i < childrenLength; ++i) { + txt += showdown.subParser('makeMarkdown.node')(children[i], globals); + } + txt += '~~'; + } + return txt; +}); diff --git a/showdown/src/subParsers/makeMarkdown/strong.js b/showdown/src/subParsers/makeMarkdown/strong.js new file mode 100644 index 00000000..05ae9bca --- /dev/null +++ b/showdown/src/subParsers/makeMarkdown/strong.js @@ -0,0 +1,15 @@ +showdown.subParser('makeMarkdown.strong', function (node, globals) { + 'use strict'; + + var txt = ''; + if (node.hasChildNodes()) { + txt += '**'; + var children = node.childNodes, + childrenLength = children.length; + for (var i = 0; i < childrenLength; ++i) { + txt += showdown.subParser('makeMarkdown.node')(children[i], globals); + } + txt += '**'; + } + return txt; +}); diff --git a/showdown/src/subParsers/makeMarkdown/table.js b/showdown/src/subParsers/makeMarkdown/table.js new file mode 100644 index 00000000..1fb1f94a --- /dev/null +++ b/showdown/src/subParsers/makeMarkdown/table.js @@ -0,0 +1,70 @@ +showdown.subParser('makeMarkdown.table', function (node, globals) { + 'use strict'; + + var txt = '', + tableArray = [[], []], + headings = node.querySelectorAll('thead>tr>th'), + rows = node.querySelectorAll('tbody>tr'), + i, ii; + for (i = 0; i < headings.length; ++i) { + var headContent = showdown.subParser('makeMarkdown.tableCell')(headings[i], globals), + allign = '---'; + + if (headings[i].hasAttribute('style')) { + var style = headings[i].getAttribute('style').toLowerCase().replace(/\s/g, ''); + switch (style) { + case 'text-align:left;': + allign = ':---'; + break; + case 'text-align:right;': + allign = '---:'; + break; + case 'text-align:center;': + allign = ':---:'; + break; + } + } + tableArray[0][i] = headContent.trim(); + tableArray[1][i] = allign; + } + + for (i = 0; i < rows.length; ++i) { + var r = tableArray.push([]) - 1, + cols = rows[i].getElementsByTagName('td'); + + for (ii = 0; ii < headings.length; ++ii) { + var cellContent = ' '; + if (typeof cols[ii] !== 'undefined') { + cellContent = showdown.subParser('makeMarkdown.tableCell')(cols[ii], globals); + } + tableArray[r].push(cellContent); + } + } + + var cellSpacesCount = 3; + for (i = 0; i < tableArray.length; ++i) { + for (ii = 0; ii < tableArray[i].length; ++ii) { + var strLen = tableArray[i][ii].length; + if (strLen > cellSpacesCount) { + cellSpacesCount = strLen; + } + } + } + + for (i = 0; i < tableArray.length; ++i) { + for (ii = 0; ii < tableArray[i].length; ++ii) { + if (i === 1) { + if (tableArray[i][ii].slice(-1) === ':') { + tableArray[i][ii] = showdown.helper.padEnd(tableArray[i][ii].slice(-1), cellSpacesCount - 1, '-') + ':'; + } else { + tableArray[i][ii] = showdown.helper.padEnd(tableArray[i][ii], cellSpacesCount, '-'); + } + } else { + tableArray[i][ii] = showdown.helper.padEnd(tableArray[i][ii], cellSpacesCount); + } + } + txt += '| ' + tableArray[i].join(' | ') + ' |\n'; + } + + return txt.trim(); +}); diff --git a/showdown/src/subParsers/makeMarkdown/tableCell.js b/showdown/src/subParsers/makeMarkdown/tableCell.js new file mode 100644 index 00000000..b318ff13 --- /dev/null +++ b/showdown/src/subParsers/makeMarkdown/tableCell.js @@ -0,0 +1,15 @@ +showdown.subParser('makeMarkdown.tableCell', function (node, globals) { + 'use strict'; + + var txt = ''; + if (!node.hasChildNodes()) { + return ''; + } + var children = node.childNodes, + childrenLength = children.length; + + for (var i = 0; i < childrenLength; ++i) { + txt += showdown.subParser('makeMarkdown.node')(children[i], globals, true); + } + return txt.trim(); +}); diff --git a/showdown/src/subParsers/makeMarkdown/txt.js b/showdown/src/subParsers/makeMarkdown/txt.js new file mode 100644 index 00000000..a231bc4a --- /dev/null +++ b/showdown/src/subParsers/makeMarkdown/txt.js @@ -0,0 +1,43 @@ +showdown.subParser('makeMarkdown.txt', function (node) { + 'use strict'; + + var txt = node.nodeValue; + + // multiple spaces are collapsed + txt = txt.replace(/ +/g, ' '); + + // replace the custom ¨NBSP; with a space + txt = txt.replace(/¨NBSP;/g, ' '); + + // ", <, > and & should replace escaped html entities + txt = showdown.helper.unescapeHTMLEntities(txt); + + // escape markdown magic characters + // emphasis, strong and strikethrough - can appear everywhere + // we also escape pipe (|) because of tables + // and escape ` because of code blocks and spans + txt = txt.replace(/([*_~|`])/g, '\\$1'); + + // escape > because of blockquotes + txt = txt.replace(/^(\s*)>/g, '\\$1>'); + + // hash character, only troublesome at the beginning of a line because of headers + txt = txt.replace(/^#/gm, '\\#'); + + // horizontal rules + txt = txt.replace(/^(\s*)([-=]{3,})(\s*)$/, '$1\\$2$3'); + + // dot, because of ordered lists, only troublesome at the beginning of a line when preceded by an integer + txt = txt.replace(/^( {0,3}\d+)\./gm, '$1\\.'); + + // +, * and -, at the beginning of a line becomes a list, so we need to escape them also (asterisk was already escaped) + txt = txt.replace(/^( {0,3})([+-])/gm, '$1\\$2'); + + // images and links, ] followed by ( is problematic, so we escape it + txt = txt.replace(/]([\s]*)\(/g, '\\]$1\\('); + + // reference URIs must also be escaped + txt = txt.replace(/^ {0,3}\[([\S \t]*?)]:/gm, '\\[$1]:'); + + return txt; +}); diff --git a/showdown/src/subParsers/metadata.js b/showdown/src/subParsers/metadata.js new file mode 100644 index 00000000..d6017232 --- /dev/null +++ b/showdown/src/subParsers/metadata.js @@ -0,0 +1,49 @@ +/** + * Parse metadata at the top of the document + */ +showdown.subParser('metadata', function (text, options, globals) { + 'use strict'; + + if (!options.metadata) { + return text; + } + + text = globals.converter._dispatch('metadata.before', text, options, globals); + + function parseMetadataContents (content) { + // raw is raw so it's not changed in any way + globals.metadata.raw = content; + + // escape chars forbidden in html attributes + // double quotes + content = content + // ampersand first + .replace(/&/g, '&') + // double quotes + .replace(/"/g, '"'); + + content = content.replace(/\n {4}/g, ' '); + content.replace(/^([\S ]+): +([\s\S]+?)$/gm, function (wm, key, value) { + globals.metadata.parsed[key] = value; + return ''; + }); + } + + text = text.replace(/^\s*«««+(\S*?)\n([\s\S]+?)\n»»»+\n/, function (wholematch, format, content) { + parseMetadataContents(content); + return '¨M'; + }); + + text = text.replace(/^\s*---+(\S*?)\n([\s\S]+?)\n---+\n/, function (wholematch, format, content) { + if (format) { + globals.metadata.format = format; + } + parseMetadataContents(content); + return '¨M'; + }); + + text = text.replace(/¨M/g, ''); + + text = globals.converter._dispatch('metadata.after', text, options, globals); + return text; +}); diff --git a/showdown/src/subParsers/outdent.js b/showdown/src/subParsers/outdent.js new file mode 100644 index 00000000..5e26714a --- /dev/null +++ b/showdown/src/subParsers/outdent.js @@ -0,0 +1,17 @@ +/** + * Remove one level of line-leading tabs or spaces + */ +showdown.subParser('outdent', function (text, options, globals) { + 'use strict'; + text = globals.converter._dispatch('outdent.before', text, options, globals); + + // attacklab: hack around Konqueror 3.5.4 bug: + // "----------bug".replace(/^-/g,"") == "bug" + text = text.replace(/^(\t|[ ]{1,4})/gm, '¨0'); // attacklab: g_tab_width + + // attacklab: clean up hack + text = text.replace(/¨0/g, ''); + + text = globals.converter._dispatch('outdent.after', text, options, globals); + return text; +}); diff --git a/showdown/src/subParsers/paragraphs.js b/showdown/src/subParsers/paragraphs.js new file mode 100644 index 00000000..dfb804d6 --- /dev/null +++ b/showdown/src/subParsers/paragraphs.js @@ -0,0 +1,70 @@ +/** + * + */ +showdown.subParser('paragraphs', function (text, options, globals) { + 'use strict'; + + text = globals.converter._dispatch('paragraphs.before', text, options, globals); + // Strip leading and trailing lines: + text = text.replace(/^\n+/g, ''); + text = text.replace(/\n+$/g, ''); + + var grafs = text.split(/\n{2,}/g), + grafsOut = [], + end = grafs.length; // Wrap

    tags + + for (var i = 0; i < end; i++) { + var str = grafs[i]; + // if this is an HTML marker, copy it + if (str.search(/¨(K|G)(\d+)\1/g) >= 0) { + grafsOut.push(str); + + // test for presence of characters to prevent empty lines being parsed + // as paragraphs (resulting in undesired extra empty paragraphs) + } else if (str.search(/\S/) >= 0) { + str = showdown.subParser('spanGamut')(str, options, globals); + str = str.replace(/^([ \t]*)/g, '

    '); + str += '

    '; + grafsOut.push(str); + } + } + + /** Unhashify HTML blocks */ + end = grafsOut.length; + for (i = 0; i < end; i++) { + var blockText = '', + grafsOutIt = grafsOut[i], + codeFlag = false; + // if this is a marker for an html block... + // use RegExp.test instead of string.search because of QML bug + while (/¨(K|G)(\d+)\1/.test(grafsOutIt)) { + var delim = RegExp.$1, + num = RegExp.$2; + + if (delim === 'K') { + blockText = globals.gHtmlBlocks[num]; + } else { + // we need to check if ghBlock is a false positive + if (codeFlag) { + // use encoded version of all text + blockText = showdown.subParser('encodeCode')(globals.ghCodeBlocks[num].text, options, globals); + } else { + blockText = globals.ghCodeBlocks[num].codeblock; + } + } + blockText = blockText.replace(/\$/g, '$$$$'); // Escape any dollar signs + + grafsOutIt = grafsOutIt.replace(/(\n\n)?¨(K|G)\d+\2(\n\n)?/, blockText); + // Check if grafsOutIt is a pre->code + if (/^]*>\s*]*>/.test(grafsOutIt)) { + codeFlag = true; + } + } + grafsOut[i] = grafsOutIt; + } + text = grafsOut.join('\n'); + // Strip leading and trailing lines: + text = text.replace(/^\n+/g, ''); + text = text.replace(/\n+$/g, ''); + return globals.converter._dispatch('paragraphs.after', text, options, globals); +}); diff --git a/showdown/src/subParsers/runExtension.js b/showdown/src/subParsers/runExtension.js new file mode 100644 index 00000000..e8d0263d --- /dev/null +++ b/showdown/src/subParsers/runExtension.js @@ -0,0 +1,20 @@ +/** + * Run extension + */ +showdown.subParser('runExtension', function (ext, text, options, globals) { + 'use strict'; + + if (ext.filter) { + text = ext.filter(text, globals.converter, options); + + } else if (ext.regex) { + // TODO remove this when old extension loading mechanism is deprecated + var re = ext.regex; + if (!(re instanceof RegExp)) { + re = new RegExp(re, 'g'); + } + text = text.replace(re, ext.replace); + } + + return text; +}); diff --git a/showdown/src/subParsers/spanGamut.js b/showdown/src/subParsers/spanGamut.js new file mode 100644 index 00000000..29891df3 --- /dev/null +++ b/showdown/src/subParsers/spanGamut.js @@ -0,0 +1,49 @@ +/** + * These are all the transformations that occur *within* block-level + * tags like paragraphs, headers, and list items. + */ +showdown.subParser('spanGamut', function (text, options, globals) { + 'use strict'; + + text = globals.converter._dispatch('spanGamut.before', text, options, globals); + text = showdown.subParser('codeSpans')(text, options, globals); + text = showdown.subParser('escapeSpecialCharsWithinTagAttributes')(text, options, globals); + text = showdown.subParser('encodeBackslashEscapes')(text, options, globals); + + // Process anchor and image tags. Images must come first, + // because ![foo][f] looks like an anchor. + text = showdown.subParser('images')(text, options, globals); + text = showdown.subParser('anchors')(text, options, globals); + + // Make links out of things like `` + // Must come after anchors, because you can use < and > + // delimiters in inline links like [this](). + text = showdown.subParser('autoLinks')(text, options, globals); + text = showdown.subParser('simplifiedAutoLinks')(text, options, globals); + text = showdown.subParser('emoji')(text, options, globals); + text = showdown.subParser('underline')(text, options, globals); + text = showdown.subParser('italicsAndBold')(text, options, globals); + text = showdown.subParser('strikethrough')(text, options, globals); + text = showdown.subParser('ellipsis')(text, options, globals); + + // we need to hash HTML tags inside spans + text = showdown.subParser('hashHTMLSpans')(text, options, globals); + + // now we encode amps and angles + text = showdown.subParser('encodeAmpsAndAngles')(text, options, globals); + + // Do hard breaks + if (options.simpleLineBreaks) { + // GFM style hard breaks + // only add line breaks if the text does not contain a block (special case for lists) + if (!/\n\n¨K/.test(text)) { + text = text.replace(/\n+/g, '
    \n'); + } + } else { + // Vanilla hard breaks + text = text.replace(/ +\n/g, '
    \n'); + } + + text = globals.converter._dispatch('spanGamut.after', text, options, globals); + return text; +}); diff --git a/showdown/src/subParsers/strikethrough.js b/showdown/src/subParsers/strikethrough.js new file mode 100644 index 00000000..4517c67f --- /dev/null +++ b/showdown/src/subParsers/strikethrough.js @@ -0,0 +1,18 @@ +showdown.subParser('strikethrough', function (text, options, globals) { + 'use strict'; + + function parseInside (txt) { + if (options.simplifiedAutoLink) { + txt = showdown.subParser('simplifiedAutoLinks')(txt, options, globals); + } + return '' + txt + ''; + } + + if (options.strikethrough) { + text = globals.converter._dispatch('strikethrough.before', text, options, globals); + text = text.replace(/(?:~){2}([\s\S]+?)(?:~){2}/g, function (wm, txt) { return parseInside(txt); }); + text = globals.converter._dispatch('strikethrough.after', text, options, globals); + } + + return text; +}); diff --git a/showdown/src/subParsers/stripLinkDefinitions.js b/showdown/src/subParsers/stripLinkDefinitions.js new file mode 100644 index 00000000..d6dc0734 --- /dev/null +++ b/showdown/src/subParsers/stripLinkDefinitions.js @@ -0,0 +1,58 @@ +/** + * Strips link definitions from text, stores the URLs and titles in + * hash references. + * Link defs are in the form: ^[id]: url "optional title" + */ +showdown.subParser('stripLinkDefinitions', function (text, options, globals) { + 'use strict'; + + var regex = /^ {0,3}\[([^\]]+)]:[ \t]*\n?[ \t]*\s]+)>?(?: =([*\d]+[A-Za-z%]{0,4})x([*\d]+[A-Za-z%]{0,4}))?[ \t]*\n?[ \t]*(?:(\n*)["|'(](.+?)["|')][ \t]*)?(?:\n+|(?=¨0))/gm, + base64Regex = /^ {0,3}\[([^\]]+)]:[ \t]*\n?[ \t]*?(?: =([*\d]+[A-Za-z%]{0,4})x([*\d]+[A-Za-z%]{0,4}))?[ \t]*\n?[ \t]*(?:(\n*)["|'(](.+?)["|')][ \t]*)?(?:\n\n|(?=¨0)|(?=\n\[))/gm; + + // attacklab: sentinel workarounds for lack of \A and \Z, safari\khtml bug + text += '¨0'; + + var replaceFunc = function (wholeMatch, linkId, url, width, height, blankLines, title) { + + // if there aren't two instances of linkId it must not be a reference link so back out + linkId = linkId.toLowerCase(); + if (text.toLowerCase().split(linkId).length - 1 < 2) { + return wholeMatch; + } + if (url.match(/^data:.+?\/.+?;base64,/)) { + // remove newlines + globals.gUrls[linkId] = url.replace(/\s/g, ''); + } else { + globals.gUrls[linkId] = showdown.subParser('encodeAmpsAndAngles')(url, options, globals); // Link IDs are case-insensitive + } + + if (blankLines) { + // Oops, found blank lines, so it's not a title. + // Put back the parenthetical statement we stole. + return blankLines + title; + + } else { + if (title) { + globals.gTitles[linkId] = title.replace(/"|'/g, '"'); + } + if (options.parseImgDimensions && width && height) { + globals.gDimensions[linkId] = { + width: width, + height: height + }; + } + } + // Completely remove the definition from the text + return ''; + }; + + // first we try to find base64 link references + text = text.replace(base64Regex, replaceFunc); + + text = text.replace(regex, replaceFunc); + + // attacklab: strip sentinel + text = text.replace(/¨0/, ''); + + return text; +}); diff --git a/showdown/src/subParsers/tables.js b/showdown/src/subParsers/tables.js new file mode 100644 index 00000000..1f3e9563 --- /dev/null +++ b/showdown/src/subParsers/tables.js @@ -0,0 +1,142 @@ +showdown.subParser('tables', function (text, options, globals) { + 'use strict'; + + if (!options.tables) { + return text; + } + + var tableRgx = /^ {0,3}\|?.+\|.+\n {0,3}\|?[ \t]*:?[ \t]*(?:[-=]){2,}[ \t]*:?[ \t]*\|[ \t]*:?[ \t]*(?:[-=]){2,}[\s\S]+?(?:\n\n|¨0)/gm, + //singeColTblRgx = /^ {0,3}\|.+\|\n {0,3}\|[ \t]*:?[ \t]*(?:[-=]){2,}[ \t]*:?[ \t]*\|[ \t]*\n(?: {0,3}\|.+\|\n)+(?:\n\n|¨0)/gm; + singeColTblRgx = /^ {0,3}\|.+\|[ \t]*\n {0,3}\|[ \t]*:?[ \t]*(?:[-=]){2,}[ \t]*:?[ \t]*\|[ \t]*\n( {0,3}\|.+\|[ \t]*\n)*(?:\n|¨0)/gm; + + function parseStyles (sLine) { + if (/^:[ \t]*--*$/.test(sLine)) { + return ' style="text-align:left;"'; + } else if (/^--*[ \t]*:[ \t]*$/.test(sLine)) { + return ' style="text-align:right;"'; + } else if (/^:[ \t]*--*[ \t]*:$/.test(sLine)) { + return ' style="text-align:center;"'; + } else { + return ''; + } + } + + function parseHeaders (header, style) { + var id = ''; + header = header.trim(); + // support both tablesHeaderId and tableHeaderId due to error in documentation so we don't break backwards compatibility + if (options.tablesHeaderId || options.tableHeaderId) { + id = ' id="' + header.replace(/ /g, '_').toLowerCase() + '"'; + } + header = showdown.subParser('spanGamut')(header, options, globals); + + return '' + header + '\n'; + } + + function parseCells (cell, style) { + var subText = showdown.subParser('spanGamut')(cell, options, globals); + return '' + subText + '\n'; + } + + function buildTable (headers, cells) { + var tb = '\n\n\n', + tblLgn = headers.length; + + for (var i = 0; i < tblLgn; ++i) { + tb += headers[i]; + } + tb += '\n\n\n'; + + for (i = 0; i < cells.length; ++i) { + tb += '\n'; + for (var ii = 0; ii < tblLgn; ++ii) { + tb += cells[i][ii]; + } + tb += '\n'; + } + tb += '\n
    \n'; + return tb; + } + + function parseTable (rawTable) { + var i, tableLines = rawTable.split('\n'); + + for (i = 0; i < tableLines.length; ++i) { + // strip wrong first and last column if wrapped tables are used + if (/^ {0,3}\|/.test(tableLines[i])) { + tableLines[i] = tableLines[i].replace(/^ {0,3}\|/, ''); + } + if (/\|[ \t]*$/.test(tableLines[i])) { + tableLines[i] = tableLines[i].replace(/\|[ \t]*$/, ''); + } + // parse code spans first, but we only support one line code spans + tableLines[i] = showdown.subParser('codeSpans')(tableLines[i], options, globals); + } + + var rawHeaders = tableLines[0].split('|').map(function (s) { return s.trim();}), + rawStyles = tableLines[1].split('|').map(function (s) { return s.trim();}), + rawCells = [], + headers = [], + styles = [], + cells = []; + + tableLines.shift(); + tableLines.shift(); + + for (i = 0; i < tableLines.length; ++i) { + if (tableLines[i].trim() === '') { + continue; + } + rawCells.push( + tableLines[i] + .split('|') + .map(function (s) { + return s.trim(); + }) + ); + } + + if (rawHeaders.length < rawStyles.length) { + return rawTable; + } + + for (i = 0; i < rawStyles.length; ++i) { + styles.push(parseStyles(rawStyles[i])); + } + + for (i = 0; i < rawHeaders.length; ++i) { + if (showdown.helper.isUndefined(styles[i])) { + styles[i] = ''; + } + headers.push(parseHeaders(rawHeaders[i], styles[i])); + } + + for (i = 0; i < rawCells.length; ++i) { + var row = []; + for (var ii = 0; ii < headers.length; ++ii) { + if (showdown.helper.isUndefined(rawCells[i][ii])) { + + } + row.push(parseCells(rawCells[i][ii], styles[ii])); + } + cells.push(row); + } + + return buildTable(headers, cells); + } + + text = globals.converter._dispatch('tables.before', text, options, globals); + + // find escaped pipe characters + text = text.replace(/\\(\|)/g, showdown.helper.escapeCharactersCallback); + + // parse multi column tables + text = text.replace(tableRgx, parseTable); + + // parse one column tables + text = text.replace(singeColTblRgx, parseTable); + + text = globals.converter._dispatch('tables.after', text, options, globals); + + return text; +}); diff --git a/showdown/src/subParsers/underline.js b/showdown/src/subParsers/underline.js new file mode 100644 index 00000000..43491a64 --- /dev/null +++ b/showdown/src/subParsers/underline.js @@ -0,0 +1,32 @@ +showdown.subParser('underline', function (text, options, globals) { + 'use strict'; + + if (!options.underline) { + return text; + } + + text = globals.converter._dispatch('underline.before', text, options, globals); + + if (options.literalMidWordUnderscores) { + text = text.replace(/\b___(\S[\s\S]*?)___\b/g, function (wm, txt) { + return '' + txt + ''; + }); + text = text.replace(/\b__(\S[\s\S]*?)__\b/g, function (wm, txt) { + return '' + txt + ''; + }); + } else { + text = text.replace(/___(\S[\s\S]*?)___/g, function (wm, m) { + return (/\S$/.test(m)) ? '' + m + '' : wm; + }); + text = text.replace(/__(\S[\s\S]*?)__/g, function (wm, m) { + return (/\S$/.test(m)) ? '' + m + '' : wm; + }); + } + + // escape remaining underscores to prevent them being parsed by italic and bold + text = text.replace(/(_)/g, showdown.helper.escapeCharactersCallback); + + text = globals.converter._dispatch('underline.after', text, options, globals); + + return text; +}); diff --git a/showdown/src/subParsers/unescapeSpecialChars.js b/showdown/src/subParsers/unescapeSpecialChars.js new file mode 100644 index 00000000..961e08b0 --- /dev/null +++ b/showdown/src/subParsers/unescapeSpecialChars.js @@ -0,0 +1,15 @@ +/** + * Swap back in all the special characters we've hidden. + */ +showdown.subParser('unescapeSpecialChars', function (text, options, globals) { + 'use strict'; + text = globals.converter._dispatch('unescapeSpecialChars.before', text, options, globals); + + text = text.replace(/¨E(\d+)E/g, function (wholeMatch, m1) { + var charCodeToReplace = parseInt(m1); + return String.fromCharCode(charCodeToReplace); + }); + + text = globals.converter._dispatch('unescapeSpecialChars.after', text, options, globals); + return text; +}); diff --git a/src/colors.ts b/src/colors.ts index a1fa873b..0c28cb36 100644 --- a/src/colors.ts +++ b/src/colors.ts @@ -1,4 +1,3 @@ -/* eslint-disable prefer-const */ /** * @license * colors.ts - Colors and schemes for huetiful-js. @@ -14,15 +13,14 @@ OF ANY KIND, either express or implied. See the License for the specific languag governing permissions and limitations under the License. */ -import tailwindHues from "./color-maps/swatches/tailwind.ts"; +import tailwindHues from './color-maps/swatches/tailwind.ts'; import type { SequentialScheme, DivergingScheme, QualitativeScheme, - HueMap, + TailwindColorFamilies, ScaleValues, ColorDistanceOptions, - ColorSpaces, ColorToken, HueColorSpaces, InterpolatorOptions, @@ -33,8 +31,8 @@ import type { PairedSchemeOptions } from './types'; -import * as filterBy from "./filterBy"; -import * as sortBy from "./sortBy"; +import * as filterBy from './filterBy'; +import * as sortBy from './sortBy'; import { discoverPalettes as nativeDiscoverPalettes, getFarthestHue as nativeMaxHue, @@ -71,20 +69,19 @@ import { getComplimentaryHue as nativeGetComplimentaryHue, colorDeficiency as nativeColorDeficiency, interpolator, - interpolateSpline as nativeInterpolatorSpline, -} from "./index"; + interpolateSpline as nativeInterpolatorSpline +} from './index'; -import { interpolatorConfig } from "./helpers"; +import { interpolatorConfig } from './helpers'; -class ColorArray extends Array { +class ColorArray { constructor(colors: ColorToken[]) { - super(); this['colors'] = colors; return this; } /** - * + * * Returns a spline based interpolator function with customizable interpolation methods (passed in as 'kind') and optional channel specific overrides.If a color has a falsy channel for example black has an undefined hue channel some interpolation methods may return NaN affecting the final result. * @param colorspace The colorspace to perform the color space in. Prefer uniform color spaces for better results such as Lch or Jch. * @param kind The type of the spline interpolation method. Default is basis. @@ -343,17 +340,13 @@ console.log(filterByDistance(sample, "yellow", 0.1)) filterByDistance( against: ColorToken, startDistance = 0.05, - endDistance?: number, - mode?: ColorSpaces, - weights?: [number, number, number, number] + endDistance?: number ): ColorArray { this['colors'] = filterBy.filterByDistance( this['colors'], against, startDistance, - endDistance, - mode, - weights + endDistance ); return this; } @@ -744,12 +737,8 @@ console.log(sortedDescending) */ // Todo: Add the mode param so that users can select mode to work with. The default is lch - sortByHue(order: 'asc' | 'desc', colorspace = 'jch'): ColorArray { - this['colors'] = sortBy.sortByHue( - this['colors'], - order, - colorspace as HueColorSpaces - ); + sortByHue(order: 'asc' | 'desc', colorspace: HueColorSpaces): ColorArray { + this['colors'] = sortBy.sortByHue(this['colors'], order, colorspace); return this; } @@ -1290,7 +1279,7 @@ function qualitative(scheme: QualitativeScheme): ColorToken[] { * * A wrapper function for the default Tailwind palette. If called with both parameters it return the hex code at the specified shade and value. Else, if called with the shade parameter as "all" it will return all colors from the shades in the palette map at the specified value (if value is undefined it will default to "500"). When called with the shade parameter only it will return all the colors from 100 to 900 of the specified shade. * @param shade Any shade in the default TailwindCSS palette e.g amber,blue. - * @param val Any value from 100 to 900 in increments of 100 e.g "200". + * @param value Any value from 100 to 900 in increments of 100 e.g "200". * @returns color Returns a hex code string or array of hex codes depending on how the function is called. * @example * @@ -1326,26 +1315,27 @@ console.log(red100) // #fee2e2 */ function colors( - shade: keyof HueMap | string, - val?: ScaleValues + shade: TailwindColorFamilies | 'all', + value?: ScaleValues ): ColorToken | ColorToken[] { const { keys } = Object; const defaultHue = 'all'; const hueKeys = keys(tailwindHues); + // @ts-ignore shade = shade.toLowerCase(); // First do an AND check on hue and val params. If true return the hue at the specified value. // If only the hue is defined return the whole array of hex codes for that color. // If only the value is defined return that color value for every hue. // @ts-ignore if (shade === defaultHue) { - return hueKeys.map((color) => tailwindHues[color][val || '500']); - } else if (hueKeys.some((hue) => hue === shade) && val) { - return tailwindHues[shade][val]; - } else if (shade && typeof val == 'undefined') { + return hueKeys.map((color) => tailwindHues[color][value || '500']); + } else if (hueKeys.some((hue) => hue === shade) && value) { + return tailwindHues[shade][value]; + } else if (shade && typeof value == 'undefined') { const keyVals = keys(tailwindHues[shade]); return keyVals.map((key) => tailwindHues[shade][key]); - } else if (typeof shade && typeof val == 'undefined') { + } else if (typeof shade && typeof value == 'undefined') { throw Error(`Both shade and value cannot be undefined`); } } @@ -1381,7 +1371,7 @@ console.log(red('900')); * */ -function tailwindColors(shade: keyof HueMap) { +function tailwindColors(shade: keyof TailwindColorFamilies) { return (val?: ScaleValues): string | string[] => { // This is a curried func that takes in the shade and returns a function that takes in a value from 100 thru 900 // @ts-ignore @@ -1390,11 +1380,13 @@ function tailwindColors(shade: keyof HueMap) { // We check if the shade is a valid Tailwind shade if not we return pure black. let targetHue: object; - if (keys(tailwindHues).indexOf(shade) != -1) { + if (keys(tailwindHues).indexOf(shade as string) != -1) { targetHue = tailwindHues[shade]; } else { throw Error( - `${shade} is not a valid shade in the default Tailwind palette` + `${ + shade as string + } is not a valid shade in the default Tailwind palette` ); } @@ -1474,8 +1466,11 @@ class Color { } via(origin: ColorToken, t?: number, options?: typeof interpolatorConfig) { - const result = - interpolator([origin, this['_color']], this['colorspace'], options); + const result = interpolator( + [origin, this['_color']], + this['colorspace'], + options + ); return nativeToHex(result(t)); } @@ -1544,7 +1539,7 @@ class Color { this['_color'] = setLuminance(this['_color'], this['_color']); // @ts-ignore return this; - } + } return getLuminance(this['_color']); } @@ -1642,6 +1637,11 @@ console.log(protanopia({ h: 20, w: 50, b: 30, mode: 'hwb' })) } } +/** + * Wrapper function over the Color class that returns a new Color method chain. + * @param color The color token to bind. + * @returns A new Color class with all the utilities that take a single color as the first parameter bound to its prototype. + */ function color(color: ColorToken) { return new Color(color); } @@ -1654,6 +1654,6 @@ export { tailwindColors, ColorArray, load, - Color as IColor, - color, + Color, + color }; diff --git a/src/converters.ts b/src/converters.ts index 5bec95e7..b2c56e9e 100644 --- a/src/converters.ts +++ b/src/converters.ts @@ -1,4 +1,5 @@ -/** +/* eslint-disable no-ternary */ +/* * @license * converters.ts - Converter functions for huetiful-js. * Contains parts of chroma.js released under the same license. @@ -21,17 +22,17 @@ import { modeLch, modeLch65, modeLchuv, - modeOklch + modeOklch, + formatHex } from 'culori/fn'; import type { ColorTuple, - ColorSpaces, + Colorspaces, ColorToken, UniformColorSpaces } from './types'; import 'culori/all'; -import 'culori/css'; -import { formatHex8, formatHex, colorsNamed } from 'culori/fn'; +import { formatHex8, colorsNamed } from 'culori/fn'; import { getModeChannel } from './helpers'; /** @@ -39,7 +40,7 @@ import { getModeChannel } from './helpers'; * @param colorspace The mode converter to return. * @returns The converter function in the mode colorspace. */ -function ucsConverter(colorspace:UniformColorSpaces) { +function ucsConverter(colorspace: UniformColorSpaces) { const ucsDefinitions = { jch: modeJch, lch: modeLch, @@ -67,78 +68,67 @@ console.log(toHex({ l: 50, c: 31, h: 100, mode: "lch" })) */ function toHex(color: ColorToken): string { // the result to return at the end of the function - let src = {}; - + var output; // if its of type string and not a CSS named color then its probably hex so we don't convert it - if ( - typeof color === 'string' && - !Object.keys(colorsNamed).some((el) => el === color.toLowerCase()) - ) { - return color; + if (typeof color === 'string') { + // @ts-ignore + if (!Object.keys(colorsNamed).some((el) => el === color.toLowerCase())) { + return color; + } + return formatHex(color); + } else if (typeof color === 'boolean') { + return (color !== true && '#ffffff') || '#000000'; + } else if (typeof color === 'number') { + output = num2rgb(color, true) as string; } else { - // If our color is an array - if (Array.isArray(color)) { - // capture the mode - const mode: string = color[0]; - - // set mode to a substring which trims the string at an index that is the reslt of length - 3 - - // Gets the channel key from the passed in mode - // Store the channels excluding alpha - const channels = (colorArr: [string, number, number, number?]) => { - // Remove the mode element - colorArr.shift(); - - return (colorArr.length === 4 && colorArr.slice(0, 3)) || colorArr; - }; - - /** - * Returns a color object with normalized RGB values or just maps value to keys and return the resultant object - * @param src The object to manipulate - * @param mode The color space. - * @param colorArr The array of the color's channel values excluding the alpha/opacity channel - * @returns A color object - */ - const channelMapper = ( - src = {}, - mode: string, - colorArr: [number, number, number] - ): number[] => { - src['mode'] = mode; - // If our mode is rgb... - if (src['mode'] === 'rgb') { - // if our rgb values are [0,255] we normalize them to [0,1] - // for Culori to make sense of the channel values else it defaults o white - if (colorArr.some((ch) => Math.abs(ch) > 1)) { - colorArr.map( - (ch, key) => (src[getModeChannel(mode, key)] = ch / 255) - ); - } - } else { - colorArr.map((ch, key) => (src[getModeChannel(mode, key)] = ch)); - } + // Get the mode variable + const mode = Array.isArray(color) + ? (color[0] as ColorTuple[0]) + : (color['mode'] as Colorspaces); + const alpha = + Array.isArray(color) && color.length === 5 + ? (color[color.length - 1] as ColorTuple[4]) + : (color['alpha'] as number); + + var channelKeys = getModeChannel(mode).split(''); + var colorTupleToObj = (colorTuple: number[]) => { + var channels = colorTuple.slice(0, 3); + + if ( + ['rgb', 'lrgb'].indexOf(mode) !== -1 && + channels.some((ch: number) => 1 < Math.abs(ch)) + ) { // @ts-ignore - return src; + channels = channels.map((ch) => ch / 255); + } + + let output = { + [channelKeys[0]]: channels[0], + [channelKeys[1]]: channels[1], + [channelKeys[2]]: channels[2], + mode: mode, + alpha: alpha }; - src['alpha'] = color[4] || 1; - // @ts-ignore - src = channelMapper(src, getModeChannel(mode), channels(src, color)); - // @ts-ignore - src = (src['alpha'] < 1 && formatHex8(src)) || formatHex(src); - } - // if its a number use num2rgb - else if (typeof color === 'number') { - src = num2rgb(color, true); - } else { - // @ts-ignore - src = formatHex8(color); + return output; + }; + if (mode) { + // coerce color tuple to object + if (Array.isArray(color)) { + // @ts-ignore + output = colorTupleToObj(color.slice(1)); + } else { + output = colorTupleToObj( + toColorTuple(color, mode as Colorspaces).slice(1) as number[] + ); + } } - // @ts-ignore - return src; } + + return (output['alpha'] < 1 && formatHex8(output)) || formatHex(output); } +// Ported from chroma-js with slight modifications /** * * Returns the RGB color equivalent of any number between 0 and 16,777,215. @@ -164,8 +154,8 @@ function num2rgb(num: number, hex = false): ColorToken { b: b / 255, mode: 'lrgb' }; - - return (hex && toHex(output)) || output; + // @ts-ignore + return (hex && formatHex(output)) || output; } else { throw Error('unknown num color: ' + num); } @@ -244,13 +234,15 @@ function temp2Color(kelvin: number, hex = false): ColorToken { b: b / 255, mode: 'rgb' }; - return (hex && toHex(result)) || result; + + // @ts-ignore + return (hex && formatHex(result)) || result; } /** * - * Returns an array of channel values in the mode color space. - * @param color Any recognizable color token. + * Returns an array of channel values in the mode color space. It does not mutate the values of the passed in color token. + * @param color Expects the color to be in hexadecimal represantation or as a plain color object. * @param mode The mode color space to return channel values for * @returns An array of channel values with the colorspace as first element and the alpha channel if its explicitly defined in the passed in color. * @example @@ -268,25 +260,16 @@ console.log(toColorTuple(rgbColor,'rgb')); */ -function toColorTuple(color: ColorToken, mode: ColorSpaces) { +function toColorTuple(color: string | object, mode: Colorspaces) { // @ts-ignore const colorObject: ColorToken = converter(mode)(color); - if (toHex(color)) { - // @ts-ignore + var arr = Object.keys(colorObject) + .filter((ch) => ch !== 'mode') + .map((key) => colorObject[key]); + arr.unshift(mode); - const arr: ColorTuple = Object.keys(colorObject) - .filter((ch) => ch !== 'mode') - .map((key) => colorObject[key]); - arr.unshift(mode); - return arr; - } else { - throw Error( - `${color} is not a valid color token. Try something like 'purple' or ['lch',85,60,143.5]` - ); - - // throw Error(`mode is not a valid color space`) - } + return arr; } -export { ucsConverter, num2rgb, rgb2num, temp2Color, toColorTuple, toHex }; +export { num2rgb, rgb2num, temp2Color, toColorTuple, ucsConverter, toHex }; diff --git a/src/filterBy.ts b/src/filterBy.ts index 40d3de3c..3d34e697 100644 --- a/src/filterBy.ts +++ b/src/filterBy.ts @@ -11,12 +11,11 @@ OF ANY KIND, either express or implied. See the License for the specific languag governing permissions and limitations under the License. */ -import { differenceEuclidean } from 'culori/fn'; +import { differenceHyab } from 'culori/fn'; import { toHex } from './converters'; -import type { ColorToken, ColorSpaces, HueColorSpaces, Factor } from './types'; +import type { ColorToken, HueColorSpaces, Factor } from './types'; import { getLuminance, getContrast, getChannel } from './utils'; import { - checkArg, matchChromaChannel, matchLightnessChannel, filteredArr, @@ -38,7 +37,7 @@ import { function baseFilterBy( factor: Factor, cb: (color: ColorToken) => number, - colors: Array | object, + collection: ColorToken[] | object | object, start: string | number, end?: number, colorspace?: HueColorSpaces @@ -57,7 +56,7 @@ function baseFilterBy( (typeof start === 'string' && sym && normalVal.toString().concat(sym)) || start; end = normalize(end, obj[factor](colorspace)); - return filteredArr(factor, cb)(colors as Array, start, end); + return filteredArr(factor, cb)(collection as Array, start, end); } /** @@ -90,7 +89,7 @@ console.log(filterByContrast(sample, 'green', '>=3')) */ function filterBySaturation( - colors: ColorToken[], + collection: ColorToken[] | object, startSaturation = 0.05, endSaturation = 1, colorspace?: HueColorSpaces @@ -102,7 +101,7 @@ function filterBySaturation( return baseFilterBy( factor, getChannel(modeChannel), - colors, + collection, startSaturation, endSaturation, colorspace @@ -139,14 +138,14 @@ filterByLuminance(sample, 0.4, 0.9) */ function filterByLuminance( - colors: ColorToken[], + collection: ColorToken[] | object, startLuminance = 0.05, endLuminance = 1 ): ColorToken[] { return baseFilterBy( 'luminance', getLuminance, - colors, + collection, startLuminance, endLuminance ); @@ -183,7 +182,7 @@ filterByLightness(sample, 20, 80) */ function filterByLightness( - colors: ColorToken[], + collection: ColorToken[] | object, startLightness = 5, endLightness = 100, colorspace?: HueColorSpaces @@ -193,7 +192,7 @@ function filterByLightness( return baseFilterBy( factor, getChannel(matchLightnessChannel(colorspace)), - colors, + collection, startLightness, endLightness, colorspace @@ -229,7 +228,7 @@ filterByHue(sample, 20, 80) */ function filterByHue( - colors: ColorToken[], + collection: ColorToken[] | object, startHue = 0, endHue = 360, colorspace?: HueColorSpaces @@ -237,7 +236,7 @@ function filterByHue( return baseFilterBy( 'hue', getChannel(`${colorspace}.h`), - colors, + collection, startHue, endHue ); @@ -245,12 +244,10 @@ function filterByHue( /** * - * Returns an array of colors with the specified distance range. The distance is tested against a comparison color (the 'against' param) and the specified distance ranges. + * Returns an array of colors with the specified distance range. The distance is tested against a comparison color (the 'against' param) and the specified distance ranges. Uses the differenceHyab metric for calculating the distances. * @param colors The array of colors to filter. * @param startDistance The minimum end of the distance range. * @param endDistance The maximum end of the distance range. - * @param weights The weighting values to pass to the Euclidean function. Default is [1,1,1,0]. - * @param colorspace The color space to calculate the distance in . * @returns Array of filtered colors. * @example * import { filterByDistance } from 'huetiful-js' @@ -271,23 +268,17 @@ console.log(filterByDistance(sample, "yellow", 0.1)) */ function filterByDistance( - colors: ColorToken[], + collection: ColorToken[] | object, against: ColorToken, startDistance = 0.05, - endDistance?: number, - colorspace?: ColorSpaces, - weights?: [number, number, number, number] + endDistance?: number ): ColorToken[] { - const cb = (against) => (color) => - differenceEuclidean( - checkArg(colorspace, 'lchuv') as typeof colorspace, - checkArg(weights, [1, 1, 1, 0]) as typeof weights - )(against, color); + const cb = (against) => (color) => differenceHyab()(against, color); return baseFilterBy( 'distance', cb(toHex(against)), - colors, + collection, startDistance, endDistance ); @@ -324,7 +315,7 @@ console.log(filterByContrast(sample, 'green', '>=3')) */ function filterByContrast( - colors: ColorToken[], + collection: ColorToken[] | object, against: ColorToken, startContrast = 1, endContrast = 21 @@ -334,7 +325,7 @@ function filterByContrast( return baseFilterBy( 'contrast', cb(against), - colors, + collection, startContrast, endContrast ); diff --git a/src/generators.ts b/src/generators.ts index b751cbf8..a5c84415 100644 --- a/src/generators.ts +++ b/src/generators.ts @@ -50,8 +50,7 @@ import { matchChromaChannel, matchLightnessChannel, max, - min, - normalize + min } from './helpers'; import { toHex, ucsConverter } from './converters'; @@ -283,55 +282,45 @@ function hueShift( (start2: number, end2: number) => ((n - start1) / (end1 - start1)) * (end2 - start2) + start2; - color = ucsConverter(colorspace)(toHex(color)); + color = ucsConverter(colorspace)(color as string); let { - samples: samples, + samples: iterations, hueStep, minLightness, - maxLightness - // easingFunc + maxLightness, + easingFunc } = options || {}; - const l = matchLightnessChannel(colorspace).split('.')[1]; + const [l, c] = [ + matchLightnessChannel(colorspace).split('.')[1], + matchChromaChannel(colorspace).split('.')[1] + ]; // Pass default values in case the options object is overridden - // easingFunc = checkArg(easingFunc, easingSmoothstep) as typeof easingFunc - samples = (checkArg(samples, 6) as number) + 1; + easingFunc = checkArg(easingFunc, easingSmoothstep) as typeof easingFunc; + iterations = (checkArg(iterations, 6) as number) + 1; hueStep = checkArg(hueStep, 5) as number; - minLightness = normalize( - checkArg(minLightness, 10) as number, - matchLightnessChannel(colorspace) - ); - maxLightness = normalize( - checkArg(maxLightness, 90) as number, - matchLightnessChannel(colorspace) - ); + (minLightness = checkArg(minLightness, 10) as number), + (maxLightness = checkArg(maxLightness, 90) as number); // Pass in default values if any of the opts is undefined const palette: ColorToken[] = [color]; - // Maximum number of iterations possible. //Each iteration add a darker shade to the start of the array and a lighter tint to the end. - for (let i = 1; i < samples; i++) { + for (let i = 1; i < iterations; i++) { //adjustHue checks hue values are clamped. // Here we use lightnessMapper to calculate our lightness values which takes a number that exists in range [0,1]. const [colorShiftDown, colorShiftUp] = [ { - l: lightnessMapper(i)( - normalize(0.1, matchLightnessChannel(colorspace)), - samples - )(color[l], minLightness), - c: color['c'], - h: adjustHue(color['h'] - hueStep * i), + [l]: lightnessMapper(i)(0.1, iterations)(color[l], minLightness), + [c]: color[c], + h: adjustHue(color['h'] - hueStep * (i * easingFunc(i))), mode: colorspace }, { - l: lightnessMapper(i)( - normalize(0.15, matchLightnessChannel(colorspace)), - samples - )(color[l], maxLightness), - c: color['c'], - h: adjustHue(color['h'] + hueStep * i), + [l]: lightnessMapper(i)(0.15, iterations)(color[l], maxLightness), + [c]: color[c], + h: adjustHue(color['h'] + hueStep * (i * easingFunc(i))), mode: colorspace } ]; diff --git a/src/helpers.ts b/src/helpers.ts index e0935ed8..56760108 100644 --- a/src/helpers.ts +++ b/src/helpers.ts @@ -1,6 +1,6 @@ /* eslint-disable no-ternary */ /** - * @internal + * @preserve * @license * helpers.ts - Helper functions for huetiful-js. * Contains colors from TailwindCSS released under the MIT permissive licence. @@ -23,7 +23,7 @@ import type { HueColorSpaces, Order, Options, - ColorSpaces + Colorspaces } from './types'; import modeRanges from './color-maps/samples/modeRanges'; @@ -86,7 +86,7 @@ console.log(getModeChannel("okhsl", 2)); // l */ -function getModeChannel(colorspace: ColorSpaces | string, index?: number) { +function getModeChannel(colorspace: Colorspaces | string, index?: number) { const result = colorspace.substring(colorspace.length - 3); return (index && result.charAt(index)) || result; @@ -118,7 +118,7 @@ function expressionParser( const [mode, channel] = modeChannel.split('.'); // @ts-ignore - color = ucsConverter(mode)(color); + color = ucsConverter(mode.toString().toLowerCase())(color); const cb = (value: string) => parseFloat(value); // Match an operator against the first truthy case and perform the relevant math operation @@ -161,8 +161,10 @@ function matchChromaChannel(colorspace: HueColorSpaces | string): string { // Matches any string with c or s colorspace = checkArg(colorspace, 'jch') as HueColorSpaces; const reChroma = /(s|c)/i; + // @ts-ignore const ch = reChroma.exec(colorspace)['0']; + // @ts-ignore if (reChroma.test(colorspace)) { return `${colorspace}.${ch}`; } else { @@ -191,8 +193,10 @@ function matchLightnessChannel(colorspace: HueColorSpaces | string): string { // Matches any string with c or s colorspace = checkArg(colorspace, 'jch') as HueColorSpaces; const reLightness = /(j|l)/i; + // @ts-ignore const ch = reLightness.exec(colorspace)['0']; + // @ts-ignore if (reLightness.test(colorspace)) { // @ts-ignore return `${colorspace}.${ch}`; @@ -353,7 +357,7 @@ function normalize(value: number, modeChannel: string): number { if (!range) { if (inRange(value, 0, 1)) { value = end * value; - } else if (inRange(value, 1, 100)) { + } else if (inRange(value, 1, 150)) { value = end * (value / 100); } else { throw Error( @@ -450,11 +454,11 @@ function colorObjArr(factor: Factor, callback) { * @param colors The array or object of colors to iterate over. If an object is passed, its values are expected to be valid color tokens. */ return ( - colors: ColorToken[] | object + collection: ColorToken[] | object | object ): Array<{ factor: Factor; color: ColorToken }> => { const cb = colorObj(factor, callback); // @ts-ignore - return Object.keys(colors).map((color) => cb(colors[color])); + return Object.keys(collection).map((color) => cb(colors[color])); }; } @@ -515,12 +519,6 @@ function max(array: number[]): number { ); } - - - - - - /** * @internal * Gets the digits in the expression string @@ -528,12 +526,11 @@ function max(array: number[]): number { * @returns The matched digits, if any, as a string. */ function matchDigits(s: string): string { - s = s.toString() + s = s.toString(); var reDigits = /[0-9]*\.?[0-9]+/; - return reDigits.test(s) && reDigits.exec(s)['0'] || undefined + return (reDigits.test(s) && reDigits.exec(s)['0']) || undefined; } - /** * @internal * Matches the comparison symbols used in the expression string. @@ -544,7 +541,7 @@ function matchComparator(s: string): string { s = s.toString(); var reComparator = /^(>=|<=|<|>)/; - return reComparator.test(s) && (reComparator.exec(s)['0']) || undefined + return (reComparator.test(s) && reComparator.exec(s)['0']) || undefined; } /** @@ -560,9 +557,9 @@ function sortedArr( order: Order, colorObj = false ) { - return (colors: ColorToken[]) => { + return (collection: ColorToken[] | object) => { const results: ColorToken[] | Array<{ factor: number; color: ColorToken }> = - colorObjArr(factor, callback)(colors); + colorObjArr(factor, callback)(collection); // Assign the value of colorObj to results variable // Sort the array using our customSort helper function @@ -587,7 +584,7 @@ function sortedArr( */ function filteredArr(factor: Factor, cb?: callback) { return ( - colors: ColorToken[], + collection: ColorToken[] | object, start: number | string, end?: number ): ColorToken[] => { @@ -597,7 +594,7 @@ function filteredArr(factor: Factor, cb?: callback) { result = colorObjArr( factor, cb - )(colors) + )(collection) .filter((color) => inRange(color[factor], start, end)) .map((color) => color['color']); @@ -614,7 +611,7 @@ function filteredArr(factor: Factor, cb?: callback) { return colorObjArr( factor, cb - )(colors) + )(collection) .filter((el) => test(el[factor], parseFloat(val))) .map((el) => el['color']); }; @@ -666,5 +663,6 @@ export { checkArg, getModeChannel, interpolatorConfig, - matchComparator,matchDigits + matchComparator, + matchDigits }; diff --git a/src/sortBy.ts b/src/sortBy.ts index e8565bb5..fb549fc7 100644 --- a/src/sortBy.ts +++ b/src/sortBy.ts @@ -14,7 +14,7 @@ governing permissions and limitations under the License. import type { Factor, ColorToken, - ColorSpaces, + Colorspaces, ColorDistanceOptions, HueColorSpaces, callback, @@ -24,20 +24,18 @@ import { checkArg, sortedArr, matchLightnessChannel, - matchChromaChannel, -} from "./helpers"; -import { wcagContrast, differenceEuclidean } from "culori/fn"; -import { getLuminance, getChannel } from "./utils"; - - + matchChromaChannel +} from './helpers'; +import { wcagContrast, differenceEuclidean } from 'culori/fn'; +import { getLuminance, getChannel } from './utils'; function baseSortBy( factor: Factor, cb: callback, order: Order, - colors: ColorToken[] + collection: ColorToken[] | object ) { - return sortedArr(factor, cb, order)(colors); + return sortedArr(factor, cb, order)(collection); } /** @@ -89,7 +87,7 @@ console.log(sortedDescending) */ function sortBySaturation( - colors: ColorToken[], + collection: ColorToken[] | object, order: 'asc' | 'desc', mode?: HueColorSpaces ): ColorToken[] { @@ -97,7 +95,7 @@ function sortBySaturation( 'saturation', getChannel(matchChromaChannel(mode)), order, - colors + collection ); } @@ -151,10 +149,10 @@ console.log(sortedDescending) */ function sortByLuminance( - colors: ColorToken[], + collection: ColorToken[] | object, order: 'asc' | 'desc' ): ColorToken[] { - return baseSortBy('luminance', getLuminance, order, colors); + return baseSortBy('luminance', getLuminance, order, collection); } /** @@ -207,7 +205,7 @@ sortByLightness(sample,'desc') */ // For lightness use a different color space function sortByLightness( - colors: ColorToken[], + collection: ColorToken[] | object, order?: Order, colorspace?: HueColorSpaces ): ColorToken[] { @@ -215,7 +213,7 @@ function sortByLightness( 'lightness', getChannel(matchLightnessChannel(colorspace)), order, - colors + collection ); } @@ -268,7 +266,7 @@ console.log(sortedDescending) // Todo: Add the mode param so that users can select mode to work with. The default is lch function sortByHue( - colors: ColorToken[], + collection: ColorToken[] | object, order?: Order, colorspace?: HueColorSpaces ): ColorToken[] { @@ -279,7 +277,7 @@ function sortByHue( 'lightness', getChannel(`${checkArg(colorspace, 'jch')}.h`), order, - colors + collection ) ); } @@ -304,14 +302,14 @@ console.log(sortByContrast(sample, 'yellow', 'desc')) */ function sortByContrast( - colors: ColorToken[], + collection: ColorToken[] | object, against: ColorToken, order?: Order ): ColorToken[] { // @ts-ignore const cb = (against: ColorToken) => (color: ColorToken) => wcagContrast(color as string, against as string); - return baseSortBy('contrast', cb(against), order, colors); + return baseSortBy('contrast', cb(against), order, collection); } /** @@ -346,14 +344,14 @@ console.log( */ function sortByDistance( - colors: ColorToken[], + collection: ColorToken[] | object, against: ColorToken, order?: 'asc' | 'desc', options?: ColorDistanceOptions ): ColorToken[] { var { mode, weights } = options || {}; - const cb = (against: string, mode: ColorSpaces) => (color: string) => { + const cb = (against: string, mode: Colorspaces) => (color: string) => { // @ts-ignore return differenceEuclidean( checkArg(mode, 'lchuv') as typeof mode, @@ -365,7 +363,7 @@ function sortByDistance( 'contrast', cb(against as string, checkArg(mode, 'lchuv') as typeof mode), order, - colors + collection ); } diff --git a/src/types.d.ts b/src/types.d.ts index a1dd170a..9c8e51a4 100644 --- a/src/types.d.ts +++ b/src/types.d.ts @@ -1,7 +1,22 @@ -export type UniformColorSpaces = 'lch' | 'jch'; +/* + * @preserve + * @license + * types.d.ts - Type declarations for huetiful-js. + * Contains colors from TailwindCSS released under the MIT permissive licence. +Copyright 2023 Dean Tarisai. +This file is licensed to you under the Apache License, Version 2.0 (the 'License'); +you may not use this file except in compliance with the License. You may obtain a copy +of the License at http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, software distributed under +the License is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS +OF ANY KIND, either express or implied. See the License for the specific language +governing permissions and limitations under the License. +*/ + +// Color token types export type ColorTuple = [string, number, number, number, number?]; -export type ColorObject = { mode: ColorSpaces; alpha?: number }; +export type ColorObject = { mode: Colorspaces; alpha?: number }; export type ColorOptions = { alpha?: number; lightness?: number; @@ -9,7 +24,6 @@ export type ColorOptions = { colorspace?: HueColorSpaces; luminance?: number; saturation?: number; - illuminant?: 'D50' | 'D65'; lightMode?: ColorToken; darkMode?: ColorToken; @@ -19,7 +33,7 @@ export type ColorOptions = { }; export type ColorDistanceOptions = { weights?: [number, number, number, number]; - mode?: ColorSpaces; + mode?: Colorspaces; }; /** @@ -112,13 +126,6 @@ type Options = { maxLightness?: number; }; -type ViewingConditions = { - adaptingLuminance?: number; - backgroundLuminance?: number; - discounting?: boolean; - surroundType?: 'dim' | 'dark' | 'average'; - whitePoint?: Illuminant; -}; export type PairedSchemeOptions = Omit< Options, 'earthtones' | 'maxLightness' | 'minLightness' @@ -221,46 +228,39 @@ type FactorMapper = ( colorObj?: boolean ) => (colors: ColorToken[]) => ColorToken[]; -export type ColorSpaces = +export type UniformColorSpaces = + | 'lch' + | 'jch' + | 'dlch' + | 'lch' + | 'lch65' + | 'lchuv' + | 'oklch'; +export type Colorspaces = | 'a98' | 'cubehelix' | 'dlab' - | 'dlch' - | 'hsi' - | 'hsl' - | 'hsv' - | 'hwb' | 'jab' - | 'jch' | 'lab' | 'lab65' - | 'lch' - | 'lch65' - | 'lchuv' | 'lrgb' | 'luv' - | 'okhsl' - | 'okhsv' | 'oklab' - | 'rgb'; + | 'rgb' + | HueColorSpaces; export type HueColorSpaces = - | 'jch' + | UniformColorSpaces | 'hsl' | 'hsv' | 'hsi' - | 'oklch' - | 'lch' | 'hwb' | 'okhsl' - | 'okhsv' - | 'lch65' - | 'lchuv' - | 'dlch'; + | 'okhsv'; export type ScaleValues = - | '100' | '50' + | '100' | '200' | '300' | '400' @@ -270,265 +270,24 @@ export type ScaleValues = | '800' | '900'; -export type HueMap = { - indigo: { - '50': string; - '100': string; - '200': string; - '300': string; - '400': string; - '500': string; - '600': string; - '700': string; - '800': string; - '900': string; - }; - gray: { - '50': string; - '100': string; - '200': string; - '300': string; - '400': string; - '500': string; - '600': string; - '700': string; - '800': string; - '900': string; - }; - - zinc: { - '50': string; - '100': string; - '200': string; - '300': string; - '400': string; - '500': string; - '600': string; - '700': string; - '800': string; - '900': string; - }; - - neutral: { - '50': string; - '100': string; - '200': string; - '300': string; - '400': string; - '500': string; - '600': string; - '700': string; - '800': string; - '900': string; - }; - - stone: { - '50': string; - '100': string; - '200': string; - '300': string; - '400': string; - '500': string; - '600': string; - '700': string; - '800': string; - '900': string; - }; - - red: { - '50': string; - '100': string; - '200': string; - '300': string; - '400': string; - '500': string; - '600': string; - '700': string; - '800': string; - '900': string; - }; - - orange: { - '50': string; - '100': string; - '200': string; - '300': string; - '400': string; - '500': string; - '600': string; - '700': string; - '800': string; - '900': string; - }; - - amber: { - '50': string; - '100': string; - '200': string; - '300': string; - '400': string; - '500': string; - '600': string; - '700': string; - '800': string; - '900': string; - }; - - yellow: { - '50': string; - '100': string; - '200': string; - '300': string; - '400': string; - '500': string; - '600': string; - '700': string; - '800': string; - '900': string; - }; - - lime: { - '50': string; - '100': string; - '200': string; - '300': string; - '400': string; - '500': string; - '600': string; - '700': string; - '800': string; - '900': string; - }; - - green: { - '50': string; - '100': string; - '200': string; - '300': string; - '400': string; - '500': string; - '600': string; - '700': string; - '800': string; - '900': string; - }; - - emerald: { - '50': string; - '100': string; - '200': string; - '300': string; - '400': string; - '500': string; - '600': string; - '700': string; - '800': string; - '900': string; - }; - - teal: { - '50': string; - '100': string; - '200': string; - '300': string; - '400': string; - '500': string; - '600': string; - '700': string; - '800': string; - '900': string; - }; - - sky: { - '50': string; - '100': string; - '200': string; - '300': string; - '400': string; - '500': string; - '600': string; - '700': string; - '800': string; - '900': string; - }; - - blue: { - '50': string; - '100': string; - '200': string; - '300': string; - '400': string; - '500': string; - '600': string; - '700': string; - '800': string; - '900': string; - }; - - violet: { - '50': string; - '100': string; - '200': string; - '300': string; - '400': string; - '500': string; - '600': string; - '700': string; - '800': string; - '900': string; - }; - - purple: { - '50': string; - '100': string; - '200': string; - '300': string; - '400': string; - '500': string; - '600': string; - '700': string; - '800': string; - '900': string; - }; - - fuchsia: { - '50': string; - '100': string; - '200': string; - '300': string; - '400': string; - '500': string; - '600': string; - '700': string; - '800': string; - '900': string; - }; - - pink: { - '50': string; - '100': string; - '200': string; - '300': string; - '400': string; - '500': string; - '600': string; - '700': string; - '800': string; - '900': string; - }; - - rose: { - '50': string; - '100': string; - '200': string; - '300': string; - '400': string; - '500': string; - '600': string; - '700': string; - '800': string; - '900': string; - }; -}; - -type ColorTemp = 'warm' | 'cool' | 'daylight' | 'incadescent' | 'fluorescent'; +export type TailwindColorFamilies = + | 'indigo' + | 'gray' + | 'zinc' + | 'neutral' + | 'stone' + | 'red' + | 'orange' + | 'amber' + | 'yellow' + | 'lime' + | 'green' + | 'emerald' + | 'teal' + | 'sky' + | 'blue' + | 'violet' + | 'purple' + | 'fuchsia' + | 'pink' + | 'rose'; diff --git a/src/utils.ts b/src/utils.ts index 7658b512..fff09386 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -57,7 +57,7 @@ function getHueFamily(color: ColorToken, mode?: HueColorSpaces): HueFamily { return Object.keys(hueTempMap) .map((hue) => { // eslint-disable-next-line @typescript-eslint/no-unused-vars - + // @ts-ignore var [hueVals, minVal, maxVal] = [ customConcat(hueTempMap[hue]), @@ -153,9 +153,8 @@ function contrastPredicate(color) { } function huePredicate(colorSpace: string) { - return (color: ColorToken) => { - return getChannel(`${checkArg(colorSpace, 'jch')}.h`)(color); - }; + return (color: ColorToken) => + getChannel(`${checkArg(colorSpace, 'jch')}.h`)(color); } function chromaPredicate(colorspace) { return (color: ColorToken) => @@ -165,7 +164,7 @@ function chromaPredicate(colorspace) { // The baseFunc for getting specifified factor extremums function baseFunc( factor: Factor, - colors: ColorToken[], + collection: ColorToken[] | object, cb: callback, order?: Order, colorObj?: boolean @@ -176,7 +175,7 @@ function baseFunc( cb, order as Order, colorObj - )(colors).filter((el) => el[factor] !== undefined); + )(collection).filter((el) => el[factor] !== undefined); return (colorObj && result[0]) || result[0][factor]; } @@ -199,7 +198,7 @@ console.log(getNearestContrast(["b2c3f1", "#a1bd2f", "#f3bac1"], "green", true)) // { contrast: 2.4061390502133424, name: '#a1bd2f' } */ function getNearestContrast( - colors: ColorToken[], + collection: ColorToken[] | object, against: ColorToken, colorObj?: boolean ) { @@ -232,7 +231,7 @@ console.log(getFarthestContrast(["b2c3f1", "#a1bd2f", "#f3bac1"], "green", true) */ function getFarthestContrast( - colors: ColorToken[], + collection: ColorToken[] | object, against: ColorToken, colorObj?: boolean ): number | { factor: number; name: ColorToken } { @@ -262,7 +261,7 @@ console.log(getNearestChroma(sample, 'lch')) // 22.45669293295522 */ function getNearestChroma( - colors: ColorToken[], + collection: ColorToken[] | object, colorspace?: HueColorSpaces, colorObj = false ): number | { factor: number; color: ColorToken } { @@ -292,7 +291,7 @@ console.log(getFarthestChroma(sample, 'lch')) // 67.22120855010492 */ function getFarthestChroma( - colors: ColorToken[], + collection: ColorToken[] | object, colorObj = false ): number | { factor: number; color: ColorToken } { return baseFunc('saturation', colors, chromaPredicate, 'desc', colorObj); @@ -315,7 +314,7 @@ console.log(getNearestHue(sample, 'lch')) // 12.462831644544274 */ function getNearestHue( - colors: ColorToken[], + collection: ColorToken[] | object, colorspace?: HueColorSpaces | string, colorObj = false ): number | { factor: number; color: ColorToken } { @@ -338,7 +337,7 @@ console.log(getFarthestHue(sample, 'lch')) // 273.54920266436477 */ function getFarthestHue( - colors: ColorToken[], + collection: ColorToken[] | object, colorspace?: HueColorSpaces, colorObj = false ): number | { factor: number; color: ColorToken } { @@ -588,7 +587,7 @@ function alpha(color: ColorToken, value?: number | string): number { } /** - * + * * Gets the contrast between the passed in colors. * @param color * @param against @@ -652,7 +651,7 @@ console.log(getNearestLightness(sample, true)) */ function getNearestLightness( - colors: ColorToken[], + collection: ColorToken[] | object, colorspace?: HueColorSpaces, colorObj = false ): number | { factor: number; color: ColorToken } { @@ -686,7 +685,7 @@ console.log(getFarthestLightness(sample, true)) */ function getFarthestLightness( - colors: ColorToken[], + collection: ColorToken[] | object, colorspace?: HueColorSpaces, colorObj = false ): number | { factor: number; color: ColorToken } { @@ -741,7 +740,7 @@ function brighten( colorspace ): ColorToken { const src = toLab(toHex(color)); - const ch = matchLightnessChannel(colorspace).split('.')[1] + const ch = matchLightnessChannel(colorspace).split('.')[1]; let result = src; if (typeof value == 'number') { result[ch] -= 18 * easingSmootherstep(Math.abs(value) / 100); @@ -886,7 +885,7 @@ function colorDeficiency(deficiencyType?: DeficiencyType) { // Store the keys of deficiency types const deficiencies: string[] = ['red', 'blue', 'green', 'monochromacy']; // Cast 'red' as the default parameter - deficiencyType = checkArg(deficiencyType, 'red') as DeficiencyType + deficiencyType = checkArg(deficiencyType, 'red') as DeficiencyType; if ( typeof deficiencyType === 'string' && @@ -905,35 +904,36 @@ function colorDeficiency(deficiencyType?: DeficiencyType) { * * @param collection The collection of colors to search for nearest colors * @param color The color to use for distance comparison - * @param samples The number of colors to return, if the value is above the colors in the available sample, the entire collection is returned with colors ordered in ascending order. + * @param num The number of colors to return, if the value is above the colors in the available sample, the entire collection is returned with colors ordered in ascending order using the differenceHyab metric. * @returns An array of colors. * @example * - * + * let cols = colors('all', '500') + * +console.log(getNearestColor(cols, 'blue', 3)); + // [ '#a855f7', '#8b5cf6', '#d946ef' ] */ function getNearestColor( - collection: ColorToken[] | 'tailwind' | 'material', + collection: ColorToken[] | 'tailwind', color: ColorToken, - samples = 1 + num = 1 ): ColorToken | ColorToken[] { const cb = (collection, color) => { // - return nearest(collection as ColorToken[], differenceHyab())( - color as string, - samples - ); + return nearest( + collection as ColorToken[], + differenceHyab(), + (color) => color as string + )(color as string, num); }; let result: ColorToken; - switch (collection) { - case 'tailwind': - result = cb(colors('all'), color); - break; - // @ts-ignore - case typeof collection !== 'string' && collection.length: - result = cb(collection, color); - break; + if (collection === 'tailwind') { + result = cb(colors('all'), color); + } else { + result = cb(collection, color); } + return result; } diff --git a/tailwind.config.js b/tailwind.config.js new file mode 100644 index 00000000..332d51e7 --- /dev/null +++ b/tailwind.config.js @@ -0,0 +1,1074 @@ +/** @type {import('tailwindcss').Config} */ +export default { + content: ['./templates/*.html'], + presets: [], + darkMode: 'media', // or 'class' + theme: { + accentColor: ({ theme }) => ({ + ...theme('colors'), + auto: 'auto' + }), + animation: { + none: 'none', + spin: 'spin 1s linear infinite', + ping: 'ping 1s cubic-bezier(0, 0, 0.2, 1) infinite', + pulse: 'pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite', + bounce: 'bounce 1s infinite' + }, + aria: { + busy: 'busy="true"', + checked: 'checked="true"', + disabled: 'disabled="true"', + expanded: 'expanded="true"', + hidden: 'hidden="true"', + pressed: 'pressed="true"', + readonly: 'readonly="true"', + required: 'required="true"', + selected: 'selected="true"' + }, + aspectRatio: { + auto: 'auto', + square: '1 / 1', + video: '16 / 9' + }, + backdropBlur: ({ theme }) => theme('blur'), + backdropBrightness: ({ theme }) => theme('brightness'), + backdropContrast: ({ theme }) => theme('contrast'), + backdropGrayscale: ({ theme }) => theme('grayscale'), + backdropHueRotate: ({ theme }) => theme('hueRotate'), + backdropInvert: ({ theme }) => theme('invert'), + backdropOpacity: ({ theme }) => theme('opacity'), + backdropSaturate: ({ theme }) => theme('saturate'), + backdropSepia: ({ theme }) => theme('sepia'), + backgroundColor: ({ theme }) => theme('colors'), + backgroundImage: { + none: 'none', + 'gradient-to-t': 'linear-gradient(to top, var(--tw-gradient-stops))', + 'gradient-to-tr': + 'linear-gradient(to top right, var(--tw-gradient-stops))', + 'gradient-to-r': 'linear-gradient(to right, var(--tw-gradient-stops))', + 'gradient-to-br': + 'linear-gradient(to bottom right, var(--tw-gradient-stops))', + 'gradient-to-b': 'linear-gradient(to bottom, var(--tw-gradient-stops))', + 'gradient-to-bl': + 'linear-gradient(to bottom left, var(--tw-gradient-stops))', + 'gradient-to-l': 'linear-gradient(to left, var(--tw-gradient-stops))', + 'gradient-to-tl': 'linear-gradient(to top left, var(--tw-gradient-stops))' + }, + backgroundOpacity: ({ theme }) => theme('opacity'), + backgroundPosition: { + bottom: 'bottom', + center: 'center', + left: 'left', + 'left-bottom': 'left bottom', + 'left-top': 'left top', + right: 'right', + 'right-bottom': 'right bottom', + 'right-top': 'right top', + top: 'top' + }, + backgroundSize: { + auto: 'auto', + cover: 'cover', + contain: 'contain' + }, + blur: { + 0: '0', + none: '0', + sm: '4px', + DEFAULT: '8px', + md: '12px', + lg: '16px', + xl: '24px', + '2xl': '40px', + '3xl': '64px' + }, + borderColor: ({ theme }) => ({ + ...theme('colors'), + DEFAULT: theme('colors.gray.200', 'currentColor') + }), + borderOpacity: ({ theme }) => theme('opacity'), + borderRadius: { + none: '0px', + sm: '0.125rem', + DEFAULT: '0.25rem', + md: '0.375rem', + lg: '0.5rem', + xl: '0.75rem', + '2xl': '1rem', + '3xl': '1.5rem', + full: '9999px' + }, + borderSpacing: ({ theme }) => ({ + ...theme('spacing') + }), + borderWidth: { + DEFAULT: '1px', + 0: '0px', + 2: '2px', + 4: '4px', + 8: '8px' + }, + boxShadow: { + sm: '0 1px 2px 0 rgb(0 0 0 / 0.05)', + DEFAULT: '0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1)', + md: '0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1)', + lg: '0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1)', + xl: '0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1)', + '2xl': '0 25px 50px -12px rgb(0 0 0 / 0.25)', + inner: 'inset 0 2px 4px 0 rgb(0 0 0 / 0.05)', + none: 'none' + }, + boxShadowColor: ({ theme }) => theme('colors'), + brightness: { + 0: '0', + 50: '.5', + 75: '.75', + 90: '.9', + 95: '.95', + 100: '1', + 105: '1.05', + 110: '1.1', + 125: '1.25', + 150: '1.5', + 200: '2' + }, + caretColor: ({ theme }) => theme('colors'), + colors: ({ colors }) => ({ + inherit: colors.inherit, + current: colors.current, + transparent: colors.transparent, + black: colors.black, + white: colors.white, + slate: colors.slate, + gray: colors.gray, + zinc: colors.zinc, + neutral: colors.neutral, + stone: colors.stone, + red: colors.red, + orange: colors.orange, + amber: colors.amber, + yellow: colors.yellow, + lime: colors.lime, + green: colors.green, + emerald: colors.emerald, + teal: colors.teal, + cyan: colors.cyan, + sky: colors.sky, + blue: colors.blue, + indigo: colors.indigo, + violet: colors.violet, + purple: colors.purple, + fuchsia: colors.fuchsia, + pink: colors.pink, + rose: colors.rose + }), + columns: { + auto: 'auto', + 1: '1', + 2: '2', + 3: '3', + 4: '4', + 5: '5', + 6: '6', + 7: '7', + 8: '8', + 9: '9', + 10: '10', + 11: '11', + 12: '12', + '3xs': '16rem', + '2xs': '18rem', + xs: '20rem', + sm: '24rem', + md: '28rem', + lg: '32rem', + xl: '36rem', + '2xl': '42rem', + '3xl': '48rem', + '4xl': '56rem', + '5xl': '64rem', + '6xl': '72rem', + '7xl': '80rem' + }, + container: {}, + content: { + none: 'none' + }, + contrast: { + 0: '0', + 50: '.5', + 75: '.75', + 100: '1', + 125: '1.25', + 150: '1.5', + 200: '2' + }, + cursor: { + auto: 'auto', + default: 'default', + pointer: 'pointer', + wait: 'wait', + text: 'text', + move: 'move', + help: 'help', + 'not-allowed': 'not-allowed', + none: 'none', + 'context-menu': 'context-menu', + progress: 'progress', + cell: 'cell', + crosshair: 'crosshair', + 'vertical-text': 'vertical-text', + alias: 'alias', + copy: 'copy', + 'no-drop': 'no-drop', + grab: 'grab', + grabbing: 'grabbing', + 'all-scroll': 'all-scroll', + 'col-resize': 'col-resize', + 'row-resize': 'row-resize', + 'n-resize': 'n-resize', + 'e-resize': 'e-resize', + 's-resize': 's-resize', + 'w-resize': 'w-resize', + 'ne-resize': 'ne-resize', + 'nw-resize': 'nw-resize', + 'se-resize': 'se-resize', + 'sw-resize': 'sw-resize', + 'ew-resize': 'ew-resize', + 'ns-resize': 'ns-resize', + 'nesw-resize': 'nesw-resize', + 'nwse-resize': 'nwse-resize', + 'zoom-in': 'zoom-in', + 'zoom-out': 'zoom-out' + }, + divideColor: ({ theme }) => theme('borderColor'), + divideOpacity: ({ theme }) => theme('borderOpacity'), + divideWidth: ({ theme }) => theme('borderWidth'), + dropShadow: { + sm: '0 1px 1px rgb(0 0 0 / 0.05)', + DEFAULT: ['0 1px 2px rgb(0 0 0 / 0.1)', '0 1px 1px rgb(0 0 0 / 0.06)'], + md: ['0 4px 3px rgb(0 0 0 / 0.07)', '0 2px 2px rgb(0 0 0 / 0.06)'], + lg: ['0 10px 8px rgb(0 0 0 / 0.04)', '0 4px 3px rgb(0 0 0 / 0.1)'], + xl: ['0 20px 13px rgb(0 0 0 / 0.03)', '0 8px 5px rgb(0 0 0 / 0.08)'], + '2xl': '0 25px 25px rgb(0 0 0 / 0.15)', + none: '0 0 #0000' + }, + fill: ({ theme }) => ({ + none: 'none', + ...theme('colors') + }), + flex: { + 1: '1 1 0%', + auto: '1 1 auto', + initial: '0 1 auto', + none: 'none' + }, + flexBasis: ({ theme }) => ({ + auto: 'auto', + ...theme('spacing'), + '1/2': '50%', + '1/3': '33.333333%', + '2/3': '66.666667%', + '1/4': '25%', + '2/4': '50%', + '3/4': '75%', + '1/5': '20%', + '2/5': '40%', + '3/5': '60%', + '4/5': '80%', + '1/6': '16.666667%', + '2/6': '33.333333%', + '3/6': '50%', + '4/6': '66.666667%', + '5/6': '83.333333%', + '1/12': '8.333333%', + '2/12': '16.666667%', + '3/12': '25%', + '4/12': '33.333333%', + '5/12': '41.666667%', + '6/12': '50%', + '7/12': '58.333333%', + '8/12': '66.666667%', + '9/12': '75%', + '10/12': '83.333333%', + '11/12': '91.666667%', + full: '100%' + }), + flexGrow: { + 0: '0', + DEFAULT: '1' + }, + flexShrink: { + 0: '0', + DEFAULT: '1' + }, + fontFamily: { + sans: [ + 'ui-sans-serif', + 'system-ui', + 'sans-serif', + '"Apple Color Emoji"', + '"Segoe UI Emoji"', + '"Segoe UI Symbol"', + '"Noto Color Emoji"' + ], + serif: [ + 'ui-serif', + 'Georgia', + 'Cambria', + '"Times New Roman"', + 'Times', + 'serif' + ], + mono: [ + 'ui-monospace', + 'SFMono-Regular', + 'Menlo', + 'Monaco', + 'Consolas', + '"Liberation Mono"', + '"Courier New"', + 'monospace' + ] + }, + fontSize: { + xs: ['0.75rem', { lineHeight: '1rem' }], + sm: ['0.875rem', { lineHeight: '1.25rem' }], + base: ['1rem', { lineHeight: '1.5rem' }], + lg: ['1.125rem', { lineHeight: '1.75rem' }], + xl: ['1.25rem', { lineHeight: '1.75rem' }], + '2xl': ['1.5rem', { lineHeight: '2rem' }], + '3xl': ['1.875rem', { lineHeight: '2.25rem' }], + '4xl': ['2.25rem', { lineHeight: '2.5rem' }], + '5xl': ['3rem', { lineHeight: '1' }], + '6xl': ['3.75rem', { lineHeight: '1' }], + '7xl': ['4.5rem', { lineHeight: '1' }], + '8xl': ['6rem', { lineHeight: '1' }], + '9xl': ['8rem', { lineHeight: '1' }] + }, + fontWeight: { + thin: '100', + extralight: '200', + light: '300', + normal: '400', + medium: '500', + semibold: '600', + bold: '700', + extrabold: '800', + black: '900' + }, + gap: ({ theme }) => theme('spacing'), + gradientColorStops: ({ theme }) => theme('colors'), + gradientColorStopPositions: { + '0%': '0%', + '5%': '5%', + '10%': '10%', + '15%': '15%', + '20%': '20%', + '25%': '25%', + '30%': '30%', + '35%': '35%', + '40%': '40%', + '45%': '45%', + '50%': '50%', + '55%': '55%', + '60%': '60%', + '65%': '65%', + '70%': '70%', + '75%': '75%', + '80%': '80%', + '85%': '85%', + '90%': '90%', + '95%': '95%', + '100%': '100%' + }, + grayscale: { + 0: '0', + DEFAULT: '100%' + }, + gridAutoColumns: { + auto: 'auto', + min: 'min-content', + max: 'max-content', + fr: 'minmax(0, 1fr)' + }, + gridAutoRows: { + auto: 'auto', + min: 'min-content', + max: 'max-content', + fr: 'minmax(0, 1fr)' + }, + gridColumn: { + auto: 'auto', + 'span-1': 'span 1 / span 1', + 'span-2': 'span 2 / span 2', + 'span-3': 'span 3 / span 3', + 'span-4': 'span 4 / span 4', + 'span-5': 'span 5 / span 5', + 'span-6': 'span 6 / span 6', + 'span-7': 'span 7 / span 7', + 'span-8': 'span 8 / span 8', + 'span-9': 'span 9 / span 9', + 'span-10': 'span 10 / span 10', + 'span-11': 'span 11 / span 11', + 'span-12': 'span 12 / span 12', + 'span-full': '1 / -1' + }, + gridColumnEnd: { + auto: 'auto', + 1: '1', + 2: '2', + 3: '3', + 4: '4', + 5: '5', + 6: '6', + 7: '7', + 8: '8', + 9: '9', + 10: '10', + 11: '11', + 12: '12', + 13: '13' + }, + gridColumnStart: { + auto: 'auto', + 1: '1', + 2: '2', + 3: '3', + 4: '4', + 5: '5', + 6: '6', + 7: '7', + 8: '8', + 9: '9', + 10: '10', + 11: '11', + 12: '12', + 13: '13' + }, + gridRow: { + auto: 'auto', + 'span-1': 'span 1 / span 1', + 'span-2': 'span 2 / span 2', + 'span-3': 'span 3 / span 3', + 'span-4': 'span 4 / span 4', + 'span-5': 'span 5 / span 5', + 'span-6': 'span 6 / span 6', + 'span-7': 'span 7 / span 7', + 'span-8': 'span 8 / span 8', + 'span-9': 'span 9 / span 9', + 'span-10': 'span 10 / span 10', + 'span-11': 'span 11 / span 11', + 'span-12': 'span 12 / span 12', + 'span-full': '1 / -1' + }, + gridRowEnd: { + auto: 'auto', + 1: '1', + 2: '2', + 3: '3', + 4: '4', + 5: '5', + 6: '6', + 7: '7', + 8: '8', + 9: '9', + 10: '10', + 11: '11', + 12: '12', + 13: '13' + }, + gridRowStart: { + auto: 'auto', + 1: '1', + 2: '2', + 3: '3', + 4: '4', + 5: '5', + 6: '6', + 7: '7', + 8: '8', + 9: '9', + 10: '10', + 11: '11', + 12: '12', + 13: '13' + }, + gridTemplateColumns: { + none: 'none', + subgrid: 'subgrid', + 1: 'repeat(1, minmax(0, 1fr))', + 2: 'repeat(2, minmax(0, 1fr))', + 3: 'repeat(3, minmax(0, 1fr))', + 4: 'repeat(4, minmax(0, 1fr))', + 5: 'repeat(5, minmax(0, 1fr))', + 6: 'repeat(6, minmax(0, 1fr))', + 7: 'repeat(7, minmax(0, 1fr))', + 8: 'repeat(8, minmax(0, 1fr))', + 9: 'repeat(9, minmax(0, 1fr))', + 10: 'repeat(10, minmax(0, 1fr))', + 11: 'repeat(11, minmax(0, 1fr))', + 12: 'repeat(12, minmax(0, 1fr))' + }, + gridTemplateRows: { + none: 'none', + subgrid: 'subgrid', + 1: 'repeat(1, minmax(0, 1fr))', + 2: 'repeat(2, minmax(0, 1fr))', + 3: 'repeat(3, minmax(0, 1fr))', + 4: 'repeat(4, minmax(0, 1fr))', + 5: 'repeat(5, minmax(0, 1fr))', + 6: 'repeat(6, minmax(0, 1fr))', + 7: 'repeat(7, minmax(0, 1fr))', + 8: 'repeat(8, minmax(0, 1fr))', + 9: 'repeat(9, minmax(0, 1fr))', + 10: 'repeat(10, minmax(0, 1fr))', + 11: 'repeat(11, minmax(0, 1fr))', + 12: 'repeat(12, minmax(0, 1fr))' + }, + height: ({ theme }) => ({ + auto: 'auto', + ...theme('spacing'), + '1/2': '50%', + '1/3': '33.333333%', + '2/3': '66.666667%', + '1/4': '25%', + '2/4': '50%', + '3/4': '75%', + '1/5': '20%', + '2/5': '40%', + '3/5': '60%', + '4/5': '80%', + '1/6': '16.666667%', + '2/6': '33.333333%', + '3/6': '50%', + '4/6': '66.666667%', + '5/6': '83.333333%', + full: '100%', + screen: '100vh', + svh: '100svh', + lvh: '100lvh', + dvh: '100dvh', + min: 'min-content', + max: 'max-content', + fit: 'fit-content' + }), + hueRotate: { + 0: '0deg', + 15: '15deg', + 30: '30deg', + 60: '60deg', + 90: '90deg', + 180: '180deg' + }, + inset: ({ theme }) => ({ + auto: 'auto', + ...theme('spacing'), + '1/2': '50%', + '1/3': '33.333333%', + '2/3': '66.666667%', + '1/4': '25%', + '2/4': '50%', + '3/4': '75%', + full: '100%' + }), + invert: { + 0: '0', + DEFAULT: '100%' + }, + keyframes: { + spin: { + to: { + transform: 'rotate(360deg)' + } + }, + ping: { + '75%, 100%': { + transform: 'scale(2)', + opacity: '0' + } + }, + pulse: { + '50%': { + opacity: '.5' + } + }, + bounce: { + '0%, 100%': { + transform: 'translateY(-25%)', + animationTimingFunction: 'cubic-bezier(0.8,0,1,1)' + }, + '50%': { + transform: 'none', + animationTimingFunction: 'cubic-bezier(0,0,0.2,1)' + } + } + }, + letterSpacing: { + tighter: '-0.05em', + tight: '-0.025em', + normal: '0em', + wide: '0.025em', + wider: '0.05em', + widest: '0.1em' + }, + lineHeight: { + none: '1', + tight: '1.25', + snug: '1.375', + normal: '1.5', + relaxed: '1.625', + loose: '2', + 3: '.75rem', + 4: '1rem', + 5: '1.25rem', + 6: '1.5rem', + 7: '1.75rem', + 8: '2rem', + 9: '2.25rem', + 10: '2.5rem' + }, + listStyleType: { + none: 'none', + disc: 'disc', + decimal: 'decimal' + }, + listStyleImage: { + none: 'none' + }, + margin: ({ theme }) => ({ + auto: 'auto', + ...theme('spacing') + }), + lineClamp: { + 1: '1', + 2: '2', + 3: '3', + 4: '4', + 5: '5', + 6: '6' + }, + maxHeight: ({ theme }) => ({ + ...theme('spacing'), + none: 'none', + full: '100%', + screen: '100vh', + svh: '100svh', + lvh: '100lvh', + dvh: '100dvh', + min: 'min-content', + max: 'max-content', + fit: 'fit-content' + }), + maxWidth: ({ theme, breakpoints }) => ({ + ...theme('spacing'), + none: 'none', + xs: '20rem', + sm: '24rem', + md: '28rem', + lg: '32rem', + xl: '36rem', + '2xl': '42rem', + '3xl': '48rem', + '4xl': '56rem', + '5xl': '64rem', + '6xl': '72rem', + '7xl': '80rem', + full: '100%', + min: 'min-content', + max: 'max-content', + fit: 'fit-content', + prose: '65ch', + ...breakpoints(theme('screens')) + }), + minHeight: ({ theme }) => ({ + ...theme('spacing'), + full: '100%', + screen: '100vh', + svh: '100svh', + lvh: '100lvh', + dvh: '100dvh', + min: 'min-content', + max: 'max-content', + fit: 'fit-content' + }), + minWidth: ({ theme }) => ({ + ...theme('spacing'), + full: '100%', + min: 'min-content', + max: 'max-content', + fit: 'fit-content' + }), + objectPosition: { + bottom: 'bottom', + center: 'center', + left: 'left', + 'left-bottom': 'left bottom', + 'left-top': 'left top', + right: 'right', + 'right-bottom': 'right bottom', + 'right-top': 'right top', + top: 'top' + }, + opacity: { + 0: '0', + 5: '0.05', + 10: '0.1', + 15: '0.15', + 20: '0.2', + 25: '0.25', + 30: '0.3', + 35: '0.35', + 40: '0.4', + 45: '0.45', + 50: '0.5', + 55: '0.55', + 60: '0.6', + 65: '0.65', + 70: '0.7', + 75: '0.75', + 80: '0.8', + 85: '0.85', + 90: '0.9', + 95: '0.95', + 100: '1' + }, + order: { + first: '-9999', + last: '9999', + none: '0', + 1: '1', + 2: '2', + 3: '3', + 4: '4', + 5: '5', + 6: '6', + 7: '7', + 8: '8', + 9: '9', + 10: '10', + 11: '11', + 12: '12' + }, + outlineColor: ({ theme }) => theme('colors'), + outlineOffset: { + 0: '0px', + 1: '1px', + 2: '2px', + 4: '4px', + 8: '8px' + }, + outlineWidth: { + 0: '0px', + 1: '1px', + 2: '2px', + 4: '4px', + 8: '8px' + }, + padding: ({ theme }) => theme('spacing'), + placeholderColor: ({ theme }) => theme('colors'), + placeholderOpacity: ({ theme }) => theme('opacity'), + ringColor: ({ theme }) => ({ + DEFAULT: theme('colors.blue.500', '#3b82f6'), + ...theme('colors') + }), + ringOffsetColor: ({ theme }) => theme('colors'), + ringOffsetWidth: { + 0: '0px', + 1: '1px', + 2: '2px', + 4: '4px', + 8: '8px' + }, + ringOpacity: ({ theme }) => ({ + DEFAULT: '0.5', + ...theme('opacity') + }), + ringWidth: { + DEFAULT: '3px', + 0: '0px', + 1: '1px', + 2: '2px', + 4: '4px', + 8: '8px' + }, + rotate: { + 0: '0deg', + 1: '1deg', + 2: '2deg', + 3: '3deg', + 6: '6deg', + 12: '12deg', + 45: '45deg', + 90: '90deg', + 180: '180deg' + }, + saturate: { + 0: '0', + 50: '.5', + 100: '1', + 150: '1.5', + 200: '2' + }, + scale: { + 0: '0', + 50: '.5', + 75: '.75', + 90: '.9', + 95: '.95', + 100: '1', + 105: '1.05', + 110: '1.1', + 125: '1.25', + 150: '1.5' + }, + screens: { + sm: '640px', + md: '768px', + lg: '1024px', + xl: '1280px', + '2xl': '1536px' + }, + scrollMargin: ({ theme }) => ({ + ...theme('spacing') + }), + scrollPadding: ({ theme }) => theme('spacing'), + sepia: { + 0: '0', + DEFAULT: '100%' + }, + skew: { + 0: '0deg', + 1: '1deg', + 2: '2deg', + 3: '3deg', + 6: '6deg', + 12: '12deg' + }, + space: ({ theme }) => ({ + ...theme('spacing') + }), + spacing: { + px: '1px', + 0: '0px', + 0.5: '0.125rem', + 1: '0.25rem', + 1.5: '0.375rem', + 2: '0.5rem', + 2.5: '0.625rem', + 3: '0.75rem', + 3.5: '0.875rem', + 4: '1rem', + 5: '1.25rem', + 6: '1.5rem', + 7: '1.75rem', + 8: '2rem', + 9: '2.25rem', + 10: '2.5rem', + 11: '2.75rem', + 12: '3rem', + 14: '3.5rem', + 16: '4rem', + 20: '5rem', + 24: '6rem', + 28: '7rem', + 32: '8rem', + 36: '9rem', + 40: '10rem', + 44: '11rem', + 48: '12rem', + 52: '13rem', + 56: '14rem', + 60: '15rem', + 64: '16rem', + 72: '18rem', + 80: '20rem', + 96: '24rem' + }, + stroke: ({ theme }) => ({ + none: 'none', + ...theme('colors') + }), + strokeWidth: { + 0: '0', + 1: '1', + 2: '2' + }, + supports: {}, + data: {}, + textColor: ({ theme }) => theme('colors'), + textDecorationColor: ({ theme }) => theme('colors'), + textDecorationThickness: { + auto: 'auto', + 'from-font': 'from-font', + 0: '0px', + 1: '1px', + 2: '2px', + 4: '4px', + 8: '8px' + }, + textIndent: ({ theme }) => ({ + ...theme('spacing') + }), + textOpacity: ({ theme }) => theme('opacity'), + textUnderlineOffset: { + auto: 'auto', + 0: '0px', + 1: '1px', + 2: '2px', + 4: '4px', + 8: '8px' + }, + transformOrigin: { + center: 'center', + top: 'top', + 'top-right': 'top right', + right: 'right', + 'bottom-right': 'bottom right', + bottom: 'bottom', + 'bottom-left': 'bottom left', + left: 'left', + 'top-left': 'top left' + }, + transitionDelay: { + 0: '0s', + 75: '75ms', + 100: '100ms', + 150: '150ms', + 200: '200ms', + 300: '300ms', + 500: '500ms', + 700: '700ms', + 1000: '1000ms' + }, + transitionDuration: { + DEFAULT: '150ms', + 0: '0s', + 75: '75ms', + 100: '100ms', + 150: '150ms', + 200: '200ms', + 300: '300ms', + 500: '500ms', + 700: '700ms', + 1000: '1000ms' + }, + transitionProperty: { + none: 'none', + all: 'all', + DEFAULT: + 'color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter', + colors: + 'color, background-color, border-color, text-decoration-color, fill, stroke', + opacity: 'opacity', + shadow: 'box-shadow', + transform: 'transform' + }, + transitionTimingFunction: { + DEFAULT: 'cubic-bezier(0.4, 0, 0.2, 1)', + linear: 'linear', + in: 'cubic-bezier(0.4, 0, 1, 1)', + out: 'cubic-bezier(0, 0, 0.2, 1)', + 'in-out': 'cubic-bezier(0.4, 0, 0.2, 1)' + }, + translate: ({ theme }) => ({ + ...theme('spacing'), + '1/2': '50%', + '1/3': '33.333333%', + '2/3': '66.666667%', + '1/4': '25%', + '2/4': '50%', + '3/4': '75%', + full: '100%' + }), + size: ({ theme }) => ({ + auto: 'auto', + ...theme('spacing'), + '1/2': '50%', + '1/3': '33.333333%', + '2/3': '66.666667%', + '1/4': '25%', + '2/4': '50%', + '3/4': '75%', + '1/5': '20%', + '2/5': '40%', + '3/5': '60%', + '4/5': '80%', + '1/6': '16.666667%', + '2/6': '33.333333%', + '3/6': '50%', + '4/6': '66.666667%', + '5/6': '83.333333%', + '1/12': '8.333333%', + '2/12': '16.666667%', + '3/12': '25%', + '4/12': '33.333333%', + '5/12': '41.666667%', + '6/12': '50%', + '7/12': '58.333333%', + '8/12': '66.666667%', + '9/12': '75%', + '10/12': '83.333333%', + '11/12': '91.666667%', + full: '100%', + min: 'min-content', + max: 'max-content', + fit: 'fit-content' + }), + width: ({ theme }) => ({ + auto: 'auto', + ...theme('spacing'), + '1/2': '50%', + '1/3': '33.333333%', + '2/3': '66.666667%', + '1/4': '25%', + '2/4': '50%', + '3/4': '75%', + '1/5': '20%', + '2/5': '40%', + '3/5': '60%', + '4/5': '80%', + '1/6': '16.666667%', + '2/6': '33.333333%', + '3/6': '50%', + '4/6': '66.666667%', + '5/6': '83.333333%', + '1/12': '8.333333%', + '2/12': '16.666667%', + '3/12': '25%', + '4/12': '33.333333%', + '5/12': '41.666667%', + '6/12': '50%', + '7/12': '58.333333%', + '8/12': '66.666667%', + '9/12': '75%', + '10/12': '83.333333%', + '11/12': '91.666667%', + full: '100%', + screen: '100vw', + svw: '100svw', + lvw: '100lvw', + dvw: '100dvw', + min: 'min-content', + max: 'max-content', + fit: 'fit-content' + }), + willChange: { + auto: 'auto', + scroll: 'scroll-position', + contents: 'contents', + transform: 'transform' + }, + zIndex: { + auto: 'auto', + 0: '0', + 10: '10', + 20: '20', + 30: '30', + 40: '40', + 50: '50' + } + }, + plugins: [] +};