├── .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 |
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 | .
--------------------------------------------------------------------------------