├── .editorconfig ├── .github ├── actions │ └── dep-install │ │ └── action.yml └── workflows │ ├── deploy.yml │ └── test.yml ├── .gitignore ├── .npmignore ├── .prettierrc ├── Dockerfile ├── License ├── README.md ├── bin └── fds ├── example ├── .editorconfig ├── fds-config.js ├── mocks │ └── index.json ├── public │ └── test.js ├── routes.js └── views │ └── index.html ├── handlers ├── data-handler.js ├── error-handler.js ├── init-handler.js ├── java-handler.js ├── not-found-handler.js ├── proxy-handler.js ├── static-html-handler.js ├── view-data-handler.js └── view-handler.js ├── index.js ├── jetty └── server.jar ├── libs ├── config-handler.js ├── dataset.js ├── handlebars-helper.js ├── java-server.js ├── lr-script.js ├── router.js └── utils.js ├── package.json ├── pnpm-lock.yaml ├── test ├── config-handler_test.js ├── data │ ├── fds-config.js │ ├── js_func.js │ ├── js_obj.js │ ├── obj.json │ └── route-file.js ├── dataset_test.js ├── embed_test.js ├── router_test.js └── utils_test.js └── views ├── 404.hbs └── error.hbs /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | end_of_line = lf 6 | indent_size = 4 7 | insert_final_newline = true 8 | trim_trailing_whitespace = true 9 | 10 | [*.{pug,json,yml}] 11 | indent_size = 2 12 | 13 | [*.md] 14 | trim_trailing_whitespace = false 15 | -------------------------------------------------------------------------------- /.github/actions/dep-install/action.yml: -------------------------------------------------------------------------------- 1 | name: Install dependencies 2 | 3 | runs: 4 | using: "composite" 5 | steps: 6 | - name: Use Node.js 18.x 7 | uses: actions/setup-node@v3 8 | with: 9 | node-version: 18.x 10 | registry-url: 'https://registry.npmjs.org' 11 | 12 | - name: Install pnpm 13 | uses: pnpm/action-setup@v2 14 | with: 15 | version: 7 16 | 17 | - name: Get pnpm store directory 18 | id: pnpm-cache 19 | shell: bash 20 | run: | 21 | echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT 22 | 23 | - name: Setup pnpm cache 24 | uses: actions/cache@v3 25 | with: 26 | path: ${{ steps.pnpm-cache.outputs.STORE_PATH }} 27 | key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} 28 | restore-keys: | 29 | ${{ runner.os }}-pnpm-store- 30 | 31 | - name: Install Dependencies 32 | shell: bash 33 | run: pnpm install 34 | -------------------------------------------------------------------------------- /.github/workflows/deploy.yml: -------------------------------------------------------------------------------- 1 | name: Build and Deploy 2 | 3 | on: 4 | pull_request: 5 | branches: 6 | - master 7 | types: [ closed ] 8 | workflow_dispatch: 9 | 10 | jobs: 11 | deploy: 12 | runs-on: ubuntu-20.04 13 | steps: 14 | - name: Check out code 15 | uses: actions/checkout@v3 16 | 17 | - name: Install dependencies 18 | uses: ./.github/actions/dep-install 19 | 20 | - name: Run test 21 | run: pnpm test 22 | 23 | - name: Get current package version 24 | uses: martinbeentjes/npm-get-version-action@v1.2.3 25 | id: pkg_version 26 | 27 | - name: Get changed for package.json 28 | id: pkg-changed 29 | uses: tj-actions/changed-files@v34 30 | with: 31 | files: | 32 | package.json 33 | 34 | - name: Publish package to NPM 35 | if: steps.pkg-changed.outputs.any_changed == 'true' 36 | run: npm publish 37 | env: 38 | NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} 39 | 40 | - name: Set up QEMU 41 | if: steps.pkg-changed.outputs.any_changed == 'true' 42 | uses: docker/setup-qemu-action@v2 43 | 44 | - name: Set up Docker Buildx 45 | if: steps.pkg-changed.outputs.any_changed == 'true' 46 | uses: docker/setup-buildx-action@v2 47 | 48 | - name: Login to Docker Hub 49 | if: steps.pkg-changed.outputs.any_changed == 'true' 50 | uses: docker/login-action@v2 51 | with: 52 | username: ${{ secrets.DOCKER_HUB_USERNAME }} 53 | password: ${{ secrets.DOCKER_HUB_TOKEN }} 54 | 55 | - name: Publish image to Docker 56 | if: steps.pkg-changed.outputs.any_changed == 'true' 57 | uses: docker/build-push-action@v3 58 | with: 59 | context: . 60 | push: true 61 | platforms: arm64,amd64 62 | tags: ${{ secrets.DOCKER_HUB_USERNAME }}/fe-dev-server:latest, ${{ secrets.DOCKER_HUB_USERNAME }}/fe-dev-server:${{ steps.pkg_version.outputs.current-version }} 63 | -------------------------------------------------------------------------------- /.github/workflows/test.yml: -------------------------------------------------------------------------------- 1 | name: Run Test 2 | 3 | on: 4 | pull_request: 5 | branches: 6 | - 'feature/*' 7 | - 'refactor/*' 8 | - 'bugfix/*' 9 | - 'release/*' 10 | - 'master' 11 | 12 | jobs: 13 | test: 14 | runs-on: ubuntu-20.04 15 | steps: 16 | - name: Check out code 17 | uses: actions/checkout@v3 18 | 19 | - name: Install dependencies 20 | uses: ./.github/actions/dep-install 21 | 22 | - name: Run test 23 | run: pnpm test 24 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .idea 2 | node_modules 3 | *.log 4 | .DS_Store 5 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | *.md 2 | test/ 3 | Dockerfile 4 | License 5 | pnpm-lock.yaml 6 | .editorconfig 7 | .prettierrc 8 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "useTabs": true, 3 | "printWidth": 100, 4 | "tabWidth": 4, 5 | "singleQuote": true, 6 | "trailingComma": "all", 7 | "proseWrap": "always" 8 | } 9 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:18 as builder 2 | 3 | WORKDIR /code 4 | 5 | RUN npm i pnpm -g 6 | 7 | COPY . . 8 | 9 | RUN pnpm i 10 | 11 | #---- 12 | 13 | FROM node:18-alpine 14 | 15 | WORKDIR /code/fe-dev-server 16 | 17 | COPY --from=builder /code ./ 18 | 19 | RUN npm link . 20 | 21 | CMD [ "fds", "server" ] 22 | -------------------------------------------------------------------------------- /License: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2013-present, Zhe (ZheX) Xu 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 13 | all 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 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # FE Dev Server [![Build and Deploy](https://github.com/zhex/fe-dev-server/actions/workflows/deploy.yml/badge.svg)](https://github.com/zhex/fe-dev-server/actions/workflows/deploy.yml) 2 | 3 | FE Dev Server target to help frontend web developers create view template, styles and js easily. It try the best to simulate real server environment which can help you to make you job done. 4 | 5 | ## Features 6 | 7 | 1. Various template engines and embedded page data. 8 | 2. Url simulation 9 | 3. Mock data in file 10 | 4. Proxy configuration 11 | 12 | ## Quick start 13 | 14 | Install it as a command line tool with the following step: 15 | 16 | 17 | Install module globally 18 | 19 | ``` 20 | $ npm install -g fe-dev-server 21 | ``` 22 | 23 | create project folder and get into the folder 24 | 25 | ``` 26 | $ mkdir workdir && cd workdir 27 | ``` 28 | 29 | initial the project folder 30 | 31 | ``` 32 | $ fds init 33 | ``` 34 | 35 | start up server 36 | 37 | ``` 38 | $ fds server 39 | ``` 40 | 41 | start up server & open browser 42 | 43 | ``` 44 | $ fds server -o 45 | ``` 46 | 47 | Also, it can be integrated into your own project as a node module. 48 | 49 | ```js 50 | var fds = require('fe-dev-server'); 51 | 52 | var app = fds({ 53 | basePath: __dirname, 54 | mockFolder: 'data', 55 | port: 8001 56 | }); 57 | ``` 58 | 59 | ## Routes 60 | 61 | Routes is stored in `routes.js` as key/value pairs by default. 62 | 63 | Sample: 64 | 65 | ```js 66 | module.exports = { 67 | // set /test route to test.html page, default http method is GET 68 | '/test': 'test.html', 69 | 70 | // set /books route to books.pug template with GET method 71 | 'GET::/books': 'books.pug', 72 | 73 | // set json api with a json file in mock folder 74 | 'POST::/api/books': 'mock::books.json', 75 | 76 | // mock file can also be a js file, which has more power to do the customization 77 | 'GET::/api/category': 'mock::category.js', 78 | 79 | // fds works with java template such as jsp; 80 | // before do this, you have to set enableJava to true in your fds-config.js file 81 | '/jsp-page': 'books.jsp', 82 | 83 | // it allow your route to proxy an online page 84 | '/proxy-api': 'http://www.github.com/zhex.json', 85 | 86 | // proxy can do fuzzy mapping; 87 | // in the setting, if you visit /books/hello, it will map to http://example.com/books/hello 88 | 'ALL::/books/:pattern*': 'http://example.com/books/' 89 | }; 90 | ``` 91 | the rule is `'[method]::[route_url]': '[template_file]'`. 92 | 93 | Allowed method: `GET`, `POST`, `PUT`, `PATCH`, `DETELE` 94 | 95 | `GET` will be used if it is not specified. 96 | 97 | If you want to setup an ajax api url, you can set the template to a json file. The server will look for the json/js file in view folder and send back it as a json object. the data in the view folder sounds not make sense. So if you want put the json/js file in the mock folder, then you can add a `mock::` prefix in the template path, then the server will look for the file in mock folder. 98 | 99 | If the mock file is a js file, then it is good to define as a module function: 100 | 101 | ```js 102 | module.exports = function (data, utils) { 103 | return { 104 | id: data.params.id, 105 | name: data.query.name || 'hello world', 106 | content: data.body.content 107 | }; 108 | }; 109 | ``` 110 | The `data.params` is the match variable collection in the particular route; The `data.query` is the query data from request url, so you can easily test your page with different api return. 111 | 112 | `utils` provide some easy to use method to handle the data. 113 | 114 | available method: 115 | 116 | - utils.isObject(obj) 117 | - utils.isArray(obj) 118 | - utils.isFunc(obj) 119 | - utils.contains(array, item) 120 | - utils.serialize(obj) 121 | - utils.assign() - which is [object-assign](https://www.npmjs.com/package/object-assign) library 122 | - utils.moment() - which is [moment](http://momentjs.com/) library 123 | - utils.Mock - which is [mockjs](http://mockjs.com) library 124 | 125 | Also, you can add `$$header` in the data file to extend http response header, and using `$$delay` to set simulate the http connection delay. 126 | 127 | ```js 128 | { 129 | "$$header": { 130 | "x-access-token": "abcs" 131 | }, 132 | "$$delay": 3000, 133 | "title": "hello world" 134 | } 135 | 136 | ``` 137 | 138 | ## embedded template engines 139 | 140 | - [pug](https://pugjs.org/api/getting-started.html) 141 | - [handlebars](http://handlebarsjs.com/) 142 | - [ejs](http://www.embeddedjs.com/) 143 | - [jsp](https://en.wikipedia.org/wiki/JavaServer_Pages) (java) 144 | - [velocity](http://velocity.apache.org/) (java) 145 | 146 | 147 | ## Configuration 148 | 149 | You can custom your configuration in `fds-config.js` file. 150 | 151 | ```js 152 | defaultConfig = { 153 | basePath: path.resolve(__dirname, './example'), 154 | publicFolder: 'public', 155 | viewFolder: 'views', 156 | mockFolder: 'mocks', 157 | routeFile: 'routes.js', 158 | port: 3000 159 | } 160 | ``` 161 | 162 | ### basePath 163 | 164 | The base path of the project, all other folder settings are related to base path. 165 | 166 | ### viewFolder 167 | 168 | default: 'views' 169 | 170 | Where you can put your view template files. 171 | 172 | ### mockFolder 173 | 174 | default: 'mocks' 175 | 176 | Save you mock data into this folder. each view template will have a matched json data file will be loaded automatcially. 177 | 178 | For example: we have a `${viewFolder}/projects/index.html` template, then data in `${viewFolder}/projects/index.json` file will be auto loaded into the template. 179 | 180 | ### publicFolder 181 | 182 | default: 'public' 183 | 184 | Where you can put your image, style and js files here. This folder is set by `express.static()` 185 | 186 | ### routeFile 187 | 188 | default: 'routes.js' 189 | 190 | Routes mapping file 191 | 192 | ### mockExts 193 | 194 | default: ['.js', '.json'] 195 | 196 | Some people like to set mockFolder as the same as viewFolder for convinence reason, `mockExts` give you the ability to define your own mock file type to avoid the conflict issue. Also, the ext order in array demonstrate the priority from higher to lower. 197 | 198 | ### port 199 | 200 | default: 3000 201 | 202 | Express server port 203 | 204 | ### enableJava 205 | 206 | default: true 207 | 208 | Sometimes you don't need to support java templates, you can turn it off with this property to `false`. 209 | 210 | ### livereload 211 | 212 | default: true 213 | 214 | livereload is awesome, it will refresh your browser automatically after anything changed. If you dont like this feature, you can set it to `false` to switch it off. also you can set it as a **livereload option object**; 215 | 216 | ### open 217 | 218 | default: { route: '/', browser: ['google chrome'] } 219 | 220 | Browser setting allow you to open dev site automatically on server started with `-o` option in cli. It will open google chrome by default. 221 | 222 | ``` 223 | $ fds server -o 224 | ``` 225 | 226 | ## License 227 | 228 | This project is licensed under the terms of the MIT license. 229 | -------------------------------------------------------------------------------- /bin/fds: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | require('@colors/colors'); 4 | var path = require('path'); 5 | var fs = require('fs-extra'); 6 | var program = require('commander'); 7 | var findup = require('findup-sync'); 8 | var fds = require('../index'); 9 | 10 | program 11 | .version(require('../package.json').version, '-v --version') 12 | .option('-o, --open', 'open site in browser after server startup') 13 | .usage(' [options]'); 14 | 15 | program 16 | .command('init [name]') 17 | .description('initial the project') 18 | .action(init); 19 | 20 | program 21 | .command('server') 22 | .description('startup server') 23 | .action(server); 24 | 25 | program.parse(process.argv); 26 | 27 | function init(name, opts) { 28 | var dest = process.cwd(); 29 | if (name) dest = path.resolve(dest, name); 30 | 31 | fs.copy(path.resolve(__dirname, '../example'), dest, function (err) { 32 | if (err) { 33 | console.error(err.red); 34 | return; 35 | } 36 | console.log('Project inited.'.green); 37 | }); 38 | } 39 | 40 | function server() { 41 | var configFile = findup('fds-config.js'); 42 | 43 | if (!configFile) { 44 | console.log('[Error] '.red + 'fds-config.js'.magenta + ' is not found in path.'); 45 | return; 46 | } 47 | 48 | var app = fds(configFile); 49 | 50 | const options = program.opts(); 51 | if (options.open) app.openBrowser(); 52 | } 53 | 54 | -------------------------------------------------------------------------------- /example/.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | end_of_line = lf 6 | indent_size = 4 7 | insert_final_newline = true 8 | trim_trailing_whitespace = true 9 | 10 | [*.{jade,json}] 11 | indent_size = 2 12 | 13 | [*.md] 14 | trim_trailing_whitespace = false 15 | -------------------------------------------------------------------------------- /example/fds-config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | basePath: __dirname, 3 | publicFolder: 'public', 4 | viewFolder: 'views', 5 | mockFolder: 'mocks', 6 | routeFile: 'routes.js', 7 | mockExts: ['.js', '.json'], 8 | port: 3000, 9 | enableJava: true, 10 | livereload: true, 11 | open: { 12 | route: '/', 13 | browser: ['google chrome'] 14 | } 15 | }; 16 | -------------------------------------------------------------------------------- /example/mocks/index.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "hello world" 3 | } 4 | -------------------------------------------------------------------------------- /example/public/test.js: -------------------------------------------------------------------------------- 1 | console.log(1111); 2 | -------------------------------------------------------------------------------- /example/routes.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'get::/': 'index.html' 3 | }; 4 | 5 | -------------------------------------------------------------------------------- /example/views/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | TEST 6 | 7 | 8 |

<%= title %>

9 | 10 |

hello world

11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /handlers/data-handler.js: -------------------------------------------------------------------------------- 1 | var path = require('path'); 2 | var utils = require('../libs/utils'); 3 | var DataSet = require('../libs/dataset'); 4 | 5 | module.exports = function (req, res, next) { 6 | var config = req._fds.config; 7 | var match = req._fds.match; 8 | 9 | if (!utils.contains(config.mockExts, path.extname(match.file))) 10 | return next(); 11 | 12 | var ds = new DataSet( 13 | match.searchType === 'view' ? config.viewFolder : config.mockFolder, 14 | config.mockExts 15 | ); 16 | var data = ds.get(match.file, { 17 | params: match.params, 18 | query: req.query, 19 | body: req.body 20 | }); 21 | 22 | if (data.$$header) { 23 | Object.keys(data.$$header).forEach(function (key) { 24 | res.setHeader(key, data.$$header[key]); 25 | }); 26 | delete data['$$header']; 27 | } 28 | 29 | var delay = 0; 30 | if (data.$$delay >= 0) { 31 | delay = data.$$delay; 32 | delete data['$$delay']; 33 | } 34 | 35 | setTimeout(function () { 36 | if (req.query.callback) { 37 | res.setHeader('Access-Control-Allow-Origin', '*'); 38 | res.setHeader('Access-Control-Allow-Methods', '*'); 39 | res.jsonp(data); 40 | } else { 41 | res.json(data); 42 | } 43 | }, delay); 44 | }; 45 | -------------------------------------------------------------------------------- /handlers/error-handler.js: -------------------------------------------------------------------------------- 1 | var cons = require('consolidate'); 2 | var path = require('path'); 3 | 4 | module.exports = function (err, req, res, next) { 5 | var tpl = path.resolve(__dirname, '../views/error.hbs'); 6 | 7 | var data = { 8 | error: err, 9 | route: req._fds.route, 10 | method: req.method, 11 | query: req.query, 12 | match: req._fds.match, 13 | config: req._fds.config 14 | }; 15 | 16 | cons.handlebars(tpl, data, function (err, html) { 17 | res.status(req._err || 500).send(html); 18 | }); 19 | }; 20 | -------------------------------------------------------------------------------- /handlers/init-handler.js: -------------------------------------------------------------------------------- 1 | var Router = require('../libs/router'); 2 | var path = require('path'); 3 | var fs = require('fs'); 4 | 5 | module.exports = function (config) { 6 | var router = new Router(config.routeFile); 7 | 8 | return function (req, res, next) { 9 | var route = '/' + req.params.pattern; 10 | var match = router.search(route, req.method); 11 | 12 | req._fds = { 13 | route: route, 14 | match: match, 15 | config: config, 16 | delay: 0, 17 | data: null 18 | }; 19 | 20 | try { 21 | if (!match) 22 | throw new Error('No route defined in: ' + config.routeFile); 23 | 24 | if (match.searchType !== 'url') { 25 | var filePath = match.searchType === 'mock' ? config.mockFolder : config.viewFolder; 26 | file = path.resolve(filePath, match.file); 27 | 28 | if (!fs.existsSync(file)) 29 | throw new Error('Template file: ' + file + ' is not found'); 30 | } 31 | 32 | next(); 33 | } catch(e) { 34 | req._err = 404; 35 | next(e); 36 | } 37 | }; 38 | }; 39 | -------------------------------------------------------------------------------- /handlers/java-handler.js: -------------------------------------------------------------------------------- 1 | var path = require('path'); 2 | var { request } = require('gaxios'); 3 | var utils = require('../libs/utils'); 4 | var lrScript = require('../libs/lr-script'); 5 | 6 | module.exports = function (req, res, next) { 7 | var config = req._fds.config; 8 | var match = req._fds.match; 9 | 10 | if (!utils.contains(['.jsp', '.vm'], path.extname(match.file))) return next(); 11 | 12 | if (!config.enableJava) { 13 | req._err = 500; 14 | return next(new Error('Please enable Java support in your fds-config.js file.')); 15 | } 16 | 17 | var formData = { 18 | template: match.file.slice(0, 1) === '/' ? match.file : '/' + match.file, 19 | data: JSON.stringify(req._fds.data), 20 | }; 21 | var url = 'http://localhost:' + config.javaServerPort + '/render?' + utils.serialize(req.query); 22 | 23 | request({ url, method: 'post', form: formData }) 24 | .then((r) => { 25 | let body = r.data; 26 | 27 | if (config.livereload) { 28 | body = lrScript.getInjectHtml(r.data, config.livereloadPort); 29 | } 30 | 31 | setTimeout(function () { 32 | res.status(r.status); 33 | res.setHeader('Content-Type', 'text/html'); 34 | res.write(body); 35 | res.end(); 36 | }, req._fds.delay); 37 | }) 38 | .catch(next); 39 | }; 40 | -------------------------------------------------------------------------------- /handlers/not-found-handler.js: -------------------------------------------------------------------------------- 1 | var cons = require('consolidate'); 2 | var path = require('path'); 3 | 4 | module.exports = function (err, req, res, next) { 5 | if (req._err !== 404) return next(err); 6 | 7 | var tpl = path.resolve(__dirname, '../views/404.hbs'); 8 | 9 | var data = { 10 | error: err, 11 | config: req._fds.config, 12 | route: req._fds.route, 13 | method: req.method, 14 | query: req.query, 15 | match: req._fds.match 16 | }; 17 | 18 | cons.handlebars(tpl, data, function (err, html) { 19 | res.status(404).send(html); 20 | }); 21 | }; 22 | -------------------------------------------------------------------------------- /handlers/proxy-handler.js: -------------------------------------------------------------------------------- 1 | var { request } = require('gaxios'); 2 | var utils = require('../libs/utils'); 3 | 4 | 5 | module.exports = (req, res, next) => { 6 | var match = req._fds.match; 7 | 8 | if (match.searchType !== 'url') { 9 | return next(); 10 | } 11 | 12 | var url = 13 | match.file + 14 | (match.params.pattern || '') + 15 | (req.query ? '?' + utils.serialize(req.query) : ''); 16 | 17 | request({ url, method: req.method, responseType: 'stream' }).then((r) => r.data.pipe(res)); 18 | }; 19 | -------------------------------------------------------------------------------- /handlers/static-html-handler.js: -------------------------------------------------------------------------------- 1 | var path = require('path'); 2 | var fs = require('fs'); 3 | var lrScript = require('../libs/lr-script'); 4 | 5 | module.exports = function (config) { 6 | return function (req, res, next) { 7 | var file = path.join(config.publicFolder, req.url); 8 | if (req.url.match(/\.html$/) && fs.existsSync(file)) { 9 | var html = fs.readFileSync(file).toString(); 10 | html = lrScript.getInjectHtml(html, config.livereloadPort); 11 | res.setHeader('Content-Type', 'text/html'); 12 | res.send(html); 13 | } else 14 | next(); 15 | }; 16 | }; 17 | 18 | -------------------------------------------------------------------------------- /handlers/view-data-handler.js: -------------------------------------------------------------------------------- 1 | var DataSet = require('../libs/dataset'); 2 | 3 | module.exports = function (req, res, next) { 4 | var config = req._fds.config; 5 | var match = req._fds.match; 6 | 7 | var ds = new DataSet(config.mockFolder, config.mockExts); 8 | var data = { 9 | params: match.params, 10 | query: req.query, 11 | body: req.body 12 | }; 13 | req._fds.data = data = ds.get(match.file, data); 14 | 15 | if (data instanceof Error) { 16 | req._err = 500; 17 | return next(data); 18 | } 19 | 20 | if (data.$$header) { 21 | Object.keys(data.$$header).forEach(function (key) { 22 | res.setHeader(key, data.$$header[key]); 23 | }); 24 | } 25 | 26 | if (data.$$delay >= 0) { 27 | req._fds.delay = data.$$delay; 28 | } 29 | 30 | Object.keys(data).forEach(function (key) { 31 | if (key.match(/^\$\$/)) delete data[key]; 32 | }); 33 | 34 | next(); 35 | }; 36 | -------------------------------------------------------------------------------- /handlers/view-handler.js: -------------------------------------------------------------------------------- 1 | var lrScript = require('../libs/lr-script'); 2 | 3 | module.exports = function (req, res, next) { 4 | var match = req._fds.match; 5 | var config = req._fds.config; 6 | 7 | res.render(match.file, req._fds.data, function (err, html) { 8 | if (err) return next(err); 9 | 10 | if (config.livereload) { 11 | html = lrScript.getInjectHtml(html, config.livereloadPort); 12 | } 13 | 14 | setTimeout(function () { 15 | res.send(html); 16 | }, req._fds.delay); 17 | }); 18 | 19 | }; 20 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | require('@colors/colors'); 2 | var url = require('url'); 3 | var express = require('express'); 4 | var cons = require('consolidate'); 5 | var bodyParser = require('body-parser'); 6 | var proxy = require('proxy-middleware'); 7 | var open = require('open'); 8 | var livereload = require('livereload'); 9 | var configHandler = require('./libs/config-handler'); 10 | var utils = require('./libs/utils'); 11 | var JavaServer = require('./libs/java-server'); 12 | 13 | require('./libs/handlebars-helper'); 14 | 15 | module.exports = function (config) { 16 | config = configHandler(config); 17 | 18 | var app = express(); 19 | app.config = config; 20 | 21 | app.use(require('morgan')('dev')); 22 | 23 | app.engine('html', cons.ejs); 24 | app.engine('pug', cons.pug); 25 | app.engine('hbs', cons.handlebars); 26 | 27 | app.set('view engine', 'html'); 28 | app.set('views', config.viewFolder); 29 | 30 | app.use(bodyParser.json()); 31 | app.use(bodyParser.urlencoded({ extended: true })); 32 | 33 | // set proxy routes 34 | if (config.proxy && utils.isObject(config.proxy)) { 35 | Object.keys(config.proxy).forEach(function (k) { 36 | app.use(k, proxy(url.parse(config.proxy[k]))); 37 | }); 38 | } 39 | 40 | // serve reload server 41 | if (config.livereload) { 42 | app.use( 43 | require('./handlers/static-html-handler')(config), 44 | express.static(config.publicFolder) 45 | ); 46 | 47 | var options = { 48 | exts: [ 'html', 'css', 'js', 'png', 'gif', 'jpg', 'json', 'jsp', 'vm' ], 49 | exclusions: [/node_modules/, /.git/], 50 | }; 51 | 52 | if (utils.isObject(config.livereload)) 53 | options = utils.assign({}, options, config.livereload); 54 | 55 | var lrServer = livereload.createServer(options); 56 | 57 | lrServer.watch([ 58 | config.viewFolder, 59 | config.mockFolder, 60 | config.publicFolder 61 | ]); 62 | } else { 63 | app.use(express.static(config.publicFolder)); 64 | } 65 | 66 | // route handle 67 | app.all( 68 | '/:pattern(*)', 69 | require('./handlers/init-handler')(config), 70 | require('./handlers/data-handler'), 71 | require('./handlers/proxy-handler'), 72 | require('./handlers/view-data-handler'), 73 | require('./handlers/java-handler'), 74 | require('./handlers/view-handler'), 75 | require('./handlers/not-found-handler'), 76 | require('./handlers/error-handler') 77 | ); 78 | 79 | // launch java server in child process 80 | if (config.enableJava) { 81 | app.javaServer = new JavaServer(); 82 | app.javaServer.create(config); 83 | } 84 | 85 | app.openBrowser = function () { 86 | var openMe = function () { 87 | const url = 'http://localhost:' + config.port + (config.open.route || '/'); 88 | open(url, { app: config.open.browser }); 89 | }; 90 | 91 | if (config.enableJava) { 92 | app.javaServer.on('started', openMe); 93 | } else { 94 | openMe(); 95 | } 96 | }; 97 | 98 | app.destroy = function() { 99 | process.exit(); 100 | } 101 | 102 | app.listen(config.port, function () { 103 | console.log('FE Dev Server is listening on port '.green + config.port.toString().green); 104 | }); 105 | 106 | process.on('uncaughtException', function(err) { 107 | if(err.errno === 'EADDRINUSE') { 108 | console.log(('FE Dev Server: Port ' + err.port + ' is already in use.').red); 109 | process.exit(1); 110 | } else 111 | console.log(err); 112 | }); 113 | 114 | process.on('SIGINT', function () { 115 | console.log('FE Dev Server is stopped.'.green); 116 | process.exit(); 117 | }); 118 | 119 | process.on('exit', function () { 120 | if (config.enableJava) app.javaServer.close(); 121 | }); 122 | 123 | return app; 124 | }; 125 | -------------------------------------------------------------------------------- /jetty/server.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhex/fe-dev-server/43122b6492a8727896754ca7ba28a87b958e5d2b/jetty/server.jar -------------------------------------------------------------------------------- /libs/config-handler.js: -------------------------------------------------------------------------------- 1 | var path = require('path'); 2 | var fs = require('fs'); 3 | var assign = require('object-assign'); 4 | var portscanner = require('portscanner'); 5 | var deasync = require('deasync'); 6 | 7 | var defaultJavaPort = 12321; 8 | var defaultLivereloadPort = 35729; 9 | 10 | var defaultConfig = { 11 | basePath: path.resolve(__dirname, '../example'), 12 | publicFolder: 'public', 13 | viewFolder: 'views', 14 | mockFolder: 'mocks', 15 | routeFile: 'routes.js', 16 | mockExts: ['.js', '.json'], 17 | proxy: null, 18 | port: 3000, 19 | enableJava: true, 20 | // javaServerPort: 12321, 21 | livereload: true, 22 | open: { 23 | route: '/', 24 | browser: ['google chrome'] 25 | } 26 | }; 27 | 28 | var findAPortNotInUse = deasync(portscanner.findAPortNotInUse); 29 | 30 | function findPort(port) { 31 | return findAPortNotInUse(port, port + 1000, '127.0.0.1'); 32 | } 33 | 34 | function extendConfig(config) { 35 | config = assign({}, defaultConfig, config); 36 | config.basePath = path.resolve(config.basePath); 37 | config.viewFolder = path.resolve(config.basePath, config.viewFolder); 38 | config.mockFolder = path.resolve(config.basePath, config.mockFolder); 39 | config.publicFolder = path.resolve(config.basePath, config.publicFolder); 40 | config.routeFile = path.resolve(config.basePath, config.routeFile); 41 | 42 | if (config.enableJava) { 43 | config.javaServerPort = findPort(defaultJavaPort); 44 | } 45 | 46 | if (config.livereload) { 47 | config.livereloadPort = findPort(defaultLivereloadPort); 48 | } 49 | return config; 50 | } 51 | 52 | module.exports = function (config, force) { 53 | if (typeof config === 'string') { 54 | if (force) delete require.cache[config]; 55 | config = fs.existsSync(config) ? require(config) : {}; 56 | } 57 | 58 | if (config.javaServerPort) { 59 | console.warn('WARN: config.javaServerPort is deprecated; please remove it in your fds-config.js file!'.yellow); 60 | } 61 | 62 | if (config.proxy) { 63 | console.warn('WARN: config.proxy is deprecated; please set proxy route in file routes.js'.yellow); 64 | } 65 | 66 | return extendConfig(config); 67 | }; 68 | -------------------------------------------------------------------------------- /libs/dataset.js: -------------------------------------------------------------------------------- 1 | var path = require('path'); 2 | var fs = require('fs'); 3 | var vm = require('vm'); 4 | var check = require('syntax-error'); 5 | var utils = require('./utils'); 6 | 7 | function DataSet(path, exts) { 8 | this.path = path; 9 | this.exts = exts; 10 | } 11 | 12 | DataSet.prototype.get = function (file, params) { 13 | var data = {}; 14 | var dataExt = null; 15 | 16 | var ext = path.extname(file); 17 | var regexp = new RegExp('\\' + ext + '$'); 18 | 19 | var dataFile = file.replace(regexp, ''); 20 | dataFile = path.resolve(this.path, dataFile); 21 | 22 | this.exts.some(function (ext) { 23 | if (fs.existsSync(dataFile + ext)) { 24 | dataExt = ext; 25 | return true; 26 | } 27 | }); 28 | 29 | if (dataExt) { 30 | dataFile += dataExt; 31 | var content = fs.readFileSync(dataFile).toString(); 32 | 33 | if (content.indexOf('module.exports') >= 0) { 34 | var err = check(content, dataFile); 35 | if (err) return err; 36 | data = jsHandler(content, params); 37 | } else { 38 | data = JSON.parse(content); 39 | } 40 | } 41 | 42 | return data; 43 | }; 44 | 45 | function jsHandler(content, params) { 46 | var sandbox = { module: {}, exports: {} }; 47 | 48 | vm.createContext(sandbox); 49 | vm.runInContext(content, sandbox); 50 | 51 | var data = sandbox.module.exports; 52 | 53 | if (utils.isFunc(data)) 54 | data = data(params, utils); 55 | else 56 | data = utils.assign({}, data); 57 | 58 | return data; 59 | } 60 | 61 | module.exports = DataSet; 62 | -------------------------------------------------------------------------------- /libs/handlebars-helper.js: -------------------------------------------------------------------------------- 1 | var Handlebars = require('handlebars'); 2 | 3 | Handlebars.registerHelper('json', function(context) { 4 | return JSON.stringify(context); 5 | }); 6 | -------------------------------------------------------------------------------- /libs/java-server.js: -------------------------------------------------------------------------------- 1 | require('@colors/colors'); 2 | var path = require('path'); 3 | var spawn = require('cross-spawn'); 4 | var EventEmitter = require('events'); 5 | var util = require('util'); 6 | 7 | function JavaServer() { 8 | this.instance = null; 9 | EventEmitter.call(this); 10 | } 11 | 12 | util.inherits(JavaServer, EventEmitter); 13 | 14 | JavaServer.prototype.create = function (config) { 15 | var jarPath = path.resolve(__dirname, '../jetty/server.jar'); 16 | var args = [ 17 | '-Dviewpath=' + config.viewFolder, 18 | '-Dserver.port=' + config.javaServerPort, 19 | '-jar', jarPath 20 | ]; 21 | 22 | this.instance = spawn('java', args, {cwd: __dirname, detached: true}); 23 | this.instance.unref(); 24 | 25 | function onData(chunk) { 26 | var data = chunk.toString(); 27 | if (data.indexOf('Exception') >= 0) { 28 | var match = data.match(/exception:?\s+([^\r\n]+)/i); 29 | console.log(('Embedded Java Server: ' + match[1]).red); 30 | // instance.stderr.removeListener('data', onData); 31 | // close(); 32 | } 33 | else if (data.indexOf('ServerConnector@') >= 0) { 34 | console.log(('Embedded Java Server is listening on port ' + config.javaServerPort).cyan); 35 | this.emit('started'); 36 | } 37 | } 38 | 39 | this.instance.stderr.on('data', onData.bind(this)); 40 | } 41 | 42 | JavaServer.prototype.close = function () { 43 | try { 44 | if (this.instance) { 45 | process.kill(this.instance.pid, 'SIGKILL'); 46 | console.log('Embedded Java Server is stopped.'.cyan); 47 | } 48 | } catch(e) {} 49 | } 50 | 51 | JavaServer.prototype.restart = function (config) { 52 | this.close(); 53 | setTimeout(function () { 54 | this.create(config); 55 | }.bind(this), 30); 56 | } 57 | 58 | module.exports = JavaServer; 59 | -------------------------------------------------------------------------------- /libs/lr-script.js: -------------------------------------------------------------------------------- 1 | exports.getInjectHtml = function (html, port) { 2 | var script = ""; 3 | 4 | html = html.split(''); 5 | 6 | if (html.length === 1) { 7 | html = html[0] + script; 8 | } else { 9 | html = html.join(script + ''); 10 | } 11 | 12 | return html; 13 | }; 14 | -------------------------------------------------------------------------------- /libs/router.js: -------------------------------------------------------------------------------- 1 | var pathRegexp = require('path-to-regexp'); 2 | var chokidar = require('chokidar'); 3 | 4 | var SYMBOL_MOCK = 'mock::'; 5 | 6 | function Router(routeFile) { 7 | this.routes = []; 8 | this.loadRoutes(routeFile); 9 | 10 | chokidar.watch(routeFile).on('change', function () { 11 | delete require.cache[routeFile]; 12 | this.routes = []; 13 | this.loadRoutes(routeFile); 14 | }.bind(this)); 15 | } 16 | 17 | Router.prototype.loadRoutes = function (routeFile) { 18 | var mapping = require(routeFile); 19 | Object.keys(mapping).forEach(function (key) { 20 | var tmp = key.split('::'); 21 | if (tmp.length < 2) { 22 | tmp[1] = tmp[0]; 23 | tmp[0] = 'GET'; 24 | } 25 | tmp[1] = (tmp[1].slice(0, 1) === '/') ? tmp[1] : '/' + tmp[1]; 26 | 27 | this.routes.push({ 28 | method: tmp[0], 29 | route: tmp[1], 30 | file: mapping[key] 31 | }); 32 | }.bind(this)); 33 | }; 34 | 35 | Router.prototype.search = function (url, method) { 36 | var match = null; 37 | var params = {}; 38 | 39 | method = method.toLowerCase(); 40 | 41 | this.routes.some(function (r) { 42 | var re = pathRegexp.pathToRegexp(r.route); 43 | var result = re.exec(url); 44 | 45 | if (result && (r.method.toLowerCase() === 'all' || r.method.toLowerCase() === method)) { 46 | match = r.file; 47 | if (match.slice(0, 1) === '/') match = match.slice(1); 48 | 49 | // find keys in routes and create params object 50 | var keys = r.route.match(/:\w+/g); 51 | if (keys) { 52 | result.shift(); 53 | keys.forEach(function (key, idx) { 54 | params[key.slice(1)] = result[idx]; 55 | }); 56 | } 57 | return true; 58 | } 59 | }); 60 | 61 | if (match) { 62 | var type = 'view'; 63 | var urlExp = /(http|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?/; 64 | 65 | if (match.indexOf(SYMBOL_MOCK) >= 0) { 66 | match = match.replace(SYMBOL_MOCK, ''); 67 | if (match.slice(0, 1) === '/') match = match.slice(1); 68 | type = 'mock'; 69 | } else if (urlExp.test(match)) { 70 | type = 'url'; 71 | } 72 | return { 73 | file: match, 74 | searchType: type, 75 | params: params 76 | }; 77 | } 78 | 79 | return match; 80 | }; 81 | 82 | module.exports = Router; 83 | 84 | -------------------------------------------------------------------------------- /libs/utils.js: -------------------------------------------------------------------------------- 1 | var toString = Object.prototype.toString; 2 | 3 | exports.isObject = function (obj) { 4 | return toString.call(obj) === '[object Object]'; 5 | }; 6 | 7 | exports.isArray = function (obj) { 8 | return toString.call(obj) === '[object Array]'; 9 | }; 10 | 11 | exports.isFunc = function (obj) { 12 | return toString.call(obj) === '[object Function]'; 13 | }; 14 | 15 | exports.contains = function (arr, item) { 16 | return arr.indexOf(item) >= 0; 17 | }; 18 | 19 | exports.serialize = function (obj, delimiter) { 20 | var arr = []; 21 | Object.keys(obj).forEach(function (key) { 22 | arr.push(key + '=' + obj[key]); 23 | }); 24 | return arr.join(delimiter || '&'); 25 | }; 26 | 27 | exports.moment = require('moment'); 28 | 29 | exports.assign = require('object-assign'); 30 | 31 | exports.Mock = require('mockjs'); 32 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "fe-dev-server", 3 | "version": "1.7.0", 4 | "description": "a dev server for frontend developers", 5 | "main": "index.js", 6 | "bin": { 7 | "fds": "./bin/fds" 8 | }, 9 | "scripts": { 10 | "test": "mocha test" 11 | }, 12 | "author": "ZheX ", 13 | "license": "MIT", 14 | "repository": { 15 | "type": "git", 16 | "url": "https://github.com/zhex/fe-dev-server.git" 17 | }, 18 | "keywords": [ 19 | "frontend", 20 | "express", 21 | "dev server", 22 | "mock server", 23 | "api", 24 | "pug", 25 | "ejs", 26 | "handlebars", 27 | "jsp", 28 | "velocity" 29 | ], 30 | "dependencies": { 31 | "@colors/colors": "^1.5.0", 32 | "body-parser": "^1.20.1", 33 | "chokidar": "^3.5.3", 34 | "commander": "^9.4.1", 35 | "consolidate": "^0.16.0", 36 | "cross-spawn": "^7.0.3", 37 | "deasync": "^0.1.28", 38 | "ejs": "^3.1.8", 39 | "express": "^4.18.2", 40 | "findup-sync": "^5.0.0", 41 | "fs-extra": "^10.1.0", 42 | "gaxios": "^5.0.2", 43 | "handlebars": "^4.7.7", 44 | "livereload": "^0.9.3", 45 | "mockjs": "^1.1.0", 46 | "moment": "^2.29.4", 47 | "morgan": "^1.10.0", 48 | "object-assign": "^4.1.1", 49 | "open": "^8.4.0", 50 | "path-to-regexp": "^6.2.1", 51 | "portscanner": "^2.2.0", 52 | "proxy-middleware": "^0.15.0", 53 | "pug": "^3.0.2", 54 | "syntax-error": "^1.4.0" 55 | }, 56 | "devDependencies": { 57 | "mocha": "^10.1.0", 58 | "prettier": "^2.8.0", 59 | "replace": "^1.2.2", 60 | "should": "^13.2.3" 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: 5.4 2 | 3 | specifiers: 4 | '@colors/colors': ^1.5.0 5 | body-parser: ^1.20.1 6 | chokidar: ^3.5.3 7 | commander: ^9.4.1 8 | consolidate: ^0.16.0 9 | cross-spawn: ^7.0.3 10 | deasync: ^0.1.28 11 | ejs: ^3.1.8 12 | express: ^4.18.2 13 | findup-sync: ^5.0.0 14 | fs-extra: ^10.1.0 15 | gaxios: ^5.0.2 16 | handlebars: ^4.7.7 17 | livereload: ^0.9.3 18 | mocha: ^10.1.0 19 | mockjs: ^1.1.0 20 | moment: ^2.29.4 21 | morgan: ^1.10.0 22 | object-assign: ^4.1.1 23 | open: ^8.4.0 24 | path-to-regexp: ^6.2.1 25 | portscanner: ^2.2.0 26 | prettier: ^2.8.0 27 | proxy-middleware: ^0.15.0 28 | pug: ^3.0.2 29 | replace: ^1.2.2 30 | should: ^13.2.3 31 | syntax-error: ^1.4.0 32 | 33 | dependencies: 34 | '@colors/colors': 1.5.0 35 | body-parser: 1.20.1 36 | chokidar: 3.5.3 37 | commander: 9.4.1 38 | consolidate: 0.16.0_p7bi3j7s7i2zmiodsvwerj4vze 39 | cross-spawn: 7.0.3 40 | deasync: 0.1.28 41 | ejs: 3.1.8 42 | express: 4.18.2 43 | findup-sync: 5.0.0 44 | fs-extra: 10.1.0 45 | gaxios: 5.0.2 46 | handlebars: 4.7.7 47 | livereload: 0.9.3 48 | mockjs: 1.1.0 49 | moment: 2.29.4 50 | morgan: 1.10.0 51 | object-assign: 4.1.1 52 | open: 8.4.0 53 | path-to-regexp: 6.2.1 54 | portscanner: 2.2.0 55 | proxy-middleware: 0.15.0 56 | pug: 3.0.2 57 | syntax-error: 1.4.0 58 | 59 | devDependencies: 60 | mocha: 10.1.0 61 | prettier: 2.8.0 62 | replace: 1.2.2 63 | should: 13.2.3 64 | 65 | packages: 66 | 67 | /@babel/helper-string-parser/7.19.4: 68 | resolution: {integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==} 69 | engines: {node: '>=6.9.0'} 70 | dev: false 71 | 72 | /@babel/helper-validator-identifier/7.19.1: 73 | resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} 74 | engines: {node: '>=6.9.0'} 75 | dev: false 76 | 77 | /@babel/parser/7.20.3: 78 | resolution: {integrity: sha512-OP/s5a94frIPXwjzEcv5S/tpQfc6XhxYUnmWpgdqMWGgYCuErA3SzozaRAMQgSZWKeTJxht9aWAkUY+0UzvOFg==} 79 | engines: {node: '>=6.0.0'} 80 | hasBin: true 81 | dependencies: 82 | '@babel/types': 7.20.2 83 | dev: false 84 | 85 | /@babel/types/7.20.2: 86 | resolution: {integrity: sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog==} 87 | engines: {node: '>=6.9.0'} 88 | dependencies: 89 | '@babel/helper-string-parser': 7.19.4 90 | '@babel/helper-validator-identifier': 7.19.1 91 | to-fast-properties: 2.0.0 92 | dev: false 93 | 94 | /@colors/colors/1.5.0: 95 | resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} 96 | engines: {node: '>=0.1.90'} 97 | dev: false 98 | 99 | /accepts/1.3.8: 100 | resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} 101 | engines: {node: '>= 0.6'} 102 | dependencies: 103 | mime-types: 2.1.35 104 | negotiator: 0.6.3 105 | dev: false 106 | 107 | /acorn-node/1.8.2: 108 | resolution: {integrity: sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==} 109 | dependencies: 110 | acorn: 7.4.1 111 | acorn-walk: 7.2.0 112 | xtend: 4.0.2 113 | dev: false 114 | 115 | /acorn-walk/7.2.0: 116 | resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==} 117 | engines: {node: '>=0.4.0'} 118 | dev: false 119 | 120 | /acorn/7.4.1: 121 | resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} 122 | engines: {node: '>=0.4.0'} 123 | hasBin: true 124 | dev: false 125 | 126 | /agent-base/6.0.2: 127 | resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} 128 | engines: {node: '>= 6.0.0'} 129 | dependencies: 130 | debug: 4.3.4 131 | transitivePeerDependencies: 132 | - supports-color 133 | dev: false 134 | 135 | /ansi-colors/4.1.1: 136 | resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} 137 | engines: {node: '>=6'} 138 | dev: true 139 | 140 | /ansi-regex/5.0.1: 141 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 142 | engines: {node: '>=8'} 143 | dev: true 144 | 145 | /ansi-styles/3.2.1: 146 | resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} 147 | engines: {node: '>=4'} 148 | dependencies: 149 | color-convert: 1.9.3 150 | dev: true 151 | 152 | /ansi-styles/4.3.0: 153 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 154 | engines: {node: '>=8'} 155 | dependencies: 156 | color-convert: 2.0.1 157 | 158 | /anymatch/3.1.3: 159 | resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} 160 | engines: {node: '>= 8'} 161 | dependencies: 162 | normalize-path: 3.0.0 163 | picomatch: 2.3.1 164 | 165 | /argparse/2.0.1: 166 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 167 | dev: true 168 | 169 | /array-flatten/1.1.1: 170 | resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} 171 | dev: false 172 | 173 | /asap/2.0.6: 174 | resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} 175 | dev: false 176 | 177 | /assert-never/1.2.1: 178 | resolution: {integrity: sha512-TaTivMB6pYI1kXwrFlEhLeGfOqoDNdTxjCdwRfFFkEA30Eu+k48W34nlok2EYWJfFFzqaEmichdNM7th6M5HNw==} 179 | dev: false 180 | 181 | /async/2.6.4: 182 | resolution: {integrity: sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==} 183 | dependencies: 184 | lodash: 4.17.21 185 | dev: false 186 | 187 | /async/3.2.4: 188 | resolution: {integrity: sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==} 189 | dev: false 190 | 191 | /babel-walk/3.0.0-canary-5: 192 | resolution: {integrity: sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw==} 193 | engines: {node: '>= 10.0.0'} 194 | dependencies: 195 | '@babel/types': 7.20.2 196 | dev: false 197 | 198 | /balanced-match/1.0.2: 199 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 200 | 201 | /basic-auth/2.0.1: 202 | resolution: {integrity: sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==} 203 | engines: {node: '>= 0.8'} 204 | dependencies: 205 | safe-buffer: 5.1.2 206 | dev: false 207 | 208 | /binary-extensions/2.2.0: 209 | resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} 210 | engines: {node: '>=8'} 211 | 212 | /bindings/1.5.0: 213 | resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} 214 | dependencies: 215 | file-uri-to-path: 1.0.0 216 | dev: false 217 | 218 | /bluebird/3.7.2: 219 | resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} 220 | dev: false 221 | 222 | /body-parser/1.20.1: 223 | resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==} 224 | engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} 225 | dependencies: 226 | bytes: 3.1.2 227 | content-type: 1.0.4 228 | debug: 2.6.9 229 | depd: 2.0.0 230 | destroy: 1.2.0 231 | http-errors: 2.0.0 232 | iconv-lite: 0.4.24 233 | on-finished: 2.4.1 234 | qs: 6.11.0 235 | raw-body: 2.5.1 236 | type-is: 1.6.18 237 | unpipe: 1.0.0 238 | transitivePeerDependencies: 239 | - supports-color 240 | dev: false 241 | 242 | /brace-expansion/1.1.11: 243 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 244 | dependencies: 245 | balanced-match: 1.0.2 246 | concat-map: 0.0.1 247 | 248 | /brace-expansion/2.0.1: 249 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} 250 | dependencies: 251 | balanced-match: 1.0.2 252 | 253 | /braces/3.0.2: 254 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} 255 | engines: {node: '>=8'} 256 | dependencies: 257 | fill-range: 7.0.1 258 | 259 | /browser-stdout/1.3.1: 260 | resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} 261 | dev: true 262 | 263 | /bytes/3.1.2: 264 | resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} 265 | engines: {node: '>= 0.8'} 266 | dev: false 267 | 268 | /call-bind/1.0.2: 269 | resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} 270 | dependencies: 271 | function-bind: 1.1.1 272 | get-intrinsic: 1.1.3 273 | dev: false 274 | 275 | /camelcase/5.3.1: 276 | resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} 277 | engines: {node: '>=6'} 278 | dev: true 279 | 280 | /camelcase/6.3.0: 281 | resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} 282 | engines: {node: '>=10'} 283 | dev: true 284 | 285 | /chalk/2.4.2: 286 | resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} 287 | engines: {node: '>=4'} 288 | dependencies: 289 | ansi-styles: 3.2.1 290 | escape-string-regexp: 1.0.5 291 | supports-color: 5.5.0 292 | dev: true 293 | 294 | /chalk/4.1.2: 295 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 296 | engines: {node: '>=10'} 297 | dependencies: 298 | ansi-styles: 4.3.0 299 | supports-color: 7.2.0 300 | 301 | /character-parser/2.2.0: 302 | resolution: {integrity: sha512-+UqJQjFEFaTAs3bNsF2j2kEN1baG/zghZbdqoYEDxGZtJo9LBzl1A+m0D4n3qKx8N2FNv8/Xp6yV9mQmBuptaw==} 303 | dependencies: 304 | is-regex: 1.1.4 305 | dev: false 306 | 307 | /chokidar/3.5.3: 308 | resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} 309 | engines: {node: '>= 8.10.0'} 310 | dependencies: 311 | anymatch: 3.1.3 312 | braces: 3.0.2 313 | glob-parent: 5.1.2 314 | is-binary-path: 2.1.0 315 | is-glob: 4.0.3 316 | normalize-path: 3.0.0 317 | readdirp: 3.6.0 318 | optionalDependencies: 319 | fsevents: 2.3.2 320 | 321 | /cliui/6.0.0: 322 | resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} 323 | dependencies: 324 | string-width: 4.2.3 325 | strip-ansi: 6.0.1 326 | wrap-ansi: 6.2.0 327 | dev: true 328 | 329 | /cliui/7.0.4: 330 | resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} 331 | dependencies: 332 | string-width: 4.2.3 333 | strip-ansi: 6.0.1 334 | wrap-ansi: 7.0.0 335 | dev: true 336 | 337 | /color-convert/1.9.3: 338 | resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} 339 | dependencies: 340 | color-name: 1.1.3 341 | dev: true 342 | 343 | /color-convert/2.0.1: 344 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 345 | engines: {node: '>=7.0.0'} 346 | dependencies: 347 | color-name: 1.1.4 348 | 349 | /color-name/1.1.3: 350 | resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} 351 | dev: true 352 | 353 | /color-name/1.1.4: 354 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 355 | 356 | /commander/9.4.1: 357 | resolution: {integrity: sha512-5EEkTNyHNGFPD2H+c/dXXfQZYa/scCKasxWcXJaWnNJ99pnQN9Vnmqow+p+PlFPE63Q6mThaZws1T+HxfpgtPw==} 358 | engines: {node: ^12.20.0 || >=14} 359 | dev: false 360 | 361 | /concat-map/0.0.1: 362 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 363 | 364 | /consolidate/0.16.0_p7bi3j7s7i2zmiodsvwerj4vze: 365 | resolution: {integrity: sha512-Nhl1wzCslqXYTJVDyJCu3ODohy9OfBMB5uD2BiBTzd7w+QY0lBzafkR8y8755yMYHAaMD4NuzbAw03/xzfw+eQ==} 366 | engines: {node: '>= 0.10.0'} 367 | peerDependencies: 368 | arc-templates: ^0.5.3 369 | atpl: '>=0.7.6' 370 | babel-core: ^6.26.3 371 | bracket-template: ^1.1.5 372 | coffee-script: ^1.12.7 373 | dot: ^1.1.3 374 | dust: ^0.3.0 375 | dustjs-helpers: ^1.7.4 376 | dustjs-linkedin: ^2.7.5 377 | eco: ^1.1.0-rc-3 378 | ect: ^0.5.9 379 | ejs: ^3.1.5 380 | haml-coffee: ^1.14.1 381 | hamlet: ^0.3.3 382 | hamljs: ^0.6.2 383 | handlebars: ^4.7.6 384 | hogan.js: ^3.0.2 385 | htmling: ^0.0.8 386 | jade: ^1.11.0 387 | jazz: ^0.0.18 388 | jqtpl: ~1.1.0 389 | just: ^0.1.8 390 | liquid-node: ^3.0.1 391 | liquor: ^0.0.5 392 | lodash: ^4.17.20 393 | marko: ^3.14.4 394 | mote: ^0.2.0 395 | mustache: ^4.0.1 396 | nunjucks: ^3.2.2 397 | plates: ~0.4.11 398 | pug: ^3.0.0 399 | qejs: ^3.0.5 400 | ractive: ^1.3.12 401 | razor-tmpl: ^1.3.1 402 | react: ^16.13.1 403 | react-dom: ^16.13.1 404 | slm: ^2.0.0 405 | squirrelly: ^5.1.0 406 | swig: ^1.4.2 407 | swig-templates: ^2.0.3 408 | teacup: ^2.0.0 409 | templayed: '>=0.2.3' 410 | then-jade: '*' 411 | then-pug: '*' 412 | tinyliquid: ^0.2.34 413 | toffee: ^0.3.6 414 | twig: ^1.15.2 415 | twing: ^5.0.2 416 | underscore: ^1.11.0 417 | vash: ^0.13.0 418 | velocityjs: ^2.0.1 419 | walrus: ^0.10.1 420 | whiskers: ^0.4.0 421 | peerDependenciesMeta: 422 | arc-templates: 423 | optional: true 424 | atpl: 425 | optional: true 426 | babel-core: 427 | optional: true 428 | bracket-template: 429 | optional: true 430 | coffee-script: 431 | optional: true 432 | dot: 433 | optional: true 434 | dust: 435 | optional: true 436 | dustjs-helpers: 437 | optional: true 438 | dustjs-linkedin: 439 | optional: true 440 | eco: 441 | optional: true 442 | ect: 443 | optional: true 444 | ejs: 445 | optional: true 446 | haml-coffee: 447 | optional: true 448 | hamlet: 449 | optional: true 450 | hamljs: 451 | optional: true 452 | handlebars: 453 | optional: true 454 | hogan.js: 455 | optional: true 456 | htmling: 457 | optional: true 458 | jade: 459 | optional: true 460 | jazz: 461 | optional: true 462 | jqtpl: 463 | optional: true 464 | just: 465 | optional: true 466 | liquid-node: 467 | optional: true 468 | liquor: 469 | optional: true 470 | lodash: 471 | optional: true 472 | marko: 473 | optional: true 474 | mote: 475 | optional: true 476 | mustache: 477 | optional: true 478 | nunjucks: 479 | optional: true 480 | plates: 481 | optional: true 482 | pug: 483 | optional: true 484 | qejs: 485 | optional: true 486 | ractive: 487 | optional: true 488 | razor-tmpl: 489 | optional: true 490 | react: 491 | optional: true 492 | react-dom: 493 | optional: true 494 | slm: 495 | optional: true 496 | squirrelly: 497 | optional: true 498 | swig: 499 | optional: true 500 | swig-templates: 501 | optional: true 502 | teacup: 503 | optional: true 504 | templayed: 505 | optional: true 506 | then-jade: 507 | optional: true 508 | then-pug: 509 | optional: true 510 | tinyliquid: 511 | optional: true 512 | toffee: 513 | optional: true 514 | twig: 515 | optional: true 516 | twing: 517 | optional: true 518 | underscore: 519 | optional: true 520 | vash: 521 | optional: true 522 | velocityjs: 523 | optional: true 524 | walrus: 525 | optional: true 526 | whiskers: 527 | optional: true 528 | dependencies: 529 | bluebird: 3.7.2 530 | ejs: 3.1.8 531 | handlebars: 4.7.7 532 | pug: 3.0.2 533 | dev: false 534 | 535 | /constantinople/4.0.1: 536 | resolution: {integrity: sha512-vCrqcSIq4//Gx74TXXCGnHpulY1dskqLTFGDmhrGxzeXL8lF8kvXv6mpNWlJj1uD4DW23D4ljAqbY4RRaaUZIw==} 537 | dependencies: 538 | '@babel/parser': 7.20.3 539 | '@babel/types': 7.20.2 540 | dev: false 541 | 542 | /content-disposition/0.5.4: 543 | resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} 544 | engines: {node: '>= 0.6'} 545 | dependencies: 546 | safe-buffer: 5.2.1 547 | dev: false 548 | 549 | /content-type/1.0.4: 550 | resolution: {integrity: sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==} 551 | engines: {node: '>= 0.6'} 552 | dev: false 553 | 554 | /cookie-signature/1.0.6: 555 | resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} 556 | dev: false 557 | 558 | /cookie/0.5.0: 559 | resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} 560 | engines: {node: '>= 0.6'} 561 | dev: false 562 | 563 | /cross-spawn/7.0.3: 564 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} 565 | engines: {node: '>= 8'} 566 | dependencies: 567 | path-key: 3.1.1 568 | shebang-command: 2.0.0 569 | which: 2.0.2 570 | dev: false 571 | 572 | /deasync/0.1.28: 573 | resolution: {integrity: sha512-QqLF6inIDwiATrfROIyQtwOQxjZuek13WRYZ7donU5wJPLoP67MnYxA6QtqdvdBy2mMqv5m3UefBVdJjvevOYg==} 574 | engines: {node: '>=0.11.0'} 575 | requiresBuild: true 576 | dependencies: 577 | bindings: 1.5.0 578 | node-addon-api: 1.7.2 579 | dev: false 580 | 581 | /debug/2.6.9: 582 | resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} 583 | peerDependencies: 584 | supports-color: '*' 585 | peerDependenciesMeta: 586 | supports-color: 587 | optional: true 588 | dependencies: 589 | ms: 2.0.0 590 | dev: false 591 | 592 | /debug/4.3.4: 593 | resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} 594 | engines: {node: '>=6.0'} 595 | peerDependencies: 596 | supports-color: '*' 597 | peerDependenciesMeta: 598 | supports-color: 599 | optional: true 600 | dependencies: 601 | ms: 2.1.2 602 | dev: false 603 | 604 | /debug/4.3.4_supports-color@8.1.1: 605 | resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} 606 | engines: {node: '>=6.0'} 607 | peerDependencies: 608 | supports-color: '*' 609 | peerDependenciesMeta: 610 | supports-color: 611 | optional: true 612 | dependencies: 613 | ms: 2.1.2 614 | supports-color: 8.1.1 615 | dev: true 616 | 617 | /decamelize/1.2.0: 618 | resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} 619 | engines: {node: '>=0.10.0'} 620 | dev: true 621 | 622 | /decamelize/4.0.0: 623 | resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} 624 | engines: {node: '>=10'} 625 | dev: true 626 | 627 | /define-lazy-prop/2.0.0: 628 | resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} 629 | engines: {node: '>=8'} 630 | dev: false 631 | 632 | /depd/2.0.0: 633 | resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} 634 | engines: {node: '>= 0.8'} 635 | dev: false 636 | 637 | /destroy/1.2.0: 638 | resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} 639 | engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} 640 | dev: false 641 | 642 | /detect-file/1.0.0: 643 | resolution: {integrity: sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==} 644 | engines: {node: '>=0.10.0'} 645 | dev: false 646 | 647 | /diff/5.0.0: 648 | resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} 649 | engines: {node: '>=0.3.1'} 650 | dev: true 651 | 652 | /doctypes/1.1.0: 653 | resolution: {integrity: sha512-LLBi6pEqS6Do3EKQ3J0NqHWV5hhb78Pi8vvESYwyOy2c31ZEZVdtitdzsQsKb7878PEERhzUk0ftqGhG6Mz+pQ==} 654 | dev: false 655 | 656 | /ee-first/1.1.1: 657 | resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} 658 | dev: false 659 | 660 | /ejs/3.1.8: 661 | resolution: {integrity: sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ==} 662 | engines: {node: '>=0.10.0'} 663 | hasBin: true 664 | dependencies: 665 | jake: 10.8.5 666 | dev: false 667 | 668 | /emoji-regex/8.0.0: 669 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 670 | dev: true 671 | 672 | /encodeurl/1.0.2: 673 | resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} 674 | engines: {node: '>= 0.8'} 675 | dev: false 676 | 677 | /escalade/3.1.1: 678 | resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} 679 | engines: {node: '>=6'} 680 | dev: true 681 | 682 | /escape-html/1.0.3: 683 | resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} 684 | dev: false 685 | 686 | /escape-string-regexp/1.0.5: 687 | resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} 688 | engines: {node: '>=0.8.0'} 689 | dev: true 690 | 691 | /escape-string-regexp/4.0.0: 692 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 693 | engines: {node: '>=10'} 694 | dev: true 695 | 696 | /etag/1.8.1: 697 | resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} 698 | engines: {node: '>= 0.6'} 699 | dev: false 700 | 701 | /expand-tilde/2.0.2: 702 | resolution: {integrity: sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==} 703 | engines: {node: '>=0.10.0'} 704 | dependencies: 705 | homedir-polyfill: 1.0.3 706 | dev: false 707 | 708 | /express/4.18.2: 709 | resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==} 710 | engines: {node: '>= 0.10.0'} 711 | dependencies: 712 | accepts: 1.3.8 713 | array-flatten: 1.1.1 714 | body-parser: 1.20.1 715 | content-disposition: 0.5.4 716 | content-type: 1.0.4 717 | cookie: 0.5.0 718 | cookie-signature: 1.0.6 719 | debug: 2.6.9 720 | depd: 2.0.0 721 | encodeurl: 1.0.2 722 | escape-html: 1.0.3 723 | etag: 1.8.1 724 | finalhandler: 1.2.0 725 | fresh: 0.5.2 726 | http-errors: 2.0.0 727 | merge-descriptors: 1.0.1 728 | methods: 1.1.2 729 | on-finished: 2.4.1 730 | parseurl: 1.3.3 731 | path-to-regexp: 0.1.7 732 | proxy-addr: 2.0.7 733 | qs: 6.11.0 734 | range-parser: 1.2.1 735 | safe-buffer: 5.2.1 736 | send: 0.18.0 737 | serve-static: 1.15.0 738 | setprototypeof: 1.2.0 739 | statuses: 2.0.1 740 | type-is: 1.6.18 741 | utils-merge: 1.0.1 742 | vary: 1.1.2 743 | transitivePeerDependencies: 744 | - supports-color 745 | dev: false 746 | 747 | /extend/3.0.2: 748 | resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} 749 | dev: false 750 | 751 | /file-uri-to-path/1.0.0: 752 | resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} 753 | dev: false 754 | 755 | /filelist/1.0.4: 756 | resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} 757 | dependencies: 758 | minimatch: 5.1.0 759 | dev: false 760 | 761 | /fill-range/7.0.1: 762 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} 763 | engines: {node: '>=8'} 764 | dependencies: 765 | to-regex-range: 5.0.1 766 | 767 | /finalhandler/1.2.0: 768 | resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} 769 | engines: {node: '>= 0.8'} 770 | dependencies: 771 | debug: 2.6.9 772 | encodeurl: 1.0.2 773 | escape-html: 1.0.3 774 | on-finished: 2.4.1 775 | parseurl: 1.3.3 776 | statuses: 2.0.1 777 | unpipe: 1.0.0 778 | transitivePeerDependencies: 779 | - supports-color 780 | dev: false 781 | 782 | /find-up/4.1.0: 783 | resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} 784 | engines: {node: '>=8'} 785 | dependencies: 786 | locate-path: 5.0.0 787 | path-exists: 4.0.0 788 | dev: true 789 | 790 | /find-up/5.0.0: 791 | resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} 792 | engines: {node: '>=10'} 793 | dependencies: 794 | locate-path: 6.0.0 795 | path-exists: 4.0.0 796 | dev: true 797 | 798 | /findup-sync/5.0.0: 799 | resolution: {integrity: sha512-MzwXju70AuyflbgeOhzvQWAvvQdo1XL0A9bVvlXsYcFEBM87WR4OakL4OfZq+QRmr+duJubio+UtNQCPsVESzQ==} 800 | engines: {node: '>= 10.13.0'} 801 | dependencies: 802 | detect-file: 1.0.0 803 | is-glob: 4.0.3 804 | micromatch: 4.0.5 805 | resolve-dir: 1.0.1 806 | dev: false 807 | 808 | /flat/5.0.2: 809 | resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} 810 | hasBin: true 811 | dev: true 812 | 813 | /forwarded/0.2.0: 814 | resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} 815 | engines: {node: '>= 0.6'} 816 | dev: false 817 | 818 | /fresh/0.5.2: 819 | resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} 820 | engines: {node: '>= 0.6'} 821 | dev: false 822 | 823 | /fs-extra/10.1.0: 824 | resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} 825 | engines: {node: '>=12'} 826 | dependencies: 827 | graceful-fs: 4.2.10 828 | jsonfile: 6.1.0 829 | universalify: 2.0.0 830 | dev: false 831 | 832 | /fs.realpath/1.0.0: 833 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 834 | dev: true 835 | 836 | /fsevents/2.3.2: 837 | resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} 838 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 839 | os: [darwin] 840 | requiresBuild: true 841 | optional: true 842 | 843 | /function-bind/1.1.1: 844 | resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} 845 | dev: false 846 | 847 | /gaxios/5.0.2: 848 | resolution: {integrity: sha512-TjtV2AJOZoMQqRYoy5eM8cCQogYwazWNYLQ72QB0kwa6vHHruYkGmhhyrlzbmgNHK1dNnuP2WSH81urfzyN2Og==} 849 | engines: {node: '>=12'} 850 | dependencies: 851 | extend: 3.0.2 852 | https-proxy-agent: 5.0.1 853 | is-stream: 2.0.1 854 | node-fetch: 2.6.7 855 | transitivePeerDependencies: 856 | - encoding 857 | - supports-color 858 | dev: false 859 | 860 | /get-caller-file/2.0.5: 861 | resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} 862 | engines: {node: 6.* || 8.* || >= 10.*} 863 | dev: true 864 | 865 | /get-intrinsic/1.1.3: 866 | resolution: {integrity: sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==} 867 | dependencies: 868 | function-bind: 1.1.1 869 | has: 1.0.3 870 | has-symbols: 1.0.3 871 | dev: false 872 | 873 | /glob-parent/5.1.2: 874 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 875 | engines: {node: '>= 6'} 876 | dependencies: 877 | is-glob: 4.0.3 878 | 879 | /glob/7.2.0: 880 | resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} 881 | dependencies: 882 | fs.realpath: 1.0.0 883 | inflight: 1.0.6 884 | inherits: 2.0.4 885 | minimatch: 3.1.2 886 | once: 1.4.0 887 | path-is-absolute: 1.0.1 888 | dev: true 889 | 890 | /global-modules/1.0.0: 891 | resolution: {integrity: sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==} 892 | engines: {node: '>=0.10.0'} 893 | dependencies: 894 | global-prefix: 1.0.2 895 | is-windows: 1.0.2 896 | resolve-dir: 1.0.1 897 | dev: false 898 | 899 | /global-prefix/1.0.2: 900 | resolution: {integrity: sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==} 901 | engines: {node: '>=0.10.0'} 902 | dependencies: 903 | expand-tilde: 2.0.2 904 | homedir-polyfill: 1.0.3 905 | ini: 1.3.8 906 | is-windows: 1.0.2 907 | which: 1.3.1 908 | dev: false 909 | 910 | /graceful-fs/4.2.10: 911 | resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} 912 | dev: false 913 | 914 | /handlebars/4.7.7: 915 | resolution: {integrity: sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==} 916 | engines: {node: '>=0.4.7'} 917 | hasBin: true 918 | dependencies: 919 | minimist: 1.2.7 920 | neo-async: 2.6.2 921 | source-map: 0.6.1 922 | wordwrap: 1.0.0 923 | optionalDependencies: 924 | uglify-js: 3.17.4 925 | dev: false 926 | 927 | /has-flag/3.0.0: 928 | resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} 929 | engines: {node: '>=4'} 930 | dev: true 931 | 932 | /has-flag/4.0.0: 933 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 934 | engines: {node: '>=8'} 935 | 936 | /has-symbols/1.0.3: 937 | resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} 938 | engines: {node: '>= 0.4'} 939 | dev: false 940 | 941 | /has-tostringtag/1.0.0: 942 | resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} 943 | engines: {node: '>= 0.4'} 944 | dependencies: 945 | has-symbols: 1.0.3 946 | dev: false 947 | 948 | /has/1.0.3: 949 | resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} 950 | engines: {node: '>= 0.4.0'} 951 | dependencies: 952 | function-bind: 1.1.1 953 | dev: false 954 | 955 | /he/1.2.0: 956 | resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} 957 | hasBin: true 958 | dev: true 959 | 960 | /homedir-polyfill/1.0.3: 961 | resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==} 962 | engines: {node: '>=0.10.0'} 963 | dependencies: 964 | parse-passwd: 1.0.0 965 | dev: false 966 | 967 | /http-errors/2.0.0: 968 | resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} 969 | engines: {node: '>= 0.8'} 970 | dependencies: 971 | depd: 2.0.0 972 | inherits: 2.0.4 973 | setprototypeof: 1.2.0 974 | statuses: 2.0.1 975 | toidentifier: 1.0.1 976 | dev: false 977 | 978 | /https-proxy-agent/5.0.1: 979 | resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} 980 | engines: {node: '>= 6'} 981 | dependencies: 982 | agent-base: 6.0.2 983 | debug: 4.3.4 984 | transitivePeerDependencies: 985 | - supports-color 986 | dev: false 987 | 988 | /iconv-lite/0.4.24: 989 | resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} 990 | engines: {node: '>=0.10.0'} 991 | dependencies: 992 | safer-buffer: 2.1.2 993 | dev: false 994 | 995 | /inflight/1.0.6: 996 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} 997 | dependencies: 998 | once: 1.4.0 999 | wrappy: 1.0.2 1000 | dev: true 1001 | 1002 | /inherits/2.0.4: 1003 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 1004 | 1005 | /ini/1.3.8: 1006 | resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} 1007 | dev: false 1008 | 1009 | /ipaddr.js/1.9.1: 1010 | resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} 1011 | engines: {node: '>= 0.10'} 1012 | dev: false 1013 | 1014 | /is-binary-path/2.1.0: 1015 | resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} 1016 | engines: {node: '>=8'} 1017 | dependencies: 1018 | binary-extensions: 2.2.0 1019 | 1020 | /is-core-module/2.11.0: 1021 | resolution: {integrity: sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==} 1022 | dependencies: 1023 | has: 1.0.3 1024 | dev: false 1025 | 1026 | /is-docker/2.2.1: 1027 | resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} 1028 | engines: {node: '>=8'} 1029 | hasBin: true 1030 | dev: false 1031 | 1032 | /is-expression/4.0.0: 1033 | resolution: {integrity: sha512-zMIXX63sxzG3XrkHkrAPvm/OVZVSCPNkwMHU8oTX7/U3AL78I0QXCEICXUM13BIa8TYGZ68PiTKfQz3yaTNr4A==} 1034 | dependencies: 1035 | acorn: 7.4.1 1036 | object-assign: 4.1.1 1037 | dev: false 1038 | 1039 | /is-extglob/2.1.1: 1040 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 1041 | engines: {node: '>=0.10.0'} 1042 | 1043 | /is-fullwidth-code-point/3.0.0: 1044 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 1045 | engines: {node: '>=8'} 1046 | dev: true 1047 | 1048 | /is-glob/4.0.3: 1049 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 1050 | engines: {node: '>=0.10.0'} 1051 | dependencies: 1052 | is-extglob: 2.1.1 1053 | 1054 | /is-number-like/1.0.8: 1055 | resolution: {integrity: sha512-6rZi3ezCyFcn5L71ywzz2bS5b2Igl1En3eTlZlvKjpz1n3IZLAYMbKYAIQgFmEu0GENg92ziU/faEOA/aixjbA==} 1056 | dependencies: 1057 | lodash.isfinite: 3.3.2 1058 | dev: false 1059 | 1060 | /is-number/7.0.0: 1061 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 1062 | engines: {node: '>=0.12.0'} 1063 | 1064 | /is-plain-obj/2.1.0: 1065 | resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} 1066 | engines: {node: '>=8'} 1067 | dev: true 1068 | 1069 | /is-promise/2.2.2: 1070 | resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==} 1071 | dev: false 1072 | 1073 | /is-regex/1.1.4: 1074 | resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} 1075 | engines: {node: '>= 0.4'} 1076 | dependencies: 1077 | call-bind: 1.0.2 1078 | has-tostringtag: 1.0.0 1079 | dev: false 1080 | 1081 | /is-stream/2.0.1: 1082 | resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} 1083 | engines: {node: '>=8'} 1084 | dev: false 1085 | 1086 | /is-unicode-supported/0.1.0: 1087 | resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} 1088 | engines: {node: '>=10'} 1089 | dev: true 1090 | 1091 | /is-windows/1.0.2: 1092 | resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} 1093 | engines: {node: '>=0.10.0'} 1094 | dev: false 1095 | 1096 | /is-wsl/2.2.0: 1097 | resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} 1098 | engines: {node: '>=8'} 1099 | dependencies: 1100 | is-docker: 2.2.1 1101 | dev: false 1102 | 1103 | /isexe/2.0.0: 1104 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 1105 | dev: false 1106 | 1107 | /jake/10.8.5: 1108 | resolution: {integrity: sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==} 1109 | engines: {node: '>=10'} 1110 | hasBin: true 1111 | dependencies: 1112 | async: 3.2.4 1113 | chalk: 4.1.2 1114 | filelist: 1.0.4 1115 | minimatch: 3.1.2 1116 | dev: false 1117 | 1118 | /js-stringify/1.0.2: 1119 | resolution: {integrity: sha512-rtS5ATOo2Q5k1G+DADISilDA6lv79zIiwFd6CcjuIxGKLFm5C+RLImRscVap9k55i+MOZwgliw+NejvkLuGD5g==} 1120 | dev: false 1121 | 1122 | /js-yaml/4.1.0: 1123 | resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} 1124 | hasBin: true 1125 | dependencies: 1126 | argparse: 2.0.1 1127 | dev: true 1128 | 1129 | /jsonfile/6.1.0: 1130 | resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} 1131 | dependencies: 1132 | universalify: 2.0.0 1133 | optionalDependencies: 1134 | graceful-fs: 4.2.10 1135 | dev: false 1136 | 1137 | /jstransformer/1.0.0: 1138 | resolution: {integrity: sha512-C9YK3Rf8q6VAPDCCU9fnqo3mAfOH6vUGnMcP4AQAYIEpWtfGLpwOTmZ+igtdK5y+VvI2n3CyYSzy4Qh34eq24A==} 1139 | dependencies: 1140 | is-promise: 2.2.2 1141 | promise: 7.3.1 1142 | dev: false 1143 | 1144 | /livereload-js/3.4.1: 1145 | resolution: {integrity: sha512-5MP0uUeVCec89ZbNOT/i97Mc+q3SxXmiUGhRFOTmhrGPn//uWVQdCvcLJDy64MSBR5MidFdOR7B9viumoavy6g==} 1146 | dev: false 1147 | 1148 | /livereload/0.9.3: 1149 | resolution: {integrity: sha512-q7Z71n3i4X0R9xthAryBdNGVGAO2R5X+/xXpmKeuPMrteg+W2U8VusTKV3YiJbXZwKsOlFlHe+go6uSNjfxrZw==} 1150 | engines: {node: '>=8.0.0'} 1151 | hasBin: true 1152 | dependencies: 1153 | chokidar: 3.5.3 1154 | livereload-js: 3.4.1 1155 | opts: 2.0.2 1156 | ws: 7.5.9 1157 | transitivePeerDependencies: 1158 | - bufferutil 1159 | - utf-8-validate 1160 | dev: false 1161 | 1162 | /locate-path/5.0.0: 1163 | resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} 1164 | engines: {node: '>=8'} 1165 | dependencies: 1166 | p-locate: 4.1.0 1167 | dev: true 1168 | 1169 | /locate-path/6.0.0: 1170 | resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} 1171 | engines: {node: '>=10'} 1172 | dependencies: 1173 | p-locate: 5.0.0 1174 | dev: true 1175 | 1176 | /lodash.isfinite/3.3.2: 1177 | resolution: {integrity: sha512-7FGG40uhC8Mm633uKW1r58aElFlBlxCrg9JfSi3P6aYiWmfiWF0PgMd86ZUsxE5GwWPdHoS2+48bwTh2VPkIQA==} 1178 | dev: false 1179 | 1180 | /lodash/4.17.21: 1181 | resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} 1182 | dev: false 1183 | 1184 | /log-symbols/4.1.0: 1185 | resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} 1186 | engines: {node: '>=10'} 1187 | dependencies: 1188 | chalk: 4.1.2 1189 | is-unicode-supported: 0.1.0 1190 | dev: true 1191 | 1192 | /media-typer/0.3.0: 1193 | resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} 1194 | engines: {node: '>= 0.6'} 1195 | dev: false 1196 | 1197 | /merge-descriptors/1.0.1: 1198 | resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} 1199 | dev: false 1200 | 1201 | /methods/1.1.2: 1202 | resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} 1203 | engines: {node: '>= 0.6'} 1204 | dev: false 1205 | 1206 | /micromatch/4.0.5: 1207 | resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} 1208 | engines: {node: '>=8.6'} 1209 | dependencies: 1210 | braces: 3.0.2 1211 | picomatch: 2.3.1 1212 | dev: false 1213 | 1214 | /mime-db/1.52.0: 1215 | resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} 1216 | engines: {node: '>= 0.6'} 1217 | dev: false 1218 | 1219 | /mime-types/2.1.35: 1220 | resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} 1221 | engines: {node: '>= 0.6'} 1222 | dependencies: 1223 | mime-db: 1.52.0 1224 | dev: false 1225 | 1226 | /mime/1.6.0: 1227 | resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} 1228 | engines: {node: '>=4'} 1229 | hasBin: true 1230 | dev: false 1231 | 1232 | /minimatch/3.0.5: 1233 | resolution: {integrity: sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==} 1234 | dependencies: 1235 | brace-expansion: 1.1.11 1236 | dev: true 1237 | 1238 | /minimatch/3.1.2: 1239 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 1240 | dependencies: 1241 | brace-expansion: 1.1.11 1242 | 1243 | /minimatch/5.0.1: 1244 | resolution: {integrity: sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==} 1245 | engines: {node: '>=10'} 1246 | dependencies: 1247 | brace-expansion: 2.0.1 1248 | dev: true 1249 | 1250 | /minimatch/5.1.0: 1251 | resolution: {integrity: sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==} 1252 | engines: {node: '>=10'} 1253 | dependencies: 1254 | brace-expansion: 2.0.1 1255 | dev: false 1256 | 1257 | /minimist/1.2.7: 1258 | resolution: {integrity: sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==} 1259 | dev: false 1260 | 1261 | /mocha/10.1.0: 1262 | resolution: {integrity: sha512-vUF7IYxEoN7XhQpFLxQAEMtE4W91acW4B6En9l97MwE9stL1A9gusXfoHZCLVHDUJ/7V5+lbCM6yMqzo5vNymg==} 1263 | engines: {node: '>= 14.0.0'} 1264 | hasBin: true 1265 | dependencies: 1266 | ansi-colors: 4.1.1 1267 | browser-stdout: 1.3.1 1268 | chokidar: 3.5.3 1269 | debug: 4.3.4_supports-color@8.1.1 1270 | diff: 5.0.0 1271 | escape-string-regexp: 4.0.0 1272 | find-up: 5.0.0 1273 | glob: 7.2.0 1274 | he: 1.2.0 1275 | js-yaml: 4.1.0 1276 | log-symbols: 4.1.0 1277 | minimatch: 5.0.1 1278 | ms: 2.1.3 1279 | nanoid: 3.3.3 1280 | serialize-javascript: 6.0.0 1281 | strip-json-comments: 3.1.1 1282 | supports-color: 8.1.1 1283 | workerpool: 6.2.1 1284 | yargs: 16.2.0 1285 | yargs-parser: 20.2.4 1286 | yargs-unparser: 2.0.0 1287 | dev: true 1288 | 1289 | /mockjs/1.1.0: 1290 | resolution: {integrity: sha512-eQsKcWzIaZzEZ07NuEyO4Nw65g0hdWAyurVol1IPl1gahRwY+svqzfgfey8U8dahLwG44d6/RwEzuK52rSa/JQ==} 1291 | hasBin: true 1292 | dependencies: 1293 | commander: 9.4.1 1294 | dev: false 1295 | 1296 | /moment/2.29.4: 1297 | resolution: {integrity: sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==} 1298 | dev: false 1299 | 1300 | /morgan/1.10.0: 1301 | resolution: {integrity: sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==} 1302 | engines: {node: '>= 0.8.0'} 1303 | dependencies: 1304 | basic-auth: 2.0.1 1305 | debug: 2.6.9 1306 | depd: 2.0.0 1307 | on-finished: 2.3.0 1308 | on-headers: 1.0.2 1309 | transitivePeerDependencies: 1310 | - supports-color 1311 | dev: false 1312 | 1313 | /ms/2.0.0: 1314 | resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} 1315 | dev: false 1316 | 1317 | /ms/2.1.2: 1318 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 1319 | 1320 | /ms/2.1.3: 1321 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 1322 | 1323 | /nanoid/3.3.3: 1324 | resolution: {integrity: sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==} 1325 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 1326 | hasBin: true 1327 | dev: true 1328 | 1329 | /negotiator/0.6.3: 1330 | resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} 1331 | engines: {node: '>= 0.6'} 1332 | dev: false 1333 | 1334 | /neo-async/2.6.2: 1335 | resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} 1336 | dev: false 1337 | 1338 | /node-addon-api/1.7.2: 1339 | resolution: {integrity: sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==} 1340 | dev: false 1341 | 1342 | /node-fetch/2.6.7: 1343 | resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} 1344 | engines: {node: 4.x || >=6.0.0} 1345 | peerDependencies: 1346 | encoding: ^0.1.0 1347 | peerDependenciesMeta: 1348 | encoding: 1349 | optional: true 1350 | dependencies: 1351 | whatwg-url: 5.0.0 1352 | dev: false 1353 | 1354 | /normalize-path/3.0.0: 1355 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 1356 | engines: {node: '>=0.10.0'} 1357 | 1358 | /object-assign/4.1.1: 1359 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} 1360 | engines: {node: '>=0.10.0'} 1361 | dev: false 1362 | 1363 | /object-inspect/1.12.2: 1364 | resolution: {integrity: sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==} 1365 | dev: false 1366 | 1367 | /on-finished/2.3.0: 1368 | resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==} 1369 | engines: {node: '>= 0.8'} 1370 | dependencies: 1371 | ee-first: 1.1.1 1372 | dev: false 1373 | 1374 | /on-finished/2.4.1: 1375 | resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} 1376 | engines: {node: '>= 0.8'} 1377 | dependencies: 1378 | ee-first: 1.1.1 1379 | dev: false 1380 | 1381 | /on-headers/1.0.2: 1382 | resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} 1383 | engines: {node: '>= 0.8'} 1384 | dev: false 1385 | 1386 | /once/1.4.0: 1387 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 1388 | dependencies: 1389 | wrappy: 1.0.2 1390 | dev: true 1391 | 1392 | /open/8.4.0: 1393 | resolution: {integrity: sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==} 1394 | engines: {node: '>=12'} 1395 | dependencies: 1396 | define-lazy-prop: 2.0.0 1397 | is-docker: 2.2.1 1398 | is-wsl: 2.2.0 1399 | dev: false 1400 | 1401 | /opts/2.0.2: 1402 | resolution: {integrity: sha512-k41FwbcLnlgnFh69f4qdUfvDQ+5vaSDnVPFI/y5XuhKRq97EnVVneO9F1ESVCdiVu4fCS2L8usX3mU331hB7pg==} 1403 | dev: false 1404 | 1405 | /p-limit/2.3.0: 1406 | resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} 1407 | engines: {node: '>=6'} 1408 | dependencies: 1409 | p-try: 2.2.0 1410 | dev: true 1411 | 1412 | /p-limit/3.1.0: 1413 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 1414 | engines: {node: '>=10'} 1415 | dependencies: 1416 | yocto-queue: 0.1.0 1417 | dev: true 1418 | 1419 | /p-locate/4.1.0: 1420 | resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} 1421 | engines: {node: '>=8'} 1422 | dependencies: 1423 | p-limit: 2.3.0 1424 | dev: true 1425 | 1426 | /p-locate/5.0.0: 1427 | resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} 1428 | engines: {node: '>=10'} 1429 | dependencies: 1430 | p-limit: 3.1.0 1431 | dev: true 1432 | 1433 | /p-try/2.2.0: 1434 | resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} 1435 | engines: {node: '>=6'} 1436 | dev: true 1437 | 1438 | /parse-passwd/1.0.0: 1439 | resolution: {integrity: sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==} 1440 | engines: {node: '>=0.10.0'} 1441 | dev: false 1442 | 1443 | /parseurl/1.3.3: 1444 | resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} 1445 | engines: {node: '>= 0.8'} 1446 | dev: false 1447 | 1448 | /path-exists/4.0.0: 1449 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 1450 | engines: {node: '>=8'} 1451 | dev: true 1452 | 1453 | /path-is-absolute/1.0.1: 1454 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} 1455 | engines: {node: '>=0.10.0'} 1456 | dev: true 1457 | 1458 | /path-key/3.1.1: 1459 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 1460 | engines: {node: '>=8'} 1461 | dev: false 1462 | 1463 | /path-parse/1.0.7: 1464 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 1465 | dev: false 1466 | 1467 | /path-to-regexp/0.1.7: 1468 | resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} 1469 | dev: false 1470 | 1471 | /path-to-regexp/6.2.1: 1472 | resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==} 1473 | dev: false 1474 | 1475 | /picomatch/2.3.1: 1476 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 1477 | engines: {node: '>=8.6'} 1478 | 1479 | /portscanner/2.2.0: 1480 | resolution: {integrity: sha512-IFroCz/59Lqa2uBvzK3bKDbDDIEaAY8XJ1jFxcLWTqosrsc32//P4VuSB2vZXoHiHqOmx8B5L5hnKOxL/7FlPw==} 1481 | engines: {node: '>=0.4', npm: '>=1.0.0'} 1482 | dependencies: 1483 | async: 2.6.4 1484 | is-number-like: 1.0.8 1485 | dev: false 1486 | 1487 | /prettier/2.8.0: 1488 | resolution: {integrity: sha512-9Lmg8hTFZKG0Asr/kW9Bp8tJjRVluO8EJQVfY2T7FMw9T5jy4I/Uvx0Rca/XWf50QQ1/SS48+6IJWnrb+2yemA==} 1489 | engines: {node: '>=10.13.0'} 1490 | hasBin: true 1491 | dev: true 1492 | 1493 | /promise/7.3.1: 1494 | resolution: {integrity: sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==} 1495 | dependencies: 1496 | asap: 2.0.6 1497 | dev: false 1498 | 1499 | /proxy-addr/2.0.7: 1500 | resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} 1501 | engines: {node: '>= 0.10'} 1502 | dependencies: 1503 | forwarded: 0.2.0 1504 | ipaddr.js: 1.9.1 1505 | dev: false 1506 | 1507 | /proxy-middleware/0.15.0: 1508 | resolution: {integrity: sha512-EGCG8SeoIRVMhsqHQUdDigB2i7qU7fCsWASwn54+nPutYO8n4q6EiwMzyfWlC+dzRFExP+kvcnDFdBDHoZBU7Q==} 1509 | engines: {node: '>=0.8.0'} 1510 | dev: false 1511 | 1512 | /pug-attrs/3.0.0: 1513 | resolution: {integrity: sha512-azINV9dUtzPMFQktvTXciNAfAuVh/L/JCl0vtPCwvOA21uZrC08K/UnmrL+SXGEVc1FwzjW62+xw5S/uaLj6cA==} 1514 | dependencies: 1515 | constantinople: 4.0.1 1516 | js-stringify: 1.0.2 1517 | pug-runtime: 3.0.1 1518 | dev: false 1519 | 1520 | /pug-code-gen/3.0.2: 1521 | resolution: {integrity: sha512-nJMhW16MbiGRiyR4miDTQMRWDgKplnHyeLvioEJYbk1RsPI3FuA3saEP8uwnTb2nTJEKBU90NFVWJBk4OU5qyg==} 1522 | dependencies: 1523 | constantinople: 4.0.1 1524 | doctypes: 1.1.0 1525 | js-stringify: 1.0.2 1526 | pug-attrs: 3.0.0 1527 | pug-error: 2.0.0 1528 | pug-runtime: 3.0.1 1529 | void-elements: 3.1.0 1530 | with: 7.0.2 1531 | dev: false 1532 | 1533 | /pug-error/2.0.0: 1534 | resolution: {integrity: sha512-sjiUsi9M4RAGHktC1drQfCr5C5eriu24Lfbt4s+7SykztEOwVZtbFk1RRq0tzLxcMxMYTBR+zMQaG07J/btayQ==} 1535 | dev: false 1536 | 1537 | /pug-filters/4.0.0: 1538 | resolution: {integrity: sha512-yeNFtq5Yxmfz0f9z2rMXGw/8/4i1cCFecw/Q7+D0V2DdtII5UvqE12VaZ2AY7ri6o5RNXiweGH79OCq+2RQU4A==} 1539 | dependencies: 1540 | constantinople: 4.0.1 1541 | jstransformer: 1.0.0 1542 | pug-error: 2.0.0 1543 | pug-walk: 2.0.0 1544 | resolve: 1.22.1 1545 | dev: false 1546 | 1547 | /pug-lexer/5.0.1: 1548 | resolution: {integrity: sha512-0I6C62+keXlZPZkOJeVam9aBLVP2EnbeDw3An+k0/QlqdwH6rv8284nko14Na7c0TtqtogfWXcRoFE4O4Ff20w==} 1549 | dependencies: 1550 | character-parser: 2.2.0 1551 | is-expression: 4.0.0 1552 | pug-error: 2.0.0 1553 | dev: false 1554 | 1555 | /pug-linker/4.0.0: 1556 | resolution: {integrity: sha512-gjD1yzp0yxbQqnzBAdlhbgoJL5qIFJw78juN1NpTLt/mfPJ5VgC4BvkoD3G23qKzJtIIXBbcCt6FioLSFLOHdw==} 1557 | dependencies: 1558 | pug-error: 2.0.0 1559 | pug-walk: 2.0.0 1560 | dev: false 1561 | 1562 | /pug-load/3.0.0: 1563 | resolution: {integrity: sha512-OCjTEnhLWZBvS4zni/WUMjH2YSUosnsmjGBB1An7CsKQarYSWQ0GCVyd4eQPMFJqZ8w9xgs01QdiZXKVjk92EQ==} 1564 | dependencies: 1565 | object-assign: 4.1.1 1566 | pug-walk: 2.0.0 1567 | dev: false 1568 | 1569 | /pug-parser/6.0.0: 1570 | resolution: {integrity: sha512-ukiYM/9cH6Cml+AOl5kETtM9NR3WulyVP2y4HOU45DyMim1IeP/OOiyEWRr6qk5I5klpsBnbuHpwKmTx6WURnw==} 1571 | dependencies: 1572 | pug-error: 2.0.0 1573 | token-stream: 1.0.0 1574 | dev: false 1575 | 1576 | /pug-runtime/3.0.1: 1577 | resolution: {integrity: sha512-L50zbvrQ35TkpHwv0G6aLSuueDRwc/97XdY8kL3tOT0FmhgG7UypU3VztfV/LATAvmUfYi4wNxSajhSAeNN+Kg==} 1578 | dev: false 1579 | 1580 | /pug-strip-comments/2.0.0: 1581 | resolution: {integrity: sha512-zo8DsDpH7eTkPHCXFeAk1xZXJbyoTfdPlNR0bK7rpOMuhBYb0f5qUVCO1xlsitYd3w5FQTK7zpNVKb3rZoUrrQ==} 1582 | dependencies: 1583 | pug-error: 2.0.0 1584 | dev: false 1585 | 1586 | /pug-walk/2.0.0: 1587 | resolution: {integrity: sha512-yYELe9Q5q9IQhuvqsZNwA5hfPkMJ8u92bQLIMcsMxf/VADjNtEYptU+inlufAFYcWdHlwNfZOEnOOQrZrcyJCQ==} 1588 | dev: false 1589 | 1590 | /pug/3.0.2: 1591 | resolution: {integrity: sha512-bp0I/hiK1D1vChHh6EfDxtndHji55XP/ZJKwsRqrz6lRia6ZC2OZbdAymlxdVFwd1L70ebrVJw4/eZ79skrIaw==} 1592 | dependencies: 1593 | pug-code-gen: 3.0.2 1594 | pug-filters: 4.0.0 1595 | pug-lexer: 5.0.1 1596 | pug-linker: 4.0.0 1597 | pug-load: 3.0.0 1598 | pug-parser: 6.0.0 1599 | pug-runtime: 3.0.1 1600 | pug-strip-comments: 2.0.0 1601 | dev: false 1602 | 1603 | /qs/6.11.0: 1604 | resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} 1605 | engines: {node: '>=0.6'} 1606 | dependencies: 1607 | side-channel: 1.0.4 1608 | dev: false 1609 | 1610 | /randombytes/2.1.0: 1611 | resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} 1612 | dependencies: 1613 | safe-buffer: 5.2.1 1614 | dev: true 1615 | 1616 | /range-parser/1.2.1: 1617 | resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} 1618 | engines: {node: '>= 0.6'} 1619 | dev: false 1620 | 1621 | /raw-body/2.5.1: 1622 | resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} 1623 | engines: {node: '>= 0.8'} 1624 | dependencies: 1625 | bytes: 3.1.2 1626 | http-errors: 2.0.0 1627 | iconv-lite: 0.4.24 1628 | unpipe: 1.0.0 1629 | dev: false 1630 | 1631 | /readdirp/3.6.0: 1632 | resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} 1633 | engines: {node: '>=8.10.0'} 1634 | dependencies: 1635 | picomatch: 2.3.1 1636 | 1637 | /replace/1.2.2: 1638 | resolution: {integrity: sha512-C4EDifm22XZM2b2JOYe6Mhn+lBsLBAvLbK8drfUQLTfD1KYl/n3VaW/CDju0Ny4w3xTtegBpg8YNSpFJPUDSjA==} 1639 | engines: {node: '>= 6'} 1640 | hasBin: true 1641 | dependencies: 1642 | chalk: 2.4.2 1643 | minimatch: 3.0.5 1644 | yargs: 15.4.1 1645 | dev: true 1646 | 1647 | /require-directory/2.1.1: 1648 | resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} 1649 | engines: {node: '>=0.10.0'} 1650 | dev: true 1651 | 1652 | /require-main-filename/2.0.0: 1653 | resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} 1654 | dev: true 1655 | 1656 | /resolve-dir/1.0.1: 1657 | resolution: {integrity: sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==} 1658 | engines: {node: '>=0.10.0'} 1659 | dependencies: 1660 | expand-tilde: 2.0.2 1661 | global-modules: 1.0.0 1662 | dev: false 1663 | 1664 | /resolve/1.22.1: 1665 | resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} 1666 | hasBin: true 1667 | dependencies: 1668 | is-core-module: 2.11.0 1669 | path-parse: 1.0.7 1670 | supports-preserve-symlinks-flag: 1.0.0 1671 | dev: false 1672 | 1673 | /safe-buffer/5.1.2: 1674 | resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} 1675 | dev: false 1676 | 1677 | /safe-buffer/5.2.1: 1678 | resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} 1679 | 1680 | /safer-buffer/2.1.2: 1681 | resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} 1682 | dev: false 1683 | 1684 | /send/0.18.0: 1685 | resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} 1686 | engines: {node: '>= 0.8.0'} 1687 | dependencies: 1688 | debug: 2.6.9 1689 | depd: 2.0.0 1690 | destroy: 1.2.0 1691 | encodeurl: 1.0.2 1692 | escape-html: 1.0.3 1693 | etag: 1.8.1 1694 | fresh: 0.5.2 1695 | http-errors: 2.0.0 1696 | mime: 1.6.0 1697 | ms: 2.1.3 1698 | on-finished: 2.4.1 1699 | range-parser: 1.2.1 1700 | statuses: 2.0.1 1701 | transitivePeerDependencies: 1702 | - supports-color 1703 | dev: false 1704 | 1705 | /serialize-javascript/6.0.0: 1706 | resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} 1707 | dependencies: 1708 | randombytes: 2.1.0 1709 | dev: true 1710 | 1711 | /serve-static/1.15.0: 1712 | resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} 1713 | engines: {node: '>= 0.8.0'} 1714 | dependencies: 1715 | encodeurl: 1.0.2 1716 | escape-html: 1.0.3 1717 | parseurl: 1.3.3 1718 | send: 0.18.0 1719 | transitivePeerDependencies: 1720 | - supports-color 1721 | dev: false 1722 | 1723 | /set-blocking/2.0.0: 1724 | resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} 1725 | dev: true 1726 | 1727 | /setprototypeof/1.2.0: 1728 | resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} 1729 | dev: false 1730 | 1731 | /shebang-command/2.0.0: 1732 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 1733 | engines: {node: '>=8'} 1734 | dependencies: 1735 | shebang-regex: 3.0.0 1736 | dev: false 1737 | 1738 | /shebang-regex/3.0.0: 1739 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 1740 | engines: {node: '>=8'} 1741 | dev: false 1742 | 1743 | /should-equal/2.0.0: 1744 | resolution: {integrity: sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA==} 1745 | dependencies: 1746 | should-type: 1.4.0 1747 | dev: true 1748 | 1749 | /should-format/3.0.3: 1750 | resolution: {integrity: sha512-hZ58adtulAk0gKtua7QxevgUaXTTXxIi8t41L3zo9AHvjXO1/7sdLECuHeIN2SRtYXpNkmhoUP2pdeWgricQ+Q==} 1751 | dependencies: 1752 | should-type: 1.4.0 1753 | should-type-adaptors: 1.1.0 1754 | dev: true 1755 | 1756 | /should-type-adaptors/1.1.0: 1757 | resolution: {integrity: sha512-JA4hdoLnN+kebEp2Vs8eBe9g7uy0zbRo+RMcU0EsNy+R+k049Ki+N5tT5Jagst2g7EAja+euFuoXFCa8vIklfA==} 1758 | dependencies: 1759 | should-type: 1.4.0 1760 | should-util: 1.0.1 1761 | dev: true 1762 | 1763 | /should-type/1.4.0: 1764 | resolution: {integrity: sha512-MdAsTu3n25yDbIe1NeN69G4n6mUnJGtSJHygX3+oN0ZbO3DTiATnf7XnYJdGT42JCXurTb1JI0qOBR65shvhPQ==} 1765 | dev: true 1766 | 1767 | /should-util/1.0.1: 1768 | resolution: {integrity: sha512-oXF8tfxx5cDk8r2kYqlkUJzZpDBqVY/II2WhvU0n9Y3XYvAYRmeaf1PvvIvTgPnv4KJ+ES5M0PyDq5Jp+Ygy2g==} 1769 | dev: true 1770 | 1771 | /should/13.2.3: 1772 | resolution: {integrity: sha512-ggLesLtu2xp+ZxI+ysJTmNjh2U0TsC+rQ/pfED9bUZZ4DKefP27D+7YJVVTvKsmjLpIi9jAa7itwDGkDDmt1GQ==} 1773 | dependencies: 1774 | should-equal: 2.0.0 1775 | should-format: 3.0.3 1776 | should-type: 1.4.0 1777 | should-type-adaptors: 1.1.0 1778 | should-util: 1.0.1 1779 | dev: true 1780 | 1781 | /side-channel/1.0.4: 1782 | resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} 1783 | dependencies: 1784 | call-bind: 1.0.2 1785 | get-intrinsic: 1.1.3 1786 | object-inspect: 1.12.2 1787 | dev: false 1788 | 1789 | /source-map/0.6.1: 1790 | resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} 1791 | engines: {node: '>=0.10.0'} 1792 | dev: false 1793 | 1794 | /statuses/2.0.1: 1795 | resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} 1796 | engines: {node: '>= 0.8'} 1797 | dev: false 1798 | 1799 | /string-width/4.2.3: 1800 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 1801 | engines: {node: '>=8'} 1802 | dependencies: 1803 | emoji-regex: 8.0.0 1804 | is-fullwidth-code-point: 3.0.0 1805 | strip-ansi: 6.0.1 1806 | dev: true 1807 | 1808 | /strip-ansi/6.0.1: 1809 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 1810 | engines: {node: '>=8'} 1811 | dependencies: 1812 | ansi-regex: 5.0.1 1813 | dev: true 1814 | 1815 | /strip-json-comments/3.1.1: 1816 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 1817 | engines: {node: '>=8'} 1818 | dev: true 1819 | 1820 | /supports-color/5.5.0: 1821 | resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} 1822 | engines: {node: '>=4'} 1823 | dependencies: 1824 | has-flag: 3.0.0 1825 | dev: true 1826 | 1827 | /supports-color/7.2.0: 1828 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 1829 | engines: {node: '>=8'} 1830 | dependencies: 1831 | has-flag: 4.0.0 1832 | 1833 | /supports-color/8.1.1: 1834 | resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} 1835 | engines: {node: '>=10'} 1836 | dependencies: 1837 | has-flag: 4.0.0 1838 | dev: true 1839 | 1840 | /supports-preserve-symlinks-flag/1.0.0: 1841 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 1842 | engines: {node: '>= 0.4'} 1843 | dev: false 1844 | 1845 | /syntax-error/1.4.0: 1846 | resolution: {integrity: sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w==} 1847 | dependencies: 1848 | acorn-node: 1.8.2 1849 | dev: false 1850 | 1851 | /to-fast-properties/2.0.0: 1852 | resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} 1853 | engines: {node: '>=4'} 1854 | dev: false 1855 | 1856 | /to-regex-range/5.0.1: 1857 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 1858 | engines: {node: '>=8.0'} 1859 | dependencies: 1860 | is-number: 7.0.0 1861 | 1862 | /toidentifier/1.0.1: 1863 | resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} 1864 | engines: {node: '>=0.6'} 1865 | dev: false 1866 | 1867 | /token-stream/1.0.0: 1868 | resolution: {integrity: sha512-VSsyNPPW74RpHwR8Fc21uubwHY7wMDeJLys2IX5zJNih+OnAnaifKHo+1LHT7DAdloQ7apeaaWg8l7qnf/TnEg==} 1869 | dev: false 1870 | 1871 | /tr46/0.0.3: 1872 | resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} 1873 | dev: false 1874 | 1875 | /type-is/1.6.18: 1876 | resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} 1877 | engines: {node: '>= 0.6'} 1878 | dependencies: 1879 | media-typer: 0.3.0 1880 | mime-types: 2.1.35 1881 | dev: false 1882 | 1883 | /uglify-js/3.17.4: 1884 | resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==} 1885 | engines: {node: '>=0.8.0'} 1886 | hasBin: true 1887 | requiresBuild: true 1888 | dev: false 1889 | optional: true 1890 | 1891 | /universalify/2.0.0: 1892 | resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} 1893 | engines: {node: '>= 10.0.0'} 1894 | dev: false 1895 | 1896 | /unpipe/1.0.0: 1897 | resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} 1898 | engines: {node: '>= 0.8'} 1899 | dev: false 1900 | 1901 | /utils-merge/1.0.1: 1902 | resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} 1903 | engines: {node: '>= 0.4.0'} 1904 | dev: false 1905 | 1906 | /vary/1.1.2: 1907 | resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} 1908 | engines: {node: '>= 0.8'} 1909 | dev: false 1910 | 1911 | /void-elements/3.1.0: 1912 | resolution: {integrity: sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==} 1913 | engines: {node: '>=0.10.0'} 1914 | dev: false 1915 | 1916 | /webidl-conversions/3.0.1: 1917 | resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} 1918 | dev: false 1919 | 1920 | /whatwg-url/5.0.0: 1921 | resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} 1922 | dependencies: 1923 | tr46: 0.0.3 1924 | webidl-conversions: 3.0.1 1925 | dev: false 1926 | 1927 | /which-module/2.0.0: 1928 | resolution: {integrity: sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==} 1929 | dev: true 1930 | 1931 | /which/1.3.1: 1932 | resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} 1933 | hasBin: true 1934 | dependencies: 1935 | isexe: 2.0.0 1936 | dev: false 1937 | 1938 | /which/2.0.2: 1939 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 1940 | engines: {node: '>= 8'} 1941 | hasBin: true 1942 | dependencies: 1943 | isexe: 2.0.0 1944 | dev: false 1945 | 1946 | /with/7.0.2: 1947 | resolution: {integrity: sha512-RNGKj82nUPg3g5ygxkQl0R937xLyho1J24ItRCBTr/m1YnZkzJy1hUiHUJrc/VlsDQzsCnInEGSg3bci0Lmd4w==} 1948 | engines: {node: '>= 10.0.0'} 1949 | dependencies: 1950 | '@babel/parser': 7.20.3 1951 | '@babel/types': 7.20.2 1952 | assert-never: 1.2.1 1953 | babel-walk: 3.0.0-canary-5 1954 | dev: false 1955 | 1956 | /wordwrap/1.0.0: 1957 | resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} 1958 | dev: false 1959 | 1960 | /workerpool/6.2.1: 1961 | resolution: {integrity: sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==} 1962 | dev: true 1963 | 1964 | /wrap-ansi/6.2.0: 1965 | resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} 1966 | engines: {node: '>=8'} 1967 | dependencies: 1968 | ansi-styles: 4.3.0 1969 | string-width: 4.2.3 1970 | strip-ansi: 6.0.1 1971 | dev: true 1972 | 1973 | /wrap-ansi/7.0.0: 1974 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} 1975 | engines: {node: '>=10'} 1976 | dependencies: 1977 | ansi-styles: 4.3.0 1978 | string-width: 4.2.3 1979 | strip-ansi: 6.0.1 1980 | dev: true 1981 | 1982 | /wrappy/1.0.2: 1983 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 1984 | dev: true 1985 | 1986 | /ws/7.5.9: 1987 | resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==} 1988 | engines: {node: '>=8.3.0'} 1989 | peerDependencies: 1990 | bufferutil: ^4.0.1 1991 | utf-8-validate: ^5.0.2 1992 | peerDependenciesMeta: 1993 | bufferutil: 1994 | optional: true 1995 | utf-8-validate: 1996 | optional: true 1997 | dev: false 1998 | 1999 | /xtend/4.0.2: 2000 | resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} 2001 | engines: {node: '>=0.4'} 2002 | dev: false 2003 | 2004 | /y18n/4.0.3: 2005 | resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} 2006 | dev: true 2007 | 2008 | /y18n/5.0.8: 2009 | resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} 2010 | engines: {node: '>=10'} 2011 | dev: true 2012 | 2013 | /yargs-parser/18.1.3: 2014 | resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} 2015 | engines: {node: '>=6'} 2016 | dependencies: 2017 | camelcase: 5.3.1 2018 | decamelize: 1.2.0 2019 | dev: true 2020 | 2021 | /yargs-parser/20.2.4: 2022 | resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} 2023 | engines: {node: '>=10'} 2024 | dev: true 2025 | 2026 | /yargs-unparser/2.0.0: 2027 | resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} 2028 | engines: {node: '>=10'} 2029 | dependencies: 2030 | camelcase: 6.3.0 2031 | decamelize: 4.0.0 2032 | flat: 5.0.2 2033 | is-plain-obj: 2.1.0 2034 | dev: true 2035 | 2036 | /yargs/15.4.1: 2037 | resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} 2038 | engines: {node: '>=8'} 2039 | dependencies: 2040 | cliui: 6.0.0 2041 | decamelize: 1.2.0 2042 | find-up: 4.1.0 2043 | get-caller-file: 2.0.5 2044 | require-directory: 2.1.1 2045 | require-main-filename: 2.0.0 2046 | set-blocking: 2.0.0 2047 | string-width: 4.2.3 2048 | which-module: 2.0.0 2049 | y18n: 4.0.3 2050 | yargs-parser: 18.1.3 2051 | dev: true 2052 | 2053 | /yargs/16.2.0: 2054 | resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} 2055 | engines: {node: '>=10'} 2056 | dependencies: 2057 | cliui: 7.0.4 2058 | escalade: 3.1.1 2059 | get-caller-file: 2.0.5 2060 | require-directory: 2.1.1 2061 | string-width: 4.2.3 2062 | y18n: 5.0.8 2063 | yargs-parser: 20.2.4 2064 | dev: true 2065 | 2066 | /yocto-queue/0.1.0: 2067 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 2068 | engines: {node: '>=10'} 2069 | dev: true 2070 | -------------------------------------------------------------------------------- /test/config-handler_test.js: -------------------------------------------------------------------------------- 1 | var should = require('should'); 2 | var path = require('path'); 3 | var configHandler = require('../libs/config-handler'); 4 | 5 | describe('Config Handler', function () { 6 | var base, config; 7 | 8 | describe('file config', function () { 9 | before(function () { 10 | base = path.resolve(__dirname, '../'); 11 | config = configHandler(path.resolve(__dirname, './data/fds-config.js')); 12 | }); 13 | 14 | it ('should have extended base path', function () { 15 | config.basePath.should.equal(base); 16 | }); 17 | 18 | it ('should have default viewFolder', function () { 19 | config.viewFolder.should.equal(base + '/views'); 20 | }); 21 | 22 | it ('should have default mockFolder', function () { 23 | config.mockFolder.should.equal(base + '/mocks'); 24 | }); 25 | 26 | it ('should have default publicFolder', function () { 27 | config.publicFolder.should.equal(base + '/public'); 28 | }); 29 | 30 | 31 | it ('should have default router file', function () { 32 | config.routeFile.should.equal(base + '/routes.js'); 33 | }); 34 | }); 35 | 36 | describe('object config', function () { 37 | before(function () { 38 | config = configHandler({ 39 | basePath: '.' 40 | }); 41 | }); 42 | 43 | it ('should have extended base path', function () { 44 | config.basePath.should.equal(base); 45 | }); 46 | 47 | it ('should have default viewFolder', function () { 48 | config.viewFolder.should.equal(base + '/views'); 49 | }); 50 | 51 | it ('should have default mockFolder', function () { 52 | config.mockFolder.should.equal(base + '/mocks'); 53 | }); 54 | 55 | it ('should have default publicFolder', function () { 56 | config.publicFolder.should.equal(base + '/public'); 57 | }); 58 | 59 | 60 | it ('should have default router file', function () { 61 | config.routeFile.should.equal(base + '/routes.js'); 62 | }); 63 | }); 64 | 65 | }); 66 | -------------------------------------------------------------------------------- /test/data/fds-config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | basePath: '.' 3 | }; 4 | -------------------------------------------------------------------------------- /test/data/js_func.js: -------------------------------------------------------------------------------- 1 | module.exports = function (params) { 2 | return { 3 | name: 'joey' 4 | }; 5 | }; 6 | -------------------------------------------------------------------------------- /test/data/js_obj.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | name: 'joey' 3 | }; 4 | -------------------------------------------------------------------------------- /test/data/obj.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "joey" 3 | } 4 | -------------------------------------------------------------------------------- /test/data/route-file.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | '/': 'index.html', 3 | 'get::/test': 'test.html', 4 | 'post::/test': 'test_post.html', 5 | '/users/:id/orders/:oid': 'users_orders.html' 6 | }; 7 | -------------------------------------------------------------------------------- /test/dataset_test.js: -------------------------------------------------------------------------------- 1 | var should = require('should'); 2 | var DataSet = require('../libs/dataset'); 3 | 4 | describe('DataSet', function () { 5 | var ds; 6 | 7 | beforeEach(function () { 8 | ds = new DataSet('./test/data', ['.js', '.json']); 9 | }); 10 | 11 | it('should have a path prop', function () { 12 | ds.path.should.equal('./test/data'); 13 | }); 14 | 15 | it('should have a exts prop', function () { 16 | ds.exts.should.eql(['.js', '.json']); 17 | }); 18 | 19 | it('should return a empty object if file is not exist', function () { 20 | var data = ds.get('no-exist.js'); 21 | data.should.be.a.Object(); 22 | Object.keys(data).length.should.equal(0); 23 | }); 24 | 25 | it('should return a json object for exist js object file', function () { 26 | var data = ds.get('js_obj.html'); 27 | data.should.have.property('name'); 28 | data.name.should.equal('joey'); 29 | }); 30 | 31 | it('should return a json object for json file', function () { 32 | var data = ds.get('obj.html'); 33 | data.should.have.property('name'); 34 | data.name.should.equal('joey'); 35 | }); 36 | }); 37 | -------------------------------------------------------------------------------- /test/embed_test.js: -------------------------------------------------------------------------------- 1 | var should = require("should"); 2 | var fds = require("../index"); 3 | 4 | describe("Embed Server", function () { 5 | var server; 6 | 7 | before(function () { 8 | server = fds({ enableJava: false, livereload: true }); 9 | }); 10 | 11 | it("should return a server object", function () { 12 | server.should.be.a.Function(); 13 | }); 14 | 15 | after(function () { 16 | server.destroy(); 17 | }); 18 | }); 19 | -------------------------------------------------------------------------------- /test/router_test.js: -------------------------------------------------------------------------------- 1 | var should = require('should'); 2 | var path = require('path'); 3 | var Router = require('../libs/router'); 4 | 5 | 6 | describe('Router', function () { 7 | var router; 8 | 9 | beforeEach(function () { 10 | var f = path.resolve(__dirname, './data/route-file.js'); 11 | router = new Router(f); 12 | }); 13 | 14 | it('should have a prop to contain the route objects', function () { 15 | router.routes.should.be.a.Array(); 16 | router.routes.length.should.equal(4); 17 | }); 18 | 19 | it('should return the url path for given method and route', function () { 20 | router.search('/', 'get').file.should.equal('index.html'); 21 | router.search('/test', 'get').file.should.equal('test.html'); 22 | router.search('/test', 'post').file.should.equal('test_post.html'); 23 | }); 24 | 25 | it('should contains the params data', function () { 26 | var match = router.search('/users/123/orders/222', 'get'); 27 | Object.keys(match.params).length.should.equal(2); 28 | match.params.id.should.equal('123'); 29 | match.params.oid.should.equal('222'); 30 | }); 31 | }); 32 | -------------------------------------------------------------------------------- /test/utils_test.js: -------------------------------------------------------------------------------- 1 | var should = require('should'); 2 | var utils = require('../libs/utils'); 3 | 4 | describe('Utils', function () { 5 | it('isFunc', function () { 6 | utils.isFunc(function () {}).should.be.true; 7 | utils.isFunc('1').should.be.false; 8 | }); 9 | 10 | it('isObject', function () { 11 | utils.isObject({}).should.be.true; 12 | utils.isObject('1').should.be.false; 13 | }); 14 | 15 | it('isArray', function () { 16 | utils.isArray([]).should.be.true; 17 | utils.isArray('1').should.be.false; 18 | }); 19 | 20 | it('contains', function () { 21 | utils.contains([2,1,4], 1).should.be.true; 22 | utils.contains([2, 4], 1).should.be.false; 23 | }); 24 | 25 | it('serialize', function () { 26 | utils.serialize({a:1, b:2}).should.equal('a=1&b=2'); 27 | }); 28 | 29 | it('moment', function () { 30 | utils.moment.version.should.be.a.String(); 31 | }); 32 | 33 | it('assign', function () { 34 | utils.assign.should.be.a.Function(); 35 | }); 36 | }); 37 | -------------------------------------------------------------------------------- /views/404.hbs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | FDS - Error Report 6 | 89 | 90 | 91 | 92 |
93 |
94 |

FDS Error Report

95 |
96 |
97 | 98 |
99 |

{{error.message}}

100 | 101 | 102 | {{#if match}} 103 | 104 | {{else}} 105 | 106 | {{/if}} 107 | 108 | 109 | 110 | {{#if match}} 111 | 112 | 113 | 114 | 115 | {{/if}} 116 | 117 | 118 | 119 | 120 |
Route{{method}} {{route}}
Template File{{match.searchType}} {{match.file}}
Query{{json query}}
121 | 122 |

Configuration

123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 |
Base Path{{config.basePath}}
View Directory{{config.viewFolder}}
Mock Directory{{config.mockFolder}}
Public Directory{{config.publicFolder}}
Route File{{config.routeFile}}
Mock Extensions 147 | {{#each config.mockExts}} 148 | {{this}} 149 | {{/each}} 150 |
Server Port{{config.port}}
Enable Java{{config.enableJava}}
Java Server Port{{config.javaServerPort}}
Proxy{{json config.proxy}}
Open{{json config.open}}
173 |
174 | 175 | 176 | 177 | 178 | 179 | 180 | -------------------------------------------------------------------------------- /views/error.hbs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | FDS - Error Report 6 | 89 | 90 | 91 | 92 |
93 |
94 |

FDS Error Report

95 |
96 |
97 | 98 |
99 |

100 |
{{error}}
101 |

102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 |
Route{{method}} {{route}}
Template File{{match.searchType}} {{match.file}}
Query{{json query}}
117 | 118 |

Configuration

119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 |
Base Path{{config.basePath}}
View Directory{{config.viewFolder}}
Mock Directory{{config.mockFolder}}
Public Directory{{config.publicFolder}}
Route File{{config.routeFile}}
Mock Extensions 143 | {{#each config.mockExts}} 144 | {{this}} 145 | {{/each}} 146 |
Server Port{{config.port}}
Enable Java{{config.enableJava}}
Java Server Port{{config.javaServerPort}}
Proxy{{json config.proxy}}
Open{{json config.open}}
169 |
170 | 171 | 172 | 173 | 174 | 175 | 176 | --------------------------------------------------------------------------------