├── .gitignore ├── .prettierrc ├── .travis.yml ├── README.md ├── lib ├── elements.ts ├── express-helpers.ts ├── extended-readable.ts ├── index.ts ├── map.ts └── util │ ├── pipe-into.ts │ └── to-string.ts ├── package-lock.json ├── package.json ├── test ├── helpers.js ├── sanity.js ├── test-attributes.js ├── test-lists.js ├── test-textnodes.js └── test.js ├── tsconfig.json └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .node_repl_history 3 | .config 4 | .npm 5 | .idea 6 | .DS_Store 7 | 8 | **/*.js 9 | 10 | **/*.js.map 11 | *.d.ts 12 | /.log/ 13 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "trailingComma": "es5", 3 | "tabWidth": 4, 4 | "useTabs": true 5 | } 6 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - node 4 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # flora 2 | 3 | > __flora-tmpl__ on npm. 4 | 5 | [![Flora Finch, silent film actress](https://user-images.githubusercontent.com/361671/31864759-7ce1b858-b731-11e7-9984-0b60ba9ff9bd.jpg)](https://en.wikipedia.org/wiki/Flora_Finch) 6 | 7 | Streaming templates. 8 | 9 | ![Streaming HTML](https://user-images.githubusercontent.com/361671/32578154-2abd05a6-c4aa-11e7-95bd-1dc39729c8fc.gif) 10 | 11 | # Why 12 | 13 | HTML is a format that can be streamed. Meaning the browser can start parsing and showing parts of a web page before the full thing has been downloaded. Your application probably has things it needs to do that take some time; like make database requests. 14 | 15 | Parts of your page depend on this data, but much of it does not. Flora allows you to write templates that get to the client as quickly as possible, because only the parts that need to wait, do wait. 16 | 17 | ## Install 18 | 19 | ```shell 20 | yarn add flora-tmpl 21 | ``` 22 | 23 | ## Usage 24 | 25 | ```js 26 | const { html, map } = require('flora-tmpl'); 27 | const streamArray = require('stream-array'); 28 | 29 | function template({items}) { 30 | return html` 31 |

Todos

32 | 37 | `; 38 | } 39 | 40 | template({ 41 | items: streamArray([1, 2, 3]) 42 | }) 43 | .pipe(...) 44 | ``` 45 | 46 | ## License 47 | 48 | BSD 2 Clause 49 | -------------------------------------------------------------------------------- /lib/elements.ts: -------------------------------------------------------------------------------- 1 | import { PathLike } from "fs"; 2 | import { html } from "."; 3 | import ExtendedReadable from "./extended-readable"; 4 | import { map } from "./map"; 5 | import * as fs from "fs"; 6 | import { v4 as uuid } from "uuid"; 7 | 8 | type StringLike = string | number | boolean | ReadableStream | ExtendedReadable; 9 | 10 | export type Attributes = { 11 | [attribute: string]: StringLike | Promise | undefined; 12 | }; 13 | 14 | export function refresh(timeout: number = 0) { 15 | return html/* HTML */ ` `; 16 | } 17 | 18 | export function redirect(url: string): string { 19 | return /* HTML */ ``; 20 | } 21 | 22 | export function document(content: ExtendedReadable): ExtendedReadable { 23 | return html/* HTML */ ` 24 | 25 | 26 | ${content} 27 | `; 28 | } 29 | 30 | export function link(text: string | ExtendedReadable, href: string) { 31 | return html/* HTML */ `${text}`; 32 | } 33 | 34 | const sanitizeAttribute = (value?: string) => 35 | value ? value.replace(/"/g, """) : ""; 36 | 37 | export function attributes(attrs: Attributes = {}) { 38 | return map(Object.entries(attrs), async ([attr, value_promise]) => { 39 | let value = await value_promise; 40 | if (typeof value === "string") { 41 | value = sanitizeAttribute(value); 42 | // TODO: think of a way to replace also within streams 43 | } 44 | return value ? html`${attr}="${value}" ` : ""; 45 | }); 46 | } 47 | 48 | type Option = { 49 | name: string; 50 | value: string; 51 | attrs?: Attributes; 52 | }; 53 | 54 | export function select( 55 | name: string, 56 | options: Promise, 57 | attrs: { [attribute: string]: string } = {}, 58 | placeholder?: string 59 | ) { 60 | const ret = html/* HTML */ ``; 83 | ret.metadata.name = name; 84 | ret.metadata.id = name; 85 | return ret; 86 | } 87 | 88 | export function script(path: PathLike): ExtendedReadable { 89 | const file = fs.createReadStream(path); 90 | return html/* HTML */ ``; 93 | } 94 | 95 | const DefaultInputOptions = { 96 | type: "text", 97 | required: true, 98 | placeholder: "text", 99 | value: null as string | null, 100 | attrs: {} as Attributes, 101 | style: "", 102 | }; 103 | 104 | export function input( 105 | name: string, 106 | options: Partial 107 | ) { 108 | options = { ...DefaultInputOptions, ...options }; 109 | const ret = html/* HTML */ ``; 118 | ret.metadata.id = name; 119 | ret.metadata.name = name; 120 | return ret; 121 | } 122 | 123 | type TextareaOptions = { 124 | id?: string; 125 | rows?: number; 126 | cols?: number; 127 | disabled?: boolean; 128 | placeholder?: string; 129 | value?: string; 130 | }; 131 | 132 | export function textarea( 133 | name: string, 134 | options: TextareaOptions 135 | ): ExtendedReadable { 136 | const unrolled_options: Attributes = { ...options }; 137 | const disabled = unrolled_options.disabled || false; 138 | delete unrolled_options.disabled; 139 | unrolled_options.name = name; 140 | if (!unrolled_options.id) { 141 | unrolled_options.id = name; 142 | } 143 | const value = unrolled_options.value || ""; 144 | delete unrolled_options.value; 145 | const ret = html/* HTML */ ``; 151 | 152 | ret.metadata.id = unrolled_options.id as string; 153 | ret.metadata.name = unrolled_options.name; 154 | return ret; 155 | } 156 | 157 | export function checkbox( 158 | name: string, 159 | { onChange }: { onChange?: string } = {} 160 | ): ExtendedReadable { 161 | return html/* HTML */ ``; 167 | } 168 | 169 | export function checkboxWithLabel(name: string, label: string) { 170 | return html/* HTML */ ``; 173 | } 174 | 175 | export function checkForMore( 176 | name: string, 177 | label: string, 178 | content: StringLike, 179 | { onChange }: { onChange?: string } = {} 180 | ) { 181 | return html/* HTML */ ` 205 |
206 | ${checkbox(name, { 207 | onChange, 208 | })} 209 | 219 |
${content}
220 |
`; 221 | } 222 | 223 | export async function cond( 224 | predicate: () => boolean | Promise, 225 | content: StringLike 226 | ): Promise { 227 | const res = await predicate(); 228 | if (res) { 229 | return content; 230 | } else { 231 | return ""; 232 | } 233 | } 234 | 235 | export class Loader { 236 | id: string; 237 | private delay = 65; 238 | constructor( 239 | public color: string = "hsl(268, 40%, 42%)", 240 | public message: string = "Please wait..." 241 | ) { 242 | this.id = "loader" + uuid().replace(/-/g, "_"); 243 | } 244 | 245 | private box(index: number) { 246 | return /* HTML */ `
250 |
`; 251 | } 252 | 253 | private style() { 254 | return /* HTML */ ` `; 343 | } 344 | 345 | public start() { 346 | let ret = this.style(); 347 | ret += `
`; 348 | ret += `
`; 349 | for (let i = 1; i <= 4; i++) { 350 | ret += this.box(i); 351 | } 352 | ret += `
`; 353 | ret += `
${this.message}
`; 354 | ret += `
`; 355 | return ret; 356 | } 357 | 358 | public stop() { 359 | return /* HTML */ ` `; 364 | } 365 | } 366 | 367 | export function fileDrop(name: string, accept?: string[]) { 368 | return /* HTML */ ` 408 |
409 | 410 | 417 |
`; 418 | } 419 | -------------------------------------------------------------------------------- /lib/express-helpers.ts: -------------------------------------------------------------------------------- 1 | import { Response } from "express"; 2 | import { Readable } from "stream"; 3 | 4 | export function streamResponse( 5 | stream: Readable, 6 | res: Response, 7 | type = "text/html; charset=utf-8" 8 | ) { 9 | res.setHeader("Content-Type", type); 10 | res.setHeader("Transfer-Encoding", "chunked"); 11 | stream.on("data", (data: any) => res.write(data)); 12 | stream.on("end", () => res.end()); 13 | } 14 | -------------------------------------------------------------------------------- /lib/extended-readable.ts: -------------------------------------------------------------------------------- 1 | import { Readable } from "stream"; 2 | 3 | export default class ExtendedReadable extends Readable { 4 | public metadata: { [field: string]: any } = {}; 5 | constructor(...args: ConstructorParameters) { 6 | super(...args); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /lib/index.ts: -------------------------------------------------------------------------------- 1 | import { Readable } from "stream"; 2 | import isStream from "is-stream"; 3 | 4 | import pipeInto from "./util/pipe-into"; 5 | import toString from "./util/to-string"; 6 | import ExtendedReadable from "./extended-readable"; 7 | 8 | export { map } from "./map"; 9 | 10 | async function readAll( 11 | stream: Readable, 12 | strings: TemplateStringsArray, 13 | values: any[] 14 | ) { 15 | let i = 0; 16 | while (i < values.length) { 17 | let html = strings[i]; 18 | stream.push(html); 19 | 20 | let p = values[i]; 21 | let val; 22 | if (isStream.readable(p)) { 23 | await pipeInto(p, stream); 24 | } else { 25 | val = await p; 26 | if (isStream.readable(val)) { 27 | await pipeInto(val, stream); 28 | } else { 29 | stream.push(toString(val)); 30 | } 31 | } 32 | 33 | i++; 34 | } 35 | stream.push(strings[i]); 36 | stream.push(null); 37 | } 38 | 39 | export function html(strings: TemplateStringsArray, ...values: any[]) { 40 | let reading = false; 41 | 42 | let readable = new ExtendedReadable({ 43 | read() { 44 | if (reading) return; 45 | reading = true; 46 | readAll(this, strings, values).catch((err) => { 47 | this.emit("error", err); 48 | this.push(null); 49 | }); 50 | }, 51 | }); 52 | 53 | return readable; 54 | } 55 | 56 | export { streamResponse } from "./express-helpers"; 57 | 58 | export * as Elements from "./elements"; 59 | -------------------------------------------------------------------------------- /lib/map.ts: -------------------------------------------------------------------------------- 1 | import arrayToStream from "stream-array"; 2 | import isStream from "is-stream"; 3 | import { Transform, Writable, Readable } from "stream"; 4 | import ExtendedReadable from "./extended-readable"; 5 | 6 | export function mapStream( 7 | stream: Readable, 8 | cb: (data: any) => Renderable | Promise 9 | ) { 10 | let outStream = new Transform(); 11 | outStream._transform = function (val, enc, next) { 12 | next(null, val); 13 | }; 14 | 15 | let writable = new Writable({ 16 | objectMode: true, 17 | async write(data, enc, next) { 18 | let val = cb(data); 19 | if ((val as { then?: Function }).then) { 20 | val = await val; 21 | } 22 | if (isStream(val)) { 23 | val.pipe(outStream, { end: false }); 24 | val.on("error", next); 25 | val.on("end", () => next(null)); 26 | } else { 27 | outStream.write((await val).toString(), "utf-8", () => { 28 | next(null); 29 | }); 30 | } 31 | }, 32 | }); 33 | 34 | writable.on("finish", () => { 35 | outStream.end(); 36 | }); 37 | 38 | stream.pipe(writable, { end: true }); 39 | 40 | return outStream; 41 | } 42 | 43 | type Renderable = string | number | ExtendedReadable; 44 | 45 | export function map( 46 | listLike: T[], 47 | cb: (data: T) => Renderable | Promise 48 | ) { 49 | var list = arrayToStream(listLike); 50 | return mapStream(list, cb); 51 | } 52 | -------------------------------------------------------------------------------- /lib/util/pipe-into.ts: -------------------------------------------------------------------------------- 1 | import { Writable, Readable } from "stream"; 2 | 3 | export default function pipeInto(fromStream: Readable, readable: Readable) { 4 | let outStream = fromStream.pipe( 5 | new Writable({ 6 | write(data, _, next) { 7 | readable.push(data); 8 | next(null); 9 | }, 10 | }) 11 | ); 12 | 13 | return new Promise((resolve) => { 14 | outStream.on("finish", () => resolve()); 15 | }); 16 | } 17 | -------------------------------------------------------------------------------- /lib/util/to-string.ts: -------------------------------------------------------------------------------- 1 | export default function toString(val: any) { 2 | if (Array.isArray(val)) { 3 | return val.join(""); 4 | } else if (val == null) { 5 | return ""; 6 | } 7 | return val.toString(); 8 | } 9 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "flora-tmpl-ts", 3 | "version": "2.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@types/body-parser": { 8 | "version": "1.19.0", 9 | "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.0.tgz", 10 | "integrity": "sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ==", 11 | "dev": true, 12 | "requires": { 13 | "@types/connect": "*", 14 | "@types/node": "*" 15 | } 16 | }, 17 | "@types/connect": { 18 | "version": "3.4.33", 19 | "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.33.tgz", 20 | "integrity": "sha512-2+FrkXY4zllzTNfJth7jOqEHC+enpLeGslEhpnTAkg21GkRrWV4SsAtqchtT4YS9/nODBU2/ZfsBY2X4J/dX7A==", 21 | "dev": true, 22 | "requires": { 23 | "@types/node": "*" 24 | } 25 | }, 26 | "@types/express": { 27 | "version": "4.17.8", 28 | "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.8.tgz", 29 | "integrity": "sha512-wLhcKh3PMlyA2cNAB9sjM1BntnhPMiM0JOBwPBqttjHev2428MLEB4AYVN+d8s2iyCVZac+o41Pflm/ZH5vLXQ==", 30 | "dev": true, 31 | "requires": { 32 | "@types/body-parser": "*", 33 | "@types/express-serve-static-core": "*", 34 | "@types/qs": "*", 35 | "@types/serve-static": "*" 36 | } 37 | }, 38 | "@types/express-serve-static-core": { 39 | "version": "4.17.13", 40 | "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.13.tgz", 41 | "integrity": "sha512-RgDi5a4nuzam073lRGKTUIaL3eF2+H7LJvJ8eUnCI0wA6SNjXc44DCmWNiTLs/AZ7QlsFWZiw/gTG3nSQGL0fA==", 42 | "dev": true, 43 | "requires": { 44 | "@types/node": "*", 45 | "@types/qs": "*", 46 | "@types/range-parser": "*" 47 | } 48 | }, 49 | "@types/mime": { 50 | "version": "2.0.3", 51 | "resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.3.tgz", 52 | "integrity": "sha512-Jus9s4CDbqwocc5pOAnh8ShfrnMcPHuJYzVcSUU7lrh8Ni5HuIqX3oilL86p3dlTrk0LzHRCgA/GQ7uNCw6l2Q==", 53 | "dev": true 54 | }, 55 | "@types/node": { 56 | "version": "14.11.8", 57 | "resolved": "https://registry.npmjs.org/@types/node/-/node-14.11.8.tgz", 58 | "integrity": "sha512-KPcKqKm5UKDkaYPTuXSx8wEP7vE9GnuaXIZKijwRYcePpZFDVuy2a57LarFKiORbHOuTOOwYzxVxcUzsh2P2Pw==" 59 | }, 60 | "@types/qs": { 61 | "version": "6.9.5", 62 | "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.5.tgz", 63 | "integrity": "sha512-/JHkVHtx/REVG0VVToGRGH2+23hsYLHdyG+GrvoUGlGAd0ErauXDyvHtRI/7H7mzLm+tBCKA7pfcpkQ1lf58iQ==", 64 | "dev": true 65 | }, 66 | "@types/range-parser": { 67 | "version": "1.2.3", 68 | "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz", 69 | "integrity": "sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==", 70 | "dev": true 71 | }, 72 | "@types/serve-static": { 73 | "version": "1.13.5", 74 | "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.5.tgz", 75 | "integrity": "sha512-6M64P58N+OXjU432WoLLBQxbA0LRGBCRm7aAGQJ+SMC1IMl0dgRVi9EFfoDcS2a7Xogygk/eGN94CfwU9UF7UQ==", 76 | "dev": true, 77 | "requires": { 78 | "@types/express-serve-static-core": "*", 79 | "@types/mime": "*" 80 | } 81 | }, 82 | "@types/stream-array": { 83 | "version": "1.1.0", 84 | "resolved": "https://registry.npmjs.org/@types/stream-array/-/stream-array-1.1.0.tgz", 85 | "integrity": "sha512-39nS0syUqgqYWKrgTa9TdBekZwzqeD8eVT/zzBekUgi28JAGlmtpRim+o8a3xuRI/Pa0s+/Jf/mYq+HNgUcY1A==", 86 | "requires": { 87 | "@types/node": "*" 88 | } 89 | }, 90 | "@types/uuid": { 91 | "version": "8.3.0", 92 | "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.0.tgz", 93 | "integrity": "sha512-eQ9qFW/fhfGJF8WKHGEHZEyVWfZxrT+6CLIJGBcZPfxUh/+BnEj+UCGYMlr9qZuX/2AltsvwrGqp0LhEW8D0zQ==", 94 | "dev": true 95 | }, 96 | "ansi-colors": { 97 | "version": "4.1.3", 98 | "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", 99 | "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", 100 | "dev": true 101 | }, 102 | "ansi-regex": { 103 | "version": "5.0.1", 104 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 105 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 106 | "dev": true 107 | }, 108 | "ansi-styles": { 109 | "version": "4.3.0", 110 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 111 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 112 | "dev": true, 113 | "requires": { 114 | "color-convert": "^2.0.1" 115 | } 116 | }, 117 | "anymatch": { 118 | "version": "3.1.3", 119 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", 120 | "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", 121 | "dev": true, 122 | "requires": { 123 | "normalize-path": "^3.0.0", 124 | "picomatch": "^2.0.4" 125 | } 126 | }, 127 | "argparse": { 128 | "version": "2.0.1", 129 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 130 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 131 | "dev": true 132 | }, 133 | "balanced-match": { 134 | "version": "1.0.2", 135 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 136 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 137 | "dev": true 138 | }, 139 | "binary-extensions": { 140 | "version": "2.3.0", 141 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", 142 | "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", 143 | "dev": true 144 | }, 145 | "brace-expansion": { 146 | "version": "2.0.1", 147 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", 148 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 149 | "dev": true, 150 | "requires": { 151 | "balanced-match": "^1.0.0" 152 | } 153 | }, 154 | "braces": { 155 | "version": "3.0.3", 156 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", 157 | "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", 158 | "dev": true, 159 | "requires": { 160 | "fill-range": "^7.1.1" 161 | } 162 | }, 163 | "browser-stdout": { 164 | "version": "1.3.1", 165 | "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", 166 | "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", 167 | "dev": true 168 | }, 169 | "buffer-shims": { 170 | "version": "1.0.0", 171 | "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", 172 | "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=" 173 | }, 174 | "camelcase": { 175 | "version": "6.3.0", 176 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", 177 | "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", 178 | "dev": true 179 | }, 180 | "chalk": { 181 | "version": "4.1.2", 182 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 183 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 184 | "dev": true, 185 | "requires": { 186 | "ansi-styles": "^4.1.0", 187 | "supports-color": "^7.1.0" 188 | }, 189 | "dependencies": { 190 | "supports-color": { 191 | "version": "7.2.0", 192 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 193 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 194 | "dev": true, 195 | "requires": { 196 | "has-flag": "^4.0.0" 197 | } 198 | } 199 | } 200 | }, 201 | "chokidar": { 202 | "version": "3.6.0", 203 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", 204 | "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", 205 | "dev": true, 206 | "requires": { 207 | "anymatch": "~3.1.2", 208 | "braces": "~3.0.2", 209 | "fsevents": "~2.3.2", 210 | "glob-parent": "~5.1.2", 211 | "is-binary-path": "~2.1.0", 212 | "is-glob": "~4.0.1", 213 | "normalize-path": "~3.0.0", 214 | "readdirp": "~3.6.0" 215 | } 216 | }, 217 | "cliui": { 218 | "version": "7.0.4", 219 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", 220 | "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", 221 | "dev": true, 222 | "requires": { 223 | "string-width": "^4.2.0", 224 | "strip-ansi": "^6.0.0", 225 | "wrap-ansi": "^7.0.0" 226 | } 227 | }, 228 | "color-convert": { 229 | "version": "2.0.1", 230 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 231 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 232 | "dev": true, 233 | "requires": { 234 | "color-name": "~1.1.4" 235 | } 236 | }, 237 | "color-name": { 238 | "version": "1.1.4", 239 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 240 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 241 | "dev": true 242 | }, 243 | "core-util-is": { 244 | "version": "1.0.2", 245 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 246 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 247 | }, 248 | "debug": { 249 | "version": "4.3.7", 250 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", 251 | "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", 252 | "dev": true, 253 | "requires": { 254 | "ms": "^2.1.3" 255 | } 256 | }, 257 | "decamelize": { 258 | "version": "4.0.0", 259 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", 260 | "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", 261 | "dev": true 262 | }, 263 | "diff": { 264 | "version": "5.2.0", 265 | "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", 266 | "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", 267 | "dev": true 268 | }, 269 | "emoji-regex": { 270 | "version": "8.0.0", 271 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 272 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 273 | "dev": true 274 | }, 275 | "escalade": { 276 | "version": "3.2.0", 277 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", 278 | "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", 279 | "dev": true 280 | }, 281 | "escape-string-regexp": { 282 | "version": "4.0.0", 283 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 284 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 285 | "dev": true 286 | }, 287 | "fill-range": { 288 | "version": "7.1.1", 289 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", 290 | "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", 291 | "dev": true, 292 | "requires": { 293 | "to-regex-range": "^5.0.1" 294 | } 295 | }, 296 | "find-up": { 297 | "version": "5.0.0", 298 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", 299 | "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", 300 | "dev": true, 301 | "requires": { 302 | "locate-path": "^6.0.0", 303 | "path-exists": "^4.0.0" 304 | } 305 | }, 306 | "flat": { 307 | "version": "5.0.2", 308 | "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", 309 | "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", 310 | "dev": true 311 | }, 312 | "fs.realpath": { 313 | "version": "1.0.0", 314 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 315 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", 316 | "dev": true 317 | }, 318 | "fsevents": { 319 | "version": "2.3.3", 320 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", 321 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", 322 | "dev": true, 323 | "optional": true 324 | }, 325 | "get-caller-file": { 326 | "version": "2.0.5", 327 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 328 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", 329 | "dev": true 330 | }, 331 | "glob": { 332 | "version": "8.1.0", 333 | "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", 334 | "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", 335 | "dev": true, 336 | "requires": { 337 | "fs.realpath": "^1.0.0", 338 | "inflight": "^1.0.4", 339 | "inherits": "2", 340 | "minimatch": "^5.0.1", 341 | "once": "^1.3.0" 342 | } 343 | }, 344 | "glob-parent": { 345 | "version": "5.1.2", 346 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 347 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 348 | "dev": true, 349 | "requires": { 350 | "is-glob": "^4.0.1" 351 | } 352 | }, 353 | "has-flag": { 354 | "version": "4.0.0", 355 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 356 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 357 | "dev": true 358 | }, 359 | "he": { 360 | "version": "1.2.0", 361 | "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", 362 | "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", 363 | "dev": true 364 | }, 365 | "inflight": { 366 | "version": "1.0.6", 367 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 368 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 369 | "dev": true, 370 | "requires": { 371 | "once": "^1.3.0", 372 | "wrappy": "1" 373 | } 374 | }, 375 | "inherits": { 376 | "version": "2.0.4", 377 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 378 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 379 | }, 380 | "is-binary-path": { 381 | "version": "2.1.0", 382 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 383 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 384 | "dev": true, 385 | "requires": { 386 | "binary-extensions": "^2.0.0" 387 | } 388 | }, 389 | "is-extglob": { 390 | "version": "2.1.1", 391 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 392 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 393 | "dev": true 394 | }, 395 | "is-fullwidth-code-point": { 396 | "version": "3.0.0", 397 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 398 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 399 | "dev": true 400 | }, 401 | "is-glob": { 402 | "version": "4.0.3", 403 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 404 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 405 | "dev": true, 406 | "requires": { 407 | "is-extglob": "^2.1.1" 408 | } 409 | }, 410 | "is-number": { 411 | "version": "7.0.0", 412 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 413 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 414 | "dev": true 415 | }, 416 | "is-plain-obj": { 417 | "version": "2.1.0", 418 | "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", 419 | "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", 420 | "dev": true 421 | }, 422 | "is-promise": { 423 | "version": "2.2.2", 424 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", 425 | "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==" 426 | }, 427 | "is-stream": { 428 | "version": "2.0.0", 429 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", 430 | "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==" 431 | }, 432 | "is-unicode-supported": { 433 | "version": "0.1.0", 434 | "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", 435 | "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", 436 | "dev": true 437 | }, 438 | "isarray": { 439 | "version": "1.0.0", 440 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 441 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 442 | }, 443 | "js-yaml": { 444 | "version": "4.1.0", 445 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", 446 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", 447 | "dev": true, 448 | "requires": { 449 | "argparse": "^2.0.1" 450 | } 451 | }, 452 | "locate-path": { 453 | "version": "6.0.0", 454 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", 455 | "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", 456 | "dev": true, 457 | "requires": { 458 | "p-locate": "^5.0.0" 459 | } 460 | }, 461 | "log-symbols": { 462 | "version": "4.1.0", 463 | "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", 464 | "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", 465 | "dev": true, 466 | "requires": { 467 | "chalk": "^4.1.0", 468 | "is-unicode-supported": "^0.1.0" 469 | } 470 | }, 471 | "minimatch": { 472 | "version": "5.1.6", 473 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", 474 | "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", 475 | "dev": true, 476 | "requires": { 477 | "brace-expansion": "^2.0.1" 478 | } 479 | }, 480 | "mocha": { 481 | "version": "10.7.3", 482 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.7.3.tgz", 483 | "integrity": "sha512-uQWxAu44wwiACGqjbPYmjo7Lg8sFrS3dQe7PP2FQI+woptP4vZXSMcfMyFL/e1yFEeEpV4RtyTpZROOKmxis+A==", 484 | "dev": true, 485 | "requires": { 486 | "ansi-colors": "^4.1.3", 487 | "browser-stdout": "^1.3.1", 488 | "chokidar": "^3.5.3", 489 | "debug": "^4.3.5", 490 | "diff": "^5.2.0", 491 | "escape-string-regexp": "^4.0.0", 492 | "find-up": "^5.0.0", 493 | "glob": "^8.1.0", 494 | "he": "^1.2.0", 495 | "js-yaml": "^4.1.0", 496 | "log-symbols": "^4.1.0", 497 | "minimatch": "^5.1.6", 498 | "ms": "^2.1.3", 499 | "serialize-javascript": "^6.0.2", 500 | "strip-json-comments": "^3.1.1", 501 | "supports-color": "^8.1.1", 502 | "workerpool": "^6.5.1", 503 | "yargs": "^16.2.0", 504 | "yargs-parser": "^20.2.9", 505 | "yargs-unparser": "^2.0.0" 506 | } 507 | }, 508 | "ms": { 509 | "version": "2.1.3", 510 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 511 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 512 | "dev": true 513 | }, 514 | "normalize-path": { 515 | "version": "3.0.0", 516 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 517 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 518 | "dev": true 519 | }, 520 | "once": { 521 | "version": "1.4.0", 522 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 523 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 524 | "dev": true, 525 | "requires": { 526 | "wrappy": "1" 527 | } 528 | }, 529 | "p-limit": { 530 | "version": "3.1.0", 531 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 532 | "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 533 | "dev": true, 534 | "requires": { 535 | "yocto-queue": "^0.1.0" 536 | } 537 | }, 538 | "p-locate": { 539 | "version": "5.0.0", 540 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", 541 | "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", 542 | "dev": true, 543 | "requires": { 544 | "p-limit": "^3.0.2" 545 | } 546 | }, 547 | "path-exists": { 548 | "version": "4.0.0", 549 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 550 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 551 | "dev": true 552 | }, 553 | "picomatch": { 554 | "version": "2.3.1", 555 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 556 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 557 | "dev": true 558 | }, 559 | "process-nextick-args": { 560 | "version": "1.0.7", 561 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", 562 | "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" 563 | }, 564 | "randombytes": { 565 | "version": "2.1.0", 566 | "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", 567 | "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", 568 | "dev": true, 569 | "requires": { 570 | "safe-buffer": "^5.1.0" 571 | } 572 | }, 573 | "readable-stream": { 574 | "version": "2.1.5", 575 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.1.5.tgz", 576 | "integrity": "sha1-ZvqLcg4UOLNkaB8q0aY8YYRIydA=", 577 | "requires": { 578 | "buffer-shims": "^1.0.0", 579 | "core-util-is": "~1.0.0", 580 | "inherits": "~2.0.1", 581 | "isarray": "~1.0.0", 582 | "process-nextick-args": "~1.0.6", 583 | "string_decoder": "~0.10.x", 584 | "util-deprecate": "~1.0.1" 585 | } 586 | }, 587 | "readdirp": { 588 | "version": "3.6.0", 589 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 590 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 591 | "dev": true, 592 | "requires": { 593 | "picomatch": "^2.2.1" 594 | } 595 | }, 596 | "require-directory": { 597 | "version": "2.1.1", 598 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 599 | "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", 600 | "dev": true 601 | }, 602 | "safe-buffer": { 603 | "version": "5.1.2", 604 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 605 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", 606 | "dev": true 607 | }, 608 | "serialize-javascript": { 609 | "version": "6.0.2", 610 | "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", 611 | "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", 612 | "dev": true, 613 | "requires": { 614 | "randombytes": "^2.1.0" 615 | } 616 | }, 617 | "stream-array": { 618 | "version": "1.1.2", 619 | "resolved": "https://registry.npmjs.org/stream-array/-/stream-array-1.1.2.tgz", 620 | "integrity": "sha1-nl9zRfITfDDuO0mLkRToC1K7frU=", 621 | "requires": { 622 | "readable-stream": "~2.1.0" 623 | } 624 | }, 625 | "string-width": { 626 | "version": "4.2.3", 627 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 628 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 629 | "dev": true, 630 | "requires": { 631 | "emoji-regex": "^8.0.0", 632 | "is-fullwidth-code-point": "^3.0.0", 633 | "strip-ansi": "^6.0.1" 634 | } 635 | }, 636 | "string_decoder": { 637 | "version": "0.10.31", 638 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", 639 | "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" 640 | }, 641 | "strip-ansi": { 642 | "version": "6.0.1", 643 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 644 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 645 | "dev": true, 646 | "requires": { 647 | "ansi-regex": "^5.0.1" 648 | } 649 | }, 650 | "strip-json-comments": { 651 | "version": "3.1.1", 652 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 653 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 654 | "dev": true 655 | }, 656 | "supports-color": { 657 | "version": "8.1.1", 658 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", 659 | "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", 660 | "dev": true, 661 | "requires": { 662 | "has-flag": "^4.0.0" 663 | } 664 | }, 665 | "through2": { 666 | "version": "2.0.5", 667 | "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", 668 | "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", 669 | "dev": true, 670 | "requires": { 671 | "readable-stream": "~2.3.6", 672 | "xtend": "~4.0.1" 673 | }, 674 | "dependencies": { 675 | "process-nextick-args": { 676 | "version": "2.0.1", 677 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 678 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", 679 | "dev": true 680 | }, 681 | "readable-stream": { 682 | "version": "2.3.7", 683 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 684 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 685 | "dev": true, 686 | "requires": { 687 | "core-util-is": "~1.0.0", 688 | "inherits": "~2.0.3", 689 | "isarray": "~1.0.0", 690 | "process-nextick-args": "~2.0.0", 691 | "safe-buffer": "~5.1.1", 692 | "string_decoder": "~1.1.1", 693 | "util-deprecate": "~1.0.1" 694 | } 695 | }, 696 | "string_decoder": { 697 | "version": "1.1.1", 698 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 699 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 700 | "dev": true, 701 | "requires": { 702 | "safe-buffer": "~5.1.0" 703 | } 704 | } 705 | } 706 | }, 707 | "to-regex-range": { 708 | "version": "5.0.1", 709 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 710 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 711 | "dev": true, 712 | "requires": { 713 | "is-number": "^7.0.0" 714 | } 715 | }, 716 | "typescript": { 717 | "version": "4.0.3", 718 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.3.tgz", 719 | "integrity": "sha512-tEu6DGxGgRJPb/mVPIZ48e69xCn2yRmCgYmDugAVwmJ6o+0u1RI18eO7E7WBTLYLaEVVOhwQmcdhQHweux/WPg==", 720 | "dev": true 721 | }, 722 | "util-deprecate": { 723 | "version": "1.0.2", 724 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 725 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 726 | }, 727 | "uuid": { 728 | "version": "8.3.1", 729 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.1.tgz", 730 | "integrity": "sha512-FOmRr+FmWEIG8uhZv6C2bTgEVXsHk08kE7mPlrBbEe+c3r9pjceVPgupIfNIhc4yx55H69OXANrUaSuu9eInKg==" 731 | }, 732 | "workerpool": { 733 | "version": "6.5.1", 734 | "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz", 735 | "integrity": "sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==", 736 | "dev": true 737 | }, 738 | "wrap-ansi": { 739 | "version": "7.0.0", 740 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 741 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 742 | "dev": true, 743 | "requires": { 744 | "ansi-styles": "^4.0.0", 745 | "string-width": "^4.1.0", 746 | "strip-ansi": "^6.0.0" 747 | } 748 | }, 749 | "wrappy": { 750 | "version": "1.0.2", 751 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 752 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 753 | "dev": true 754 | }, 755 | "xtend": { 756 | "version": "4.0.2", 757 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", 758 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", 759 | "dev": true 760 | }, 761 | "y18n": { 762 | "version": "5.0.8", 763 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", 764 | "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", 765 | "dev": true 766 | }, 767 | "yargs": { 768 | "version": "16.2.0", 769 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", 770 | "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", 771 | "dev": true, 772 | "requires": { 773 | "cliui": "^7.0.2", 774 | "escalade": "^3.1.1", 775 | "get-caller-file": "^2.0.5", 776 | "require-directory": "^2.1.1", 777 | "string-width": "^4.2.0", 778 | "y18n": "^5.0.5", 779 | "yargs-parser": "^20.2.2" 780 | } 781 | }, 782 | "yargs-parser": { 783 | "version": "20.2.9", 784 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", 785 | "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", 786 | "dev": true 787 | }, 788 | "yargs-unparser": { 789 | "version": "2.0.0", 790 | "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", 791 | "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", 792 | "dev": true, 793 | "requires": { 794 | "camelcase": "^6.0.0", 795 | "decamelize": "^4.0.0", 796 | "flat": "^5.0.2", 797 | "is-plain-obj": "^2.1.0" 798 | } 799 | }, 800 | "yocto-queue": { 801 | "version": "0.1.0", 802 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 803 | "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", 804 | "dev": true 805 | } 806 | } 807 | } 808 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "flora-tmpl-ts", 3 | "version": "2.0.0", 4 | "description": "Streaming templates for node", 5 | "main": "lib/index.js", 6 | "types": "lib/index.d.ts", 7 | "scripts": { 8 | "test": "mocha test/test.js", 9 | "debug": "node --inspect-brk node_modules/.bin/_mocha test/test.js", 10 | "build": "tsc", 11 | "watch": "tsc --watch", 12 | "install": "npm run build" 13 | }, 14 | "keywords": [ 15 | "templates" 16 | ], 17 | "author": "Matthew Phillips", 18 | "license": "BSD-2-Clause", 19 | "dependencies": { 20 | "@types/stream-array": "^1.1.0", 21 | "is-promise": "^2.1.0", 22 | "is-stream": "^2.0.0", 23 | "stream-array": "^1.1.2", 24 | "uuid": "^8.3.1" 25 | }, 26 | "devDependencies": { 27 | "@types/express": "^4.17.8", 28 | "@types/node": "^14.11.8", 29 | "@types/uuid": "^8.3.0", 30 | "mocha": "^10.7.3", 31 | "through2": "^2.0.3", 32 | "typescript": "^4.0.3" 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /test/helpers.js: -------------------------------------------------------------------------------- 1 | const through = require('through2'); 2 | 3 | async function readAll(stream) { 4 | let values = []; 5 | return new Promise((resolve, reject) => { 6 | stream.on('error', err => reject(err)); 7 | stream.pipe(through(function(val, enc, next){ 8 | values.push(val.toString().trim()); 9 | next(); 10 | }, function(){ 11 | resolve(values); 12 | })); 13 | }); 14 | } 15 | 16 | exports.readAll = readAll; 17 | -------------------------------------------------------------------------------- /test/sanity.js: -------------------------------------------------------------------------------- 1 | const {Readable} = require('stream'); 2 | const { 3 | html, map 4 | } = require('../lib'); 5 | 6 | const timeBetween = 1000; 7 | 8 | const items = [ 9 | 'Walk the dog', 10 | 'Eat food', 11 | 'Clean the kitchen', 12 | 'Mow the lawn', 13 | 'Play slots', 14 | 'Earn some money', 15 | 'Run for president' 16 | ]; 17 | 18 | const stream = new Readable({ 19 | objectMode: true, 20 | read() { 21 | let item = items.shift() || null; 22 | setTimeout(() => { 23 | this.push(item); 24 | }, timeBetween); 25 | } 26 | }); 27 | 28 | let out = html` 29 | 30 | 31 | Todo list 32 |
33 |

Todo list

34 |
    35 | ${map(stream, item => ( 36 | html` 37 |
  • ${item}
  • 38 | ` 39 | ))} 40 |
41 |
42 | `; 43 | 44 | out.pipe(process.stdout); 45 | -------------------------------------------------------------------------------- /test/test-attributes.js: -------------------------------------------------------------------------------- 1 | const assert = require('assert'); 2 | const {html, map} = require('../lib/index'); 3 | const { readAll } = require('./helpers'); 4 | 5 | describe('Attributes', function(){ 6 | it('basics works', async function(){ 7 | function tmpl({myClass, name}) { 8 | return html` 9 | Hello ${name} 10 | ` 11 | } 12 | 13 | let expected = [ 14 | 'Hello', 17 | 'Wilbur', 18 | '' 19 | ]; 20 | 21 | let values = await readAll(tmpl({ 22 | myClass: Promise.resolve().then(_ => 'blue'), 23 | name: 'Wilbur' 24 | })); 25 | 26 | assert.deepEqual(values, expected); 27 | }); 28 | }); 29 | -------------------------------------------------------------------------------- /test/test-lists.js: -------------------------------------------------------------------------------- 1 | const assert = require('assert'); 2 | const {html, map} = require('../lib/index'); 3 | const Readable = require('stream').Readable; 4 | const { readAll } = require('./helpers'); 5 | const arrayToStream = require('stream-array'); 6 | 7 | describe('Lists', function(){ 8 | describe('Streams', function(){ 9 | it('basics works', async function() { 10 | function tmpl({items}) { 11 | return html` 12 |
    13 | ${map(items, item => { 14 | return html`
  • Item ${item}
  • ` 15 | })} 16 |
17 | `; 18 | } 19 | 20 | let values = await readAll(tmpl({ 21 | items: arrayToStream([1, 2, 3]) 22 | })); 23 | 24 | let expected = [ 25 | '
    ', 26 | '
  • Item', 27 | '1', 28 | '
  • ', 29 | '
  • Item', 30 | '2', 31 | '
  • ', 32 | '
  • Item', 33 | '3', 34 | '
  • ', 35 | '
' 36 | ]; 37 | 38 | assert.deepEqual(values, expected); 39 | }); 40 | }); 41 | 42 | describe('Arrays', function(){ 43 | it('basics works', async function(){ 44 | function tmpl({items}) { 45 | return html` 46 |
    47 | ${map(items, item => { 48 | return html`
  • Item ${item}
  • ` 49 | })} 50 |
51 | `; 52 | } 53 | 54 | let values = await readAll(tmpl({ 55 | items: [1, 2, 3, 4] 56 | })); 57 | 58 | let expected = [ 59 | '
    ', 60 | '
  • Item', 61 | '1', 62 | '
  • ', 63 | '
  • Item', 64 | '2', 65 | '
  • ', 66 | '
  • Item', 67 | '3', 68 | '
  • ', 69 | '
  • Item', 70 | '4', 71 | '
  • ', 72 | '
' 73 | ]; 74 | 75 | assert.deepEqual(values, expected); 76 | }); 77 | }); 78 | }); 79 | -------------------------------------------------------------------------------- /test/test-textnodes.js: -------------------------------------------------------------------------------- 1 | const assert = require('assert'); 2 | const {html, map} = require('../lib/index'); 3 | const { readAll } = require('./helpers'); 4 | 5 | describe('TextNodes', function(){ 6 | it('basics works', async function(){ 7 | function tmpl({name}) { 8 | return html` 9 | Hello ${name}! 10 | `; 11 | } 12 | 13 | let expected = ['Hello ', 'World', '!']; 14 | 15 | let values = await readAll(tmpl({ 16 | name: Promise.resolve('World') 17 | })); 18 | 19 | assert.deepEqual(values, expected); 20 | }); 21 | 22 | it('Null/undefined values are blanks', async function(){ 23 | function tmpl(data) { 24 | return html` 25 | ${data.one}${data.two} 26 | `; 27 | } 28 | 29 | let expected = ['','','']; 30 | 31 | let values = await readAll(tmpl({ 32 | one: void 0, 33 | two: null 34 | })); 35 | 36 | assert.deepEqual(values, expected); 37 | }); 38 | 39 | it('A promise can resolve to a stream', async function(){ 40 | function tmpl({name}) { 41 | async function strongName() { 42 | return html`${name}`; 43 | } 44 | 45 | return html` 46 | Hello ${strongName()}! 47 | `; 48 | } 49 | 50 | let expected = ['Hello', '', 'World', 51 | '', '!']; 52 | 53 | let values = await readAll(tmpl({ 54 | name: Promise.resolve('World') 55 | })); 56 | 57 | assert.deepEqual(values, expected); 58 | }); 59 | }); 60 | -------------------------------------------------------------------------------- /test/test.js: -------------------------------------------------------------------------------- 1 | require('./test-textnodes.js'); 2 | require('./test-attributes.js'); 3 | require('./test-lists.js'); 4 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "noImplicitAny": true, 5 | "noImplicitThis": true, 6 | "strictNullChecks": true, 7 | "target": "es6", 8 | "declaration": true, 9 | "esModuleInterop": true, 10 | "jsx": "react", 11 | "lib": ["es2017", "dom"] 12 | }, 13 | "exclude": ["node_modules", "dist"] 14 | } 15 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@types/body-parser@*": 6 | version "1.19.5" 7 | resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.5.tgz#04ce9a3b677dc8bd681a17da1ab9835dc9d3ede4" 8 | dependencies: 9 | "@types/connect" "*" 10 | "@types/node" "*" 11 | 12 | "@types/connect@*": 13 | version "3.4.38" 14 | resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.38.tgz#5ba7f3bc4fbbdeaff8dded952e5ff2cc53f8d858" 15 | dependencies: 16 | "@types/node" "*" 17 | 18 | "@types/express-serve-static-core@^4.17.33": 19 | version "4.19.6" 20 | resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz#e01324c2a024ff367d92c66f48553ced0ab50267" 21 | dependencies: 22 | "@types/node" "*" 23 | "@types/qs" "*" 24 | "@types/range-parser" "*" 25 | "@types/send" "*" 26 | 27 | "@types/express@^4.17.8": 28 | version "4.17.21" 29 | resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.21.tgz#c26d4a151e60efe0084b23dc3369ebc631ed192d" 30 | dependencies: 31 | "@types/body-parser" "*" 32 | "@types/express-serve-static-core" "^4.17.33" 33 | "@types/qs" "*" 34 | "@types/serve-static" "*" 35 | 36 | "@types/http-errors@*": 37 | version "2.0.4" 38 | resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.4.tgz#7eb47726c391b7345a6ec35ad7f4de469cf5ba4f" 39 | 40 | "@types/mime@^1": 41 | version "1.3.5" 42 | resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.5.tgz#1ef302e01cf7d2b5a0fa526790c9123bf1d06690" 43 | 44 | "@types/node@*": 45 | version "22.7.9" 46 | resolved "https://registry.yarnpkg.com/@types/node/-/node-22.7.9.tgz#2bf2797b5e84702d8262ea2cf843c3c3c880d0e9" 47 | dependencies: 48 | undici-types "~6.19.2" 49 | 50 | "@types/node@^14.11.8": 51 | version "14.18.63" 52 | resolved "https://registry.yarnpkg.com/@types/node/-/node-14.18.63.tgz#1788fa8da838dbb5f9ea994b834278205db6ca2b" 53 | 54 | "@types/qs@*": 55 | version "6.9.16" 56 | resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.16.tgz#52bba125a07c0482d26747d5d4947a64daf8f794" 57 | 58 | "@types/range-parser@*": 59 | version "1.2.7" 60 | resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.7.tgz#50ae4353eaaddc04044279812f52c8c65857dbcb" 61 | 62 | "@types/send@*": 63 | version "0.17.4" 64 | resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.4.tgz#6619cd24e7270793702e4e6a4b958a9010cfc57a" 65 | dependencies: 66 | "@types/mime" "^1" 67 | "@types/node" "*" 68 | 69 | "@types/serve-static@*": 70 | version "1.15.7" 71 | resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.7.tgz#22174bbd74fb97fe303109738e9b5c2f3064f714" 72 | dependencies: 73 | "@types/http-errors" "*" 74 | "@types/node" "*" 75 | "@types/send" "*" 76 | 77 | "@types/stream-array@^1.1.0": 78 | version "1.1.4" 79 | resolved "https://registry.yarnpkg.com/@types/stream-array/-/stream-array-1.1.4.tgz#18c98eeef71e145a7935827729d8c59decda480c" 80 | dependencies: 81 | "@types/node" "*" 82 | 83 | "@types/uuid@^8.3.0": 84 | version "8.3.4" 85 | resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-8.3.4.tgz#bd86a43617df0594787d38b735f55c805becf1bc" 86 | 87 | ansi-colors@^4.1.3: 88 | version "4.1.3" 89 | resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" 90 | 91 | ansi-regex@^5.0.1: 92 | version "5.0.1" 93 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" 94 | 95 | ansi-styles@^4.0.0, ansi-styles@^4.1.0: 96 | version "4.3.0" 97 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" 98 | dependencies: 99 | color-convert "^2.0.1" 100 | 101 | anymatch@~3.1.2: 102 | version "3.1.3" 103 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" 104 | dependencies: 105 | normalize-path "^3.0.0" 106 | picomatch "^2.0.4" 107 | 108 | argparse@^2.0.1: 109 | version "2.0.1" 110 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" 111 | 112 | balanced-match@^1.0.0: 113 | version "1.0.0" 114 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 115 | 116 | binary-extensions@^2.0.0: 117 | version "2.3.0" 118 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" 119 | 120 | brace-expansion@^2.0.1: 121 | version "2.0.1" 122 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" 123 | dependencies: 124 | balanced-match "^1.0.0" 125 | 126 | braces@~3.0.2: 127 | version "3.0.3" 128 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" 129 | dependencies: 130 | fill-range "^7.1.1" 131 | 132 | browser-stdout@^1.3.1: 133 | version "1.3.1" 134 | resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" 135 | 136 | buffer-shims@^1.0.0: 137 | version "1.0.0" 138 | resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" 139 | 140 | camelcase@^6.0.0: 141 | version "6.3.0" 142 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" 143 | 144 | chalk@^4.1.0: 145 | version "4.1.2" 146 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" 147 | dependencies: 148 | ansi-styles "^4.1.0" 149 | supports-color "^7.1.0" 150 | 151 | chokidar@^3.5.3: 152 | version "3.6.0" 153 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" 154 | dependencies: 155 | anymatch "~3.1.2" 156 | braces "~3.0.2" 157 | glob-parent "~5.1.2" 158 | is-binary-path "~2.1.0" 159 | is-glob "~4.0.1" 160 | normalize-path "~3.0.0" 161 | readdirp "~3.6.0" 162 | optionalDependencies: 163 | fsevents "~2.3.2" 164 | 165 | cliui@^7.0.2: 166 | version "7.0.4" 167 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" 168 | dependencies: 169 | string-width "^4.2.0" 170 | strip-ansi "^6.0.0" 171 | wrap-ansi "^7.0.0" 172 | 173 | color-convert@^2.0.1: 174 | version "2.0.1" 175 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 176 | dependencies: 177 | color-name "~1.1.4" 178 | 179 | color-name@~1.1.4: 180 | version "1.1.4" 181 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 182 | 183 | core-util-is@~1.0.0: 184 | version "1.0.2" 185 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 186 | 187 | debug@^4.3.5: 188 | version "4.3.7" 189 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" 190 | dependencies: 191 | ms "^2.1.3" 192 | 193 | decamelize@^4.0.0: 194 | version "4.0.0" 195 | resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" 196 | 197 | diff@^5.2.0: 198 | version "5.2.0" 199 | resolved "https://registry.yarnpkg.com/diff/-/diff-5.2.0.tgz#26ded047cd1179b78b9537d5ef725503ce1ae531" 200 | 201 | emoji-regex@^8.0.0: 202 | version "8.0.0" 203 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" 204 | 205 | escalade@^3.1.1: 206 | version "3.2.0" 207 | resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" 208 | 209 | escape-string-regexp@^4.0.0: 210 | version "4.0.0" 211 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" 212 | 213 | fill-range@^7.1.1: 214 | version "7.1.1" 215 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" 216 | dependencies: 217 | to-regex-range "^5.0.1" 218 | 219 | find-up@^5.0.0: 220 | version "5.0.0" 221 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" 222 | dependencies: 223 | locate-path "^6.0.0" 224 | path-exists "^4.0.0" 225 | 226 | flat@^5.0.2: 227 | version "5.0.2" 228 | resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" 229 | 230 | fs.realpath@^1.0.0: 231 | version "1.0.0" 232 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 233 | 234 | fsevents@~2.3.2: 235 | version "2.3.3" 236 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" 237 | 238 | get-caller-file@^2.0.5: 239 | version "2.0.5" 240 | resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" 241 | 242 | glob-parent@~5.1.2: 243 | version "5.1.2" 244 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" 245 | dependencies: 246 | is-glob "^4.0.1" 247 | 248 | glob@^8.1.0: 249 | version "8.1.0" 250 | resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" 251 | dependencies: 252 | fs.realpath "^1.0.0" 253 | inflight "^1.0.4" 254 | inherits "2" 255 | minimatch "^5.0.1" 256 | once "^1.3.0" 257 | 258 | has-flag@^4.0.0: 259 | version "4.0.0" 260 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 261 | 262 | he@^1.2.0: 263 | version "1.2.0" 264 | resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" 265 | 266 | inflight@^1.0.4: 267 | version "1.0.6" 268 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 269 | dependencies: 270 | once "^1.3.0" 271 | wrappy "1" 272 | 273 | inherits@2, inherits@~2.0.1, inherits@~2.0.3: 274 | version "2.0.3" 275 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 276 | 277 | is-binary-path@~2.1.0: 278 | version "2.1.0" 279 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" 280 | dependencies: 281 | binary-extensions "^2.0.0" 282 | 283 | is-extglob@^2.1.1: 284 | version "2.1.1" 285 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 286 | 287 | is-fullwidth-code-point@^3.0.0: 288 | version "3.0.0" 289 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" 290 | 291 | is-glob@^4.0.1, is-glob@~4.0.1: 292 | version "4.0.3" 293 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" 294 | dependencies: 295 | is-extglob "^2.1.1" 296 | 297 | is-number@^7.0.0: 298 | version "7.0.0" 299 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 300 | 301 | is-plain-obj@^2.1.0: 302 | version "2.1.0" 303 | resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" 304 | 305 | is-promise@^2.1.0: 306 | version "2.1.0" 307 | resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" 308 | 309 | is-stream@^2.0.0: 310 | version "2.0.1" 311 | resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" 312 | 313 | is-unicode-supported@^0.1.0: 314 | version "0.1.0" 315 | resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" 316 | 317 | isarray@~1.0.0: 318 | version "1.0.0" 319 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 320 | 321 | js-yaml@^4.1.0: 322 | version "4.1.0" 323 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" 324 | dependencies: 325 | argparse "^2.0.1" 326 | 327 | locate-path@^6.0.0: 328 | version "6.0.0" 329 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" 330 | dependencies: 331 | p-locate "^5.0.0" 332 | 333 | log-symbols@^4.1.0: 334 | version "4.1.0" 335 | resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" 336 | dependencies: 337 | chalk "^4.1.0" 338 | is-unicode-supported "^0.1.0" 339 | 340 | minimatch@^5.0.1, minimatch@^5.1.6: 341 | version "5.1.6" 342 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" 343 | dependencies: 344 | brace-expansion "^2.0.1" 345 | 346 | mocha@^10.7.3: 347 | version "10.7.3" 348 | resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.7.3.tgz#ae32003cabbd52b59aece17846056a68eb4b0752" 349 | dependencies: 350 | ansi-colors "^4.1.3" 351 | browser-stdout "^1.3.1" 352 | chokidar "^3.5.3" 353 | debug "^4.3.5" 354 | diff "^5.2.0" 355 | escape-string-regexp "^4.0.0" 356 | find-up "^5.0.0" 357 | glob "^8.1.0" 358 | he "^1.2.0" 359 | js-yaml "^4.1.0" 360 | log-symbols "^4.1.0" 361 | minimatch "^5.1.6" 362 | ms "^2.1.3" 363 | serialize-javascript "^6.0.2" 364 | strip-json-comments "^3.1.1" 365 | supports-color "^8.1.1" 366 | workerpool "^6.5.1" 367 | yargs "^16.2.0" 368 | yargs-parser "^20.2.9" 369 | yargs-unparser "^2.0.0" 370 | 371 | ms@^2.1.3: 372 | version "2.1.3" 373 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" 374 | 375 | normalize-path@^3.0.0, normalize-path@~3.0.0: 376 | version "3.0.0" 377 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" 378 | 379 | once@^1.3.0: 380 | version "1.4.0" 381 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 382 | dependencies: 383 | wrappy "1" 384 | 385 | p-limit@^3.0.2: 386 | version "3.1.0" 387 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" 388 | dependencies: 389 | yocto-queue "^0.1.0" 390 | 391 | p-locate@^5.0.0: 392 | version "5.0.0" 393 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" 394 | dependencies: 395 | p-limit "^3.0.2" 396 | 397 | path-exists@^4.0.0: 398 | version "4.0.0" 399 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" 400 | 401 | picomatch@^2.0.4, picomatch@^2.2.1: 402 | version "2.3.1" 403 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" 404 | 405 | process-nextick-args@~1.0.6: 406 | version "1.0.7" 407 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" 408 | 409 | randombytes@^2.1.0: 410 | version "2.1.0" 411 | resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" 412 | dependencies: 413 | safe-buffer "^5.1.0" 414 | 415 | readable-stream@^2.1.5: 416 | version "2.3.3" 417 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" 418 | dependencies: 419 | core-util-is "~1.0.0" 420 | inherits "~2.0.3" 421 | isarray "~1.0.0" 422 | process-nextick-args "~1.0.6" 423 | safe-buffer "~5.1.1" 424 | string_decoder "~1.0.3" 425 | util-deprecate "~1.0.1" 426 | 427 | readable-stream@~2.1.0: 428 | version "2.1.5" 429 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.1.5.tgz#66fa8b720e1438b364681f2ad1a63c618448c9d0" 430 | dependencies: 431 | buffer-shims "^1.0.0" 432 | core-util-is "~1.0.0" 433 | inherits "~2.0.1" 434 | isarray "~1.0.0" 435 | process-nextick-args "~1.0.6" 436 | string_decoder "~0.10.x" 437 | util-deprecate "~1.0.1" 438 | 439 | readdirp@~3.6.0: 440 | version "3.6.0" 441 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" 442 | dependencies: 443 | picomatch "^2.2.1" 444 | 445 | require-directory@^2.1.1: 446 | version "2.1.1" 447 | resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" 448 | 449 | safe-buffer@^5.1.0: 450 | version "5.2.1" 451 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" 452 | 453 | safe-buffer@~5.1.0, safe-buffer@~5.1.1: 454 | version "5.1.1" 455 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" 456 | 457 | serialize-javascript@^6.0.2: 458 | version "6.0.2" 459 | resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2" 460 | dependencies: 461 | randombytes "^2.1.0" 462 | 463 | stream-array@^1.1.2: 464 | version "1.1.2" 465 | resolved "https://registry.yarnpkg.com/stream-array/-/stream-array-1.1.2.tgz#9e5f7345f2137c30ee3b498b9114e80b52bb7eb5" 466 | dependencies: 467 | readable-stream "~2.1.0" 468 | 469 | string-width@^4.1.0, string-width@^4.2.0: 470 | version "4.2.3" 471 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" 472 | dependencies: 473 | emoji-regex "^8.0.0" 474 | is-fullwidth-code-point "^3.0.0" 475 | strip-ansi "^6.0.1" 476 | 477 | string_decoder@~0.10.x: 478 | version "0.10.31" 479 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" 480 | 481 | string_decoder@~1.0.3: 482 | version "1.0.3" 483 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" 484 | dependencies: 485 | safe-buffer "~5.1.0" 486 | 487 | strip-ansi@^6.0.0, strip-ansi@^6.0.1: 488 | version "6.0.1" 489 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" 490 | dependencies: 491 | ansi-regex "^5.0.1" 492 | 493 | strip-json-comments@^3.1.1: 494 | version "3.1.1" 495 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" 496 | 497 | supports-color@^7.1.0: 498 | version "7.2.0" 499 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" 500 | dependencies: 501 | has-flag "^4.0.0" 502 | 503 | supports-color@^8.1.1: 504 | version "8.1.1" 505 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" 506 | dependencies: 507 | has-flag "^4.0.0" 508 | 509 | through2@^2.0.3: 510 | version "2.0.3" 511 | resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" 512 | dependencies: 513 | readable-stream "^2.1.5" 514 | xtend "~4.0.1" 515 | 516 | to-regex-range@^5.0.1: 517 | version "5.0.1" 518 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 519 | dependencies: 520 | is-number "^7.0.0" 521 | 522 | typescript@^4.0.3: 523 | version "4.9.5" 524 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" 525 | 526 | undici-types@~6.19.2: 527 | version "6.19.8" 528 | resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" 529 | 530 | util-deprecate@~1.0.1: 531 | version "1.0.2" 532 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 533 | 534 | uuid@^8.3.1: 535 | version "8.3.2" 536 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" 537 | 538 | workerpool@^6.5.1: 539 | version "6.5.1" 540 | resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.5.1.tgz#060f73b39d0caf97c6db64da004cd01b4c099544" 541 | 542 | wrap-ansi@^7.0.0: 543 | version "7.0.0" 544 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" 545 | dependencies: 546 | ansi-styles "^4.0.0" 547 | string-width "^4.1.0" 548 | strip-ansi "^6.0.0" 549 | 550 | wrappy@1: 551 | version "1.0.2" 552 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 553 | 554 | xtend@~4.0.1: 555 | version "4.0.1" 556 | resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" 557 | 558 | y18n@^5.0.5: 559 | version "5.0.8" 560 | resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" 561 | 562 | yargs-parser@^20.2.2, yargs-parser@^20.2.9: 563 | version "20.2.9" 564 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" 565 | 566 | yargs-unparser@^2.0.0: 567 | version "2.0.0" 568 | resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" 569 | dependencies: 570 | camelcase "^6.0.0" 571 | decamelize "^4.0.0" 572 | flat "^5.0.2" 573 | is-plain-obj "^2.1.0" 574 | 575 | yargs@^16.2.0: 576 | version "16.2.0" 577 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" 578 | dependencies: 579 | cliui "^7.0.2" 580 | escalade "^3.1.1" 581 | get-caller-file "^2.0.5" 582 | require-directory "^2.1.1" 583 | string-width "^4.2.0" 584 | y18n "^5.0.5" 585 | yargs-parser "^20.2.2" 586 | 587 | yocto-queue@^0.1.0: 588 | version "0.1.0" 589 | resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" 590 | --------------------------------------------------------------------------------