diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..7c90c56
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,125 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+lerna-debug.log*
+
+# Diagnostic reports (https://nodejs.org/api/report.html)
+report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
+
+# Runtime data
+pids
+*.pid
+*.seed
+*.pid.lock
+
+# Directory for instrumented libs generated by jscoverage/JSCover
+lib-cov
+
+# Coverage directory used by tools like istanbul
+coverage
+*.lcov
+
+# nyc test coverage
+.nyc_output
+
+# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
+.grunt
+
+# Bower dependency directory (https://bower.io/)
+bower_components
+
+# node-waf configuration
+.lock-wscript
+
+# Compiled binary addons (https://nodejs.org/api/addons.html)
+build/Release
+
+# Dependency directories
+node_modules/
+jspm_packages/
+
+# Snowpack dependency directory (https://snowpack.dev/)
+web_modules/
+
+# TypeScript cache
+*.tsbuildinfo
+
+# Optional npm cache directory
+.npm
+
+# Optional eslint cache
+.eslintcache
+
+# Microbundle cache
+.rpt2_cache/
+.rts2_cache_cjs/
+.rts2_cache_es/
+.rts2_cache_umd/
+
+# Optional REPL history
+.node_repl_history
+
+# Output of 'npm pack'
+*.tgz
+
+# Yarn Integrity file
+.yarn-integrity
+
+# dotenv environment variables file
+.env
+.env.test
+
+# parcel-bundler cache (https://parceljs.org/)
+.cache
+.parcel-cache
+
+# Next.js build output
+.next
+out
+
+# Nuxt.js build / generate output
+.nuxt
+dist
+
+# Gatsby files
+.cache/
+# Comment in the public line in if your project uses Gatsby and not Next.js
+# https://nextjs.org/blog/next-9-1#public-directory-support
+# public
+
+# vuepress build output
+.vuepress/dist
+
+# Serverless directories
+.serverless/
+
+# FuseBox cache
+.fusebox/
+
+# DynamoDB Local files
+.dynamodb/
+
+# TernJS port file
+.tern-port
+
+# Stores VSCode versions used for testing VSCode extensions
+.vscode-test
+
+# yarn v2
+.yarn/cache
+.yarn/unplugged
+.yarn/build-state.yml
+.yarn/install-state.gz
+.pnp.*
+
+
+.pnpm-store/
+
+pnpm-debug.log
+
+.theia
+
+.results
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..f6347fa
--- /dev/null
+++ b/README.md
@@ -0,0 +1,444 @@
+# Todo Application
+
+Given an `app.js` file and database file `todoApplication.db` with a table `todo`.
+
+Write APIs to perform operations on the table `todo`, with the following columns,
+
+**Todo Table**
+
+| Column | Type |
+| -------- | ------- |
+| id | INTEGER |
+| todo | TEXT |
+| category | TEXT |
+| priority | TEXT |
+| status | TEXT |
+| due_date | DATE |
+
+
+
+ - Replace the spaces in URL with `%20`.
+ - Possible values for `priority` are `HIGH`, `MEDIUM`, and `LOW`.
+ - Possible values for `status` are `TO DO`, `IN PROGRESS`, and `DONE`.
+ - Possible values for `category` are `WORK`, `HOME`, and `LEARNING`.
+ - Use the format `yyyy-MM-dd` for formating with date-fns `format` function.
+ - The user may request with due date value as `2021-1-21`, format the date to `2021-01-21` and perform Create, Read, Update operations on the database.
+
+
+
+
+Use `date-fns` format function to format the date. Refer to the documentation [link](https://date-fns.org/v2.19.0/docs/Getting-Started) for the usage of `format` function.
+
+
+### Invalid scenarios for all APIs
+
+- **Invalid Status**
+ - **Response**
+ - **Status code**
+ ```
+ 400
+ ```
+ - **Body**
+ ```
+ Invalid Todo Status
+ ```
+- **Invalid Priority**
+ - **Response**
+ - **Status code**
+ ```
+ 400
+ ```
+ - **Body**
+ ```
+ Invalid Todo Priority
+ ```
+- **Invalid Category**
+
+ - **Response**
+ - **Status code**
+ ```
+ 400
+ ```
+ - **Body**
+ ```
+ Invalid Todo Category
+ ```
+
+- **Invalid Due Date**
+ - **Response**
+ - **Status code**
+ ```
+ 400
+ ```
+ - **Body**
+ ```
+ Invalid Due Date
+ ```
+
+### API 1
+
+#### Path: `/todos/`
+
+#### Method: `GET`
+
+- **Scenario 1**
+
+ - **Sample API**
+ ```
+ /todos/?status=TO%20DO
+ ```
+ - **Description**:
+
+ Returns a list of all todos whose status is 'TO DO'
+
+ - **Response**
+
+ ```
+ [
+ {
+ "id": 2,
+ "todo": "Buy a Car",
+ "priority": "Medium",
+ "category": "WORK",
+ "status": "TO DO",
+ "dueDate": "2021-09-22"
+ },
+ ...
+ ]
+ ```
+
+- **Scenario 2**
+
+ - **Sample API**
+ ```
+ /todos/?priority=HIGH
+ ```
+ - **Description**:
+
+ Returns a list of all todos whose priority is 'HIGH'
+
+ - **Response**
+
+ ```
+ [
+ {
+ "id": 1,
+ "todo": "Learn Node JS",
+ "priority": "HIGH",
+ "status": "IN PROGRESS",
+ "category": "LEARNING",
+ "status": "IN PROGRESS",
+ "dueDate": "2021-04-04"
+ }
+ ]
+ ```
+
+- **Scenario 3**
+
+ - **Sample API**
+ ```
+ /todos/?priority=HIGH&status=IN%20PROGRESS
+ ```
+ - **Description**:
+
+ Returns a list of all todos whose priority is 'HIGH' and status is 'IN PROGRESS'
+
+ - **Response**
+
+ ```
+ [
+ {
+ "id": 2,
+ "todo": "Learn Node JS",
+ "priority": "HIGH",
+ "category": "LEARNING",
+ "status": "IN PROGRESS",
+ "dueDate": "2021-02-22"
+ },
+ ...
+ ]
+ ```
+
+- **Scenario 4**
+
+ - **Sample API**
+ ```
+ /todos/?search_q=Buy
+ ```
+ - **Description**:
+
+ Returns a list of all todos whose todo contains 'Buy' text
+
+ - **Response**
+
+ ```
+ [
+ {
+ "id": 2,
+ "todo": "Buy a Car",
+ "priority": "MEDIUM",
+ "status":"TO DO"
+ "category": "HOME",
+ "dueDate": "2021-09-22"
+ }
+ ]
+ ```
+
+- **Scenario 5**
+
+ - **Sample API**
+ ```
+ /todos/?category=WORK&status=DONE
+ ```
+ - **Description**:
+
+ Returns a list of all todos whose category is 'WORK' and status is 'DONE'
+
+ - **Response**
+
+ ```
+ [
+ {
+ "id": 4,
+ "todo": "Fix the bug",
+ "priority": "MEDIUM",
+ "status": "TO DO",
+ "category": "WORK",
+ "dueDate": "2021-01-12"
+ }
+ ]
+ ```
+
+- **Scenario 6**
+
+ - **Sample API**
+ ```
+ /todos/?category=HOME
+ ```
+ - **Description**:
+
+ Returns a list of all todos whose category is 'HOME'
+
+ - **Response**
+
+ ```
+ [
+ {
+ "id": 2,
+ "todo": "Buy a Car",
+ "priority": "MEDIUM",
+ "status": "TO DO",
+ "category": "HOME",
+ "dueDate": "2021-09-22"
+ },
+ ...
+ ]
+ ```
+
+- **Scenario 7**
+
+ - **Sample API**
+ ```
+ /todos/?category=LEARNING&priority=HIGH
+ ```
+ - **Description**:
+
+ Returns a list of all todos whose category is 'LEARNING' and priority is 'HIGH'
+
+ - **Response**
+
+ ```
+ [
+ {
+ "id": 1,
+ "todo": "Learn Node JS",
+ "priority": "HIGH",
+ "status": "IN PROGRESS",
+ "category": "LEARNING",
+ "dueDate": "2021-04-04"
+ }
+ ]
+ ```
+
+### API 2
+
+#### Path: `/todos/:todoId/`
+
+#### Method: `GET`
+
+#### Description:
+
+Returns a specific todo based on the todo ID
+
+#### Response
+
+```
+{
+ "id": 1,
+ "todo": "Learn Node JS",
+ "priority": "HIGH",
+ "status": "IN PROGRESS",
+ "category": "LEARNING",
+ "dueDate": "2021-04-04"
+}
+```
+
+### API 3
+
+#### Path: `/agenda/`
+
+#### Method: `GET`
+
+#### Description:
+
+Returns a list of all todos with a specific due date in the query parameter `/agenda/?date=2021-02-22`
+
+#### Response
+
+```
+[
+ {
+ "id": 3,
+ "todo": "Clean the garden",
+ "priority": "LOW",
+ "status": "TO DO",
+ "category": "HOME",
+ "dueDate": "2021-02-22"
+ }
+]
+```
+
+### API 4
+
+#### Path: `/todos/`
+
+#### Method: `POST`
+
+#### Description:
+
+Create a todo in the todo table,
+
+#### Request
+
+```
+{
+ "id": 6,
+ "todo": "Finalize event theme",
+ "priority": "LOW",
+ "status": "TO DO",
+ "category": "HOME",
+ "dueDate": "2021-02-22"
+}
+```
+
+#### Response
+
+```
+Todo Successfully Added
+```
+
+### API 5
+
+#### Path: `/todos/:todoId/`
+
+#### Method: `PUT`
+
+#### Description:
+
+Updates the details of a specific todo based on the todo ID
+
+- **Scenario 1**
+
+ - **Request**
+ ```
+ {
+ "status": "DONE"
+ }
+ ```
+ - **Response**
+
+ ```
+ Status Updated
+ ```
+
+- **Scenario 2**
+
+ - **Request**
+ ```
+ {
+ "priority": "HIGH"
+ }
+ ```
+ - **Response**
+
+ ```
+ Priority Updated
+ ```
+
+- **Scenario 3**
+
+ - **Request**
+
+ ```
+ {
+ "todo": "Clean the garden"
+ }
+ ```
+
+ - **Response**
+
+ ```
+ Todo Updated
+ ```
+
+- **Scenario 4**
+
+ - **Request**
+ ```
+ {
+ "category": "LEARNING"
+ }
+ ```
+ - **Response**
+
+ ```
+ Category Updated
+ ```
+
+- **Scenario 5**
+
+ - **Request**
+ ```
+ {
+ "dueDate": "2021-01-12"
+ }
+ ```
+ - **Response**
+
+ ```
+ Due Date Updated
+ ```
+
+### API 6
+
+#### Path: `/todos/:todoId/`
+
+#### Method: `DELETE`
+
+#### Description:
+
+Deletes a todo from the todo table based on the todo ID
+
+#### Response
+
+```
+Todo Deleted
+```
+
+
+
+Use `npm install` to install the packages.
+
+**Export the express instance using the default export syntax.**
+
+**Use Common JS module syntax.**
diff --git a/app.http b/app.http
new file mode 100644
index 0000000..e69de29
diff --git a/app.js b/app.js
new file mode 100644
index 0000000..bf06b99
--- /dev/null
+++ b/app.js
@@ -0,0 +1,412 @@
+const express = require("express");
+const path = require("path");
+const { open } = require("sqlite");
+const sqlite3 = require("sqlite3");
+const format = require("date-fns/format");
+const isMatch = require("date-fns/isMatch");
+var isValid = require("date-fns/isValid");
+const app = express();
+app.use(express.json());
+
+let database;
+const initializeDBandServer = async () => {
+ try {
+ database = await open({
+ filename: path.join(__dirname, "todoApplication.db"),
+ driver: sqlite3.Database,
+ });
+ app.listen(3000, () => {
+ console.log("Server is running on http://localhost:3000/");
+ });
+ } catch (error) {
+ console.log(`DataBase error is ${error.message}`);
+ process.exit(1);
+ }
+};
+initializeDBandServer();
+
+//get the list of todos
+/*
+app.get("/todos/", async (request, response) => {
+ const requestQuery = `select * from todo;`;
+ const responseResult = await database.all(requestQuery);
+ response.send(responseResult);
+});
+*/
+
+//api 1
+
+const hasPriorityAndStatusProperties = (requestQuery) => {
+ return (
+ requestQuery.priority !== undefined && requestQuery.status !== undefined
+ );
+};
+
+const hasPriorityProperty = (requestQuery) => {
+ return requestQuery.priority !== undefined;
+};
+
+const hasStatusProperty = (requestQuery) => {
+ return requestQuery.status !== undefined;
+};
+
+const hasCategoryAndStatus = (requestQuery) => {
+ return (
+ requestQuery.category !== undefined && requestQuery.status !== undefined
+ );
+};
+
+const hasCategoryAndPriority = (requestQuery) => {
+ return (
+ requestQuery.category !== undefined && requestQuery.priority !== undefined
+ );
+};
+
+const hasSearchProperty = (requestQuery) => {
+ return requestQuery.search_q !== undefined;
+};
+
+const hasCategoryProperty = (requestQuery) => {
+ return requestQuery.category !== undefined;
+};
+
+const outPutResult = (dbObject) => {
+ return {
+ id: dbObject.id,
+ todo: dbObject.todo,
+ priority: dbObject.priority,
+ category: dbObject.category,
+ status: dbObject.status,
+ dueDate: dbObject.due_date,
+ };
+};
+
+app.get("/todos/", async (request, response) => {
+ let data = null;
+ let getTodosQuery = "";
+ const { search_q = "", priority, status, category } = request.query;
+ /*console.log(hasPriorityAndStatusProperties(request.query));
+ console.log(hasCategoryAndStatus(request.query));
+ console.log(hasCategoryAndPriority(request.query));
+ console.log(hasPriorityProperty(request.query));
+ console.log(hasStatusProperty(request.query));
+ console.log(hasCategoryProperty(request.query));
+ console.log(hasSearchProperty(request.query));*/
+
+ /** switch case */
+ switch (true) {
+ //scenario 3
+ /**----------- has priority and status -------- */
+ case hasPriorityAndStatusProperties(request.query):
+ if (priority === "HIGH" || priority === "MEDIUM" || priority === "LOW") {
+ if (
+ status === "TO DO" ||
+ status === "IN PROGRESS" ||
+ status === "DONE"
+ ) {
+ getTodosQuery = `
+ SELECT * FROM todo WHERE status = '${status}' AND priority = '${priority}';`;
+ data = await database.all(getTodosQuery);
+ response.send(data.map((eachItem) => outPutResult(eachItem)));
+ } else {
+ response.status(400);
+ response.send("Invalid Todo Status");
+ }
+ } else {
+ response.status(400);
+ response.send("Invalid Todo Priority");
+ }
+
+ break;
+
+ //scenario 5
+ /** has category and status */
+ case hasCategoryAndStatus(request.query):
+ if (
+ category === "WORK" ||
+ category === "HOME" ||
+ category === "LEARNING"
+ ) {
+ if (
+ status === "TO DO" ||
+ status === "IN PROGRESS" ||
+ status === "DONE"
+ ) {
+ getTodosQuery = `select * from todo where category='${category}' and status='${status}';`;
+ data = await database.all(getTodosQuery);
+ response.send(data.map((eachItem) => outPutResult(eachItem)));
+ } else {
+ response.status(400);
+ response.send("Invalid Todo Status");
+ }
+ } else {
+ response.status(400);
+ response.send("Invalid Todo Category");
+ }
+
+ break;
+
+ //scenario 7
+ /** has both category and priority */
+ case hasCategoryAndPriority(request.query):
+ if (
+ category === "WORK" ||
+ category === "HOME" ||
+ category === "LEARNING"
+ ) {
+ if (
+ priority === "HIGH" ||
+ priority === "MEDIUM" ||
+ priority === "LOW"
+ ) {
+ getTodosQuery = `select * from todo where category='${category}' and priority='${priority}';`;
+ data = await database.all(getTodosQuery);
+ response.send(data.map((eachItem) => outPutResult(eachItem)));
+ } else {
+ response.status(400);
+ response.send("Invalid Todo Priority");
+ }
+ } else {
+ response.status(400);
+ response.send("Invalid Todo Category");
+ }
+
+ break;
+
+ //scenario 2
+ /**-------------- has only priority---------- */
+ case hasPriorityProperty(request.query):
+ if (priority === "HIGH" || priority === "MEDIUM" || priority === "LOW") {
+ getTodosQuery = `
+ SELECT * FROM todo WHERE priority = '${priority}';`;
+ data = await database.all(getTodosQuery);
+ response.send(data.map((eachItem) => outPutResult(eachItem)));
+ } else {
+ response.status(400);
+ response.send("Invalid Todo Priority");
+ }
+ break;
+
+ //scenario 1
+ /**-------------has only status ------------ */
+ case hasStatusProperty(request.query):
+ if (status === "TO DO" || status === "IN PROGRESS" || status === "DONE") {
+ getTodosQuery = `SELECT * FROM todo WHERE status = '${status}';`;
+ data = await database.all(getTodosQuery);
+ response.send(data.map((eachItem) => outPutResult(eachItem)));
+ } else {
+ response.status(400);
+ response.send("Invalid Todo Status");
+ }
+ break;
+ //has only search property
+ //scenario 4
+ case hasSearchProperty(request.query):
+ getTodosQuery = `select * from todo where todo like '%${search_q}%';`;
+ data = await database.all(getTodosQuery);
+ response.send(data.map((eachItem) => outPutResult(eachItem)));
+ break;
+ //scenario 6
+ //has only category
+ case hasCategoryProperty(request.query):
+ if (
+ category === "WORK" ||
+ category === "HOME" ||
+ category === "LEARNING"
+ ) {
+ getTodosQuery = `select * from todo where category='${category}';`;
+ data = await database.all(getTodosQuery);
+ response.send(data.map((eachItem) => outPutResult(eachItem)));
+ } else {
+ response.status(400);
+ response.send("Invalid Todo Category");
+ }
+ break;
+
+ //default get all todos
+ default:
+ getTodosQuery = `select * from todo;`;
+ data = await database.all(getTodosQuery);
+ response.send(data.map((eachItem) => outPutResult(eachItem)));
+ }
+});
+
+//api2
+app.get("/todos/:todoId/", async (request, response) => {
+ const { todoId } = request.params;
+ const getToDoQuery = `select * from todo where id=${todoId};`;
+ const responseResult = await database.get(getToDoQuery);
+ response.send(outPutResult(responseResult));
+});
+
+//api3
+app.get("/agenda/", async (request, response) => {
+ const { date } = request.query;
+ console.log(isMatch(date, "yyyy-MM-dd"));
+ if (isMatch(date, "yyyy-MM-dd")) {
+ const newDate = format(new Date(date), "yyyy-MM-dd");
+ console.log(newDate);
+ const requestQuery = `select * from todo where due_date='${newDate}';`;
+ const responseResult = await database.all(requestQuery);
+ //console.log(responseResult);
+ response.send(responseResult.map((eachItem) => outPutResult(eachItem)));
+ } else {
+ response.status(400);
+ response.send("Invalid Due Date");
+ }
+});
+
+//api4
+app.post("/todos/", async (request, response) => {
+ const { id, todo, priority, status, category, dueDate } = request.body;
+ if (priority === "HIGH" || priority === "LOW" || priority === "MEDIUM") {
+ if (status === "TO DO" || status === "IN PROGRESS" || status === "DONE") {
+ if (
+ category === "WORK" ||
+ category === "HOME" ||
+ category === "LEARNING"
+ ) {
+ if (isMatch(dueDate, "yyyy-MM-dd")) {
+ const postNewDueDate = format(new Date(dueDate), "yyyy-MM-dd");
+ const postTodoQuery = `
+ INSERT INTO
+ todo (id, todo, category,priority, status, due_date)
+ VALUES
+ (${id}, '${todo}', '${category}','${priority}', '${status}', '${postNewDueDate}');`;
+ await database.run(postTodoQuery);
+ //console.log(responseResult);
+ response.send("Todo Successfully Added");
+ } else {
+ response.status(400);
+ response.send("Invalid Due Date");
+ }
+ } else {
+ response.status(400);
+ response.send("Invalid Todo Category");
+ }
+ } else {
+ response.status(400);
+ response.send("Invalid Todo Status");
+ }
+ } else {
+ response.status(400);
+ response.send("Invalid Todo Priority");
+ }
+});
+
+//api5
+app.put("/todos/:todoId/", async (request, response) => {
+ const { todoId } = request.params;
+ let updateColumn = "";
+ const requestBody = request.body;
+ console.log(requestBody);
+ const previousTodoQuery = `SELECT * FROM todo WHERE id = ${todoId};`;
+ const previousTodo = await database.get(previousTodoQuery);
+ const {
+ todo = previousTodo.todo,
+ priority = previousTodo.priority,
+ status = previousTodo.status,
+ category = previousTodo.category,
+ dueDate = previousTodo.dueDate,
+ } = request.body;
+
+ let updateTodoQuery;
+ switch (true) {
+ // update status
+ case requestBody.status !== undefined:
+ if (status === "TO DO" || status === "IN PROGRESS" || status === "DONE") {
+ updateTodoQuery = `
+ UPDATE todo SET todo='${todo}', priority='${priority}', status='${status}', category='${category}',
+ due_date='${dueDate}' WHERE id = ${todoId};`;
+
+ await database.run(updateTodoQuery);
+ response.send(`Status Updated`);
+ } else {
+ response.status(400);
+ response.send("Invalid Todo Status");
+ }
+ break;
+
+ //update priority
+ case requestBody.priority !== undefined:
+ if (priority === "HIGH" || priority === "LOW" || priority === "MEDIUM") {
+ updateTodoQuery = `
+ UPDATE todo SET todo='${todo}', priority='${priority}', status='${status}', category='${category}',
+ due_date='${dueDate}' WHERE id = ${todoId};`;
+
+ await database.run(updateTodoQuery);
+ response.send(`Priority Updated`);
+ } else {
+ response.status(400);
+ response.send("Invalid Todo Priority");
+ }
+ break;
+
+ //update todo
+ case requestBody.todo !== undefined:
+ updateTodoQuery = `
+ UPDATE todo SET todo='${todo}', priority='${priority}', status='${status}', category='${category}',
+ due_date='${dueDate}' WHERE id = ${todoId};`;
+
+ await database.run(updateTodoQuery);
+ response.send(`Todo Updated`);
+ break;
+
+ //update category
+ case requestBody.category !== undefined:
+ if (
+ category === "WORK" ||
+ category === "HOME" ||
+ category === "LEARNING"
+ ) {
+ updateTodoQuery = `
+ UPDATE todo SET todo='${todo}', priority='${priority}', status='${status}', category='${category}',
+ due_date='${dueDate}' WHERE id = ${todoId};`;
+
+ await database.run(updateTodoQuery);
+ response.send(`Category Updated`);
+ } else {
+ response.status(400);
+ response.send("Invalid Todo Category");
+ }
+ break;
+ //update due date
+ case requestBody.dueDate !== undefined:
+ if (isMatch(dueDate, "yyyy-MM-dd")) {
+ const newDueDate = format(new Date(dueDate), "yyyy-MM-dd");
+ updateTodoQuery = `
+ UPDATE todo SET todo='${todo}', priority='${priority}', status='${status}', category='${category}',
+ due_date='${newDueDate}' WHERE id = ${todoId};`;
+
+ await database.run(updateTodoQuery);
+ response.send(`Due Date Updated`);
+ } else {
+ response.status(400);
+ response.send("Invalid Due Date");
+ }
+ break;
+ }
+
+ /*updateTodoQuery = `
+ UPDATE todo SET todo='${todo}', priority='${priority}', status='${status}', category='${category}',
+ due_date='${dueDate}' WHERE id = ${todoId};`;
+
+ const responseData = await database.run(updateTodoQuery);
+ response.send(`${updateColumn} Updated`);*/
+});
+
+//api6
+
+app.delete("/todos/:todoId/", async (request, response) => {
+ const { todoId } = request.params;
+ const deleteTodoQuery = `
+ DELETE FROM
+ todo
+ WHERE
+ id = ${todoId};`;
+
+ await database.run(deleteTodoQuery);
+ response.send("Todo Deleted");
+});
+
+module.exports = app;
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..da96b6d
--- /dev/null
+++ b/package.json
@@ -0,0 +1,16 @@
+{
+ "name": "todo-application",
+ "version": "1.0.0",
+ "description": "",
+ "main": "app.js",
+ "author": "",
+ "license": "ISC",
+ "dependencies": {
+ "date-fns": "2.19.0",
+ "express": "4.17.1",
+ "nodemon": "2.0.7",
+ "sqlite": "4.0.19",
+ "sqlite3": "5.0.2",
+ "validate-date": "^2.0.0"
+ }
+}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
new file mode 100644
index 0000000..ee172fb
--- /dev/null
+++ b/pnpm-lock.yaml
@@ -0,0 +1,1824 @@
+lockfileVersion: 5.3
+
+specifiers:
+ date-fns: 2.19.0
+ express: 4.17.1
+ nodemon: 2.0.7
+ sqlite: 4.0.19
+ sqlite3: 5.0.2
+ validate-date: ^2.0.0
+
+dependencies:
+ date-fns: 2.19.0
+ express: 4.17.1
+ nodemon: 2.0.7
+ sqlite: 4.0.19
+ sqlite3: 5.0.2
+ validate-date: 2.0.0
+
+packages:
+
+ /@sindresorhus/is/0.14.0:
+ resolution: {integrity: sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==}
+ engines: {node: '>=6'}
+ dev: false
+
+ /@szmarczak/http-timer/1.1.2:
+ resolution: {integrity: sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==}
+ engines: {node: '>=6'}
+ dependencies:
+ defer-to-connect: 1.1.3
+ dev: false
+
+ /abbrev/1.1.1:
+ resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==}
+ dev: false
+
+ /accepts/1.3.7:
+ resolution: {integrity: sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==}
+ engines: {node: '>= 0.6'}
+ dependencies:
+ mime-types: 2.1.30
+ negotiator: 0.6.2
+ dev: false
+
+ /ajv/6.12.6:
+ resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
+ dependencies:
+ fast-deep-equal: 3.1.3
+ fast-json-stable-stringify: 2.1.0
+ json-schema-traverse: 0.4.1
+ uri-js: 4.4.1
+ dev: false
+ optional: true
+
+ /ansi-align/3.0.0:
+ resolution: {integrity: sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==}
+ dependencies:
+ string-width: 3.1.0
+ dev: false
+
+ /ansi-regex/2.1.1:
+ resolution: {integrity: sha1-w7M6te42DYbg5ijwRorn7yfWVN8=}
+ engines: {node: '>=0.10.0'}
+ dev: false
+
+ /ansi-regex/4.1.0:
+ resolution: {integrity: sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==}
+ engines: {node: '>=6'}
+ dev: false
+
+ /ansi-regex/5.0.0:
+ resolution: {integrity: sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==}
+ engines: {node: '>=8'}
+ dev: false
+
+ /ansi-styles/4.3.0:
+ resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
+ engines: {node: '>=8'}
+ dependencies:
+ color-convert: 2.0.1
+ dev: false
+
+ /anymatch/3.1.2:
+ resolution: {integrity: sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==}
+ engines: {node: '>= 8'}
+ dependencies:
+ normalize-path: 3.0.0
+ picomatch: 2.2.3
+ dev: false
+
+ /aproba/1.2.0:
+ resolution: {integrity: sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==}
+ dev: false
+
+ /are-we-there-yet/1.1.5:
+ resolution: {integrity: sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==}
+ dependencies:
+ delegates: 1.0.0
+ readable-stream: 2.3.7
+ dev: false
+
+ /array-flatten/1.1.1:
+ resolution: {integrity: sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=}
+ dev: false
+
+ /asn1/0.2.4:
+ resolution: {integrity: sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==}
+ dependencies:
+ safer-buffer: 2.1.2
+ dev: false
+ optional: true
+
+ /assert-plus/1.0.0:
+ resolution: {integrity: sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=}
+ engines: {node: '>=0.8'}
+ dev: false
+ optional: true
+
+ /asynckit/0.4.0:
+ resolution: {integrity: sha1-x57Zf380y48robyXkLzDZkdLS3k=}
+ dev: false
+ optional: true
+
+ /aws-sign2/0.7.0:
+ resolution: {integrity: sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=}
+ dev: false
+ optional: true
+
+ /aws4/1.11.0:
+ resolution: {integrity: sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==}
+ dev: false
+ optional: true
+
+ /balanced-match/1.0.2:
+ resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
+ dev: false
+
+ /bcrypt-pbkdf/1.0.2:
+ resolution: {integrity: sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=}
+ dependencies:
+ tweetnacl: 0.14.5
+ dev: false
+ optional: true
+
+ /binary-extensions/2.2.0:
+ resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==}
+ engines: {node: '>=8'}
+ dev: false
+
+ /block-stream/0.0.9:
+ resolution: {integrity: sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=}
+ engines: {node: 0.4 || >=0.5.8}
+ dependencies:
+ inherits: 2.0.4
+ dev: false
+ optional: true
+
+ /body-parser/1.19.0:
+ resolution: {integrity: sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==}
+ engines: {node: '>= 0.8'}
+ dependencies:
+ bytes: 3.1.0
+ content-type: 1.0.4
+ debug: 2.6.9
+ depd: 1.1.2
+ http-errors: 1.7.2
+ iconv-lite: 0.4.24
+ on-finished: 2.3.0
+ qs: 6.7.0
+ raw-body: 2.4.0
+ type-is: 1.6.18
+ dev: false
+
+ /boxen/4.2.0:
+ resolution: {integrity: sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==}
+ engines: {node: '>=8'}
+ dependencies:
+ ansi-align: 3.0.0
+ camelcase: 5.3.1
+ chalk: 3.0.0
+ cli-boxes: 2.2.1
+ string-width: 4.2.2
+ term-size: 2.2.1
+ type-fest: 0.8.1
+ widest-line: 3.1.0
+ dev: false
+
+ /brace-expansion/1.1.11:
+ resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
+ dependencies:
+ balanced-match: 1.0.2
+ concat-map: 0.0.1
+ dev: false
+
+ /braces/3.0.2:
+ resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==}
+ engines: {node: '>=8'}
+ dependencies:
+ fill-range: 7.0.1
+ dev: false
+
+ /bytes/3.1.0:
+ resolution: {integrity: sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==}
+ engines: {node: '>= 0.8'}
+ dev: false
+
+ /cacheable-request/6.1.0:
+ resolution: {integrity: sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==}
+ engines: {node: '>=8'}
+ dependencies:
+ clone-response: 1.0.2
+ get-stream: 5.2.0
+ http-cache-semantics: 4.1.0
+ keyv: 3.1.0
+ lowercase-keys: 2.0.0
+ normalize-url: 4.5.0
+ responselike: 1.0.2
+ dev: false
+
+ /camelcase/5.3.1:
+ resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==}
+ engines: {node: '>=6'}
+ dev: false
+
+ /caseless/0.12.0:
+ resolution: {integrity: sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=}
+ dev: false
+ optional: true
+
+ /chalk/3.0.0:
+ resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==}
+ engines: {node: '>=8'}
+ dependencies:
+ ansi-styles: 4.3.0
+ supports-color: 7.2.0
+ dev: false
+
+ /chokidar/3.5.1:
+ resolution: {integrity: sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==}
+ engines: {node: '>= 8.10.0'}
+ dependencies:
+ anymatch: 3.1.2
+ braces: 3.0.2
+ glob-parent: 5.1.2
+ is-binary-path: 2.1.0
+ is-glob: 4.0.1
+ normalize-path: 3.0.0
+ readdirp: 3.5.0
+ optionalDependencies:
+ fsevents: 2.3.2
+ dev: false
+
+ /chownr/1.1.4:
+ resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==}
+ dev: false
+
+ /ci-info/2.0.0:
+ resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==}
+ dev: false
+
+ /cli-boxes/2.2.1:
+ resolution: {integrity: sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==}
+ engines: {node: '>=6'}
+ dev: false
+
+ /clone-response/1.0.2:
+ resolution: {integrity: sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=}
+ dependencies:
+ mimic-response: 1.0.1
+ dev: false
+
+ /code-point-at/1.1.0:
+ resolution: {integrity: sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=}
+ engines: {node: '>=0.10.0'}
+ dev: false
+
+ /color-convert/2.0.1:
+ resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
+ engines: {node: '>=7.0.0'}
+ dependencies:
+ color-name: 1.1.4
+ dev: false
+
+ /color-name/1.1.4:
+ resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
+ dev: false
+
+ /combined-stream/1.0.8:
+ resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==}
+ engines: {node: '>= 0.8'}
+ dependencies:
+ delayed-stream: 1.0.0
+ dev: false
+ optional: true
+
+ /concat-map/0.0.1:
+ resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=}
+ dev: false
+
+ /configstore/5.0.1:
+ resolution: {integrity: sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==}
+ engines: {node: '>=8'}
+ dependencies:
+ dot-prop: 5.3.0
+ graceful-fs: 4.2.6
+ make-dir: 3.1.0
+ unique-string: 2.0.0
+ write-file-atomic: 3.0.3
+ xdg-basedir: 4.0.0
+ dev: false
+
+ /console-control-strings/1.1.0:
+ resolution: {integrity: sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=}
+ dev: false
+
+ /content-disposition/0.5.3:
+ resolution: {integrity: sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==}
+ engines: {node: '>= 0.6'}
+ dependencies:
+ safe-buffer: 5.1.2
+ dev: false
+
+ /content-type/1.0.4:
+ resolution: {integrity: sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==}
+ engines: {node: '>= 0.6'}
+ dev: false
+
+ /cookie-signature/1.0.6:
+ resolution: {integrity: sha1-4wOogrNCzD7oylE6eZmXNNqzriw=}
+ dev: false
+
+ /cookie/0.4.0:
+ resolution: {integrity: sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==}
+ engines: {node: '>= 0.6'}
+ dev: false
+
+ /core-util-is/1.0.2:
+ resolution: {integrity: sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=}
+ dev: false
+
+ /crypto-random-string/2.0.0:
+ resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==}
+ engines: {node: '>=8'}
+ dev: false
+
+ /dashdash/1.14.1:
+ resolution: {integrity: sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=}
+ engines: {node: '>=0.10'}
+ dependencies:
+ assert-plus: 1.0.0
+ dev: false
+ optional: true
+
+ /date-fns/2.19.0:
+ resolution: {integrity: sha512-X3bf2iTPgCAQp9wvjOQytnf5vO5rESYRXlPIVcgSbtT5OTScPcsf9eZU+B/YIkKAtYr5WeCii58BgATrNitlWg==}
+ engines: {node: '>=0.11'}
+ dev: false
+
+ /debug/2.6.9:
+ resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==}
+ dependencies:
+ ms: 2.0.0
+ dev: false
+
+ /debug/3.2.7:
+ resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==}
+ dependencies:
+ ms: 2.1.3
+ dev: false
+
+ /decompress-response/3.3.0:
+ resolution: {integrity: sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=}
+ engines: {node: '>=4'}
+ dependencies:
+ mimic-response: 1.0.1
+ dev: false
+
+ /deep-extend/0.6.0:
+ resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==}
+ engines: {node: '>=4.0.0'}
+ dev: false
+
+ /defer-to-connect/1.1.3:
+ resolution: {integrity: sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==}
+ dev: false
+
+ /delayed-stream/1.0.0:
+ resolution: {integrity: sha1-3zrhmayt+31ECqrgsp4icrJOxhk=}
+ engines: {node: '>=0.4.0'}
+ dev: false
+ optional: true
+
+ /delegates/1.0.0:
+ resolution: {integrity: sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=}
+ dev: false
+
+ /depd/1.1.2:
+ resolution: {integrity: sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=}
+ engines: {node: '>= 0.6'}
+ dev: false
+
+ /destroy/1.0.4:
+ resolution: {integrity: sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=}
+ dev: false
+
+ /detect-libc/1.0.3:
+ resolution: {integrity: sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=}
+ engines: {node: '>=0.10'}
+ hasBin: true
+ dev: false
+
+ /dot-prop/5.3.0:
+ resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==}
+ engines: {node: '>=8'}
+ dependencies:
+ is-obj: 2.0.0
+ dev: false
+
+ /duplexer3/0.1.4:
+ resolution: {integrity: sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=}
+ dev: false
+
+ /ecc-jsbn/0.1.2:
+ resolution: {integrity: sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=}
+ dependencies:
+ jsbn: 0.1.1
+ safer-buffer: 2.1.2
+ dev: false
+ optional: true
+
+ /ee-first/1.1.1:
+ resolution: {integrity: sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=}
+ dev: false
+
+ /emoji-regex/7.0.3:
+ resolution: {integrity: sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==}
+ dev: false
+
+ /emoji-regex/8.0.0:
+ resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
+ dev: false
+
+ /encodeurl/1.0.2:
+ resolution: {integrity: sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=}
+ engines: {node: '>= 0.8'}
+ dev: false
+
+ /end-of-stream/1.4.4:
+ resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==}
+ dependencies:
+ once: 1.4.0
+ dev: false
+
+ /escape-goat/2.1.1:
+ resolution: {integrity: sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==}
+ engines: {node: '>=8'}
+ dev: false
+
+ /escape-html/1.0.3:
+ resolution: {integrity: sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=}
+ dev: false
+
+ /etag/1.8.1:
+ resolution: {integrity: sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=}
+ engines: {node: '>= 0.6'}
+ dev: false
+
+ /express/4.17.1:
+ resolution: {integrity: sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==}
+ engines: {node: '>= 0.10.0'}
+ dependencies:
+ accepts: 1.3.7
+ array-flatten: 1.1.1
+ body-parser: 1.19.0
+ content-disposition: 0.5.3
+ content-type: 1.0.4
+ cookie: 0.4.0
+ cookie-signature: 1.0.6
+ debug: 2.6.9
+ depd: 1.1.2
+ encodeurl: 1.0.2
+ escape-html: 1.0.3
+ etag: 1.8.1
+ finalhandler: 1.1.2
+ fresh: 0.5.2
+ merge-descriptors: 1.0.1
+ methods: 1.1.2
+ on-finished: 2.3.0
+ parseurl: 1.3.3
+ path-to-regexp: 0.1.7
+ proxy-addr: 2.0.6
+ qs: 6.7.0
+ range-parser: 1.2.1
+ safe-buffer: 5.1.2
+ send: 0.17.1
+ serve-static: 1.14.1
+ setprototypeof: 1.1.1
+ statuses: 1.5.0
+ type-is: 1.6.18
+ utils-merge: 1.0.1
+ vary: 1.1.2
+ dev: false
+
+ /extend/3.0.2:
+ resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==}
+ dev: false
+ optional: true
+
+ /extsprintf/1.3.0:
+ resolution: {integrity: sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=}
+ engines: {'0': node >=0.6.0}
+ dev: false
+ optional: true
+
+ /fast-deep-equal/3.1.3:
+ resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
+ dev: false
+ optional: true
+
+ /fast-json-stable-stringify/2.1.0:
+ resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==}
+ dev: false
+ optional: true
+
+ /fill-range/7.0.1:
+ resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==}
+ engines: {node: '>=8'}
+ dependencies:
+ to-regex-range: 5.0.1
+ dev: false
+
+ /finalhandler/1.1.2:
+ resolution: {integrity: sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==}
+ engines: {node: '>= 0.8'}
+ dependencies:
+ debug: 2.6.9
+ encodeurl: 1.0.2
+ escape-html: 1.0.3
+ on-finished: 2.3.0
+ parseurl: 1.3.3
+ statuses: 1.5.0
+ unpipe: 1.0.0
+ dev: false
+
+ /forever-agent/0.6.1:
+ resolution: {integrity: sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=}
+ dev: false
+ optional: true
+
+ /form-data/2.3.3:
+ resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==}
+ engines: {node: '>= 0.12'}
+ dependencies:
+ asynckit: 0.4.0
+ combined-stream: 1.0.8
+ mime-types: 2.1.30
+ dev: false
+ optional: true
+
+ /forwarded/0.1.2:
+ resolution: {integrity: sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=}
+ engines: {node: '>= 0.6'}
+ dev: false
+
+ /fresh/0.5.2:
+ resolution: {integrity: sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=}
+ engines: {node: '>= 0.6'}
+ dev: false
+
+ /fs-minipass/1.2.7:
+ resolution: {integrity: sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==}
+ dependencies:
+ minipass: 2.9.0
+ dev: false
+
+ /fs.realpath/1.0.0:
+ resolution: {integrity: sha1-FQStJSMVjKpA20onh8sBQRmU6k8=}
+ dev: false
+
+ /fsevents/2.3.2:
+ resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==}
+ engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
+ os: [darwin]
+ dev: false
+ optional: true
+
+ /fstream/1.0.12:
+ resolution: {integrity: sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==}
+ engines: {node: '>=0.6'}
+ dependencies:
+ graceful-fs: 4.2.6
+ inherits: 2.0.4
+ mkdirp: 0.5.5
+ rimraf: 2.7.1
+ dev: false
+ optional: true
+
+ /gauge/2.7.4:
+ resolution: {integrity: sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=}
+ dependencies:
+ aproba: 1.2.0
+ console-control-strings: 1.1.0
+ has-unicode: 2.0.1
+ object-assign: 4.1.1
+ signal-exit: 3.0.3
+ string-width: 1.0.2
+ strip-ansi: 3.0.1
+ wide-align: 1.1.3
+ dev: false
+
+ /get-stream/4.1.0:
+ resolution: {integrity: sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==}
+ engines: {node: '>=6'}
+ dependencies:
+ pump: 3.0.0
+ dev: false
+
+ /get-stream/5.2.0:
+ resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==}
+ engines: {node: '>=8'}
+ dependencies:
+ pump: 3.0.0
+ dev: false
+
+ /getpass/0.1.7:
+ resolution: {integrity: sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=}
+ dependencies:
+ assert-plus: 1.0.0
+ dev: false
+ optional: true
+
+ /glob-parent/5.1.2:
+ resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
+ engines: {node: '>= 6'}
+ dependencies:
+ is-glob: 4.0.1
+ dev: false
+
+ /glob/7.1.7:
+ resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==}
+ dependencies:
+ fs.realpath: 1.0.0
+ inflight: 1.0.6
+ inherits: 2.0.4
+ minimatch: 3.0.4
+ once: 1.4.0
+ path-is-absolute: 1.0.1
+ dev: false
+
+ /global-dirs/2.1.0:
+ resolution: {integrity: sha512-MG6kdOUh/xBnyo9cJFeIKkLEc1AyFq42QTU4XiX51i2NEdxLxLWXIjEjmqKeSuKR7pAZjTqUVoT2b2huxVLgYQ==}
+ engines: {node: '>=8'}
+ dependencies:
+ ini: 1.3.7
+ dev: false
+
+ /got/9.6.0:
+ resolution: {integrity: sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==}
+ engines: {node: '>=8.6'}
+ dependencies:
+ '@sindresorhus/is': 0.14.0
+ '@szmarczak/http-timer': 1.1.2
+ cacheable-request: 6.1.0
+ decompress-response: 3.3.0
+ duplexer3: 0.1.4
+ get-stream: 4.1.0
+ lowercase-keys: 1.0.1
+ mimic-response: 1.0.1
+ p-cancelable: 1.1.0
+ to-readable-stream: 1.0.0
+ url-parse-lax: 3.0.0
+ dev: false
+
+ /graceful-fs/4.2.6:
+ resolution: {integrity: sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==}
+ dev: false
+
+ /har-schema/2.0.0:
+ resolution: {integrity: sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=}
+ engines: {node: '>=4'}
+ dev: false
+ optional: true
+
+ /har-validator/5.1.5:
+ resolution: {integrity: sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==}
+ engines: {node: '>=6'}
+ deprecated: this library is no longer supported
+ dependencies:
+ ajv: 6.12.6
+ har-schema: 2.0.0
+ dev: false
+ optional: true
+
+ /has-flag/3.0.0:
+ resolution: {integrity: sha1-tdRU3CGZriJWmfNGfloH87lVuv0=}
+ engines: {node: '>=4'}
+ dev: false
+
+ /has-flag/4.0.0:
+ resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
+ engines: {node: '>=8'}
+ dev: false
+
+ /has-unicode/2.0.1:
+ resolution: {integrity: sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=}
+ dev: false
+
+ /has-yarn/2.1.0:
+ resolution: {integrity: sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==}
+ engines: {node: '>=8'}
+ dev: false
+
+ /http-cache-semantics/4.1.0:
+ resolution: {integrity: sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==}
+ dev: false
+
+ /http-errors/1.7.2:
+ resolution: {integrity: sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==}
+ engines: {node: '>= 0.6'}
+ dependencies:
+ depd: 1.1.2
+ inherits: 2.0.3
+ setprototypeof: 1.1.1
+ statuses: 1.5.0
+ toidentifier: 1.0.0
+ dev: false
+
+ /http-errors/1.7.3:
+ resolution: {integrity: sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==}
+ engines: {node: '>= 0.6'}
+ dependencies:
+ depd: 1.1.2
+ inherits: 2.0.4
+ setprototypeof: 1.1.1
+ statuses: 1.5.0
+ toidentifier: 1.0.0
+ dev: false
+
+ /http-signature/1.2.0:
+ resolution: {integrity: sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=}
+ engines: {node: '>=0.8', npm: '>=1.3.7'}
+ dependencies:
+ assert-plus: 1.0.0
+ jsprim: 1.4.1
+ sshpk: 1.16.1
+ dev: false
+ optional: true
+
+ /iconv-lite/0.4.24:
+ resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ safer-buffer: 2.1.2
+ dev: false
+
+ /ignore-by-default/1.0.1:
+ resolution: {integrity: sha1-SMptcvbGo68Aqa1K5odr44ieKwk=}
+ dev: false
+
+ /ignore-walk/3.0.4:
+ resolution: {integrity: sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ==}
+ dependencies:
+ minimatch: 3.0.4
+ dev: false
+
+ /import-lazy/2.1.0:
+ resolution: {integrity: sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=}
+ engines: {node: '>=4'}
+ dev: false
+
+ /imurmurhash/0.1.4:
+ resolution: {integrity: sha1-khi5srkoojixPcT7a21XbyMUU+o=}
+ engines: {node: '>=0.8.19'}
+ dev: false
+
+ /inflight/1.0.6:
+ resolution: {integrity: sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=}
+ dependencies:
+ once: 1.4.0
+ wrappy: 1.0.2
+ dev: false
+
+ /inherits/2.0.3:
+ resolution: {integrity: sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=}
+ dev: false
+
+ /inherits/2.0.4:
+ resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
+ dev: false
+
+ /ini/1.3.7:
+ resolution: {integrity: sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==}
+ dev: false
+
+ /ini/1.3.8:
+ resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==}
+ dev: false
+
+ /ipaddr.js/1.9.1:
+ resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==}
+ engines: {node: '>= 0.10'}
+ dev: false
+
+ /is-binary-path/2.1.0:
+ resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
+ engines: {node: '>=8'}
+ dependencies:
+ binary-extensions: 2.2.0
+ dev: false
+
+ /is-ci/2.0.0:
+ resolution: {integrity: sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==}
+ hasBin: true
+ dependencies:
+ ci-info: 2.0.0
+ dev: false
+
+ /is-extglob/2.1.1:
+ resolution: {integrity: sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=}
+ engines: {node: '>=0.10.0'}
+ dev: false
+
+ /is-fullwidth-code-point/1.0.0:
+ resolution: {integrity: sha1-754xOG8DGn8NZDr4L95QxFfvAMs=}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ number-is-nan: 1.0.1
+ dev: false
+
+ /is-fullwidth-code-point/2.0.0:
+ resolution: {integrity: sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=}
+ engines: {node: '>=4'}
+ dev: false
+
+ /is-fullwidth-code-point/3.0.0:
+ resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
+ engines: {node: '>=8'}
+ dev: false
+
+ /is-glob/4.0.1:
+ resolution: {integrity: sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ is-extglob: 2.1.1
+ dev: false
+
+ /is-installed-globally/0.3.2:
+ resolution: {integrity: sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==}
+ engines: {node: '>=8'}
+ dependencies:
+ global-dirs: 2.1.0
+ is-path-inside: 3.0.3
+ dev: false
+
+ /is-npm/4.0.0:
+ resolution: {integrity: sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==}
+ engines: {node: '>=8'}
+ dev: false
+
+ /is-number/7.0.0:
+ resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
+ engines: {node: '>=0.12.0'}
+ dev: false
+
+ /is-obj/2.0.0:
+ resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==}
+ engines: {node: '>=8'}
+ dev: false
+
+ /is-path-inside/3.0.3:
+ resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==}
+ engines: {node: '>=8'}
+ dev: false
+
+ /is-typedarray/1.0.0:
+ resolution: {integrity: sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=}
+ dev: false
+
+ /is-yarn-global/0.3.0:
+ resolution: {integrity: sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==}
+ dev: false
+
+ /isarray/1.0.0:
+ resolution: {integrity: sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=}
+ dev: false
+
+ /isexe/2.0.0:
+ resolution: {integrity: sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=}
+ dev: false
+ optional: true
+
+ /isstream/0.1.2:
+ resolution: {integrity: sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=}
+ dev: false
+ optional: true
+
+ /jsbn/0.1.1:
+ resolution: {integrity: sha1-peZUwuWi3rXyAdls77yoDA7y9RM=}
+ dev: false
+ optional: true
+
+ /json-buffer/3.0.0:
+ resolution: {integrity: sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=}
+ dev: false
+
+ /json-schema-traverse/0.4.1:
+ resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
+ dev: false
+ optional: true
+
+ /json-schema/0.2.3:
+ resolution: {integrity: sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=}
+ dev: false
+ optional: true
+
+ /json-stringify-safe/5.0.1:
+ resolution: {integrity: sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=}
+ dev: false
+ optional: true
+
+ /jsprim/1.4.1:
+ resolution: {integrity: sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=}
+ engines: {'0': node >=0.6.0}
+ dependencies:
+ assert-plus: 1.0.0
+ extsprintf: 1.3.0
+ json-schema: 0.2.3
+ verror: 1.10.0
+ dev: false
+ optional: true
+
+ /keyv/3.1.0:
+ resolution: {integrity: sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==}
+ dependencies:
+ json-buffer: 3.0.0
+ dev: false
+
+ /latest-version/5.1.0:
+ resolution: {integrity: sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==}
+ engines: {node: '>=8'}
+ dependencies:
+ package-json: 6.5.0
+ dev: false
+
+ /lowercase-keys/1.0.1:
+ resolution: {integrity: sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==}
+ engines: {node: '>=0.10.0'}
+ dev: false
+
+ /lowercase-keys/2.0.0:
+ resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==}
+ engines: {node: '>=8'}
+ dev: false
+
+ /make-dir/3.1.0:
+ resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==}
+ engines: {node: '>=8'}
+ dependencies:
+ semver: 6.3.0
+ dev: false
+
+ /media-typer/0.3.0:
+ resolution: {integrity: sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=}
+ engines: {node: '>= 0.6'}
+ dev: false
+
+ /merge-descriptors/1.0.1:
+ resolution: {integrity: sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=}
+ dev: false
+
+ /methods/1.1.2:
+ resolution: {integrity: sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=}
+ engines: {node: '>= 0.6'}
+ dev: false
+
+ /mime-db/1.47.0:
+ resolution: {integrity: sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw==}
+ engines: {node: '>= 0.6'}
+ dev: false
+
+ /mime-types/2.1.30:
+ resolution: {integrity: sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg==}
+ engines: {node: '>= 0.6'}
+ dependencies:
+ mime-db: 1.47.0
+ dev: false
+
+ /mime/1.6.0:
+ resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==}
+ engines: {node: '>=4'}
+ hasBin: true
+ dev: false
+
+ /mimic-response/1.0.1:
+ resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==}
+ engines: {node: '>=4'}
+ dev: false
+
+ /minimatch/3.0.4:
+ resolution: {integrity: sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==}
+ dependencies:
+ brace-expansion: 1.1.11
+ dev: false
+
+ /minimist/1.2.5:
+ resolution: {integrity: sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==}
+ dev: false
+
+ /minipass/2.9.0:
+ resolution: {integrity: sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==}
+ dependencies:
+ safe-buffer: 5.2.1
+ yallist: 3.1.1
+ dev: false
+
+ /minizlib/1.3.3:
+ resolution: {integrity: sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==}
+ dependencies:
+ minipass: 2.9.0
+ dev: false
+
+ /mkdirp/0.5.5:
+ resolution: {integrity: sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==}
+ hasBin: true
+ dependencies:
+ minimist: 1.2.5
+ dev: false
+
+ /ms/2.0.0:
+ resolution: {integrity: sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=}
+ dev: false
+
+ /ms/2.1.1:
+ resolution: {integrity: sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==}
+ dev: false
+
+ /ms/2.1.3:
+ resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
+ dev: false
+
+ /needle/2.6.0:
+ resolution: {integrity: sha512-KKYdza4heMsEfSWD7VPUIz3zX2XDwOyX2d+geb4vrERZMT5RMU6ujjaD+I5Yr54uZxQ2w6XRTAhHBbSCyovZBg==}
+ engines: {node: '>= 4.4.x'}
+ hasBin: true
+ dependencies:
+ debug: 3.2.7
+ iconv-lite: 0.4.24
+ sax: 1.2.4
+ dev: false
+
+ /negotiator/0.6.2:
+ resolution: {integrity: sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==}
+ engines: {node: '>= 0.6'}
+ dev: false
+
+ /node-addon-api/3.1.0:
+ resolution: {integrity: sha512-flmrDNB06LIl5lywUz7YlNGZH/5p0M7W28k8hzd9Lshtdh1wshD2Y+U4h9LD6KObOy1f+fEVdgprPrEymjM5uw==}
+ dev: false
+
+ /node-gyp/3.8.0:
+ resolution: {integrity: sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==}
+ engines: {node: '>= 0.8.0'}
+ hasBin: true
+ dependencies:
+ fstream: 1.0.12
+ glob: 7.1.7
+ graceful-fs: 4.2.6
+ mkdirp: 0.5.5
+ nopt: 3.0.6
+ npmlog: 4.1.2
+ osenv: 0.1.5
+ request: 2.88.2
+ rimraf: 2.7.1
+ semver: 5.3.0
+ tar: 2.2.2
+ which: 1.3.1
+ dev: false
+ optional: true
+
+ /node-pre-gyp/0.11.0:
+ resolution: {integrity: sha512-TwWAOZb0j7e9eGaf9esRx3ZcLaE5tQ2lvYy1pb5IAaG1a2e2Kv5Lms1Y4hpj+ciXJRofIxxlt5haeQ/2ANeE0Q==}
+ deprecated: 'Please upgrade to @mapbox/node-pre-gyp: the non-scoped node-pre-gyp package is deprecated and only the @mapbox scoped package will recieve updates in the future'
+ hasBin: true
+ dependencies:
+ detect-libc: 1.0.3
+ mkdirp: 0.5.5
+ needle: 2.6.0
+ nopt: 4.0.3
+ npm-packlist: 1.4.8
+ npmlog: 4.1.2
+ rc: 1.2.8
+ rimraf: 2.7.1
+ semver: 5.7.1
+ tar: 4.4.13
+ dev: false
+
+ /nodemon/2.0.7:
+ resolution: {integrity: sha512-XHzK69Awgnec9UzHr1kc8EomQh4sjTQ8oRf8TsGrSmHDx9/UmiGG9E/mM3BuTfNeFwdNBvrqQq/RHL0xIeyFOA==}
+ engines: {node: '>=8.10.0'}
+ hasBin: true
+ requiresBuild: true
+ dependencies:
+ chokidar: 3.5.1
+ debug: 3.2.7
+ ignore-by-default: 1.0.1
+ minimatch: 3.0.4
+ pstree.remy: 1.1.8
+ semver: 5.7.1
+ supports-color: 5.5.0
+ touch: 3.1.0
+ undefsafe: 2.0.3
+ update-notifier: 4.1.3
+ dev: false
+
+ /nopt/1.0.10:
+ resolution: {integrity: sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=}
+ hasBin: true
+ dependencies:
+ abbrev: 1.1.1
+ dev: false
+
+ /nopt/3.0.6:
+ resolution: {integrity: sha1-xkZdvwirzU2zWTF/eaxopkayj/k=}
+ hasBin: true
+ dependencies:
+ abbrev: 1.1.1
+ dev: false
+ optional: true
+
+ /nopt/4.0.3:
+ resolution: {integrity: sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==}
+ hasBin: true
+ dependencies:
+ abbrev: 1.1.1
+ osenv: 0.1.5
+ dev: false
+
+ /normalize-path/3.0.0:
+ resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
+ engines: {node: '>=0.10.0'}
+ dev: false
+
+ /normalize-url/4.5.0:
+ resolution: {integrity: sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==}
+ engines: {node: '>=8'}
+ dev: false
+
+ /npm-bundled/1.1.2:
+ resolution: {integrity: sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==}
+ dependencies:
+ npm-normalize-package-bin: 1.0.1
+ dev: false
+
+ /npm-normalize-package-bin/1.0.1:
+ resolution: {integrity: sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==}
+ dev: false
+
+ /npm-packlist/1.4.8:
+ resolution: {integrity: sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==}
+ dependencies:
+ ignore-walk: 3.0.4
+ npm-bundled: 1.1.2
+ npm-normalize-package-bin: 1.0.1
+ dev: false
+
+ /npmlog/4.1.2:
+ resolution: {integrity: sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==}
+ dependencies:
+ are-we-there-yet: 1.1.5
+ console-control-strings: 1.1.0
+ gauge: 2.7.4
+ set-blocking: 2.0.0
+ dev: false
+
+ /number-is-nan/1.0.1:
+ resolution: {integrity: sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=}
+ engines: {node: '>=0.10.0'}
+ dev: false
+
+ /oauth-sign/0.9.0:
+ resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==}
+ dev: false
+ optional: true
+
+ /object-assign/4.1.1:
+ resolution: {integrity: sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=}
+ engines: {node: '>=0.10.0'}
+ dev: false
+
+ /on-finished/2.3.0:
+ resolution: {integrity: sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=}
+ engines: {node: '>= 0.8'}
+ dependencies:
+ ee-first: 1.1.1
+ dev: false
+
+ /once/1.4.0:
+ resolution: {integrity: sha1-WDsap3WWHUsROsF9nFC6753Xa9E=}
+ dependencies:
+ wrappy: 1.0.2
+ dev: false
+
+ /os-homedir/1.0.2:
+ resolution: {integrity: sha1-/7xJiDNuDoM94MFox+8VISGqf7M=}
+ engines: {node: '>=0.10.0'}
+ dev: false
+
+ /os-tmpdir/1.0.2:
+ resolution: {integrity: sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=}
+ engines: {node: '>=0.10.0'}
+ dev: false
+
+ /osenv/0.1.5:
+ resolution: {integrity: sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==}
+ dependencies:
+ os-homedir: 1.0.2
+ os-tmpdir: 1.0.2
+ dev: false
+
+ /p-cancelable/1.1.0:
+ resolution: {integrity: sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==}
+ engines: {node: '>=6'}
+ dev: false
+
+ /package-json/6.5.0:
+ resolution: {integrity: sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==}
+ engines: {node: '>=8'}
+ dependencies:
+ got: 9.6.0
+ registry-auth-token: 4.2.1
+ registry-url: 5.1.0
+ semver: 6.3.0
+ dev: false
+
+ /parseurl/1.3.3:
+ resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==}
+ engines: {node: '>= 0.8'}
+ dev: false
+
+ /path-is-absolute/1.0.1:
+ resolution: {integrity: sha1-F0uSaHNVNP+8es5r9TpanhtcX18=}
+ engines: {node: '>=0.10.0'}
+ dev: false
+
+ /path-to-regexp/0.1.7:
+ resolution: {integrity: sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=}
+ dev: false
+
+ /performance-now/2.1.0:
+ resolution: {integrity: sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=}
+ dev: false
+ optional: true
+
+ /picomatch/2.2.3:
+ resolution: {integrity: sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==}
+ engines: {node: '>=8.6'}
+ dev: false
+
+ /prepend-http/2.0.0:
+ resolution: {integrity: sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=}
+ engines: {node: '>=4'}
+ dev: false
+
+ /process-nextick-args/2.0.1:
+ resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==}
+ dev: false
+
+ /proxy-addr/2.0.6:
+ resolution: {integrity: sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==}
+ engines: {node: '>= 0.10'}
+ dependencies:
+ forwarded: 0.1.2
+ ipaddr.js: 1.9.1
+ dev: false
+
+ /psl/1.8.0:
+ resolution: {integrity: sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==}
+ dev: false
+ optional: true
+
+ /pstree.remy/1.1.8:
+ resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==}
+ dev: false
+
+ /pump/3.0.0:
+ resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==}
+ dependencies:
+ end-of-stream: 1.4.4
+ once: 1.4.0
+ dev: false
+
+ /punycode/2.1.1:
+ resolution: {integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==}
+ engines: {node: '>=6'}
+ dev: false
+ optional: true
+
+ /pupa/2.1.1:
+ resolution: {integrity: sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==}
+ engines: {node: '>=8'}
+ dependencies:
+ escape-goat: 2.1.1
+ dev: false
+
+ /qs/6.5.2:
+ resolution: {integrity: sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==}
+ engines: {node: '>=0.6'}
+ dev: false
+ optional: true
+
+ /qs/6.7.0:
+ resolution: {integrity: sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==}
+ engines: {node: '>=0.6'}
+ dev: false
+
+ /range-parser/1.2.1:
+ resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==}
+ engines: {node: '>= 0.6'}
+ dev: false
+
+ /raw-body/2.4.0:
+ resolution: {integrity: sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==}
+ engines: {node: '>= 0.8'}
+ dependencies:
+ bytes: 3.1.0
+ http-errors: 1.7.2
+ iconv-lite: 0.4.24
+ unpipe: 1.0.0
+ dev: false
+
+ /rc/1.2.8:
+ resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==}
+ hasBin: true
+ dependencies:
+ deep-extend: 0.6.0
+ ini: 1.3.8
+ minimist: 1.2.5
+ strip-json-comments: 2.0.1
+ dev: false
+
+ /readable-stream/2.3.7:
+ resolution: {integrity: sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==}
+ dependencies:
+ core-util-is: 1.0.2
+ inherits: 2.0.4
+ isarray: 1.0.0
+ process-nextick-args: 2.0.1
+ safe-buffer: 5.1.2
+ string_decoder: 1.1.1
+ util-deprecate: 1.0.2
+ dev: false
+
+ /readdirp/3.5.0:
+ resolution: {integrity: sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==}
+ engines: {node: '>=8.10.0'}
+ dependencies:
+ picomatch: 2.2.3
+ dev: false
+
+ /registry-auth-token/4.2.1:
+ resolution: {integrity: sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==}
+ engines: {node: '>=6.0.0'}
+ dependencies:
+ rc: 1.2.8
+ dev: false
+
+ /registry-url/5.1.0:
+ resolution: {integrity: sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==}
+ engines: {node: '>=8'}
+ dependencies:
+ rc: 1.2.8
+ dev: false
+
+ /request/2.88.2:
+ resolution: {integrity: sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==}
+ engines: {node: '>= 6'}
+ deprecated: request has been deprecated, see https://github.com/request/request/issues/3142
+ dependencies:
+ aws-sign2: 0.7.0
+ aws4: 1.11.0
+ caseless: 0.12.0
+ combined-stream: 1.0.8
+ extend: 3.0.2
+ forever-agent: 0.6.1
+ form-data: 2.3.3
+ har-validator: 5.1.5
+ http-signature: 1.2.0
+ is-typedarray: 1.0.0
+ isstream: 0.1.2
+ json-stringify-safe: 5.0.1
+ mime-types: 2.1.30
+ oauth-sign: 0.9.0
+ performance-now: 2.1.0
+ qs: 6.5.2
+ safe-buffer: 5.2.1
+ tough-cookie: 2.5.0
+ tunnel-agent: 0.6.0
+ uuid: 3.4.0
+ dev: false
+ optional: true
+
+ /responselike/1.0.2:
+ resolution: {integrity: sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=}
+ dependencies:
+ lowercase-keys: 1.0.1
+ dev: false
+
+ /rimraf/2.7.1:
+ resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==}
+ hasBin: true
+ dependencies:
+ glob: 7.1.7
+ dev: false
+
+ /safe-buffer/5.1.2:
+ resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==}
+ dev: false
+
+ /safe-buffer/5.2.1:
+ resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
+ dev: false
+
+ /safer-buffer/2.1.2:
+ resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
+ dev: false
+
+ /sax/1.2.4:
+ resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==}
+ dev: false
+
+ /semver-diff/3.1.1:
+ resolution: {integrity: sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==}
+ engines: {node: '>=8'}
+ dependencies:
+ semver: 6.3.0
+ dev: false
+
+ /semver/5.3.0:
+ resolution: {integrity: sha1-myzl094C0XxgEq0yaqa00M9U+U8=}
+ hasBin: true
+ dev: false
+ optional: true
+
+ /semver/5.7.1:
+ resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==}
+ hasBin: true
+ dev: false
+
+ /semver/6.3.0:
+ resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==}
+ hasBin: true
+ dev: false
+
+ /send/0.17.1:
+ resolution: {integrity: sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==}
+ engines: {node: '>= 0.8.0'}
+ dependencies:
+ debug: 2.6.9
+ depd: 1.1.2
+ destroy: 1.0.4
+ encodeurl: 1.0.2
+ escape-html: 1.0.3
+ etag: 1.8.1
+ fresh: 0.5.2
+ http-errors: 1.7.3
+ mime: 1.6.0
+ ms: 2.1.1
+ on-finished: 2.3.0
+ range-parser: 1.2.1
+ statuses: 1.5.0
+ dev: false
+
+ /serve-static/1.14.1:
+ resolution: {integrity: sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==}
+ engines: {node: '>= 0.8.0'}
+ dependencies:
+ encodeurl: 1.0.2
+ escape-html: 1.0.3
+ parseurl: 1.3.3
+ send: 0.17.1
+ dev: false
+
+ /set-blocking/2.0.0:
+ resolution: {integrity: sha1-BF+XgtARrppoA93TgrJDkrPYkPc=}
+ dev: false
+
+ /setprototypeof/1.1.1:
+ resolution: {integrity: sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==}
+ dev: false
+
+ /signal-exit/3.0.3:
+ resolution: {integrity: sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==}
+ dev: false
+
+ /sqlite/4.0.19:
+ resolution: {integrity: sha512-UiHAgJI4NzbnBXdD3r8EHOpwCOiv8VxcC6dnOoEYPEde8bw6t2HRqUcvGppF3uOV/SrqyVHicMl5Cjmuaalnlw==}
+ dev: false
+
+ /sqlite3/5.0.2:
+ resolution: {integrity: sha512-1SdTNo+BVU211Xj1csWa8lV6KM0CtucDwRyA0VHl91wEH1Mgh7RxUpI4rVvG7OhHrzCSGaVyW5g8vKvlrk9DJA==}
+ requiresBuild: true
+ peerDependenciesMeta:
+ node-gyp:
+ optional: true
+ dependencies:
+ node-addon-api: 3.1.0
+ node-pre-gyp: 0.11.0
+ optionalDependencies:
+ node-gyp: 3.8.0
+ dev: false
+
+ /sshpk/1.16.1:
+ resolution: {integrity: sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==}
+ engines: {node: '>=0.10.0'}
+ hasBin: true
+ dependencies:
+ asn1: 0.2.4
+ assert-plus: 1.0.0
+ bcrypt-pbkdf: 1.0.2
+ dashdash: 1.14.1
+ ecc-jsbn: 0.1.2
+ getpass: 0.1.7
+ jsbn: 0.1.1
+ safer-buffer: 2.1.2
+ tweetnacl: 0.14.5
+ dev: false
+ optional: true
+
+ /statuses/1.5.0:
+ resolution: {integrity: sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=}
+ engines: {node: '>= 0.6'}
+ dev: false
+
+ /string-width/1.0.2:
+ resolution: {integrity: sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ code-point-at: 1.1.0
+ is-fullwidth-code-point: 1.0.0
+ strip-ansi: 3.0.1
+ dev: false
+
+ /string-width/3.1.0:
+ resolution: {integrity: sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==}
+ engines: {node: '>=6'}
+ dependencies:
+ emoji-regex: 7.0.3
+ is-fullwidth-code-point: 2.0.0
+ strip-ansi: 5.2.0
+ dev: false
+
+ /string-width/4.2.2:
+ resolution: {integrity: sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==}
+ engines: {node: '>=8'}
+ dependencies:
+ emoji-regex: 8.0.0
+ is-fullwidth-code-point: 3.0.0
+ strip-ansi: 6.0.0
+ dev: false
+
+ /string_decoder/1.1.1:
+ resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==}
+ dependencies:
+ safe-buffer: 5.1.2
+ dev: false
+
+ /strip-ansi/3.0.1:
+ resolution: {integrity: sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ ansi-regex: 2.1.1
+ dev: false
+
+ /strip-ansi/5.2.0:
+ resolution: {integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==}
+ engines: {node: '>=6'}
+ dependencies:
+ ansi-regex: 4.1.0
+ dev: false
+
+ /strip-ansi/6.0.0:
+ resolution: {integrity: sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==}
+ engines: {node: '>=8'}
+ dependencies:
+ ansi-regex: 5.0.0
+ dev: false
+
+ /strip-json-comments/2.0.1:
+ resolution: {integrity: sha1-PFMZQukIwml8DsNEhYwobHygpgo=}
+ engines: {node: '>=0.10.0'}
+ dev: false
+
+ /supports-color/5.5.0:
+ resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==}
+ engines: {node: '>=4'}
+ dependencies:
+ has-flag: 3.0.0
+ dev: false
+
+ /supports-color/7.2.0:
+ resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
+ engines: {node: '>=8'}
+ dependencies:
+ has-flag: 4.0.0
+ dev: false
+
+ /tar/2.2.2:
+ resolution: {integrity: sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==}
+ dependencies:
+ block-stream: 0.0.9
+ fstream: 1.0.12
+ inherits: 2.0.4
+ dev: false
+ optional: true
+
+ /tar/4.4.13:
+ resolution: {integrity: sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==}
+ engines: {node: '>=4.5'}
+ dependencies:
+ chownr: 1.1.4
+ fs-minipass: 1.2.7
+ minipass: 2.9.0
+ minizlib: 1.3.3
+ mkdirp: 0.5.5
+ safe-buffer: 5.2.1
+ yallist: 3.1.1
+ dev: false
+
+ /term-size/2.2.1:
+ resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==}
+ engines: {node: '>=8'}
+ dev: false
+
+ /to-readable-stream/1.0.0:
+ resolution: {integrity: sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==}
+ engines: {node: '>=6'}
+ dev: false
+
+ /to-regex-range/5.0.1:
+ resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
+ engines: {node: '>=8.0'}
+ dependencies:
+ is-number: 7.0.0
+ dev: false
+
+ /toidentifier/1.0.0:
+ resolution: {integrity: sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==}
+ engines: {node: '>=0.6'}
+ dev: false
+
+ /touch/3.1.0:
+ resolution: {integrity: sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==}
+ hasBin: true
+ dependencies:
+ nopt: 1.0.10
+ dev: false
+
+ /tough-cookie/2.5.0:
+ resolution: {integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==}
+ engines: {node: '>=0.8'}
+ dependencies:
+ psl: 1.8.0
+ punycode: 2.1.1
+ dev: false
+ optional: true
+
+ /tunnel-agent/0.6.0:
+ resolution: {integrity: sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=}
+ dependencies:
+ safe-buffer: 5.2.1
+ dev: false
+ optional: true
+
+ /tweetnacl/0.14.5:
+ resolution: {integrity: sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=}
+ dev: false
+ optional: true
+
+ /type-fest/0.8.1:
+ resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==}
+ engines: {node: '>=8'}
+ dev: false
+
+ /type-is/1.6.18:
+ resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==}
+ engines: {node: '>= 0.6'}
+ dependencies:
+ media-typer: 0.3.0
+ mime-types: 2.1.30
+ dev: false
+
+ /typedarray-to-buffer/3.1.5:
+ resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==}
+ dependencies:
+ is-typedarray: 1.0.0
+ dev: false
+
+ /undefsafe/2.0.3:
+ resolution: {integrity: sha512-nrXZwwXrD/T/JXeygJqdCO6NZZ1L66HrxM/Z7mIq2oPanoN0F1nLx3lwJMu6AwJY69hdixaFQOuoYsMjE5/C2A==}
+ dependencies:
+ debug: 2.6.9
+ dev: false
+
+ /unique-string/2.0.0:
+ resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==}
+ engines: {node: '>=8'}
+ dependencies:
+ crypto-random-string: 2.0.0
+ dev: false
+
+ /unpipe/1.0.0:
+ resolution: {integrity: sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=}
+ engines: {node: '>= 0.8'}
+ dev: false
+
+ /update-notifier/4.1.3:
+ resolution: {integrity: sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A==}
+ engines: {node: '>=8'}
+ dependencies:
+ boxen: 4.2.0
+ chalk: 3.0.0
+ configstore: 5.0.1
+ has-yarn: 2.1.0
+ import-lazy: 2.1.0
+ is-ci: 2.0.0
+ is-installed-globally: 0.3.2
+ is-npm: 4.0.0
+ is-yarn-global: 0.3.0
+ latest-version: 5.1.0
+ pupa: 2.1.1
+ semver-diff: 3.1.1
+ xdg-basedir: 4.0.0
+ dev: false
+
+ /uri-js/4.4.1:
+ resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
+ dependencies:
+ punycode: 2.1.1
+ dev: false
+ optional: true
+
+ /url-parse-lax/3.0.0:
+ resolution: {integrity: sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=}
+ engines: {node: '>=4'}
+ dependencies:
+ prepend-http: 2.0.0
+ dev: false
+
+ /util-deprecate/1.0.2:
+ resolution: {integrity: sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=}
+ dev: false
+
+ /utils-merge/1.0.1:
+ resolution: {integrity: sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=}
+ engines: {node: '>= 0.4.0'}
+ dev: false
+
+ /uuid/3.4.0:
+ resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==}
+ hasBin: true
+ dev: false
+ optional: true
+
+ /validate-date/2.0.0:
+ resolution: {integrity: sha512-DmRIajI6qR/j3JibfDaQsar2IYIUdRUPRBgo/M/kcl6CR5aWb3CsNTX2tdgu2KD3oAMpfXfuJncP30Z3xNHAJg==}
+ dev: false
+
+ /vary/1.1.2:
+ resolution: {integrity: sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=}
+ engines: {node: '>= 0.8'}
+ dev: false
+
+ /verror/1.10.0:
+ resolution: {integrity: sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=}
+ engines: {'0': node >=0.6.0}
+ dependencies:
+ assert-plus: 1.0.0
+ core-util-is: 1.0.2
+ extsprintf: 1.3.0
+ dev: false
+ optional: true
+
+ /which/1.3.1:
+ resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==}
+ hasBin: true
+ dependencies:
+ isexe: 2.0.0
+ dev: false
+ optional: true
+
+ /wide-align/1.1.3:
+ resolution: {integrity: sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==}
+ dependencies:
+ string-width: 1.0.2
+ dev: false
+
+ /widest-line/3.1.0:
+ resolution: {integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==}
+ engines: {node: '>=8'}
+ dependencies:
+ string-width: 4.2.2
+ dev: false
+
+ /wrappy/1.0.2:
+ resolution: {integrity: sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=}
+ dev: false
+
+ /write-file-atomic/3.0.3:
+ resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==}
+ dependencies:
+ imurmurhash: 0.1.4
+ is-typedarray: 1.0.0
+ signal-exit: 3.0.3
+ typedarray-to-buffer: 3.1.5
+ dev: false
+
+ /xdg-basedir/4.0.0:
+ resolution: {integrity: sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==}
+ engines: {node: '>=8'}
+ dev: false
+
+ /yallist/3.1.1:
+ resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
+ dev: false
diff --git a/todoApplication.db b/todoApplication.db
new file mode 100644
index 0000000..4726ea0
Binary files /dev/null and b/todoApplication.db differ
diff --git a/todoApplication.http b/todoApplication.http
new file mode 100644
index 0000000..eda3e86
--- /dev/null
+++ b/todoApplication.http
@@ -0,0 +1,27 @@
+GET http://localhost:3000/todos/
+
+###
+POST httP://localhost:3000/todos/
+Content-Type: application/json
+
+{
+ "id": 7,
+ "todo": "Finalize event theme",
+ "priority": "LOW",
+ "status": "TO DO",
+ "category": "HOME",
+ "dueDate": "2021-2-22"
+}
+###
+PUT http://localhost:3000/todos/6/
+Content-Type: application/json
+
+{
+ "dueDate": "2021-4-12"
+}
+
+###
+DELETE http://localhost:3000/todos/6/
+
+###
+GET http://localhost:3000/agenda/?date=2021-2-22
\ No newline at end of file