├── .github └── workflows │ └── node.js.yml ├── .gitignore ├── .npmignore ├── LICENSE ├── README.md ├── bin └── index.js ├── dark.svg ├── index.d.ts ├── lib └── directory-tree.js ├── package-lock.json ├── package.json └── test ├── depth ├── fixtureFirstDepth.js ├── fixtureSecondDepth.js └── fixtureZeroDepth.js ├── fixture.js ├── fixtureExclude.js ├── fixtureMultipleExclude.js ├── fixtureSymlink.js ├── test.js └── test_data ├── file_a.txt ├── file_b.txt ├── some_dir ├── another_dir │ ├── file_a.txt │ └── file_b.txt ├── file_a.txt └── file_b.txt ├── some_dir_2 └── .gitkeep └── symlink /.github/workflows/node.js.yml: -------------------------------------------------------------------------------- 1 | # 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 2 | # For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions 3 | 4 | name: Node.js CI 5 | 6 | on: 7 | push: 8 | branches: [ master ] 9 | pull_request: 10 | branches: [ master ] 11 | 12 | jobs: 13 | build: 14 | 15 | runs-on: ubuntu-latest 16 | 17 | strategy: 18 | matrix: 19 | node-version: [22.x] 20 | # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ 21 | 22 | steps: 23 | - uses: actions/checkout@v2 24 | - name: Use Node.js ${{ matrix.node-version }} 25 | uses: actions/setup-node@v4 26 | with: 27 | node-version: ${{ matrix.node-version }} 28 | - run: npm ci 29 | - run: npm run build --if-present 30 | - run: npm test 31 | - run: npm run test-ts 32 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules/ 3 | .vscode/ 4 | .idea 5 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | test 2 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Mihnea Dobrescu-Balaur 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # directory-tree 2 | 3 | Creates a JavaScript object representing a directory tree. 4 | 5 | This library gets [~100k downloads per week](http://npm-stats.org/#/directory-tree). If you find it useful, feel free to 6 | 7 | ## Install 8 | 9 | ```bash 10 | $ npm install directory-tree 11 | ``` 12 | 13 | ## Usage 14 | 15 | ```js 16 | const dirTree = require("directory-tree"); 17 | const tree = dirTree("/some/path"); 18 | ``` 19 | 20 | And you can also filter by an extensions regex: 21 | This is useful for including only certain types of files. 22 | 23 | ```js 24 | const dirTree = require("directory-tree"); 25 | const filteredTree = dirTree("/some/path", { extensions: /\.txt/ }); 26 | ``` 27 | 28 | Example for filtering multiple extensions with Regex. 29 | 30 | ```js 31 | const dirTree = require("directory-tree"); 32 | const filteredTree = dirTree("/some/path", { 33 | extensions: /\.(md|js|html|java|py|rb)$/ 34 | }); 35 | ``` 36 | 37 | You can also exclude paths from the tree using a regex: 38 | 39 | ```js 40 | const dirTree = require("directory-tree"); 41 | const filteredTree = dirTree("/some/path", { exclude: /some_path_to_exclude/ }); 42 | ``` 43 | 44 | You can also specify which additional attributes you would like to be included about each file/directory: 45 | 46 | ```js 47 | const dirTree = require('directory-tree'); 48 | const filteredTree = dirTree('/some/path', {attributes:['mode', 'mtime']}); 49 | ``` 50 | 51 | The default attributes are `[name, path]` for Files and `[name, path, children]` for Directories 52 | 53 | A callback function can be executed with each file that matches the extensions provided: 54 | 55 | ```js 56 | const PATH = require('path'); 57 | const dirTree = require('directory-tree'); 58 | 59 | const tree = dirTree('./test/test_data', {extensions:/\.txt$/}, (item, PATH, stats) => { 60 | console.log(item); 61 | }); 62 | ``` 63 | 64 | The callback function takes the directory item (has path, name, size, and extension) and an instance of [node path](https://nodejs.org/api/path.html) and an instance of [node FS.stats](https://nodejs.org/api/fs.html#fs_class_fs_stats). 65 | 66 | You can also pass a callback function for directories: 67 | ```js 68 | const PATH = require('path'); 69 | const dirTree = require('directory-tree'); 70 | 71 | const tree = dirTree('./test/test_data', {extensions:/\.txt$/}, null, (item, PATH, stats) => { 72 | console.log(item); 73 | }); 74 | ``` 75 | 76 | ## Options 77 | 78 | `exclude` : `RegExp|RegExp[]` - A RegExp or an array of RegExp to test for exclusion of directories. 79 | 80 | `extensions` : `RegExp` - A RegExp to test for exclusion of files with the matching extension. 81 | 82 | `attributes` : `string[]` - Array of [FS.stats](https://nodejs.org/api/fs.html#fs_class_fs_stats) attributes. 83 | 84 | `normalizePath` : `Boolean` - If true, Windows style paths will be normalized to UNIX style paths (/ instead of \\). 85 | 86 | `depth` : `number` - If presented, reads so many nested dirs as specified in argument. Usage of size attribute with depth option is prohibited. 87 | 88 | ## Result 89 | 90 | Given a directory structured like this: 91 | 92 | ``` 93 | photos 94 | ├── summer 95 | │   └── june 96 | │   └── windsurf.jpg 97 | └── winter 98 | └── january 99 | ├── ski.png 100 | └── snowboard.jpg 101 | ``` 102 | 103 | `directory-tree` with `attributes: ["size", "type", "extension"]` will return this JS object: 104 | 105 | ```json 106 | { 107 | "path": "photos", 108 | "name": "photos", 109 | "size": 600, 110 | "type": "directory", 111 | "children": [ 112 | { 113 | "path": "photos/summer", 114 | "name": "summer", 115 | "size": 400, 116 | "type": "directory", 117 | "children": [ 118 | { 119 | "path": "photos/summer/june", 120 | "name": "june", 121 | "size": 400, 122 | "type": "directory", 123 | "children": [ 124 | { 125 | "path": "photos/summer/june/windsurf.jpg", 126 | "name": "windsurf.jpg", 127 | "size": 400, 128 | "type": "file", 129 | "extension": ".jpg" 130 | } 131 | ] 132 | } 133 | ] 134 | }, 135 | { 136 | "path": "photos/winter", 137 | "name": "winter", 138 | "size": 200, 139 | "type": "directory", 140 | "children": [ 141 | { 142 | "path": "photos/winter/january", 143 | "name": "january", 144 | "size": 200, 145 | "type": "directory", 146 | "children": [ 147 | { 148 | "path": "photos/winter/january/ski.png", 149 | "name": "ski.png", 150 | "size": 100, 151 | "type": "file", 152 | "extension": ".png" 153 | }, 154 | { 155 | "path": "photos/winter/january/snowboard.jpg", 156 | "name": "snowboard.jpg", 157 | "size": 100, 158 | "type": "file", 159 | "extension": ".jpg" 160 | } 161 | ] 162 | } 163 | ] 164 | } 165 | ] 166 | } 167 | ``` 168 | 169 | ## Adding custom fields 170 | You can easily extend a `DirectoryTree` object with custom fields by adding them to the custom field. 171 | For example add an `id` based on the path of a `DirectoryTree` object for each directory and file like so: 172 | ``` 173 | import { createHash } from 'crypto'; 174 | import * as directoryTree from 'directory-tree'; 175 | import { DirectoryTree, DirectoryTreeOptions, DirectoryTreeCallback } from 'directory-tree'; 176 | 177 | const callback: DirectoryTreeCallback = ( 178 | item: DirectoryTree, 179 | path: string 180 | ) => { 181 | item.custom = {id: createHash('sha1').update(path).digest('base64')}; 182 | }; 183 | 184 | const dirTree: DirectoryTree & { id?: string } = directoryTree( 185 | "", 186 | {}, 187 | callback, 188 | callback 189 | ); 190 | 191 | // to explore the object with the new custom fields 192 | console.log(JSON.stringify(dirTree, null, 2)); 193 | 194 | ``` 195 | 196 | ## Note 197 | 198 | Device, FIFO and socket files are ignored. 199 | 200 | Files to which the user does not have permissions are included in the directory 201 | tree, however, directories to which the user does not have permissions, along 202 | with all of its contained files, are completely ignored. 203 | 204 | ## Dev 205 | 206 | To run tests go the package root in your CLI and run, 207 | 208 | ```bash 209 | $ npm test 210 | ``` 211 | 212 | Make sure you have the dev dependencies installed (e.g. `npm install .`) 213 | 214 | ## CLI usage 215 | 216 | You can use script directly from command line for generating json data. 217 | 218 | ```bash 219 | $ npx directory-tree --help 220 | ``` 221 | ```bash 222 | $ npx directory-tree --path /Users/user/target --attributes type,extension --pretty -o ./xz.json --depth 1 223 | ``` 224 | 225 | ### Available options 226 | -p, --path string 🗂 The input folder to process. Required. 227 | -e, --exclude string 🐒 Exclude some folders from processing by regexp string. Ex -e "test_data/some_dir$|js|.DS_Store" 228 | -o, --output string 📝 Put result into file provided by this options. Overwrites if exists. 229 | -d, --depth number ☞ Reads dirs in deep as specified. Usage of size attribute with depth option is prohibited. 230 | --attributes string ℹ️ Grab file attributes. Example: --attributes size,type,extension. Usage of size attribute with depth option is prohibited 231 | --pretty 💎 Json pretty print 232 | -------------------------------------------------------------------------------- /bin/index.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | const fs = require('fs'); 4 | const commandLineUsage = require('command-line-usage') 5 | const commandLineArgs = require('command-line-args') 6 | const directoryTree = require('../lib/directory-tree'); 7 | 8 | const optionList = [ 9 | { 10 | name: 'path', 11 | alias: 'p', 12 | required: true, 13 | defaultOption: true, 14 | typeLabel: '{underline string}', 15 | description: '🗂 The input folder to process. Required.' 16 | }, 17 | { 18 | name: 'exclude', 19 | alias: 'e', 20 | type: String, 21 | description: '🐒 Exclude some folders from processing by regexp string. Ex -e "test_data/some_dir$|js|.DS_Store"' 22 | }, 23 | { 24 | name: 'output', 25 | alias: 'o', 26 | type: String, 27 | description: '📝 Put result into file provided by this options. Overwrites if exists.' 28 | }, 29 | { 30 | name: 'depth', 31 | alias: 'd', 32 | type: Number, 33 | description: '☞ Reads dirs in deep as specified. Usage of size attribute with depth option is prohibited.' 34 | }, 35 | { 36 | name: 'attributes', 37 | type: String, 38 | description: 'ℹ️ Grab file attributes. Example: --attributes size,type,extension. Usage of size attribute with depth option is prohibited' 39 | }, 40 | { 41 | name: 'pretty', 42 | type: Boolean, 43 | description: '💎 Json pretty print' 44 | }, 45 | { 46 | name: 'help', 47 | alias: 'h', 48 | type: Boolean, 49 | description: '⁉️ Print this usage guide.' 50 | } 51 | ] 52 | 53 | const usageNotes = [ 54 | { 55 | header: '⛄️️ Folder-tree command line script', 56 | content: 'Used for generates json representation of folder internals' 57 | }, 58 | { 59 | header: '🔥 Options 🔥', 60 | optionList: optionList 61 | } 62 | ] 63 | 64 | const usage = commandLineUsage(usageNotes) 65 | let options = null; 66 | try { 67 | options = commandLineArgs(optionList) 68 | } catch(e) { 69 | console.log(usage); 70 | return; 71 | } 72 | 73 | if (Object.keys(options).length === 0 || options.help || !options.path) { 74 | console.log(usage) 75 | return; 76 | } 77 | 78 | if (!fs.existsSync(options.path)) { 79 | console.log('-----------------------------------------------------------------------------------------------------') 80 | console.log(`doesn't exist; please check your args`); 81 | console.log('-----------------------------------------------------------------------------------------------------') 82 | console.log(usage) 83 | return; 84 | } 85 | 86 | try { 87 | const result = directoryTree(options.path, { 88 | depth: options.depth, 89 | exclude: options.exclude ? [new RegExp(options.exclude)] : undefined, 90 | attributes: options.attributes ? options.attributes.split(',') : undefined 91 | }) 92 | 93 | const resultString = JSON.stringify(result, null, options.pretty ? ' ' : ''); 94 | if (options.output) { 95 | fs.writeFileSync(options.output, resultString); 96 | } else { 97 | console.log(resultString); 98 | } 99 | } catch(e) { 100 | console.log(e); 101 | console.log(usage); 102 | } 103 | -------------------------------------------------------------------------------- /dark.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 15 | 16 | 18 | 19 | 56 | 57 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 116 | 117 | 118 | 119 | -------------------------------------------------------------------------------- /index.d.ts: -------------------------------------------------------------------------------- 1 | import { Stats } from "fs"; 2 | 3 | declare function directoryTree< 4 | TCustomFile extends Record = Record, 5 | TCustomDir extends Record = Record, 6 | TCustomResult extends Record = TCustomFile & TCustomDir 7 | >( 8 | path: string, 9 | options?: directoryTree.DirectoryTreeOptions, 10 | onEachFile?: directoryTree.DirectoryTreeCallback, 11 | onEachDirectory?: directoryTree.DirectoryTreeCallback 12 | ): directoryTree.DirectoryTree; 13 | 14 | export as namespace directoryTree; 15 | 16 | declare namespace directoryTree { 17 | export interface DirectoryTree = Record> { 18 | path: string; 19 | name: string; 20 | size: number; 21 | type: "directory" | "file"; 22 | children?: DirectoryTree[]; 23 | extension?: string; 24 | isSymbolicLink?: boolean; 25 | custom?: C; 26 | } 27 | 28 | export interface DirectoryTreeOptions { 29 | normalizePath?: boolean; 30 | exclude?: RegExp | RegExp[]; 31 | attributes?: (keyof Stats | "type" | "extension")[]; 32 | extensions?: RegExp; 33 | followSymlinks?: boolean; 34 | depth?: number; 35 | } 36 | 37 | export type DirectoryTreeCallback = Record> = ( 38 | item: DirectoryTree, 39 | path: string, 40 | stats: Stats 41 | ) => void; 42 | } 43 | 44 | export = directoryTree; 45 | -------------------------------------------------------------------------------- /lib/directory-tree.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const FS = require('fs'); 4 | const PATH = require('path'); 5 | const constants = { 6 | DIRECTORY: 'directory', 7 | FILE: 'file' 8 | } 9 | 10 | function safeReadDirSync (path) { 11 | let dirData = {}; 12 | try { 13 | dirData = FS.readdirSync(path); 14 | } catch(ex) { 15 | if (ex.code == "EACCES" || ex.code == "EPERM") { 16 | //User does not have permissions, ignore directory 17 | return null; 18 | } 19 | else throw ex; 20 | } 21 | return dirData; 22 | } 23 | 24 | /** 25 | * Normalizes Windows style paths by replacing double backslashes with single forward slashes (UNIX style). 26 | * @param {string} path 27 | * @return {string} 28 | */ 29 | function normalizePath(path) { 30 | return path.replace(/\\/g, '/'); 31 | } 32 | 33 | /** 34 | * Tests if the supplied parameter is of type RegExp 35 | * @param {any} regExp 36 | * @return {Boolean} 37 | */ 38 | function isRegExp(regExp) { 39 | return typeof regExp === "object" && regExp.constructor == RegExp; 40 | } 41 | 42 | /** 43 | * Collects the files and folders for a directory path into an Object, subject 44 | * to the options supplied, and invoking optional 45 | * @param {String} path 46 | * @param {Object} options 47 | * @param {function} onEachFile 48 | * @param {function} onEachDirectory 49 | * @return {Object} 50 | */ 51 | function directoryTree (path, options, onEachFile, onEachDirectory, currentDepth = 0) { 52 | options = options || {}; 53 | 54 | if (options.depth !== undefined && options.attributes && options.attributes.indexOf('size') !== -1) { 55 | throw new Error('usage of size attribute with depth option is prohibited'); 56 | } 57 | 58 | const name = PATH.basename(path); 59 | path = options.normalizePath ? normalizePath(path) : path; 60 | const item = { path, name }; 61 | let stats; 62 | let lstat; 63 | 64 | try { 65 | stats = FS.statSync(path); 66 | lstat = FS.lstatSync(path); 67 | } 68 | catch (e) { return null } 69 | 70 | // Skip if it matches the exclude regex 71 | if (options.exclude) { 72 | const excludes = isRegExp(options.exclude) ? [options.exclude] : options.exclude; 73 | if (excludes.some((exclusion) => exclusion.test(path))) { 74 | return null; 75 | } 76 | } 77 | 78 | if (lstat.isSymbolicLink()) { 79 | item.isSymbolicLink = true; 80 | // Skip if symbolic links should not be followed 81 | if (options.followSymlinks === false) 82 | return null; 83 | // Initialize the symbolic links array to avoid infinite loops 84 | if (!options.symlinks) 85 | options = { ...options, symlinks: [] }; 86 | // Skip if a cyclic symbolic link has been found 87 | if (options.symlinks.find(ino => ino === lstat.ino)) { 88 | return null; 89 | } else { 90 | options.symlinks.push(lstat.ino); 91 | } 92 | } 93 | 94 | if (stats.isFile()) { 95 | 96 | const ext = PATH.extname(path).toLowerCase(); 97 | 98 | // Skip if it does not match the extension regex 99 | if (options.extensions && !options.extensions.test(ext)) 100 | return null; 101 | 102 | 103 | if (options.attributes) { 104 | options.attributes.forEach((attribute) => { 105 | switch (attribute) { 106 | case 'extension': 107 | item.extension = ext; 108 | break; 109 | case 'type': 110 | item.type = constants.FILE; 111 | break; 112 | default: 113 | item[attribute] = stats[attribute]; 114 | break; 115 | } 116 | }); 117 | } 118 | 119 | if (onEachFile) { 120 | onEachFile(item, path, stats); 121 | } 122 | } 123 | else if (stats.isDirectory()) { 124 | let dirData = safeReadDirSync(path); 125 | if (dirData === null) return null; 126 | 127 | if (options.depth === undefined || options.depth > currentDepth) { 128 | item.children = dirData 129 | .map(child => directoryTree(PATH.join(path, child), options, onEachFile, onEachDirectory, currentDepth + 1)) 130 | .filter(e => !!e); 131 | } 132 | 133 | if (options.attributes) { 134 | options.attributes.forEach((attribute) => { 135 | switch (attribute) { 136 | case 'size': 137 | item.size = item.children.reduce((prev, cur) => prev + cur.size, 0); 138 | break; 139 | case 'type': 140 | item.type = constants.DIRECTORY; 141 | break; 142 | case 'extension': 143 | break; 144 | default: 145 | item[attribute] = stats[attribute]; 146 | break; 147 | } 148 | 149 | }); 150 | } 151 | 152 | if (onEachDirectory) { 153 | onEachDirectory(item, path, stats); 154 | } 155 | } else { 156 | return null; // Or set item.size = 0 for devices, FIFO and sockets ? 157 | } 158 | return item; 159 | } 160 | 161 | module.exports = directoryTree; 162 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "directory-tree", 3 | "version": "3.5.2", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "directory-tree", 9 | "version": "3.5.2", 10 | "license": "MIT", 11 | "dependencies": { 12 | "command-line-args": "^5.2.0", 13 | "command-line-usage": "^6.1.1" 14 | }, 15 | "bin": { 16 | "directory-tree": "bin/index.js" 17 | }, 18 | "devDependencies": { 19 | "@types/node": "^18.11.17", 20 | "chai": "^2.3.0", 21 | "mocha": "^10.2.0", 22 | "typescript": "^4.9.4" 23 | }, 24 | "engines": { 25 | "node": ">=10.0" 26 | } 27 | }, 28 | "node_modules/@types/node": { 29 | "version": "18.11.17", 30 | "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.17.tgz", 31 | "integrity": "sha512-HJSUJmni4BeDHhfzn6nF0sVmd1SMezP7/4F0Lq+aXzmp2xm9O7WXrUtHW/CHlYVtZUbByEvWidHqRtcJXGF2Ng==", 32 | "dev": true 33 | }, 34 | "node_modules/ansi-colors": { 35 | "version": "4.1.3", 36 | "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", 37 | "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", 38 | "dev": true, 39 | "license": "MIT", 40 | "engines": { 41 | "node": ">=6" 42 | } 43 | }, 44 | "node_modules/ansi-styles": { 45 | "version": "4.3.0", 46 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 47 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 48 | "dev": true, 49 | "dependencies": { 50 | "color-convert": "^2.0.1" 51 | }, 52 | "engines": { 53 | "node": ">=8" 54 | } 55 | }, 56 | "node_modules/anymatch": { 57 | "version": "3.1.3", 58 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", 59 | "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", 60 | "dev": true, 61 | "dependencies": { 62 | "normalize-path": "^3.0.0", 63 | "picomatch": "^2.0.4" 64 | }, 65 | "engines": { 66 | "node": ">= 8" 67 | } 68 | }, 69 | "node_modules/argparse": { 70 | "version": "2.0.1", 71 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 72 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 73 | "dev": true 74 | }, 75 | "node_modules/array-back": { 76 | "version": "3.1.0", 77 | "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", 78 | "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", 79 | "engines": { 80 | "node": ">=6" 81 | } 82 | }, 83 | "node_modules/assertion-error": { 84 | "version": "1.0.0", 85 | "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.0.0.tgz", 86 | "integrity": "sha1-x/hUOP3UZrx8oWq5DIFRN5el0js=", 87 | "dev": true, 88 | "engines": { 89 | "node": "*" 90 | } 91 | }, 92 | "node_modules/balanced-match": { 93 | "version": "1.0.2", 94 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 95 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 96 | "dev": true, 97 | "license": "MIT" 98 | }, 99 | "node_modules/binary-extensions": { 100 | "version": "2.2.0", 101 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 102 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", 103 | "dev": true, 104 | "engines": { 105 | "node": ">=8" 106 | } 107 | }, 108 | "node_modules/brace-expansion": { 109 | "version": "2.0.1", 110 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", 111 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 112 | "dev": true, 113 | "license": "MIT", 114 | "dependencies": { 115 | "balanced-match": "^1.0.0" 116 | } 117 | }, 118 | "node_modules/braces": { 119 | "version": "3.0.3", 120 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", 121 | "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", 122 | "dev": true, 123 | "dependencies": { 124 | "fill-range": "^7.1.1" 125 | }, 126 | "engines": { 127 | "node": ">=8" 128 | } 129 | }, 130 | "node_modules/browser-stdout": { 131 | "version": "1.3.1", 132 | "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", 133 | "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", 134 | "dev": true 135 | }, 136 | "node_modules/camelcase": { 137 | "version": "6.2.0", 138 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", 139 | "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", 140 | "dev": true, 141 | "engines": { 142 | "node": ">=10" 143 | } 144 | }, 145 | "node_modules/chai": { 146 | "version": "2.3.0", 147 | "resolved": "https://registry.npmjs.org/chai/-/chai-2.3.0.tgz", 148 | "integrity": "sha1-ii9qNHSNqAEJD9cyh7Kqc5pOkJo=", 149 | "dev": true, 150 | "dependencies": { 151 | "assertion-error": "1.0.0", 152 | "deep-eql": "0.1.3" 153 | }, 154 | "engines": { 155 | "node": ">= 0.4.0" 156 | } 157 | }, 158 | "node_modules/chalk": { 159 | "version": "4.1.2", 160 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 161 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 162 | "dev": true, 163 | "dependencies": { 164 | "ansi-styles": "^4.1.0", 165 | "supports-color": "^7.1.0" 166 | }, 167 | "engines": { 168 | "node": ">=10" 169 | }, 170 | "funding": { 171 | "url": "https://github.com/chalk/chalk?sponsor=1" 172 | } 173 | }, 174 | "node_modules/chalk/node_modules/supports-color": { 175 | "version": "7.2.0", 176 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 177 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 178 | "dev": true, 179 | "dependencies": { 180 | "has-flag": "^4.0.0" 181 | }, 182 | "engines": { 183 | "node": ">=8" 184 | } 185 | }, 186 | "node_modules/chokidar": { 187 | "version": "3.5.3", 188 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", 189 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", 190 | "dev": true, 191 | "funding": [ 192 | { 193 | "type": "individual", 194 | "url": "https://paulmillr.com/funding/" 195 | } 196 | ], 197 | "dependencies": { 198 | "anymatch": "~3.1.2", 199 | "braces": "~3.0.2", 200 | "glob-parent": "~5.1.2", 201 | "is-binary-path": "~2.1.0", 202 | "is-glob": "~4.0.1", 203 | "normalize-path": "~3.0.0", 204 | "readdirp": "~3.6.0" 205 | }, 206 | "engines": { 207 | "node": ">= 8.10.0" 208 | }, 209 | "optionalDependencies": { 210 | "fsevents": "~2.3.2" 211 | } 212 | }, 213 | "node_modules/cliui": { 214 | "version": "7.0.4", 215 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", 216 | "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", 217 | "dev": true, 218 | "dependencies": { 219 | "string-width": "^4.2.0", 220 | "strip-ansi": "^6.0.0", 221 | "wrap-ansi": "^7.0.0" 222 | } 223 | }, 224 | "node_modules/cliui/node_modules/ansi-regex": { 225 | "version": "5.0.1", 226 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 227 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 228 | "dev": true, 229 | "engines": { 230 | "node": ">=8" 231 | } 232 | }, 233 | "node_modules/cliui/node_modules/is-fullwidth-code-point": { 234 | "version": "3.0.0", 235 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 236 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 237 | "dev": true, 238 | "engines": { 239 | "node": ">=8" 240 | } 241 | }, 242 | "node_modules/cliui/node_modules/string-width": { 243 | "version": "4.2.2", 244 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", 245 | "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", 246 | "dev": true, 247 | "dependencies": { 248 | "emoji-regex": "^8.0.0", 249 | "is-fullwidth-code-point": "^3.0.0", 250 | "strip-ansi": "^6.0.0" 251 | }, 252 | "engines": { 253 | "node": ">=8" 254 | } 255 | }, 256 | "node_modules/cliui/node_modules/strip-ansi": { 257 | "version": "6.0.0", 258 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", 259 | "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", 260 | "dev": true, 261 | "dependencies": { 262 | "ansi-regex": "^5.0.0" 263 | }, 264 | "engines": { 265 | "node": ">=8" 266 | } 267 | }, 268 | "node_modules/color-convert": { 269 | "version": "2.0.1", 270 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 271 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 272 | "dev": true, 273 | "dependencies": { 274 | "color-name": "~1.1.4" 275 | }, 276 | "engines": { 277 | "node": ">=7.0.0" 278 | } 279 | }, 280 | "node_modules/color-name": { 281 | "version": "1.1.4", 282 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 283 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 284 | "dev": true 285 | }, 286 | "node_modules/command-line-args": { 287 | "version": "5.2.0", 288 | "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.0.tgz", 289 | "integrity": "sha512-4zqtU1hYsSJzcJBOcNZIbW5Fbk9BkjCp1pZVhQKoRaWL5J7N4XphDLwo8aWwdQpTugxwu+jf9u2ZhkXiqp5Z6A==", 290 | "dependencies": { 291 | "array-back": "^3.1.0", 292 | "find-replace": "^3.0.0", 293 | "lodash.camelcase": "^4.3.0", 294 | "typical": "^4.0.0" 295 | }, 296 | "engines": { 297 | "node": ">=4.0.0" 298 | } 299 | }, 300 | "node_modules/command-line-usage": { 301 | "version": "6.1.1", 302 | "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.1.1.tgz", 303 | "integrity": "sha512-F59pEuAR9o1SF/bD0dQBDluhpT4jJQNWUHEuVBqpDmCUo6gPjCi+m9fCWnWZVR/oG6cMTUms4h+3NPl74wGXvA==", 304 | "dependencies": { 305 | "array-back": "^4.0.1", 306 | "chalk": "^2.4.2", 307 | "table-layout": "^1.0.1", 308 | "typical": "^5.2.0" 309 | }, 310 | "engines": { 311 | "node": ">=8.0.0" 312 | } 313 | }, 314 | "node_modules/command-line-usage/node_modules/ansi-styles": { 315 | "version": "3.2.1", 316 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 317 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 318 | "dependencies": { 319 | "color-convert": "^1.9.0" 320 | }, 321 | "engines": { 322 | "node": ">=4" 323 | } 324 | }, 325 | "node_modules/command-line-usage/node_modules/array-back": { 326 | "version": "4.0.2", 327 | "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", 328 | "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", 329 | "engines": { 330 | "node": ">=8" 331 | } 332 | }, 333 | "node_modules/command-line-usage/node_modules/chalk": { 334 | "version": "2.4.2", 335 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 336 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 337 | "dependencies": { 338 | "ansi-styles": "^3.2.1", 339 | "escape-string-regexp": "^1.0.5", 340 | "supports-color": "^5.3.0" 341 | }, 342 | "engines": { 343 | "node": ">=4" 344 | } 345 | }, 346 | "node_modules/command-line-usage/node_modules/color-convert": { 347 | "version": "1.9.3", 348 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 349 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 350 | "dependencies": { 351 | "color-name": "1.1.3" 352 | } 353 | }, 354 | "node_modules/command-line-usage/node_modules/color-name": { 355 | "version": "1.1.3", 356 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 357 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" 358 | }, 359 | "node_modules/command-line-usage/node_modules/escape-string-regexp": { 360 | "version": "1.0.5", 361 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 362 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 363 | "engines": { 364 | "node": ">=0.8.0" 365 | } 366 | }, 367 | "node_modules/command-line-usage/node_modules/has-flag": { 368 | "version": "3.0.0", 369 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 370 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 371 | "engines": { 372 | "node": ">=4" 373 | } 374 | }, 375 | "node_modules/command-line-usage/node_modules/supports-color": { 376 | "version": "5.5.0", 377 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 378 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 379 | "dependencies": { 380 | "has-flag": "^3.0.0" 381 | }, 382 | "engines": { 383 | "node": ">=4" 384 | } 385 | }, 386 | "node_modules/command-line-usage/node_modules/typical": { 387 | "version": "5.2.0", 388 | "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", 389 | "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", 390 | "engines": { 391 | "node": ">=8" 392 | } 393 | }, 394 | "node_modules/debug": { 395 | "version": "4.4.0", 396 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", 397 | "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", 398 | "dev": true, 399 | "license": "MIT", 400 | "dependencies": { 401 | "ms": "^2.1.3" 402 | }, 403 | "engines": { 404 | "node": ">=6.0" 405 | }, 406 | "peerDependenciesMeta": { 407 | "supports-color": { 408 | "optional": true 409 | } 410 | } 411 | }, 412 | "node_modules/decamelize": { 413 | "version": "4.0.0", 414 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", 415 | "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", 416 | "dev": true, 417 | "engines": { 418 | "node": ">=10" 419 | } 420 | }, 421 | "node_modules/deep-eql": { 422 | "version": "0.1.3", 423 | "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz", 424 | "integrity": "sha1-71WKyrjeJSBs1xOQbXTlaTDrafI=", 425 | "dev": true, 426 | "dependencies": { 427 | "type-detect": "0.1.1" 428 | }, 429 | "engines": { 430 | "node": "*" 431 | } 432 | }, 433 | "node_modules/deep-extend": { 434 | "version": "0.6.0", 435 | "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", 436 | "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", 437 | "engines": { 438 | "node": ">=4.0.0" 439 | } 440 | }, 441 | "node_modules/diff": { 442 | "version": "5.2.0", 443 | "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", 444 | "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", 445 | "dev": true, 446 | "license": "BSD-3-Clause", 447 | "engines": { 448 | "node": ">=0.3.1" 449 | } 450 | }, 451 | "node_modules/emoji-regex": { 452 | "version": "8.0.0", 453 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 454 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 455 | "dev": true 456 | }, 457 | "node_modules/escalade": { 458 | "version": "3.1.1", 459 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 460 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", 461 | "dev": true, 462 | "engines": { 463 | "node": ">=6" 464 | } 465 | }, 466 | "node_modules/escape-string-regexp": { 467 | "version": "4.0.0", 468 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 469 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 470 | "dev": true, 471 | "engines": { 472 | "node": ">=10" 473 | } 474 | }, 475 | "node_modules/fill-range": { 476 | "version": "7.1.1", 477 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", 478 | "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", 479 | "dev": true, 480 | "dependencies": { 481 | "to-regex-range": "^5.0.1" 482 | }, 483 | "engines": { 484 | "node": ">=8" 485 | } 486 | }, 487 | "node_modules/find-replace": { 488 | "version": "3.0.0", 489 | "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz", 490 | "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==", 491 | "dependencies": { 492 | "array-back": "^3.0.1" 493 | }, 494 | "engines": { 495 | "node": ">=4.0.0" 496 | } 497 | }, 498 | "node_modules/find-up": { 499 | "version": "5.0.0", 500 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", 501 | "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", 502 | "dev": true, 503 | "dependencies": { 504 | "locate-path": "^6.0.0", 505 | "path-exists": "^4.0.0" 506 | }, 507 | "engines": { 508 | "node": ">=10" 509 | } 510 | }, 511 | "node_modules/flat": { 512 | "version": "5.0.2", 513 | "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", 514 | "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", 515 | "dev": true, 516 | "bin": { 517 | "flat": "cli.js" 518 | } 519 | }, 520 | "node_modules/fs.realpath": { 521 | "version": "1.0.0", 522 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 523 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", 524 | "dev": true, 525 | "license": "ISC" 526 | }, 527 | "node_modules/fsevents": { 528 | "version": "2.3.2", 529 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 530 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 531 | "dev": true, 532 | "hasInstallScript": true, 533 | "optional": true, 534 | "os": [ 535 | "darwin" 536 | ], 537 | "engines": { 538 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 539 | } 540 | }, 541 | "node_modules/get-caller-file": { 542 | "version": "2.0.5", 543 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 544 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", 545 | "dev": true, 546 | "engines": { 547 | "node": "6.* || 8.* || >= 10.*" 548 | } 549 | }, 550 | "node_modules/glob": { 551 | "version": "8.1.0", 552 | "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", 553 | "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", 554 | "deprecated": "Glob versions prior to v9 are no longer supported", 555 | "dev": true, 556 | "license": "ISC", 557 | "dependencies": { 558 | "fs.realpath": "^1.0.0", 559 | "inflight": "^1.0.4", 560 | "inherits": "2", 561 | "minimatch": "^5.0.1", 562 | "once": "^1.3.0" 563 | }, 564 | "engines": { 565 | "node": ">=12" 566 | }, 567 | "funding": { 568 | "url": "https://github.com/sponsors/isaacs" 569 | } 570 | }, 571 | "node_modules/glob-parent": { 572 | "version": "5.1.2", 573 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 574 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 575 | "dev": true, 576 | "dependencies": { 577 | "is-glob": "^4.0.1" 578 | }, 579 | "engines": { 580 | "node": ">= 6" 581 | } 582 | }, 583 | "node_modules/has-flag": { 584 | "version": "4.0.0", 585 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 586 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 587 | "dev": true, 588 | "engines": { 589 | "node": ">=8" 590 | } 591 | }, 592 | "node_modules/he": { 593 | "version": "1.2.0", 594 | "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", 595 | "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", 596 | "dev": true, 597 | "bin": { 598 | "he": "bin/he" 599 | } 600 | }, 601 | "node_modules/inflight": { 602 | "version": "1.0.6", 603 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 604 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 605 | "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", 606 | "dev": true, 607 | "license": "ISC", 608 | "dependencies": { 609 | "once": "^1.3.0", 610 | "wrappy": "1" 611 | } 612 | }, 613 | "node_modules/inherits": { 614 | "version": "2.0.4", 615 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 616 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 617 | "dev": true, 618 | "license": "ISC" 619 | }, 620 | "node_modules/is-binary-path": { 621 | "version": "2.1.0", 622 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 623 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 624 | "dev": true, 625 | "dependencies": { 626 | "binary-extensions": "^2.0.0" 627 | }, 628 | "engines": { 629 | "node": ">=8" 630 | } 631 | }, 632 | "node_modules/is-extglob": { 633 | "version": "2.1.1", 634 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 635 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 636 | "dev": true, 637 | "engines": { 638 | "node": ">=0.10.0" 639 | } 640 | }, 641 | "node_modules/is-glob": { 642 | "version": "4.0.3", 643 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 644 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 645 | "dev": true, 646 | "dependencies": { 647 | "is-extglob": "^2.1.1" 648 | }, 649 | "engines": { 650 | "node": ">=0.10.0" 651 | } 652 | }, 653 | "node_modules/is-number": { 654 | "version": "7.0.0", 655 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 656 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 657 | "dev": true, 658 | "engines": { 659 | "node": ">=0.12.0" 660 | } 661 | }, 662 | "node_modules/is-plain-obj": { 663 | "version": "2.1.0", 664 | "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", 665 | "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", 666 | "dev": true, 667 | "engines": { 668 | "node": ">=8" 669 | } 670 | }, 671 | "node_modules/is-unicode-supported": { 672 | "version": "0.1.0", 673 | "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", 674 | "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", 675 | "dev": true, 676 | "engines": { 677 | "node": ">=10" 678 | }, 679 | "funding": { 680 | "url": "https://github.com/sponsors/sindresorhus" 681 | } 682 | }, 683 | "node_modules/js-yaml": { 684 | "version": "4.1.0", 685 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", 686 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", 687 | "dev": true, 688 | "dependencies": { 689 | "argparse": "^2.0.1" 690 | }, 691 | "bin": { 692 | "js-yaml": "bin/js-yaml.js" 693 | } 694 | }, 695 | "node_modules/locate-path": { 696 | "version": "6.0.0", 697 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", 698 | "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", 699 | "dev": true, 700 | "dependencies": { 701 | "p-locate": "^5.0.0" 702 | }, 703 | "engines": { 704 | "node": ">=10" 705 | } 706 | }, 707 | "node_modules/lodash.camelcase": { 708 | "version": "4.3.0", 709 | "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", 710 | "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=" 711 | }, 712 | "node_modules/log-symbols": { 713 | "version": "4.1.0", 714 | "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", 715 | "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", 716 | "dev": true, 717 | "dependencies": { 718 | "chalk": "^4.1.0", 719 | "is-unicode-supported": "^0.1.0" 720 | }, 721 | "engines": { 722 | "node": ">=10" 723 | }, 724 | "funding": { 725 | "url": "https://github.com/sponsors/sindresorhus" 726 | } 727 | }, 728 | "node_modules/minimatch": { 729 | "version": "5.1.6", 730 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", 731 | "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", 732 | "dev": true, 733 | "license": "ISC", 734 | "dependencies": { 735 | "brace-expansion": "^2.0.1" 736 | }, 737 | "engines": { 738 | "node": ">=10" 739 | } 740 | }, 741 | "node_modules/mocha": { 742 | "version": "10.8.2", 743 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.8.2.tgz", 744 | "integrity": "sha512-VZlYo/WE8t1tstuRmqgeyBgCbJc/lEdopaa+axcKzTBJ+UIdlAB9XnmvTCAH4pwR4ElNInaedhEBmZD8iCSVEg==", 745 | "dev": true, 746 | "license": "MIT", 747 | "dependencies": { 748 | "ansi-colors": "^4.1.3", 749 | "browser-stdout": "^1.3.1", 750 | "chokidar": "^3.5.3", 751 | "debug": "^4.3.5", 752 | "diff": "^5.2.0", 753 | "escape-string-regexp": "^4.0.0", 754 | "find-up": "^5.0.0", 755 | "glob": "^8.1.0", 756 | "he": "^1.2.0", 757 | "js-yaml": "^4.1.0", 758 | "log-symbols": "^4.1.0", 759 | "minimatch": "^5.1.6", 760 | "ms": "^2.1.3", 761 | "serialize-javascript": "^6.0.2", 762 | "strip-json-comments": "^3.1.1", 763 | "supports-color": "^8.1.1", 764 | "workerpool": "^6.5.1", 765 | "yargs": "^16.2.0", 766 | "yargs-parser": "^20.2.9", 767 | "yargs-unparser": "^2.0.0" 768 | }, 769 | "bin": { 770 | "_mocha": "bin/_mocha", 771 | "mocha": "bin/mocha.js" 772 | }, 773 | "engines": { 774 | "node": ">= 14.0.0" 775 | } 776 | }, 777 | "node_modules/ms": { 778 | "version": "2.1.3", 779 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 780 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 781 | "dev": true 782 | }, 783 | "node_modules/normalize-path": { 784 | "version": "3.0.0", 785 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 786 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 787 | "dev": true, 788 | "engines": { 789 | "node": ">=0.10.0" 790 | } 791 | }, 792 | "node_modules/once": { 793 | "version": "1.4.0", 794 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 795 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 796 | "dev": true, 797 | "license": "ISC", 798 | "dependencies": { 799 | "wrappy": "1" 800 | } 801 | }, 802 | "node_modules/p-limit": { 803 | "version": "3.1.0", 804 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 805 | "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 806 | "dev": true, 807 | "dependencies": { 808 | "yocto-queue": "^0.1.0" 809 | }, 810 | "engines": { 811 | "node": ">=10" 812 | } 813 | }, 814 | "node_modules/p-locate": { 815 | "version": "5.0.0", 816 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", 817 | "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", 818 | "dev": true, 819 | "dependencies": { 820 | "p-limit": "^3.0.2" 821 | }, 822 | "engines": { 823 | "node": ">=10" 824 | } 825 | }, 826 | "node_modules/path-exists": { 827 | "version": "4.0.0", 828 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 829 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 830 | "dev": true, 831 | "engines": { 832 | "node": ">=8" 833 | } 834 | }, 835 | "node_modules/picomatch": { 836 | "version": "2.3.1", 837 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 838 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 839 | "dev": true, 840 | "engines": { 841 | "node": ">=8.6" 842 | }, 843 | "funding": { 844 | "url": "https://github.com/sponsors/jonschlinkert" 845 | } 846 | }, 847 | "node_modules/randombytes": { 848 | "version": "2.1.0", 849 | "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", 850 | "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", 851 | "dev": true, 852 | "license": "MIT", 853 | "dependencies": { 854 | "safe-buffer": "^5.1.0" 855 | } 856 | }, 857 | "node_modules/readdirp": { 858 | "version": "3.6.0", 859 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 860 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 861 | "dev": true, 862 | "dependencies": { 863 | "picomatch": "^2.2.1" 864 | }, 865 | "engines": { 866 | "node": ">=8.10.0" 867 | } 868 | }, 869 | "node_modules/reduce-flatten": { 870 | "version": "2.0.0", 871 | "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz", 872 | "integrity": "sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==", 873 | "engines": { 874 | "node": ">=6" 875 | } 876 | }, 877 | "node_modules/require-directory": { 878 | "version": "2.1.1", 879 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 880 | "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", 881 | "dev": true, 882 | "engines": { 883 | "node": ">=0.10.0" 884 | } 885 | }, 886 | "node_modules/safe-buffer": { 887 | "version": "5.2.1", 888 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 889 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 890 | "dev": true, 891 | "funding": [ 892 | { 893 | "type": "github", 894 | "url": "https://github.com/sponsors/feross" 895 | }, 896 | { 897 | "type": "patreon", 898 | "url": "https://www.patreon.com/feross" 899 | }, 900 | { 901 | "type": "consulting", 902 | "url": "https://feross.org/support" 903 | } 904 | ], 905 | "license": "MIT" 906 | }, 907 | "node_modules/serialize-javascript": { 908 | "version": "6.0.2", 909 | "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", 910 | "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", 911 | "dev": true, 912 | "license": "BSD-3-Clause", 913 | "dependencies": { 914 | "randombytes": "^2.1.0" 915 | } 916 | }, 917 | "node_modules/strip-json-comments": { 918 | "version": "3.1.1", 919 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 920 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 921 | "dev": true, 922 | "engines": { 923 | "node": ">=8" 924 | } 925 | }, 926 | "node_modules/supports-color": { 927 | "version": "8.1.1", 928 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", 929 | "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", 930 | "dev": true, 931 | "dependencies": { 932 | "has-flag": "^4.0.0" 933 | }, 934 | "engines": { 935 | "node": ">=10" 936 | } 937 | }, 938 | "node_modules/table-layout": { 939 | "version": "1.0.2", 940 | "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-1.0.2.tgz", 941 | "integrity": "sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==", 942 | "dependencies": { 943 | "array-back": "^4.0.1", 944 | "deep-extend": "~0.6.0", 945 | "typical": "^5.2.0", 946 | "wordwrapjs": "^4.0.0" 947 | }, 948 | "engines": { 949 | "node": ">=8.0.0" 950 | } 951 | }, 952 | "node_modules/table-layout/node_modules/array-back": { 953 | "version": "4.0.2", 954 | "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", 955 | "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", 956 | "engines": { 957 | "node": ">=8" 958 | } 959 | }, 960 | "node_modules/table-layout/node_modules/typical": { 961 | "version": "5.2.0", 962 | "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", 963 | "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", 964 | "engines": { 965 | "node": ">=8" 966 | } 967 | }, 968 | "node_modules/to-regex-range": { 969 | "version": "5.0.1", 970 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 971 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 972 | "dev": true, 973 | "dependencies": { 974 | "is-number": "^7.0.0" 975 | }, 976 | "engines": { 977 | "node": ">=8.0" 978 | } 979 | }, 980 | "node_modules/type-detect": { 981 | "version": "0.1.1", 982 | "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz", 983 | "integrity": "sha1-C6XsKohWQORw6k6FBZcZANrFiCI=", 984 | "dev": true, 985 | "engines": { 986 | "node": "*" 987 | } 988 | }, 989 | "node_modules/typescript": { 990 | "version": "4.9.4", 991 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz", 992 | "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==", 993 | "dev": true, 994 | "bin": { 995 | "tsc": "bin/tsc", 996 | "tsserver": "bin/tsserver" 997 | }, 998 | "engines": { 999 | "node": ">=4.2.0" 1000 | } 1001 | }, 1002 | "node_modules/typical": { 1003 | "version": "4.0.0", 1004 | "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", 1005 | "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==", 1006 | "engines": { 1007 | "node": ">=8" 1008 | } 1009 | }, 1010 | "node_modules/wordwrapjs": { 1011 | "version": "4.0.1", 1012 | "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.1.tgz", 1013 | "integrity": "sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==", 1014 | "dependencies": { 1015 | "reduce-flatten": "^2.0.0", 1016 | "typical": "^5.2.0" 1017 | }, 1018 | "engines": { 1019 | "node": ">=8.0.0" 1020 | } 1021 | }, 1022 | "node_modules/wordwrapjs/node_modules/typical": { 1023 | "version": "5.2.0", 1024 | "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", 1025 | "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", 1026 | "engines": { 1027 | "node": ">=8" 1028 | } 1029 | }, 1030 | "node_modules/workerpool": { 1031 | "version": "6.5.1", 1032 | "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz", 1033 | "integrity": "sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==", 1034 | "dev": true, 1035 | "license": "Apache-2.0" 1036 | }, 1037 | "node_modules/wrap-ansi": { 1038 | "version": "7.0.0", 1039 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 1040 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 1041 | "dev": true, 1042 | "dependencies": { 1043 | "ansi-styles": "^4.0.0", 1044 | "string-width": "^4.1.0", 1045 | "strip-ansi": "^6.0.0" 1046 | }, 1047 | "engines": { 1048 | "node": ">=10" 1049 | } 1050 | }, 1051 | "node_modules/wrap-ansi/node_modules/ansi-regex": { 1052 | "version": "5.0.1", 1053 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 1054 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 1055 | "dev": true, 1056 | "engines": { 1057 | "node": ">=8" 1058 | } 1059 | }, 1060 | "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { 1061 | "version": "3.0.0", 1062 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 1063 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 1064 | "dev": true, 1065 | "engines": { 1066 | "node": ">=8" 1067 | } 1068 | }, 1069 | "node_modules/wrap-ansi/node_modules/string-width": { 1070 | "version": "4.2.2", 1071 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", 1072 | "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", 1073 | "dev": true, 1074 | "dependencies": { 1075 | "emoji-regex": "^8.0.0", 1076 | "is-fullwidth-code-point": "^3.0.0", 1077 | "strip-ansi": "^6.0.0" 1078 | }, 1079 | "engines": { 1080 | "node": ">=8" 1081 | } 1082 | }, 1083 | "node_modules/wrap-ansi/node_modules/strip-ansi": { 1084 | "version": "6.0.0", 1085 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", 1086 | "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", 1087 | "dev": true, 1088 | "dependencies": { 1089 | "ansi-regex": "^5.0.0" 1090 | }, 1091 | "engines": { 1092 | "node": ">=8" 1093 | } 1094 | }, 1095 | "node_modules/wrappy": { 1096 | "version": "1.0.2", 1097 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1098 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 1099 | "dev": true, 1100 | "license": "ISC" 1101 | }, 1102 | "node_modules/y18n": { 1103 | "version": "5.0.8", 1104 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", 1105 | "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", 1106 | "dev": true, 1107 | "engines": { 1108 | "node": ">=10" 1109 | } 1110 | }, 1111 | "node_modules/yargs": { 1112 | "version": "16.2.0", 1113 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", 1114 | "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", 1115 | "dev": true, 1116 | "dependencies": { 1117 | "cliui": "^7.0.2", 1118 | "escalade": "^3.1.1", 1119 | "get-caller-file": "^2.0.5", 1120 | "require-directory": "^2.1.1", 1121 | "string-width": "^4.2.0", 1122 | "y18n": "^5.0.5", 1123 | "yargs-parser": "^20.2.2" 1124 | }, 1125 | "engines": { 1126 | "node": ">=10" 1127 | } 1128 | }, 1129 | "node_modules/yargs-parser": { 1130 | "version": "20.2.9", 1131 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", 1132 | "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", 1133 | "dev": true, 1134 | "license": "ISC", 1135 | "engines": { 1136 | "node": ">=10" 1137 | } 1138 | }, 1139 | "node_modules/yargs-unparser": { 1140 | "version": "2.0.0", 1141 | "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", 1142 | "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", 1143 | "dev": true, 1144 | "dependencies": { 1145 | "camelcase": "^6.0.0", 1146 | "decamelize": "^4.0.0", 1147 | "flat": "^5.0.2", 1148 | "is-plain-obj": "^2.1.0" 1149 | }, 1150 | "engines": { 1151 | "node": ">=10" 1152 | } 1153 | }, 1154 | "node_modules/yargs/node_modules/ansi-regex": { 1155 | "version": "5.0.1", 1156 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 1157 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 1158 | "dev": true, 1159 | "engines": { 1160 | "node": ">=8" 1161 | } 1162 | }, 1163 | "node_modules/yargs/node_modules/is-fullwidth-code-point": { 1164 | "version": "3.0.0", 1165 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 1166 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 1167 | "dev": true, 1168 | "engines": { 1169 | "node": ">=8" 1170 | } 1171 | }, 1172 | "node_modules/yargs/node_modules/string-width": { 1173 | "version": "4.2.2", 1174 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", 1175 | "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", 1176 | "dev": true, 1177 | "dependencies": { 1178 | "emoji-regex": "^8.0.0", 1179 | "is-fullwidth-code-point": "^3.0.0", 1180 | "strip-ansi": "^6.0.0" 1181 | }, 1182 | "engines": { 1183 | "node": ">=8" 1184 | } 1185 | }, 1186 | "node_modules/yargs/node_modules/strip-ansi": { 1187 | "version": "6.0.0", 1188 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", 1189 | "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", 1190 | "dev": true, 1191 | "dependencies": { 1192 | "ansi-regex": "^5.0.0" 1193 | }, 1194 | "engines": { 1195 | "node": ">=8" 1196 | } 1197 | }, 1198 | "node_modules/yocto-queue": { 1199 | "version": "0.1.0", 1200 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 1201 | "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", 1202 | "dev": true, 1203 | "engines": { 1204 | "node": ">=10" 1205 | } 1206 | } 1207 | }, 1208 | "dependencies": { 1209 | "@types/node": { 1210 | "version": "18.11.17", 1211 | "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.17.tgz", 1212 | "integrity": "sha512-HJSUJmni4BeDHhfzn6nF0sVmd1SMezP7/4F0Lq+aXzmp2xm9O7WXrUtHW/CHlYVtZUbByEvWidHqRtcJXGF2Ng==", 1213 | "dev": true 1214 | }, 1215 | "ansi-colors": { 1216 | "version": "4.1.3", 1217 | "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", 1218 | "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", 1219 | "dev": true 1220 | }, 1221 | "ansi-styles": { 1222 | "version": "4.3.0", 1223 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 1224 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 1225 | "dev": true, 1226 | "requires": { 1227 | "color-convert": "^2.0.1" 1228 | } 1229 | }, 1230 | "anymatch": { 1231 | "version": "3.1.3", 1232 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", 1233 | "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", 1234 | "dev": true, 1235 | "requires": { 1236 | "normalize-path": "^3.0.0", 1237 | "picomatch": "^2.0.4" 1238 | } 1239 | }, 1240 | "argparse": { 1241 | "version": "2.0.1", 1242 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 1243 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 1244 | "dev": true 1245 | }, 1246 | "array-back": { 1247 | "version": "3.1.0", 1248 | "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", 1249 | "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==" 1250 | }, 1251 | "assertion-error": { 1252 | "version": "1.0.0", 1253 | "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.0.0.tgz", 1254 | "integrity": "sha1-x/hUOP3UZrx8oWq5DIFRN5el0js=", 1255 | "dev": true 1256 | }, 1257 | "balanced-match": { 1258 | "version": "1.0.2", 1259 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 1260 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 1261 | "dev": true 1262 | }, 1263 | "binary-extensions": { 1264 | "version": "2.2.0", 1265 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 1266 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", 1267 | "dev": true 1268 | }, 1269 | "brace-expansion": { 1270 | "version": "2.0.1", 1271 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", 1272 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 1273 | "dev": true, 1274 | "requires": { 1275 | "balanced-match": "^1.0.0" 1276 | } 1277 | }, 1278 | "braces": { 1279 | "version": "3.0.3", 1280 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", 1281 | "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", 1282 | "dev": true, 1283 | "requires": { 1284 | "fill-range": "^7.1.1" 1285 | } 1286 | }, 1287 | "browser-stdout": { 1288 | "version": "1.3.1", 1289 | "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", 1290 | "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", 1291 | "dev": true 1292 | }, 1293 | "camelcase": { 1294 | "version": "6.2.0", 1295 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", 1296 | "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", 1297 | "dev": true 1298 | }, 1299 | "chai": { 1300 | "version": "2.3.0", 1301 | "resolved": "https://registry.npmjs.org/chai/-/chai-2.3.0.tgz", 1302 | "integrity": "sha1-ii9qNHSNqAEJD9cyh7Kqc5pOkJo=", 1303 | "dev": true, 1304 | "requires": { 1305 | "assertion-error": "1.0.0", 1306 | "deep-eql": "0.1.3" 1307 | } 1308 | }, 1309 | "chalk": { 1310 | "version": "4.1.2", 1311 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 1312 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 1313 | "dev": true, 1314 | "requires": { 1315 | "ansi-styles": "^4.1.0", 1316 | "supports-color": "^7.1.0" 1317 | }, 1318 | "dependencies": { 1319 | "supports-color": { 1320 | "version": "7.2.0", 1321 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 1322 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 1323 | "dev": true, 1324 | "requires": { 1325 | "has-flag": "^4.0.0" 1326 | } 1327 | } 1328 | } 1329 | }, 1330 | "chokidar": { 1331 | "version": "3.5.3", 1332 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", 1333 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", 1334 | "dev": true, 1335 | "requires": { 1336 | "anymatch": "~3.1.2", 1337 | "braces": "~3.0.2", 1338 | "fsevents": "~2.3.2", 1339 | "glob-parent": "~5.1.2", 1340 | "is-binary-path": "~2.1.0", 1341 | "is-glob": "~4.0.1", 1342 | "normalize-path": "~3.0.0", 1343 | "readdirp": "~3.6.0" 1344 | } 1345 | }, 1346 | "cliui": { 1347 | "version": "7.0.4", 1348 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", 1349 | "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", 1350 | "dev": true, 1351 | "requires": { 1352 | "string-width": "^4.2.0", 1353 | "strip-ansi": "^6.0.0", 1354 | "wrap-ansi": "^7.0.0" 1355 | }, 1356 | "dependencies": { 1357 | "ansi-regex": { 1358 | "version": "5.0.1", 1359 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 1360 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 1361 | "dev": true 1362 | }, 1363 | "is-fullwidth-code-point": { 1364 | "version": "3.0.0", 1365 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 1366 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 1367 | "dev": true 1368 | }, 1369 | "string-width": { 1370 | "version": "4.2.2", 1371 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", 1372 | "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", 1373 | "dev": true, 1374 | "requires": { 1375 | "emoji-regex": "^8.0.0", 1376 | "is-fullwidth-code-point": "^3.0.0", 1377 | "strip-ansi": "^6.0.0" 1378 | } 1379 | }, 1380 | "strip-ansi": { 1381 | "version": "6.0.0", 1382 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", 1383 | "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", 1384 | "dev": true, 1385 | "requires": { 1386 | "ansi-regex": "^5.0.0" 1387 | } 1388 | } 1389 | } 1390 | }, 1391 | "color-convert": { 1392 | "version": "2.0.1", 1393 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 1394 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 1395 | "dev": true, 1396 | "requires": { 1397 | "color-name": "~1.1.4" 1398 | } 1399 | }, 1400 | "color-name": { 1401 | "version": "1.1.4", 1402 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 1403 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 1404 | "dev": true 1405 | }, 1406 | "command-line-args": { 1407 | "version": "5.2.0", 1408 | "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.0.tgz", 1409 | "integrity": "sha512-4zqtU1hYsSJzcJBOcNZIbW5Fbk9BkjCp1pZVhQKoRaWL5J7N4XphDLwo8aWwdQpTugxwu+jf9u2ZhkXiqp5Z6A==", 1410 | "requires": { 1411 | "array-back": "^3.1.0", 1412 | "find-replace": "^3.0.0", 1413 | "lodash.camelcase": "^4.3.0", 1414 | "typical": "^4.0.0" 1415 | } 1416 | }, 1417 | "command-line-usage": { 1418 | "version": "6.1.1", 1419 | "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.1.1.tgz", 1420 | "integrity": "sha512-F59pEuAR9o1SF/bD0dQBDluhpT4jJQNWUHEuVBqpDmCUo6gPjCi+m9fCWnWZVR/oG6cMTUms4h+3NPl74wGXvA==", 1421 | "requires": { 1422 | "array-back": "^4.0.1", 1423 | "chalk": "^2.4.2", 1424 | "table-layout": "^1.0.1", 1425 | "typical": "^5.2.0" 1426 | }, 1427 | "dependencies": { 1428 | "ansi-styles": { 1429 | "version": "3.2.1", 1430 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 1431 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 1432 | "requires": { 1433 | "color-convert": "^1.9.0" 1434 | } 1435 | }, 1436 | "array-back": { 1437 | "version": "4.0.2", 1438 | "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", 1439 | "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==" 1440 | }, 1441 | "chalk": { 1442 | "version": "2.4.2", 1443 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 1444 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 1445 | "requires": { 1446 | "ansi-styles": "^3.2.1", 1447 | "escape-string-regexp": "^1.0.5", 1448 | "supports-color": "^5.3.0" 1449 | } 1450 | }, 1451 | "color-convert": { 1452 | "version": "1.9.3", 1453 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 1454 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 1455 | "requires": { 1456 | "color-name": "1.1.3" 1457 | } 1458 | }, 1459 | "color-name": { 1460 | "version": "1.1.3", 1461 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 1462 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" 1463 | }, 1464 | "escape-string-regexp": { 1465 | "version": "1.0.5", 1466 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 1467 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" 1468 | }, 1469 | "has-flag": { 1470 | "version": "3.0.0", 1471 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 1472 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" 1473 | }, 1474 | "supports-color": { 1475 | "version": "5.5.0", 1476 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 1477 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 1478 | "requires": { 1479 | "has-flag": "^3.0.0" 1480 | } 1481 | }, 1482 | "typical": { 1483 | "version": "5.2.0", 1484 | "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", 1485 | "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==" 1486 | } 1487 | } 1488 | }, 1489 | "debug": { 1490 | "version": "4.4.0", 1491 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", 1492 | "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", 1493 | "dev": true, 1494 | "requires": { 1495 | "ms": "^2.1.3" 1496 | } 1497 | }, 1498 | "decamelize": { 1499 | "version": "4.0.0", 1500 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", 1501 | "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", 1502 | "dev": true 1503 | }, 1504 | "deep-eql": { 1505 | "version": "0.1.3", 1506 | "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz", 1507 | "integrity": "sha1-71WKyrjeJSBs1xOQbXTlaTDrafI=", 1508 | "dev": true, 1509 | "requires": { 1510 | "type-detect": "0.1.1" 1511 | } 1512 | }, 1513 | "deep-extend": { 1514 | "version": "0.6.0", 1515 | "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", 1516 | "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" 1517 | }, 1518 | "diff": { 1519 | "version": "5.2.0", 1520 | "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", 1521 | "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", 1522 | "dev": true 1523 | }, 1524 | "emoji-regex": { 1525 | "version": "8.0.0", 1526 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 1527 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 1528 | "dev": true 1529 | }, 1530 | "escalade": { 1531 | "version": "3.1.1", 1532 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 1533 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", 1534 | "dev": true 1535 | }, 1536 | "escape-string-regexp": { 1537 | "version": "4.0.0", 1538 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 1539 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 1540 | "dev": true 1541 | }, 1542 | "fill-range": { 1543 | "version": "7.1.1", 1544 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", 1545 | "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", 1546 | "dev": true, 1547 | "requires": { 1548 | "to-regex-range": "^5.0.1" 1549 | } 1550 | }, 1551 | "find-replace": { 1552 | "version": "3.0.0", 1553 | "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz", 1554 | "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==", 1555 | "requires": { 1556 | "array-back": "^3.0.1" 1557 | } 1558 | }, 1559 | "find-up": { 1560 | "version": "5.0.0", 1561 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", 1562 | "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", 1563 | "dev": true, 1564 | "requires": { 1565 | "locate-path": "^6.0.0", 1566 | "path-exists": "^4.0.0" 1567 | } 1568 | }, 1569 | "flat": { 1570 | "version": "5.0.2", 1571 | "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", 1572 | "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", 1573 | "dev": true 1574 | }, 1575 | "fs.realpath": { 1576 | "version": "1.0.0", 1577 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 1578 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", 1579 | "dev": true 1580 | }, 1581 | "fsevents": { 1582 | "version": "2.3.2", 1583 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 1584 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 1585 | "dev": true, 1586 | "optional": true 1587 | }, 1588 | "get-caller-file": { 1589 | "version": "2.0.5", 1590 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 1591 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", 1592 | "dev": true 1593 | }, 1594 | "glob": { 1595 | "version": "8.1.0", 1596 | "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", 1597 | "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", 1598 | "dev": true, 1599 | "requires": { 1600 | "fs.realpath": "^1.0.0", 1601 | "inflight": "^1.0.4", 1602 | "inherits": "2", 1603 | "minimatch": "^5.0.1", 1604 | "once": "^1.3.0" 1605 | } 1606 | }, 1607 | "glob-parent": { 1608 | "version": "5.1.2", 1609 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 1610 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 1611 | "dev": true, 1612 | "requires": { 1613 | "is-glob": "^4.0.1" 1614 | } 1615 | }, 1616 | "has-flag": { 1617 | "version": "4.0.0", 1618 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 1619 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 1620 | "dev": true 1621 | }, 1622 | "he": { 1623 | "version": "1.2.0", 1624 | "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", 1625 | "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", 1626 | "dev": true 1627 | }, 1628 | "inflight": { 1629 | "version": "1.0.6", 1630 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1631 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 1632 | "dev": true, 1633 | "requires": { 1634 | "once": "^1.3.0", 1635 | "wrappy": "1" 1636 | } 1637 | }, 1638 | "inherits": { 1639 | "version": "2.0.4", 1640 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1641 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 1642 | "dev": true 1643 | }, 1644 | "is-binary-path": { 1645 | "version": "2.1.0", 1646 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 1647 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 1648 | "dev": true, 1649 | "requires": { 1650 | "binary-extensions": "^2.0.0" 1651 | } 1652 | }, 1653 | "is-extglob": { 1654 | "version": "2.1.1", 1655 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1656 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 1657 | "dev": true 1658 | }, 1659 | "is-glob": { 1660 | "version": "4.0.3", 1661 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 1662 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 1663 | "dev": true, 1664 | "requires": { 1665 | "is-extglob": "^2.1.1" 1666 | } 1667 | }, 1668 | "is-number": { 1669 | "version": "7.0.0", 1670 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 1671 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 1672 | "dev": true 1673 | }, 1674 | "is-plain-obj": { 1675 | "version": "2.1.0", 1676 | "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", 1677 | "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", 1678 | "dev": true 1679 | }, 1680 | "is-unicode-supported": { 1681 | "version": "0.1.0", 1682 | "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", 1683 | "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", 1684 | "dev": true 1685 | }, 1686 | "js-yaml": { 1687 | "version": "4.1.0", 1688 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", 1689 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", 1690 | "dev": true, 1691 | "requires": { 1692 | "argparse": "^2.0.1" 1693 | } 1694 | }, 1695 | "locate-path": { 1696 | "version": "6.0.0", 1697 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", 1698 | "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", 1699 | "dev": true, 1700 | "requires": { 1701 | "p-locate": "^5.0.0" 1702 | } 1703 | }, 1704 | "lodash.camelcase": { 1705 | "version": "4.3.0", 1706 | "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", 1707 | "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=" 1708 | }, 1709 | "log-symbols": { 1710 | "version": "4.1.0", 1711 | "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", 1712 | "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", 1713 | "dev": true, 1714 | "requires": { 1715 | "chalk": "^4.1.0", 1716 | "is-unicode-supported": "^0.1.0" 1717 | } 1718 | }, 1719 | "minimatch": { 1720 | "version": "5.1.6", 1721 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", 1722 | "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", 1723 | "dev": true, 1724 | "requires": { 1725 | "brace-expansion": "^2.0.1" 1726 | } 1727 | }, 1728 | "mocha": { 1729 | "version": "10.8.2", 1730 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.8.2.tgz", 1731 | "integrity": "sha512-VZlYo/WE8t1tstuRmqgeyBgCbJc/lEdopaa+axcKzTBJ+UIdlAB9XnmvTCAH4pwR4ElNInaedhEBmZD8iCSVEg==", 1732 | "dev": true, 1733 | "requires": { 1734 | "ansi-colors": "^4.1.3", 1735 | "browser-stdout": "^1.3.1", 1736 | "chokidar": "^3.5.3", 1737 | "debug": "^4.3.5", 1738 | "diff": "^5.2.0", 1739 | "escape-string-regexp": "^4.0.0", 1740 | "find-up": "^5.0.0", 1741 | "glob": "^8.1.0", 1742 | "he": "^1.2.0", 1743 | "js-yaml": "^4.1.0", 1744 | "log-symbols": "^4.1.0", 1745 | "minimatch": "^5.1.6", 1746 | "ms": "^2.1.3", 1747 | "serialize-javascript": "^6.0.2", 1748 | "strip-json-comments": "^3.1.1", 1749 | "supports-color": "^8.1.1", 1750 | "workerpool": "^6.5.1", 1751 | "yargs": "^16.2.0", 1752 | "yargs-parser": "^20.2.9", 1753 | "yargs-unparser": "^2.0.0" 1754 | } 1755 | }, 1756 | "ms": { 1757 | "version": "2.1.3", 1758 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1759 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 1760 | "dev": true 1761 | }, 1762 | "normalize-path": { 1763 | "version": "3.0.0", 1764 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 1765 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 1766 | "dev": true 1767 | }, 1768 | "once": { 1769 | "version": "1.4.0", 1770 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1771 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 1772 | "dev": true, 1773 | "requires": { 1774 | "wrappy": "1" 1775 | } 1776 | }, 1777 | "p-limit": { 1778 | "version": "3.1.0", 1779 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 1780 | "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 1781 | "dev": true, 1782 | "requires": { 1783 | "yocto-queue": "^0.1.0" 1784 | } 1785 | }, 1786 | "p-locate": { 1787 | "version": "5.0.0", 1788 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", 1789 | "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", 1790 | "dev": true, 1791 | "requires": { 1792 | "p-limit": "^3.0.2" 1793 | } 1794 | }, 1795 | "path-exists": { 1796 | "version": "4.0.0", 1797 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 1798 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 1799 | "dev": true 1800 | }, 1801 | "picomatch": { 1802 | "version": "2.3.1", 1803 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 1804 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 1805 | "dev": true 1806 | }, 1807 | "randombytes": { 1808 | "version": "2.1.0", 1809 | "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", 1810 | "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", 1811 | "dev": true, 1812 | "requires": { 1813 | "safe-buffer": "^5.1.0" 1814 | } 1815 | }, 1816 | "readdirp": { 1817 | "version": "3.6.0", 1818 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 1819 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 1820 | "dev": true, 1821 | "requires": { 1822 | "picomatch": "^2.2.1" 1823 | } 1824 | }, 1825 | "reduce-flatten": { 1826 | "version": "2.0.0", 1827 | "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz", 1828 | "integrity": "sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==" 1829 | }, 1830 | "require-directory": { 1831 | "version": "2.1.1", 1832 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 1833 | "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", 1834 | "dev": true 1835 | }, 1836 | "safe-buffer": { 1837 | "version": "5.2.1", 1838 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 1839 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 1840 | "dev": true 1841 | }, 1842 | "serialize-javascript": { 1843 | "version": "6.0.2", 1844 | "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", 1845 | "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", 1846 | "dev": true, 1847 | "requires": { 1848 | "randombytes": "^2.1.0" 1849 | } 1850 | }, 1851 | "strip-json-comments": { 1852 | "version": "3.1.1", 1853 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 1854 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 1855 | "dev": true 1856 | }, 1857 | "supports-color": { 1858 | "version": "8.1.1", 1859 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", 1860 | "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", 1861 | "dev": true, 1862 | "requires": { 1863 | "has-flag": "^4.0.0" 1864 | } 1865 | }, 1866 | "table-layout": { 1867 | "version": "1.0.2", 1868 | "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-1.0.2.tgz", 1869 | "integrity": "sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==", 1870 | "requires": { 1871 | "array-back": "^4.0.1", 1872 | "deep-extend": "~0.6.0", 1873 | "typical": "^5.2.0", 1874 | "wordwrapjs": "^4.0.0" 1875 | }, 1876 | "dependencies": { 1877 | "array-back": { 1878 | "version": "4.0.2", 1879 | "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", 1880 | "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==" 1881 | }, 1882 | "typical": { 1883 | "version": "5.2.0", 1884 | "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", 1885 | "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==" 1886 | } 1887 | } 1888 | }, 1889 | "to-regex-range": { 1890 | "version": "5.0.1", 1891 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 1892 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 1893 | "dev": true, 1894 | "requires": { 1895 | "is-number": "^7.0.0" 1896 | } 1897 | }, 1898 | "type-detect": { 1899 | "version": "0.1.1", 1900 | "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz", 1901 | "integrity": "sha1-C6XsKohWQORw6k6FBZcZANrFiCI=", 1902 | "dev": true 1903 | }, 1904 | "typescript": { 1905 | "version": "4.9.4", 1906 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz", 1907 | "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==", 1908 | "dev": true 1909 | }, 1910 | "typical": { 1911 | "version": "4.0.0", 1912 | "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", 1913 | "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==" 1914 | }, 1915 | "wordwrapjs": { 1916 | "version": "4.0.1", 1917 | "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.1.tgz", 1918 | "integrity": "sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==", 1919 | "requires": { 1920 | "reduce-flatten": "^2.0.0", 1921 | "typical": "^5.2.0" 1922 | }, 1923 | "dependencies": { 1924 | "typical": { 1925 | "version": "5.2.0", 1926 | "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", 1927 | "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==" 1928 | } 1929 | } 1930 | }, 1931 | "workerpool": { 1932 | "version": "6.5.1", 1933 | "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz", 1934 | "integrity": "sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==", 1935 | "dev": true 1936 | }, 1937 | "wrap-ansi": { 1938 | "version": "7.0.0", 1939 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 1940 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 1941 | "dev": true, 1942 | "requires": { 1943 | "ansi-styles": "^4.0.0", 1944 | "string-width": "^4.1.0", 1945 | "strip-ansi": "^6.0.0" 1946 | }, 1947 | "dependencies": { 1948 | "ansi-regex": { 1949 | "version": "5.0.1", 1950 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 1951 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 1952 | "dev": true 1953 | }, 1954 | "is-fullwidth-code-point": { 1955 | "version": "3.0.0", 1956 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 1957 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 1958 | "dev": true 1959 | }, 1960 | "string-width": { 1961 | "version": "4.2.2", 1962 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", 1963 | "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", 1964 | "dev": true, 1965 | "requires": { 1966 | "emoji-regex": "^8.0.0", 1967 | "is-fullwidth-code-point": "^3.0.0", 1968 | "strip-ansi": "^6.0.0" 1969 | } 1970 | }, 1971 | "strip-ansi": { 1972 | "version": "6.0.0", 1973 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", 1974 | "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", 1975 | "dev": true, 1976 | "requires": { 1977 | "ansi-regex": "^5.0.0" 1978 | } 1979 | } 1980 | } 1981 | }, 1982 | "wrappy": { 1983 | "version": "1.0.2", 1984 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1985 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 1986 | "dev": true 1987 | }, 1988 | "y18n": { 1989 | "version": "5.0.8", 1990 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", 1991 | "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", 1992 | "dev": true 1993 | }, 1994 | "yargs": { 1995 | "version": "16.2.0", 1996 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", 1997 | "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", 1998 | "dev": true, 1999 | "requires": { 2000 | "cliui": "^7.0.2", 2001 | "escalade": "^3.1.1", 2002 | "get-caller-file": "^2.0.5", 2003 | "require-directory": "^2.1.1", 2004 | "string-width": "^4.2.0", 2005 | "y18n": "^5.0.5", 2006 | "yargs-parser": "^20.2.2" 2007 | }, 2008 | "dependencies": { 2009 | "ansi-regex": { 2010 | "version": "5.0.1", 2011 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 2012 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 2013 | "dev": true 2014 | }, 2015 | "is-fullwidth-code-point": { 2016 | "version": "3.0.0", 2017 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 2018 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 2019 | "dev": true 2020 | }, 2021 | "string-width": { 2022 | "version": "4.2.2", 2023 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", 2024 | "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", 2025 | "dev": true, 2026 | "requires": { 2027 | "emoji-regex": "^8.0.0", 2028 | "is-fullwidth-code-point": "^3.0.0", 2029 | "strip-ansi": "^6.0.0" 2030 | } 2031 | }, 2032 | "strip-ansi": { 2033 | "version": "6.0.0", 2034 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", 2035 | "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", 2036 | "dev": true, 2037 | "requires": { 2038 | "ansi-regex": "^5.0.0" 2039 | } 2040 | } 2041 | } 2042 | }, 2043 | "yargs-parser": { 2044 | "version": "20.2.9", 2045 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", 2046 | "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", 2047 | "dev": true 2048 | }, 2049 | "yargs-unparser": { 2050 | "version": "2.0.0", 2051 | "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", 2052 | "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", 2053 | "dev": true, 2054 | "requires": { 2055 | "camelcase": "^6.0.0", 2056 | "decamelize": "^4.0.0", 2057 | "flat": "^5.0.2", 2058 | "is-plain-obj": "^2.1.0" 2059 | } 2060 | }, 2061 | "yocto-queue": { 2062 | "version": "0.1.0", 2063 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 2064 | "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", 2065 | "dev": true 2066 | } 2067 | } 2068 | } 2069 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "directory-tree", 3 | "version": "3.5.2", 4 | "description": "Convert a directory tree to a JS object.", 5 | "repository": { 6 | "type": "git", 7 | "url": "https://github.com/mihneadb/node-directory-tree" 8 | }, 9 | "keywords": [ 10 | "directory", 11 | "tree" 12 | ], 13 | "main": "lib/directory-tree.js", 14 | "author": "Mihnea Dobrescu-Balaur", 15 | "license": "MIT", 16 | "bugs": { 17 | "url": "https://github.com/mihneadb/node-directory-tree/issues" 18 | }, 19 | "homepage": "https://github.com/mihneadb/node-directory-tree", 20 | "dependencies": { 21 | "command-line-args": "^5.2.0", 22 | "command-line-usage": "^6.1.1" 23 | }, 24 | "devDependencies": { 25 | "@types/node": "^18.11.17", 26 | "chai": "^2.3.0", 27 | "mocha": "^10.2.0", 28 | "typescript": "^4.9.4" 29 | }, 30 | "bin": "bin/index.js", 31 | "engines": { 32 | "node": ">=10.0" 33 | }, 34 | "scripts": { 35 | "test": "mocha", 36 | "test-ts": "./node_modules/.bin/tsc index.d.ts" 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /test/depth/fixtureFirstDepth.js: -------------------------------------------------------------------------------- 1 | tree = { 2 | "path": "./test/test_data", 3 | "name": "test_data", 4 | "type": "directory", 5 | "children": [ 6 | { 7 | "path": "test/test_data/file_a.txt", 8 | "name": "file_a.txt", 9 | "type": "file", 10 | "extension": ".txt" 11 | }, 12 | { 13 | "path": "test/test_data/file_b.txt", 14 | "name": "file_b.txt", 15 | "type": "file", 16 | "extension": ".txt" 17 | }, 18 | { 19 | "path": "test/test_data/some_dir", 20 | "name": "some_dir", 21 | "type": "directory", 22 | }, 23 | { 24 | "path": "test/test_data/some_dir_2", 25 | "name": "some_dir_2", 26 | "type": "directory", 27 | } 28 | ] 29 | } 30 | 31 | module.exports = tree; 32 | -------------------------------------------------------------------------------- /test/depth/fixtureSecondDepth.js: -------------------------------------------------------------------------------- 1 | tree = { 2 | "path": "./test/test_data", 3 | "name": "test_data", 4 | "type": "directory", 5 | "children": [ 6 | { 7 | "path": "test/test_data/file_a.txt", 8 | "name": "file_a.txt", 9 | "type": "file", 10 | "extension": ".txt" 11 | }, 12 | { 13 | "path": "test/test_data/file_b.txt", 14 | "name": "file_b.txt", 15 | "type": "file", 16 | "extension": ".txt" 17 | }, 18 | { 19 | "path": "test/test_data/some_dir", 20 | "name": "some_dir", 21 | "type": "directory", 22 | "children": [ 23 | { 24 | "path": "test/test_data/some_dir/another_dir", 25 | "name": "another_dir", 26 | "type": "directory" 27 | }, 28 | { 29 | "path": "test/test_data/some_dir/file_a.txt", 30 | "name": "file_a.txt", 31 | "type": "file", 32 | "extension": ".txt" 33 | }, 34 | { 35 | "path": "test/test_data/some_dir/file_b.txt", 36 | "name": "file_b.txt", 37 | "type": "file", 38 | "extension": ".txt" 39 | } 40 | ] 41 | }, 42 | { 43 | "path": "test/test_data/some_dir_2", 44 | "name": "some_dir_2", 45 | "type": "directory", 46 | "children": [ 47 | { 48 | "path": "test/test_data/some_dir_2/.gitkeep", 49 | "name": ".gitkeep", 50 | "type": "file", 51 | "extension": "" 52 | } 53 | ], 54 | } 55 | ] 56 | } 57 | 58 | module.exports = tree; 59 | -------------------------------------------------------------------------------- /test/depth/fixtureZeroDepth.js: -------------------------------------------------------------------------------- 1 | tree = { 2 | "path": "./test/test_data", 3 | "name": "test_data", 4 | "type": "directory" 5 | } 6 | 7 | module.exports = tree; 8 | -------------------------------------------------------------------------------- /test/fixture.js: -------------------------------------------------------------------------------- 1 | tree = { 2 | "path": "./test/test_data", 3 | "name": "test_data", 4 | "type": "directory", 5 | "children": [ 6 | { 7 | "path": "test/test_data/file_a.txt", 8 | "name": "file_a.txt", 9 | "size": 12, 10 | "type": "file", 11 | "extension": ".txt" 12 | }, 13 | { 14 | "path": "test/test_data/file_b.txt", 15 | "name": "file_b.txt", 16 | "size": 3756, 17 | "type": "file", 18 | "extension": ".txt" 19 | }, 20 | { 21 | "path": "test/test_data/some_dir", 22 | "name": "some_dir", 23 | "type": "directory", 24 | "children": [ 25 | { 26 | "path": "test/test_data/some_dir/another_dir", 27 | "name": "another_dir", 28 | "type": "directory", 29 | "children": [ 30 | { 31 | "path": "test/test_data/some_dir/another_dir/file_a.txt", 32 | "name": "file_a.txt", 33 | "size": 12, 34 | "type": "file", 35 | "extension": ".txt" 36 | }, 37 | { 38 | "path": "test/test_data/some_dir/another_dir/file_b.txt", 39 | "name": "file_b.txt", 40 | "size": 3756, 41 | "type": "file", 42 | "extension": ".txt" 43 | } 44 | ], 45 | "size": 3768 46 | }, 47 | { 48 | "path": "test/test_data/some_dir/file_a.txt", 49 | "name": "file_a.txt", 50 | "size": 12, 51 | "type": "file", 52 | "extension": ".txt" 53 | }, 54 | { 55 | "path": "test/test_data/some_dir/file_b.txt", 56 | "name": "file_b.txt", 57 | "size": 3756, 58 | "type": "file", 59 | "extension": ".txt" 60 | } 61 | ], 62 | "size": 7536 63 | }, 64 | { 65 | "path": "test/test_data/some_dir_2", 66 | "name": "some_dir_2", 67 | "type": "directory", 68 | "children": [ 69 | { 70 | "path": "test/test_data/some_dir_2/.gitkeep", 71 | "name": ".gitkeep", 72 | "size": 0, 73 | "type": "file", 74 | "extension": "" 75 | } 76 | ], 77 | "size": 0 78 | } 79 | ], 80 | "size": 11304 81 | } 82 | 83 | module.exports = tree; 84 | -------------------------------------------------------------------------------- /test/fixtureExclude.js: -------------------------------------------------------------------------------- 1 | tree = { 2 | "path": "./test/test_data", 3 | "name": "test_data", 4 | "children": [ 5 | { 6 | "path": "test/test_data/file_a.txt", 7 | "name": "file_a.txt", 8 | "size": 12, 9 | "extension": ".txt", 10 | "type": "file" 11 | }, 12 | { 13 | "path": "test/test_data/file_b.txt", 14 | "name": "file_b.txt", 15 | "size": 3756, 16 | "extension": ".txt", 17 | "type": "file" 18 | }, 19 | { 20 | "path": "test/test_data/some_dir", 21 | "name": "some_dir", 22 | "children": [ 23 | { 24 | "path": "test/test_data/some_dir/file_a.txt", 25 | "name": "file_a.txt", 26 | "size": 12, 27 | "extension": ".txt", 28 | "type": "file" 29 | }, 30 | { 31 | "path": "test/test_data/some_dir/file_b.txt", 32 | "name": "file_b.txt", 33 | "size": 3756, 34 | "extension": ".txt", 35 | "type": "file" 36 | } 37 | ], 38 | "type": "directory", 39 | "size": 3768 40 | }, 41 | { 42 | "path": "test/test_data/some_dir_2", 43 | "name": "some_dir_2", 44 | "children": [ 45 | { 46 | "path": "test/test_data/some_dir_2/.gitkeep", 47 | "name": ".gitkeep", 48 | "size": 0, 49 | "extension": "", 50 | "type": "file" 51 | } 52 | ], 53 | "size": 0, 54 | "type": "directory" 55 | } 56 | ], 57 | "size": 7536, 58 | "type": "directory" 59 | } 60 | 61 | module.exports = tree; 62 | -------------------------------------------------------------------------------- /test/fixtureMultipleExclude.js: -------------------------------------------------------------------------------- 1 | tree = { 2 | "path": "./test/test_data", 3 | "name": "test_data", 4 | "children": [ 5 | { 6 | "path": "test/test_data/file_a.txt", 7 | "name": "file_a.txt", 8 | "size": 12, 9 | "extension": ".txt", 10 | "type": "file" 11 | }, 12 | { 13 | "path": "test/test_data/file_b.txt", 14 | "name": "file_b.txt", 15 | "size": 3756, 16 | "extension": ".txt", 17 | "type": "file" 18 | }, 19 | { 20 | "path": "test/test_data/some_dir", 21 | "name": "some_dir", 22 | "children": [ 23 | { 24 | "path": "test/test_data/some_dir/file_a.txt", 25 | "name": "file_a.txt", 26 | "size": 12, 27 | "extension": ".txt", 28 | "type": "file" 29 | }, 30 | { 31 | "path": "test/test_data/some_dir/file_b.txt", 32 | "name": "file_b.txt", 33 | "size": 3756, 34 | "extension": ".txt", 35 | "type": "file" 36 | } 37 | ], 38 | "type": "directory", 39 | "size": 3768 40 | } 41 | ], 42 | "size": 7536, 43 | "type": "directory" 44 | } 45 | 46 | module.exports = tree; 47 | -------------------------------------------------------------------------------- /test/fixtureSymlink.js: -------------------------------------------------------------------------------- 1 | tree = { 2 | "path": "./test/test_data", 3 | "name": "test_data", 4 | "type": "directory", 5 | "children": [ 6 | { 7 | "path": "test/test_data/file_a.txt", 8 | "name": "file_a.txt", 9 | "size": 12, 10 | "type": "file", 11 | "extension": ".txt" 12 | }, 13 | { 14 | "path": "test/test_data/file_b.txt", 15 | "name": "file_b.txt", 16 | "size": 3756, 17 | "type": "file", 18 | "extension": ".txt" 19 | }, 20 | { 21 | "path": "test/test_data/some_dir", 22 | "name": "some_dir", 23 | "type": "directory", 24 | "children": [ 25 | { 26 | "path": "test/test_data/some_dir/another_dir", 27 | "name": "another_dir", 28 | "type": "directory", 29 | "children": [ 30 | { 31 | "path": "test/test_data/some_dir/another_dir/file_a.txt", 32 | "name": "file_a.txt", 33 | "size": 12, 34 | "type": "file", 35 | "extension": ".txt" 36 | }, 37 | { 38 | "path": "test/test_data/some_dir/another_dir/file_b.txt", 39 | "name": "file_b.txt", 40 | "size": 3756, 41 | "type": "file", 42 | "extension": ".txt" 43 | } 44 | ], 45 | "size": 3768 46 | }, 47 | { 48 | "path": "test/test_data/some_dir/file_a.txt", 49 | "name": "file_a.txt", 50 | "size": 12, 51 | "type": "file", 52 | "extension": ".txt" 53 | }, 54 | { 55 | "path": "test/test_data/some_dir/file_b.txt", 56 | "name": "file_b.txt", 57 | "size": 3756, 58 | "type": "file", 59 | "extension": ".txt" 60 | } 61 | ], 62 | "size": 7536 63 | }, 64 | { 65 | "path": "test/test_data/some_dir_2", 66 | "name": "some_dir_2", 67 | "type": "directory", 68 | "children": [ 69 | { 70 | "path": "test/test_data/some_dir_2/.gitkeep", 71 | "name": ".gitkeep", 72 | "size": 0, 73 | "type": "file", 74 | "extension": "" 75 | } 76 | ], 77 | "size": 0 78 | }, 79 | { 80 | "children": [ 81 | { 82 | "extension": ".txt", 83 | "name": "file_a.txt", 84 | "path": "test/test_data/symlink/file_a.txt", 85 | "size": 12, 86 | "type": "file", 87 | }, 88 | { 89 | "extension": ".txt", 90 | "name": "file_b.txt", 91 | "path": "test/test_data/symlink/file_b.txt", 92 | "size": 3756, 93 | "type": "file", 94 | }, 95 | { 96 | "children": [ 97 | { 98 | "children": [ 99 | { 100 | "extension": ".txt", 101 | "name": "file_a.txt", 102 | "path": "test/test_data/symlink/some_dir/another_dir/file_a.txt", 103 | "size": 12, 104 | "type": "file", 105 | }, 106 | { 107 | "extension": ".txt", 108 | "name": "file_b.txt", 109 | "path": "test/test_data/symlink/some_dir/another_dir/file_b.txt", 110 | "size": 3756, 111 | "type": "file", 112 | } 113 | ], 114 | "name": "another_dir", 115 | "path": "test/test_data/symlink/some_dir/another_dir", 116 | "size": 3768, 117 | "type": "directory" 118 | }, 119 | { 120 | "extension": ".txt", 121 | "name": "file_a.txt", 122 | "path": "test/test_data/symlink/some_dir/file_a.txt", 123 | "size": 12, 124 | "type": "file" 125 | }, 126 | { 127 | "extension": ".txt", 128 | "name": "file_b.txt", 129 | "path": "test/test_data/symlink/some_dir/file_b.txt", 130 | "size": 3756, 131 | "type": "file" 132 | } 133 | ], 134 | "name": "some_dir", 135 | "path": "test/test_data/symlink/some_dir", 136 | "size": 7536, 137 | "type": "directory" 138 | }, 139 | { 140 | "children": [ 141 | { 142 | "extension": "", 143 | "name": ".gitkeep", 144 | "path": "test/test_data/symlink/some_dir_2/.gitkeep", 145 | "size": 0, 146 | "type": "file" 147 | } 148 | ], 149 | "name": "some_dir_2", 150 | "path": "test/test_data/symlink/some_dir_2", 151 | "size": 0, 152 | "type": "directory" 153 | } 154 | ], 155 | "isSymbolicLink": true, 156 | "name": "symlink", 157 | "path": "test/test_data/symlink", 158 | "size": 11304, 159 | "type": "directory" 160 | } 161 | ], 162 | "size": 22608 163 | } 164 | 165 | module.exports = tree; 166 | -------------------------------------------------------------------------------- /test/test.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const expect = require('chai').expect; 4 | const dirtree = require('../lib/directory-tree'); 5 | const testTree = require('./fixture.js'); 6 | const testTreeZeroDepth = require('./depth/fixtureZeroDepth.js'); 7 | const testTreeFirstDepth = require('./depth/fixtureFirstDepth.js'); 8 | const testTreeSecondDepth = require('./depth/fixtureSecondDepth.js'); 9 | const excludeTree = require('./fixtureExclude'); 10 | const excludeTree2 = require('./fixtureMultipleExclude'); 11 | const symlinkTree = require('./fixtureSymlink'); 12 | 13 | 14 | describe('directoryTree', () => { 15 | 16 | it('should not crash with empty options', () => { 17 | const tree = dirtree('./test/test_data'); 18 | }); 19 | 20 | it('should return an Object', () => { 21 | const tree = dirtree('./test/test_data', {extensions:/\.txt$/, followSymlinks: false }); 22 | expect(tree).to.be.an('object'); 23 | }); 24 | 25 | it('should list the children in a directory', () => { 26 | const tree = dirtree('./test/test_data', {extensions:/\.txt$/, followSymlinks: false }); 27 | 28 | // 4 including the empty `some_dir_2`. 29 | expect(tree.children.length).to.equal(4); 30 | }); 31 | 32 | it('should execute a callback function for each file with no specified extensions', () => { 33 | let number_of_files = 7; 34 | let callback_executed_times = 0; 35 | 36 | const tree = dirtree('./test/test_data', { followSymlinks: false }, function(item, PATH) { 37 | callback_executed_times++; 38 | }); 39 | 40 | expect(callback_executed_times).to.equal(number_of_files); 41 | }); 42 | 43 | it('should execute a callback function for each directory', () => { 44 | let number_of_directories = 4; 45 | let callback_executed_times = 0; 46 | 47 | const tree = dirtree('./test/test_data', { followSymlinks: false }, null, function(item, PATH) { 48 | callback_executed_times++; 49 | }); 50 | 51 | expect(callback_executed_times).to.equal(number_of_directories); 52 | }); 53 | 54 | it('should execute a callback function for each file with specified extensions', () => { 55 | let number_of_files = 6; 56 | let callback_executed_times = 0; 57 | 58 | const tree = dirtree('./test/test_data', {extensions:/\.txt$/, followSymlinks: false }, function(item, PATH) { 59 | callback_executed_times++; 60 | }); 61 | expect(callback_executed_times).to.equal(number_of_files); 62 | }); 63 | 64 | it('should display the size of a directory (summing up the children)', () => { 65 | const tree = dirtree('./test/test_data', {extensions:/\.txt$/, attributes: ['size']}); 66 | expect(tree.size).to.be.above(11000); 67 | }); 68 | 69 | it('should not crash with directories where the user does not have necessary permissions', () => { 70 | const tree = dirtree('/root/', {extensions:/\.txt$/}); 71 | expect(tree).to.equal(null); 72 | }); 73 | 74 | it('should return the correct exact result', () => { 75 | const tree = dirtree('./test/test_data', {normalizePath: true, followSymlinks: false, attributes: ['size','type','extension'] }); 76 | expect(tree).to.deep.equal(testTree); 77 | }); 78 | 79 | it('should not swallow exceptions thrown in the callback function', () => { 80 | const error = new Error('Something happened!'); 81 | const badFunction = function () { 82 | dirtree('./test/test_data', {extensions:/\.txt$/}, function(item) { 83 | throw error; 84 | }); 85 | } 86 | expect(badFunction).to.throw(error); 87 | }) 88 | 89 | it('should exclude the correct folders', () => { 90 | const tree = dirtree('./test/test_data',{exclude: /another_dir/, normalizePath: true, followSymlinks: false, attributes: ['size','type','extension']}); 91 | expect(tree).to.deep.equal(excludeTree); 92 | }); 93 | 94 | it('should exclude multiple folders', () => { 95 | const tree = dirtree('./test/test_data', {exclude: [/another_dir/, /some_dir_2/], normalizePath: true, followSymlinks: false, attributes: ['size','type','extension']}); 96 | expect(tree).to.deep.equal(excludeTree2); 97 | 98 | }); 99 | 100 | it('should include attributes', () => { 101 | const tree = dirtree('./test/test_data',{ attributes: ['mtime', 'ctime'], followSymlinks: false}); 102 | tree.children.forEach((child) => { 103 | if(child.type == 'file'){ 104 | expect(child).to.have.property('mtime') 105 | expect(child).to.have.property('ctime') 106 | } 107 | }) 108 | }); 109 | 110 | it('should follow symlinks', () => { 111 | const tree = dirtree('./test/test_data', {normalizePath: true, followSymlinks: true, attributes: ['size','type','extension'] }); 112 | expect(tree).to.deep.equal(symlinkTree); 113 | }) 114 | 115 | it('should respect "depth = 0" argument', () => { 116 | const tree = dirtree('./test/test_data', {depth: 0, normalizePath: true, followSymlinks: false, attributes: ['type','extension'] }); 117 | expect(tree).to.deep.equal(testTreeZeroDepth); 118 | }) 119 | 120 | it('should respect "depth = 1" argument', () => { 121 | const tree = dirtree('./test/test_data', {depth: 1, normalizePath: true, followSymlinks: false, attributes: ['type','extension'] }); 122 | expect(tree).to.deep.equal(testTreeFirstDepth); 123 | }) 124 | 125 | it('should respect "depth = 2" argument', () => { 126 | const tree = dirtree('./test/test_data', {depth: 2, normalizePath: true, followSymlinks: false, attributes: ['type','extension'] }); 127 | expect(tree).to.deep.equal(testTreeSecondDepth); 128 | }) 129 | 130 | it('should throw error when combines size attribute with depth option', () => { 131 | expect( 132 | dirtree.bind(dirtree, './test/test_data', {depth: 2, normalizePath: true, followSymlinks: false, attributes: ['size', 'type','extension'] }) 133 | ).to.throw('usage of size attribute with depth option is prohibited'); 134 | }) 135 | 136 | }); 137 | -------------------------------------------------------------------------------- /test/test_data/file_a.txt: -------------------------------------------------------------------------------- 1 | Hello world 2 | -------------------------------------------------------------------------------- /test/test_data/file_b.txt: -------------------------------------------------------------------------------- 1 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam ultrices ligula at metus iaculis accumsan. Donec at aliquam justo. Phasellus eu orci gravida, rutrum eros eget, ultrices lacus. Mauris lacinia tortor eu vestibulum vestibulum. Sed eleifend nec ex vel egestas. Donec viverra nibh eu neque gravida, in tincidunt nisi ultricies. Praesent dictum molestie magna mollis accumsan. Proin sed egestas quam. Mauris luctus ante ipsum, non porta ex ultrices eu. Quisque gravida lectus ut diam porta, ut tempus magna fermentum. In hac habitasse platea dictumst. Phasellus sollicitudin tempor feugiat. Nullam imperdiet cursus arcu, sit amet interdum enim feugiat eget. Ut elit metus, semper in turpis luctus, aliquam pharetra libero. Morbi eget lectus vel enim suscipit tempus eget et ipsum. 2 | 3 | Curabitur imperdiet tortor turpis. Ut eu faucibus sem, ut suscipit tellus. Quisque vitae nunc et felis pretium pellentesque sed in mi. Fusce eu eros nulla. Integer sagittis a ligula non vehicula. Pellentesque consequat lacinia justo ac tempor. Cras accumsan nibh dictum eros blandit, nec tempor ante egestas. Proin vitae augue vitae lorem eleifend faucibus cursus a eros. Maecenas quam velit, tincidunt nec quam quis, cursus finibus eros. Suspendisse dignissim tempus tortor, vel imperdiet mi gravida sed. Nam placerat sapien vel quam efficitur mattis. Mauris vehicula dolor id lacus viverra, eu vehicula arcu suscipit. 4 | 5 | Nunc finibus, erat at hendrerit scelerisque, massa mi cursus mauris, eget suscipit est neque non elit. Suspendisse potenti. Quisque a fermentum ligula, eget luctus felis. Aliquam et lorem risus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla scelerisque lectus ut lorem molestie accumsan. Etiam pulvinar volutpat augue id maximus. Curabitur dapibus augue magna, in ullamcorper urna lobortis id. Curabitur molestie accumsan sapien quis vestibulum. Sed quis nisi condimentum, fringilla nulla sed, aliquet elit. Donec non turpis odio. Donec sodales volutpat lectus, in rutrum erat tempor vel. Nullam auctor erat a turpis dignissim imperdiet. Fusce in tellus nec mi mattis bibendum id nec metus. 6 | 7 | Nullam efficitur, risus eu ornare pretium, sapien dui rhoncus est, non vulputate purus ipsum non sem. Proin a sem id lectus porttitor auctor ut eget sem. Nullam sodales odio enim, at tincidunt libero tempor vulputate. Nulla facilisi. Maecenas semper tincidunt congue. Phasellus dictum nisi nec nunc finibus finibus. Pellentesque lacinia ante pulvinar justo fermentum tristique. Praesent sit amet arcu lacus. Sed in pharetra nisl. Nunc iaculis ipsum id diam rutrum, eu feugiat lectus euismod. Aenean nunc nunc, lacinia in elementum sed, sagittis at nulla. Curabitur ut posuere urna. Nulla augue ex, cursus eu arcu eu, suscipit ultrices risus. 8 | 9 | Phasellus varius tincidunt est, accumsan hendrerit justo feugiat non. Proin hendrerit, nibh lobortis auctor suscipit, felis nibh malesuada erat, at venenatis ex risus id enim. Nulla rutrum velit ut rhoncus molestie. Quisque ac accumsan risus. Sed non nisi non libero volutpat lobortis. Aliquam viverra felis non lacus efficitur rutrum. Ut sagittis metus dolor, non efficitur turpis porta eget. Praesent ullamcorper, lacus congue suscipit accumsan, leo magna rhoncus nisl, vitae rhoncus dolor odio in odio. Nam neque odio, auctor et lacinia id, posuere sed enim. Etiam sit amet purus viverra, ultrices nisl sit amet, porttitor leo. Ut imperdiet congue pretium. Cras quis neque et lorem scelerisque malesuada. Maecenas et vestibulum erat. Cras faucibus tristique purus at dapibus. Phasellus auctor justo ante, vel feugiat arcu lobortis eu. Sed arcu diam, tincidunt vel leo ac, iaculis vehicula lacus. -------------------------------------------------------------------------------- /test/test_data/some_dir/another_dir/file_a.txt: -------------------------------------------------------------------------------- 1 | Hello world 2 | -------------------------------------------------------------------------------- /test/test_data/some_dir/another_dir/file_b.txt: -------------------------------------------------------------------------------- 1 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam ultrices ligula at metus iaculis accumsan. Donec at aliquam justo. Phasellus eu orci gravida, rutrum eros eget, ultrices lacus. Mauris lacinia tortor eu vestibulum vestibulum. Sed eleifend nec ex vel egestas. Donec viverra nibh eu neque gravida, in tincidunt nisi ultricies. Praesent dictum molestie magna mollis accumsan. Proin sed egestas quam. Mauris luctus ante ipsum, non porta ex ultrices eu. Quisque gravida lectus ut diam porta, ut tempus magna fermentum. In hac habitasse platea dictumst. Phasellus sollicitudin tempor feugiat. Nullam imperdiet cursus arcu, sit amet interdum enim feugiat eget. Ut elit metus, semper in turpis luctus, aliquam pharetra libero. Morbi eget lectus vel enim suscipit tempus eget et ipsum. 2 | 3 | Curabitur imperdiet tortor turpis. Ut eu faucibus sem, ut suscipit tellus. Quisque vitae nunc et felis pretium pellentesque sed in mi. Fusce eu eros nulla. Integer sagittis a ligula non vehicula. Pellentesque consequat lacinia justo ac tempor. Cras accumsan nibh dictum eros blandit, nec tempor ante egestas. Proin vitae augue vitae lorem eleifend faucibus cursus a eros. Maecenas quam velit, tincidunt nec quam quis, cursus finibus eros. Suspendisse dignissim tempus tortor, vel imperdiet mi gravida sed. Nam placerat sapien vel quam efficitur mattis. Mauris vehicula dolor id lacus viverra, eu vehicula arcu suscipit. 4 | 5 | Nunc finibus, erat at hendrerit scelerisque, massa mi cursus mauris, eget suscipit est neque non elit. Suspendisse potenti. Quisque a fermentum ligula, eget luctus felis. Aliquam et lorem risus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla scelerisque lectus ut lorem molestie accumsan. Etiam pulvinar volutpat augue id maximus. Curabitur dapibus augue magna, in ullamcorper urna lobortis id. Curabitur molestie accumsan sapien quis vestibulum. Sed quis nisi condimentum, fringilla nulla sed, aliquet elit. Donec non turpis odio. Donec sodales volutpat lectus, in rutrum erat tempor vel. Nullam auctor erat a turpis dignissim imperdiet. Fusce in tellus nec mi mattis bibendum id nec metus. 6 | 7 | Nullam efficitur, risus eu ornare pretium, sapien dui rhoncus est, non vulputate purus ipsum non sem. Proin a sem id lectus porttitor auctor ut eget sem. Nullam sodales odio enim, at tincidunt libero tempor vulputate. Nulla facilisi. Maecenas semper tincidunt congue. Phasellus dictum nisi nec nunc finibus finibus. Pellentesque lacinia ante pulvinar justo fermentum tristique. Praesent sit amet arcu lacus. Sed in pharetra nisl. Nunc iaculis ipsum id diam rutrum, eu feugiat lectus euismod. Aenean nunc nunc, lacinia in elementum sed, sagittis at nulla. Curabitur ut posuere urna. Nulla augue ex, cursus eu arcu eu, suscipit ultrices risus. 8 | 9 | Phasellus varius tincidunt est, accumsan hendrerit justo feugiat non. Proin hendrerit, nibh lobortis auctor suscipit, felis nibh malesuada erat, at venenatis ex risus id enim. Nulla rutrum velit ut rhoncus molestie. Quisque ac accumsan risus. Sed non nisi non libero volutpat lobortis. Aliquam viverra felis non lacus efficitur rutrum. Ut sagittis metus dolor, non efficitur turpis porta eget. Praesent ullamcorper, lacus congue suscipit accumsan, leo magna rhoncus nisl, vitae rhoncus dolor odio in odio. Nam neque odio, auctor et lacinia id, posuere sed enim. Etiam sit amet purus viverra, ultrices nisl sit amet, porttitor leo. Ut imperdiet congue pretium. Cras quis neque et lorem scelerisque malesuada. Maecenas et vestibulum erat. Cras faucibus tristique purus at dapibus. Phasellus auctor justo ante, vel feugiat arcu lobortis eu. Sed arcu diam, tincidunt vel leo ac, iaculis vehicula lacus. -------------------------------------------------------------------------------- /test/test_data/some_dir/file_a.txt: -------------------------------------------------------------------------------- 1 | Hello world 2 | -------------------------------------------------------------------------------- /test/test_data/some_dir/file_b.txt: -------------------------------------------------------------------------------- 1 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam ultrices ligula at metus iaculis accumsan. Donec at aliquam justo. Phasellus eu orci gravida, rutrum eros eget, ultrices lacus. Mauris lacinia tortor eu vestibulum vestibulum. Sed eleifend nec ex vel egestas. Donec viverra nibh eu neque gravida, in tincidunt nisi ultricies. Praesent dictum molestie magna mollis accumsan. Proin sed egestas quam. Mauris luctus ante ipsum, non porta ex ultrices eu. Quisque gravida lectus ut diam porta, ut tempus magna fermentum. In hac habitasse platea dictumst. Phasellus sollicitudin tempor feugiat. Nullam imperdiet cursus arcu, sit amet interdum enim feugiat eget. Ut elit metus, semper in turpis luctus, aliquam pharetra libero. Morbi eget lectus vel enim suscipit tempus eget et ipsum. 2 | 3 | Curabitur imperdiet tortor turpis. Ut eu faucibus sem, ut suscipit tellus. Quisque vitae nunc et felis pretium pellentesque sed in mi. Fusce eu eros nulla. Integer sagittis a ligula non vehicula. Pellentesque consequat lacinia justo ac tempor. Cras accumsan nibh dictum eros blandit, nec tempor ante egestas. Proin vitae augue vitae lorem eleifend faucibus cursus a eros. Maecenas quam velit, tincidunt nec quam quis, cursus finibus eros. Suspendisse dignissim tempus tortor, vel imperdiet mi gravida sed. Nam placerat sapien vel quam efficitur mattis. Mauris vehicula dolor id lacus viverra, eu vehicula arcu suscipit. 4 | 5 | Nunc finibus, erat at hendrerit scelerisque, massa mi cursus mauris, eget suscipit est neque non elit. Suspendisse potenti. Quisque a fermentum ligula, eget luctus felis. Aliquam et lorem risus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla scelerisque lectus ut lorem molestie accumsan. Etiam pulvinar volutpat augue id maximus. Curabitur dapibus augue magna, in ullamcorper urna lobortis id. Curabitur molestie accumsan sapien quis vestibulum. Sed quis nisi condimentum, fringilla nulla sed, aliquet elit. Donec non turpis odio. Donec sodales volutpat lectus, in rutrum erat tempor vel. Nullam auctor erat a turpis dignissim imperdiet. Fusce in tellus nec mi mattis bibendum id nec metus. 6 | 7 | Nullam efficitur, risus eu ornare pretium, sapien dui rhoncus est, non vulputate purus ipsum non sem. Proin a sem id lectus porttitor auctor ut eget sem. Nullam sodales odio enim, at tincidunt libero tempor vulputate. Nulla facilisi. Maecenas semper tincidunt congue. Phasellus dictum nisi nec nunc finibus finibus. Pellentesque lacinia ante pulvinar justo fermentum tristique. Praesent sit amet arcu lacus. Sed in pharetra nisl. Nunc iaculis ipsum id diam rutrum, eu feugiat lectus euismod. Aenean nunc nunc, lacinia in elementum sed, sagittis at nulla. Curabitur ut posuere urna. Nulla augue ex, cursus eu arcu eu, suscipit ultrices risus. 8 | 9 | Phasellus varius tincidunt est, accumsan hendrerit justo feugiat non. Proin hendrerit, nibh lobortis auctor suscipit, felis nibh malesuada erat, at venenatis ex risus id enim. Nulla rutrum velit ut rhoncus molestie. Quisque ac accumsan risus. Sed non nisi non libero volutpat lobortis. Aliquam viverra felis non lacus efficitur rutrum. Ut sagittis metus dolor, non efficitur turpis porta eget. Praesent ullamcorper, lacus congue suscipit accumsan, leo magna rhoncus nisl, vitae rhoncus dolor odio in odio. Nam neque odio, auctor et lacinia id, posuere sed enim. Etiam sit amet purus viverra, ultrices nisl sit amet, porttitor leo. Ut imperdiet congue pretium. Cras quis neque et lorem scelerisque malesuada. Maecenas et vestibulum erat. Cras faucibus tristique purus at dapibus. Phasellus auctor justo ante, vel feugiat arcu lobortis eu. Sed arcu diam, tincidunt vel leo ac, iaculis vehicula lacus. -------------------------------------------------------------------------------- /test/test_data/some_dir_2/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mihneadb/node-directory-tree/5b26667395e9d2c696484f5c4b72fb4eeffb4b04/test/test_data/some_dir_2/.gitkeep -------------------------------------------------------------------------------- /test/test_data/symlink: -------------------------------------------------------------------------------- 1 | . --------------------------------------------------------------------------------