From ac3ba31ad6a407000cbf04fd077da96ed519575e Mon Sep 17 00:00:00 2001 From: AarshZadaphiya Date: Fri, 8 Sep 2023 10:07:56 -0400 Subject: [PATCH 01/23] Updated files --- node_modules/.bin/mime | 1 + node_modules/.package-lock.json | 19 ++ node_modules/mime/CHANGELOG.md | 296 ++++++++++++++++++++++++++++ node_modules/mime/LICENSE | 21 ++ node_modules/mime/Mime.js | 97 +++++++++ node_modules/mime/README.md | 187 ++++++++++++++++++ node_modules/mime/cli.js | 46 +++++ node_modules/mime/index.js | 4 + node_modules/mime/lite.js | 4 + node_modules/mime/package.json | 52 +++++ node_modules/mime/types/other.js | 1 + node_modules/mime/types/standard.js | 1 + package-lock.json | 27 +++ package.json | 11 +- public/css/main.css | 31 ++- public/index.html | 25 ++- public/js/main.js | 13 +- server.improved.js | 15 +- 18 files changed, 831 insertions(+), 20 deletions(-) create mode 120000 node_modules/.bin/mime create mode 100644 node_modules/.package-lock.json create mode 100644 node_modules/mime/CHANGELOG.md create mode 100644 node_modules/mime/LICENSE create mode 100644 node_modules/mime/Mime.js create mode 100644 node_modules/mime/README.md create mode 100755 node_modules/mime/cli.js create mode 100644 node_modules/mime/index.js create mode 100644 node_modules/mime/lite.js create mode 100644 node_modules/mime/package.json create mode 100644 node_modules/mime/types/other.js create mode 100644 node_modules/mime/types/standard.js create mode 100644 package-lock.json diff --git a/node_modules/.bin/mime b/node_modules/.bin/mime new file mode 120000 index 00000000..fbb7ee0e --- /dev/null +++ b/node_modules/.bin/mime @@ -0,0 +1 @@ +../mime/cli.js \ No newline at end of file diff --git a/node_modules/.package-lock.json b/node_modules/.package-lock.json new file mode 100644 index 00000000..a08ba3b9 --- /dev/null +++ b/node_modules/.package-lock.json @@ -0,0 +1,19 @@ +{ + "name": "a2-aarshzadaphiya", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + } + } +} diff --git a/node_modules/mime/CHANGELOG.md b/node_modules/mime/CHANGELOG.md new file mode 100644 index 00000000..dd254310 --- /dev/null +++ b/node_modules/mime/CHANGELOG.md @@ -0,0 +1,296 @@ +# Changelog + +All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. + +## [2.6.0](https://github.com/broofa/mime/compare/v2.5.2...v2.6.0) (2021-11-02) + + +### Features + +* mime-db@1.50.0 ([cef0cc4](https://github.com/broofa/mime/commit/cef0cc484ff6d05ff1e12b54ca3e8b856fbc14d8)) + +### [2.5.2](https://github.com/broofa/mime/compare/v2.5.0...v2.5.2) (2021-02-17) + + +### Bug Fixes + +* update to mime-db@1.46.0, fixes [#253](https://github.com/broofa/mime/issues/253) ([f10e6aa](https://github.com/broofa/mime/commit/f10e6aa62e1356de7e2491d7fb4374c8dac65800)) + +## [2.5.0](https://github.com/broofa/mime/compare/v2.4.7...v2.5.0) (2021-01-16) + + +### Features + +* improved CLI ([#244](https://github.com/broofa/mime/issues/244)) ([c8a8356](https://github.com/broofa/mime/commit/c8a8356e3b27f3ef46b64b89b428fdb547b14d5f)) + +### [2.4.7](https://github.com/broofa/mime/compare/v2.4.6...v2.4.7) (2020-12-16) + + +### Bug Fixes + +* update to latest mime-db ([43b09ef](https://github.com/broofa/mime/commit/43b09eff0233eacc449af2b1f99a19ba9e104a44)) + +### [2.4.6](https://github.com/broofa/mime/compare/v2.4.5...v2.4.6) (2020-05-27) + + +### Bug Fixes + +* add cli.js to package.json files ([#237](https://github.com/broofa/mime/issues/237)) ([6c070bc](https://github.com/broofa/mime/commit/6c070bc298fa12a48e2ed126fbb9de641a1e7ebc)) + +### [2.4.5](https://github.com/broofa/mime/compare/v2.4.4...v2.4.5) (2020-05-01) + + +### Bug Fixes + +* fix [#236](https://github.com/broofa/mime/issues/236) ([7f4ecd0](https://github.com/broofa/mime/commit/7f4ecd0d850ed22c9e3bfda2c11fc74e4dde12a7)) +* update to latest mime-db ([c5cb3f2](https://github.com/broofa/mime/commit/c5cb3f2ab8b07642a066efbde1142af1b90c927b)) + +### [2.4.4](https://github.com/broofa/mime/compare/v2.4.3...v2.4.4) (2019-06-07) + + + +### [2.4.3](https://github.com/broofa/mime/compare/v2.4.2...v2.4.3) (2019-05-15) + + + +### [2.4.2](https://github.com/broofa/mime/compare/v2.4.1...v2.4.2) (2019-04-07) + + +### Bug Fixes + +* don't use arrow function introduced in 2.4.1 ([2e00b5c](https://github.com/broofa/mime/commit/2e00b5c)) + + + +### [2.4.1](https://github.com/broofa/mime/compare/v2.4.0...v2.4.1) (2019-04-03) + + +### Bug Fixes + +* update MDN and mime-db types ([3e567a9](https://github.com/broofa/mime/commit/3e567a9)) + + + +# [2.4.0](https://github.com/broofa/mime/compare/v2.3.1...v2.4.0) (2018-11-26) + + +### Features + +* Bind exported methods ([9d2a7b8](https://github.com/broofa/mime/commit/9d2a7b8)) +* update to mime-db@1.37.0 ([49e6e41](https://github.com/broofa/mime/commit/49e6e41)) + + + +### [2.3.1](https://github.com/broofa/mime/compare/v2.3.0...v2.3.1) (2018-04-11) + + +### Bug Fixes + +* fix [#198](https://github.com/broofa/mime/issues/198) ([25ca180](https://github.com/broofa/mime/commit/25ca180)) + + + +# [2.3.0](https://github.com/broofa/mime/compare/v2.2.2...v2.3.0) (2018-04-11) + + +### Bug Fixes + +* fix [#192](https://github.com/broofa/mime/issues/192) ([5c35df6](https://github.com/broofa/mime/commit/5c35df6)) + + +### Features + +* add travis-ci testing ([d64160f](https://github.com/broofa/mime/commit/d64160f)) + + + +### [2.2.2](https://github.com/broofa/mime/compare/v2.2.1...v2.2.2) (2018-03-30) + + +### Bug Fixes + +* update types files to mime-db@1.32.0 ([85aac16](https://github.com/broofa/mime/commit/85aac16)) + + +### [2.2.1](https://github.com/broofa/mime/compare/v2.2.0...v2.2.1) (2018-03-30) + + +### Bug Fixes + +* Retain type->extension mappings for non-default types. Fixes [#180](https://github.com/broofa/mime/issues/180) ([b5c83fb](https://github.com/broofa/mime/commit/b5c83fb)) + + + +# [2.2.0](https://github.com/broofa/mime/compare/v2.1.0...v2.2.0) (2018-01-04) + + +### Features + +* Retain type->extension mappings for non-default types. Fixes [#180](https://github.com/broofa/mime/issues/180) ([10f82ac](https://github.com/broofa/mime/commit/10f82ac)) + + + +# [2.1.0](https://github.com/broofa/mime/compare/v2.0.5...v2.1.0) (2017-12-22) + + +### Features + +* Upgrade to mime-db@1.32.0. Fixes [#185](https://github.com/broofa/mime/issues/185) ([3f775ba](https://github.com/broofa/mime/commit/3f775ba)) + + + +### [2.0.5](https://github.com/broofa/mime/compare/v2.0.1...v2.0.5) (2017-12-22) + + +### Bug Fixes + +* ES5 support (back to node v0.4) ([f14ccb6](https://github.com/broofa/mime/commit/f14ccb6)) + + + +# Changelog + +### v2.0.4 (24/11/2017) +- [**closed**] Switch to mime-score module for resolving extension contention issues. [#182](https://github.com/broofa/mime/issues/182) +- [**closed**] Update mime-db to 1.31.0 in v1.x branch [#181](https://github.com/broofa/mime/issues/181) + +--- + +## v1.5.0 (22/11/2017) +- [**closed**] need ES5 version ready in npm package [#179](https://github.com/broofa/mime/issues/179) +- [**closed**] mime-db no trace of iWork - pages / numbers / etc. [#178](https://github.com/broofa/mime/issues/178) +- [**closed**] How it works in brownser ? [#176](https://github.com/broofa/mime/issues/176) +- [**closed**] Missing `./Mime` [#175](https://github.com/broofa/mime/issues/175) +- [**closed**] Vulnerable Regular Expression [#167](https://github.com/broofa/mime/issues/167) + +--- + +### v2.0.3 (25/09/2017) +*No changelog for this release.* + +--- + +### v1.4.1 (25/09/2017) +- [**closed**] Issue when bundling with webpack [#172](https://github.com/broofa/mime/issues/172) + +--- + +### v2.0.2 (15/09/2017) +- [**V2**] fs.readFileSync is not a function [#165](https://github.com/broofa/mime/issues/165) +- [**closed**] The extension for video/quicktime should map to .mov, not .qt [#164](https://github.com/broofa/mime/issues/164) +- [**V2**] [v2 Feedback request] Mime class API [#163](https://github.com/broofa/mime/issues/163) +- [**V2**] [v2 Feedback request] Resolving conflicts over extensions [#162](https://github.com/broofa/mime/issues/162) +- [**V2**] Allow callers to load module with official, full, or no defined types. [#161](https://github.com/broofa/mime/issues/161) +- [**V2**] Use "facets" to resolve extension conflicts [#160](https://github.com/broofa/mime/issues/160) +- [**V2**] Remove fs and path dependencies [#152](https://github.com/broofa/mime/issues/152) +- [**V2**] Default content-type should not be application/octet-stream [#139](https://github.com/broofa/mime/issues/139) +- [**V2**] reset mime-types [#124](https://github.com/broofa/mime/issues/124) +- [**V2**] Extensionless paths should return null or false [#113](https://github.com/broofa/mime/issues/113) + +--- + +### v2.0.1 (14/09/2017) +- [**closed**] Changelog for v2.0 does not mention breaking changes [#171](https://github.com/broofa/mime/issues/171) +- [**closed**] MIME breaking with 'class' declaration as it is without 'use strict mode' [#170](https://github.com/broofa/mime/issues/170) + +--- + +## v2.0.0 (12/09/2017) +- [**closed**] woff and woff2 [#168](https://github.com/broofa/mime/issues/168) + +--- + +## v1.4.0 (28/08/2017) +- [**closed**] support for ac3 voc files [#159](https://github.com/broofa/mime/issues/159) +- [**closed**] Help understanding change from application/xml to text/xml [#158](https://github.com/broofa/mime/issues/158) +- [**closed**] no longer able to override mimetype [#157](https://github.com/broofa/mime/issues/157) +- [**closed**] application/vnd.adobe.photoshop [#147](https://github.com/broofa/mime/issues/147) +- [**closed**] Directories should appear as something other than application/octet-stream [#135](https://github.com/broofa/mime/issues/135) +- [**closed**] requested features [#131](https://github.com/broofa/mime/issues/131) +- [**closed**] Make types.json loading optional? [#129](https://github.com/broofa/mime/issues/129) +- [**closed**] Cannot find module './types.json' [#120](https://github.com/broofa/mime/issues/120) +- [**V2**] .wav files show up as "audio/x-wav" instead of "audio/x-wave" [#118](https://github.com/broofa/mime/issues/118) +- [**closed**] Don't be a pain in the ass for node community [#108](https://github.com/broofa/mime/issues/108) +- [**closed**] don't make default_type global [#78](https://github.com/broofa/mime/issues/78) +- [**closed**] mime.extension() fails if the content-type is parameterized [#74](https://github.com/broofa/mime/issues/74) + +--- + +### v1.3.6 (11/05/2017) +- [**closed**] .md should be text/markdown as of March 2016 [#154](https://github.com/broofa/mime/issues/154) +- [**closed**] Error while installing mime [#153](https://github.com/broofa/mime/issues/153) +- [**closed**] application/manifest+json [#149](https://github.com/broofa/mime/issues/149) +- [**closed**] Dynamic adaptive streaming over HTTP (DASH) file extension typo [#141](https://github.com/broofa/mime/issues/141) +- [**closed**] charsets image/png undefined [#140](https://github.com/broofa/mime/issues/140) +- [**closed**] Mime-db dependency out of date [#130](https://github.com/broofa/mime/issues/130) +- [**closed**] how to support plist? [#126](https://github.com/broofa/mime/issues/126) +- [**closed**] how does .types file format look like? [#123](https://github.com/broofa/mime/issues/123) +- [**closed**] Feature: support for expanding MIME patterns [#121](https://github.com/broofa/mime/issues/121) +- [**closed**] DEBUG_MIME doesn't work [#117](https://github.com/broofa/mime/issues/117) + +--- + +### v1.3.4 (06/02/2015) +*No changelog for this release.* + +--- + +### v1.3.3 (06/02/2015) +*No changelog for this release.* + +--- + +### v1.3.1 (05/02/2015) +- [**closed**] Consider adding support for Handlebars .hbs file ending [#111](https://github.com/broofa/mime/issues/111) +- [**closed**] Consider adding support for hjson. [#110](https://github.com/broofa/mime/issues/110) +- [**closed**] Add mime type for Opus audio files [#94](https://github.com/broofa/mime/issues/94) +- [**closed**] Consider making the `Requesting New Types` information more visible [#77](https://github.com/broofa/mime/issues/77) + +--- + +## v1.3.0 (05/02/2015) +- [**closed**] Add common name? [#114](https://github.com/broofa/mime/issues/114) +- [**closed**] application/x-yaml [#104](https://github.com/broofa/mime/issues/104) +- [**closed**] Add mime type for WOFF file format 2.0 [#102](https://github.com/broofa/mime/issues/102) +- [**closed**] application/x-msi for .msi [#99](https://github.com/broofa/mime/issues/99) +- [**closed**] Add mimetype for gettext translation files [#98](https://github.com/broofa/mime/issues/98) +- [**closed**] collaborators [#88](https://github.com/broofa/mime/issues/88) +- [**closed**] getting errot in installation of mime module...any1 can help? [#87](https://github.com/broofa/mime/issues/87) +- [**closed**] should application/json's charset be utf8? [#86](https://github.com/broofa/mime/issues/86) +- [**closed**] Add "license" and "licenses" to package.json [#81](https://github.com/broofa/mime/issues/81) +- [**closed**] lookup with extension-less file on Windows returns wrong type [#68](https://github.com/broofa/mime/issues/68) + +--- + +### v1.2.11 (15/08/2013) +- [**closed**] Update mime.types [#65](https://github.com/broofa/mime/issues/65) +- [**closed**] Publish a new version [#63](https://github.com/broofa/mime/issues/63) +- [**closed**] README should state upfront that "application/octet-stream" is default for unknown extension [#55](https://github.com/broofa/mime/issues/55) +- [**closed**] Suggested improvement to the charset API [#52](https://github.com/broofa/mime/issues/52) + +--- + +### v1.2.10 (25/07/2013) +- [**closed**] Mime type for woff files should be application/font-woff and not application/x-font-woff [#62](https://github.com/broofa/mime/issues/62) +- [**closed**] node.types in conflict with mime.types [#51](https://github.com/broofa/mime/issues/51) + +--- + +### v1.2.9 (17/01/2013) +- [**closed**] Please update "mime" NPM [#49](https://github.com/broofa/mime/issues/49) +- [**closed**] Please add semicolon [#46](https://github.com/broofa/mime/issues/46) +- [**closed**] parse full mime types [#43](https://github.com/broofa/mime/issues/43) + +--- + +### v1.2.8 (10/01/2013) +- [**closed**] /js directory mime is application/javascript. Is it correct? [#47](https://github.com/broofa/mime/issues/47) +- [**closed**] Add mime types for lua code. [#45](https://github.com/broofa/mime/issues/45) + +--- + +### v1.2.7 (19/10/2012) +- [**closed**] cannot install 1.2.7 via npm [#41](https://github.com/broofa/mime/issues/41) +- [**closed**] Transfer ownership to @broofa [#36](https://github.com/broofa/mime/issues/36) +- [**closed**] it's wrong to set charset to UTF-8 for text [#30](https://github.com/broofa/mime/issues/30) +- [**closed**] Allow multiple instances of MIME types container [#27](https://github.com/broofa/mime/issues/27) diff --git a/node_modules/mime/LICENSE b/node_modules/mime/LICENSE new file mode 100644 index 00000000..d3f46f7e --- /dev/null +++ b/node_modules/mime/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2010 Benjamin Thomas, Robert Kieffer + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/node_modules/mime/Mime.js b/node_modules/mime/Mime.js new file mode 100644 index 00000000..969a66e4 --- /dev/null +++ b/node_modules/mime/Mime.js @@ -0,0 +1,97 @@ +'use strict'; + +/** + * @param typeMap [Object] Map of MIME type -> Array[extensions] + * @param ... + */ +function Mime() { + this._types = Object.create(null); + this._extensions = Object.create(null); + + for (let i = 0; i < arguments.length; i++) { + this.define(arguments[i]); + } + + this.define = this.define.bind(this); + this.getType = this.getType.bind(this); + this.getExtension = this.getExtension.bind(this); +} + +/** + * Define mimetype -> extension mappings. Each key is a mime-type that maps + * to an array of extensions associated with the type. The first extension is + * used as the default extension for the type. + * + * e.g. mime.define({'audio/ogg', ['oga', 'ogg', 'spx']}); + * + * If a type declares an extension that has already been defined, an error will + * be thrown. To suppress this error and force the extension to be associated + * with the new type, pass `force`=true. Alternatively, you may prefix the + * extension with "*" to map the type to extension, without mapping the + * extension to the type. + * + * e.g. mime.define({'audio/wav', ['wav']}, {'audio/x-wav', ['*wav']}); + * + * + * @param map (Object) type definitions + * @param force (Boolean) if true, force overriding of existing definitions + */ +Mime.prototype.define = function(typeMap, force) { + for (let type in typeMap) { + let extensions = typeMap[type].map(function(t) { + return t.toLowerCase(); + }); + type = type.toLowerCase(); + + for (let i = 0; i < extensions.length; i++) { + const ext = extensions[i]; + + // '*' prefix = not the preferred type for this extension. So fixup the + // extension, and skip it. + if (ext[0] === '*') { + continue; + } + + if (!force && (ext in this._types)) { + throw new Error( + 'Attempt to change mapping for "' + ext + + '" extension from "' + this._types[ext] + '" to "' + type + + '". Pass `force=true` to allow this, otherwise remove "' + ext + + '" from the list of extensions for "' + type + '".' + ); + } + + this._types[ext] = type; + } + + // Use first extension as default + if (force || !this._extensions[type]) { + const ext = extensions[0]; + this._extensions[type] = (ext[0] !== '*') ? ext : ext.substr(1); + } + } +}; + +/** + * Lookup a mime type based on extension + */ +Mime.prototype.getType = function(path) { + path = String(path); + let last = path.replace(/^.*[/\\]/, '').toLowerCase(); + let ext = last.replace(/^.*\./, '').toLowerCase(); + + let hasPath = last.length < path.length; + let hasDot = ext.length < last.length - 1; + + return (hasDot || !hasPath) && this._types[ext] || null; +}; + +/** + * Return file extension associated with a mime type + */ +Mime.prototype.getExtension = function(type) { + type = /^\s*([^;\s]*)/.test(type) && RegExp.$1; + return type && this._extensions[type.toLowerCase()] || null; +}; + +module.exports = Mime; diff --git a/node_modules/mime/README.md b/node_modules/mime/README.md new file mode 100644 index 00000000..b08316f2 --- /dev/null +++ b/node_modules/mime/README.md @@ -0,0 +1,187 @@ + +# Mime + +A comprehensive, compact MIME type module. + +[![Build Status](https://travis-ci.org/broofa/mime.svg?branch=master)](https://travis-ci.org/broofa/mime) + +## Version 2 Notes + +Version 2 is a breaking change from 1.x as the semver implies. Specifically: + +* `lookup()` renamed to `getType()` +* `extension()` renamed to `getExtension()` +* `charset()` and `load()` methods have been removed + +If you prefer the legacy version of this module please `npm install mime@^1`. Version 1 docs may be found [here](https://github.com/broofa/mime/tree/v1.4.0). + +## Install + +### NPM +``` +npm install mime +``` + +### Browser + +It is recommended that you use a bundler such as +[webpack](https://webpack.github.io/) or [browserify](http://browserify.org/) to +package your code. However, browser-ready versions are available via wzrd.in. +E.g. For the full version: + + + + +Or, for the `mime/lite` version: + + + + +## Quick Start + +For the full version (800+ MIME types, 1,000+ extensions): + +```javascript +const mime = require('mime'); + +mime.getType('txt'); // ⇨ 'text/plain' +mime.getExtension('text/plain'); // ⇨ 'txt' +``` + +See [Mime API](#mime-api) below for API details. + +## Lite Version + +There is also a "lite" version of this module that omits vendor-specific +(`*/vnd.*`) and experimental (`*/x-*`) types. It weighs in at ~2.5KB, compared +to 8KB for the full version. To load the lite version: + +```javascript +const mime = require('mime/lite'); +``` + +## Mime .vs. mime-types .vs. mime-db modules + +For those of you wondering about the difference between these [popular] NPM modules, +here's a brief rundown ... + +[`mime-db`](https://github.com/jshttp/mime-db) is "the source of +truth" for MIME type information. It is not an API. Rather, it is a canonical +dataset of mime type definitions pulled from IANA, Apache, NGINX, and custom mappings +submitted by the Node.js community. + +[`mime-types`](https://github.com/jshttp/mime-types) is a thin +wrapper around mime-db that provides an API drop-in compatible(ish) with `mime @ < v1.3.6` API. + +`mime` is, as of v2, a self-contained module bundled with a pre-optimized version +of the `mime-db` dataset. It provides a simplified API with the following characteristics: + +* Intelligently resolved type conflicts (See [mime-score](https://github.com/broofa/mime-score) for details) +* Method naming consistent with industry best-practices +* Compact footprint. E.g. The minified+compressed sizes of the various modules: + +Module | Size +--- | --- +`mime-db` | 18 KB +`mime-types` | same as mime-db +`mime` | 8 KB +`mime/lite` | 2 KB + +## Mime API + +Both `require('mime')` and `require('mime/lite')` return instances of the MIME +class, documented below. + +Note: Inputs to this API are case-insensitive. Outputs (returned values) will +be lowercase. + +### new Mime(typeMap, ... more maps) + +Most users of this module will not need to create Mime instances directly. +However if you would like to create custom mappings, you may do so as follows +... + +```javascript +// Require Mime class +const Mime = require('mime/Mime'); + +// Define mime type -> extensions map +const typeMap = { + 'text/abc': ['abc', 'alpha', 'bet'], + 'text/def': ['leppard'] +}; + +// Create and use Mime instance +const myMime = new Mime(typeMap); +myMime.getType('abc'); // ⇨ 'text/abc' +myMime.getExtension('text/def'); // ⇨ 'leppard' +``` + +If more than one map argument is provided, each map is `define()`ed (see below), in order. + +### mime.getType(pathOrExtension) + +Get mime type for the given path or extension. E.g. + +```javascript +mime.getType('js'); // ⇨ 'application/javascript' +mime.getType('json'); // ⇨ 'application/json' + +mime.getType('txt'); // ⇨ 'text/plain' +mime.getType('dir/text.txt'); // ⇨ 'text/plain' +mime.getType('dir\\text.txt'); // ⇨ 'text/plain' +mime.getType('.text.txt'); // ⇨ 'text/plain' +mime.getType('.txt'); // ⇨ 'text/plain' +``` + +`null` is returned in cases where an extension is not detected or recognized + +```javascript +mime.getType('foo/txt'); // ⇨ null +mime.getType('bogus_type'); // ⇨ null +``` + +### mime.getExtension(type) +Get extension for the given mime type. Charset options (often included in +Content-Type headers) are ignored. + +```javascript +mime.getExtension('text/plain'); // ⇨ 'txt' +mime.getExtension('application/json'); // ⇨ 'json' +mime.getExtension('text/html; charset=utf8'); // ⇨ 'html' +``` + +### mime.define(typeMap[, force = false]) + +Define [more] type mappings. + +`typeMap` is a map of type -> extensions, as documented in `new Mime`, above. + +By default this method will throw an error if you try to map a type to an +extension that is already assigned to another type. Passing `true` for the +`force` argument will suppress this behavior (overriding any previous mapping). + +```javascript +mime.define({'text/x-abc': ['abc', 'abcd']}); + +mime.getType('abcd'); // ⇨ 'text/x-abc' +mime.getExtension('text/x-abc') // ⇨ 'abc' +``` + +## Command Line + + mime [path_or_extension] + +E.g. + + > mime scripts/jquery.js + application/javascript + +---- +Markdown generated from [src/README_js.md](src/README_js.md) by [![RunMD Logo](http://i.imgur.com/h0FVyzU.png)](https://github.com/broofa/runmd) \ No newline at end of file diff --git a/node_modules/mime/cli.js b/node_modules/mime/cli.js new file mode 100755 index 00000000..ab70a49c --- /dev/null +++ b/node_modules/mime/cli.js @@ -0,0 +1,46 @@ +#!/usr/bin/env node + +'use strict'; + +process.title = 'mime'; +let mime = require('.'); +let pkg = require('./package.json'); +let args = process.argv.splice(2); + +if (args.includes('--version') || args.includes('-v') || args.includes('--v')) { + console.log(pkg.version); + process.exit(0); +} else if (args.includes('--name') || args.includes('-n') || args.includes('--n')) { + console.log(pkg.name); + process.exit(0); +} else if (args.includes('--help') || args.includes('-h') || args.includes('--h')) { + console.log(pkg.name + ' - ' + pkg.description + '\n'); + console.log(`Usage: + + mime [flags] [path_or_extension] + + Flags: + --help, -h Show this message + --version, -v Display the version + --name, -n Print the name of the program + + Note: the command will exit after it executes if a command is specified + The path_or_extension is the path to the file or the extension of the file. + + Examples: + mime --help + mime --version + mime --name + mime -v + mime src/log.js + mime new.py + mime foo.sh + `); + process.exit(0); +} + +let file = args[0]; +let type = mime.getType(file); + +process.stdout.write(type + '\n'); + diff --git a/node_modules/mime/index.js b/node_modules/mime/index.js new file mode 100644 index 00000000..fadcf8d6 --- /dev/null +++ b/node_modules/mime/index.js @@ -0,0 +1,4 @@ +'use strict'; + +let Mime = require('./Mime'); +module.exports = new Mime(require('./types/standard'), require('./types/other')); diff --git a/node_modules/mime/lite.js b/node_modules/mime/lite.js new file mode 100644 index 00000000..835cffb3 --- /dev/null +++ b/node_modules/mime/lite.js @@ -0,0 +1,4 @@ +'use strict'; + +let Mime = require('./Mime'); +module.exports = new Mime(require('./types/standard')); diff --git a/node_modules/mime/package.json b/node_modules/mime/package.json new file mode 100644 index 00000000..df7f369b --- /dev/null +++ b/node_modules/mime/package.json @@ -0,0 +1,52 @@ +{ + "author": { + "name": "Robert Kieffer", + "url": "http://github.com/broofa", + "email": "robert@broofa.com" + }, + "engines": { + "node": ">=4.0.0" + }, + "bin": { + "mime": "cli.js" + }, + "contributors": [], + "description": "A comprehensive library for mime-type mapping", + "license": "MIT", + "dependencies": {}, + "devDependencies": { + "benchmark": "*", + "chalk": "4.1.2", + "eslint": "8.1.0", + "mime-db": "1.50.0", + "mime-score": "1.2.0", + "mime-types": "2.1.33", + "mocha": "9.1.3", + "runmd": "*", + "standard-version": "9.3.2" + }, + "files": [ + "index.js", + "lite.js", + "Mime.js", + "cli.js", + "/types" + ], + "scripts": { + "prepare": "node src/build.js && runmd --output README.md src/README_js.md", + "release": "standard-version", + "benchmark": "node src/benchmark.js", + "md": "runmd --watch --output README.md src/README_js.md", + "test": "mocha src/test.js" + }, + "keywords": [ + "util", + "mime" + ], + "name": "mime", + "repository": { + "url": "https://github.com/broofa/mime", + "type": "git" + }, + "version": "2.6.0" +} diff --git a/node_modules/mime/types/other.js b/node_modules/mime/types/other.js new file mode 100644 index 00000000..bb6a0353 --- /dev/null +++ b/node_modules/mime/types/other.js @@ -0,0 +1 @@ +module.exports = {"application/prs.cww":["cww"],"application/vnd.1000minds.decision-model+xml":["1km"],"application/vnd.3gpp.pic-bw-large":["plb"],"application/vnd.3gpp.pic-bw-small":["psb"],"application/vnd.3gpp.pic-bw-var":["pvb"],"application/vnd.3gpp2.tcap":["tcap"],"application/vnd.3m.post-it-notes":["pwn"],"application/vnd.accpac.simply.aso":["aso"],"application/vnd.accpac.simply.imp":["imp"],"application/vnd.acucobol":["acu"],"application/vnd.acucorp":["atc","acutc"],"application/vnd.adobe.air-application-installer-package+zip":["air"],"application/vnd.adobe.formscentral.fcdt":["fcdt"],"application/vnd.adobe.fxp":["fxp","fxpl"],"application/vnd.adobe.xdp+xml":["xdp"],"application/vnd.adobe.xfdf":["xfdf"],"application/vnd.ahead.space":["ahead"],"application/vnd.airzip.filesecure.azf":["azf"],"application/vnd.airzip.filesecure.azs":["azs"],"application/vnd.amazon.ebook":["azw"],"application/vnd.americandynamics.acc":["acc"],"application/vnd.amiga.ami":["ami"],"application/vnd.android.package-archive":["apk"],"application/vnd.anser-web-certificate-issue-initiation":["cii"],"application/vnd.anser-web-funds-transfer-initiation":["fti"],"application/vnd.antix.game-component":["atx"],"application/vnd.apple.installer+xml":["mpkg"],"application/vnd.apple.keynote":["key"],"application/vnd.apple.mpegurl":["m3u8"],"application/vnd.apple.numbers":["numbers"],"application/vnd.apple.pages":["pages"],"application/vnd.apple.pkpass":["pkpass"],"application/vnd.aristanetworks.swi":["swi"],"application/vnd.astraea-software.iota":["iota"],"application/vnd.audiograph":["aep"],"application/vnd.balsamiq.bmml+xml":["bmml"],"application/vnd.blueice.multipass":["mpm"],"application/vnd.bmi":["bmi"],"application/vnd.businessobjects":["rep"],"application/vnd.chemdraw+xml":["cdxml"],"application/vnd.chipnuts.karaoke-mmd":["mmd"],"application/vnd.cinderella":["cdy"],"application/vnd.citationstyles.style+xml":["csl"],"application/vnd.claymore":["cla"],"application/vnd.cloanto.rp9":["rp9"],"application/vnd.clonk.c4group":["c4g","c4d","c4f","c4p","c4u"],"application/vnd.cluetrust.cartomobile-config":["c11amc"],"application/vnd.cluetrust.cartomobile-config-pkg":["c11amz"],"application/vnd.commonspace":["csp"],"application/vnd.contact.cmsg":["cdbcmsg"],"application/vnd.cosmocaller":["cmc"],"application/vnd.crick.clicker":["clkx"],"application/vnd.crick.clicker.keyboard":["clkk"],"application/vnd.crick.clicker.palette":["clkp"],"application/vnd.crick.clicker.template":["clkt"],"application/vnd.crick.clicker.wordbank":["clkw"],"application/vnd.criticaltools.wbs+xml":["wbs"],"application/vnd.ctc-posml":["pml"],"application/vnd.cups-ppd":["ppd"],"application/vnd.curl.car":["car"],"application/vnd.curl.pcurl":["pcurl"],"application/vnd.dart":["dart"],"application/vnd.data-vision.rdz":["rdz"],"application/vnd.dbf":["dbf"],"application/vnd.dece.data":["uvf","uvvf","uvd","uvvd"],"application/vnd.dece.ttml+xml":["uvt","uvvt"],"application/vnd.dece.unspecified":["uvx","uvvx"],"application/vnd.dece.zip":["uvz","uvvz"],"application/vnd.denovo.fcselayout-link":["fe_launch"],"application/vnd.dna":["dna"],"application/vnd.dolby.mlp":["mlp"],"application/vnd.dpgraph":["dpg"],"application/vnd.dreamfactory":["dfac"],"application/vnd.ds-keypoint":["kpxx"],"application/vnd.dvb.ait":["ait"],"application/vnd.dvb.service":["svc"],"application/vnd.dynageo":["geo"],"application/vnd.ecowin.chart":["mag"],"application/vnd.enliven":["nml"],"application/vnd.epson.esf":["esf"],"application/vnd.epson.msf":["msf"],"application/vnd.epson.quickanime":["qam"],"application/vnd.epson.salt":["slt"],"application/vnd.epson.ssf":["ssf"],"application/vnd.eszigno3+xml":["es3","et3"],"application/vnd.ezpix-album":["ez2"],"application/vnd.ezpix-package":["ez3"],"application/vnd.fdf":["fdf"],"application/vnd.fdsn.mseed":["mseed"],"application/vnd.fdsn.seed":["seed","dataless"],"application/vnd.flographit":["gph"],"application/vnd.fluxtime.clip":["ftc"],"application/vnd.framemaker":["fm","frame","maker","book"],"application/vnd.frogans.fnc":["fnc"],"application/vnd.frogans.ltf":["ltf"],"application/vnd.fsc.weblaunch":["fsc"],"application/vnd.fujitsu.oasys":["oas"],"application/vnd.fujitsu.oasys2":["oa2"],"application/vnd.fujitsu.oasys3":["oa3"],"application/vnd.fujitsu.oasysgp":["fg5"],"application/vnd.fujitsu.oasysprs":["bh2"],"application/vnd.fujixerox.ddd":["ddd"],"application/vnd.fujixerox.docuworks":["xdw"],"application/vnd.fujixerox.docuworks.binder":["xbd"],"application/vnd.fuzzysheet":["fzs"],"application/vnd.genomatix.tuxedo":["txd"],"application/vnd.geogebra.file":["ggb"],"application/vnd.geogebra.tool":["ggt"],"application/vnd.geometry-explorer":["gex","gre"],"application/vnd.geonext":["gxt"],"application/vnd.geoplan":["g2w"],"application/vnd.geospace":["g3w"],"application/vnd.gmx":["gmx"],"application/vnd.google-apps.document":["gdoc"],"application/vnd.google-apps.presentation":["gslides"],"application/vnd.google-apps.spreadsheet":["gsheet"],"application/vnd.google-earth.kml+xml":["kml"],"application/vnd.google-earth.kmz":["kmz"],"application/vnd.grafeq":["gqf","gqs"],"application/vnd.groove-account":["gac"],"application/vnd.groove-help":["ghf"],"application/vnd.groove-identity-message":["gim"],"application/vnd.groove-injector":["grv"],"application/vnd.groove-tool-message":["gtm"],"application/vnd.groove-tool-template":["tpl"],"application/vnd.groove-vcard":["vcg"],"application/vnd.hal+xml":["hal"],"application/vnd.handheld-entertainment+xml":["zmm"],"application/vnd.hbci":["hbci"],"application/vnd.hhe.lesson-player":["les"],"application/vnd.hp-hpgl":["hpgl"],"application/vnd.hp-hpid":["hpid"],"application/vnd.hp-hps":["hps"],"application/vnd.hp-jlyt":["jlt"],"application/vnd.hp-pcl":["pcl"],"application/vnd.hp-pclxl":["pclxl"],"application/vnd.hydrostatix.sof-data":["sfd-hdstx"],"application/vnd.ibm.minipay":["mpy"],"application/vnd.ibm.modcap":["afp","listafp","list3820"],"application/vnd.ibm.rights-management":["irm"],"application/vnd.ibm.secure-container":["sc"],"application/vnd.iccprofile":["icc","icm"],"application/vnd.igloader":["igl"],"application/vnd.immervision-ivp":["ivp"],"application/vnd.immervision-ivu":["ivu"],"application/vnd.insors.igm":["igm"],"application/vnd.intercon.formnet":["xpw","xpx"],"application/vnd.intergeo":["i2g"],"application/vnd.intu.qbo":["qbo"],"application/vnd.intu.qfx":["qfx"],"application/vnd.ipunplugged.rcprofile":["rcprofile"],"application/vnd.irepository.package+xml":["irp"],"application/vnd.is-xpr":["xpr"],"application/vnd.isac.fcs":["fcs"],"application/vnd.jam":["jam"],"application/vnd.jcp.javame.midlet-rms":["rms"],"application/vnd.jisp":["jisp"],"application/vnd.joost.joda-archive":["joda"],"application/vnd.kahootz":["ktz","ktr"],"application/vnd.kde.karbon":["karbon"],"application/vnd.kde.kchart":["chrt"],"application/vnd.kde.kformula":["kfo"],"application/vnd.kde.kivio":["flw"],"application/vnd.kde.kontour":["kon"],"application/vnd.kde.kpresenter":["kpr","kpt"],"application/vnd.kde.kspread":["ksp"],"application/vnd.kde.kword":["kwd","kwt"],"application/vnd.kenameaapp":["htke"],"application/vnd.kidspiration":["kia"],"application/vnd.kinar":["kne","knp"],"application/vnd.koan":["skp","skd","skt","skm"],"application/vnd.kodak-descriptor":["sse"],"application/vnd.las.las+xml":["lasxml"],"application/vnd.llamagraphics.life-balance.desktop":["lbd"],"application/vnd.llamagraphics.life-balance.exchange+xml":["lbe"],"application/vnd.lotus-1-2-3":["123"],"application/vnd.lotus-approach":["apr"],"application/vnd.lotus-freelance":["pre"],"application/vnd.lotus-notes":["nsf"],"application/vnd.lotus-organizer":["org"],"application/vnd.lotus-screencam":["scm"],"application/vnd.lotus-wordpro":["lwp"],"application/vnd.macports.portpkg":["portpkg"],"application/vnd.mapbox-vector-tile":["mvt"],"application/vnd.mcd":["mcd"],"application/vnd.medcalcdata":["mc1"],"application/vnd.mediastation.cdkey":["cdkey"],"application/vnd.mfer":["mwf"],"application/vnd.mfmp":["mfm"],"application/vnd.micrografx.flo":["flo"],"application/vnd.micrografx.igx":["igx"],"application/vnd.mif":["mif"],"application/vnd.mobius.daf":["daf"],"application/vnd.mobius.dis":["dis"],"application/vnd.mobius.mbk":["mbk"],"application/vnd.mobius.mqy":["mqy"],"application/vnd.mobius.msl":["msl"],"application/vnd.mobius.plc":["plc"],"application/vnd.mobius.txf":["txf"],"application/vnd.mophun.application":["mpn"],"application/vnd.mophun.certificate":["mpc"],"application/vnd.mozilla.xul+xml":["xul"],"application/vnd.ms-artgalry":["cil"],"application/vnd.ms-cab-compressed":["cab"],"application/vnd.ms-excel":["xls","xlm","xla","xlc","xlt","xlw"],"application/vnd.ms-excel.addin.macroenabled.12":["xlam"],"application/vnd.ms-excel.sheet.binary.macroenabled.12":["xlsb"],"application/vnd.ms-excel.sheet.macroenabled.12":["xlsm"],"application/vnd.ms-excel.template.macroenabled.12":["xltm"],"application/vnd.ms-fontobject":["eot"],"application/vnd.ms-htmlhelp":["chm"],"application/vnd.ms-ims":["ims"],"application/vnd.ms-lrm":["lrm"],"application/vnd.ms-officetheme":["thmx"],"application/vnd.ms-outlook":["msg"],"application/vnd.ms-pki.seccat":["cat"],"application/vnd.ms-pki.stl":["*stl"],"application/vnd.ms-powerpoint":["ppt","pps","pot"],"application/vnd.ms-powerpoint.addin.macroenabled.12":["ppam"],"application/vnd.ms-powerpoint.presentation.macroenabled.12":["pptm"],"application/vnd.ms-powerpoint.slide.macroenabled.12":["sldm"],"application/vnd.ms-powerpoint.slideshow.macroenabled.12":["ppsm"],"application/vnd.ms-powerpoint.template.macroenabled.12":["potm"],"application/vnd.ms-project":["mpp","mpt"],"application/vnd.ms-word.document.macroenabled.12":["docm"],"application/vnd.ms-word.template.macroenabled.12":["dotm"],"application/vnd.ms-works":["wps","wks","wcm","wdb"],"application/vnd.ms-wpl":["wpl"],"application/vnd.ms-xpsdocument":["xps"],"application/vnd.mseq":["mseq"],"application/vnd.musician":["mus"],"application/vnd.muvee.style":["msty"],"application/vnd.mynfc":["taglet"],"application/vnd.neurolanguage.nlu":["nlu"],"application/vnd.nitf":["ntf","nitf"],"application/vnd.noblenet-directory":["nnd"],"application/vnd.noblenet-sealer":["nns"],"application/vnd.noblenet-web":["nnw"],"application/vnd.nokia.n-gage.ac+xml":["*ac"],"application/vnd.nokia.n-gage.data":["ngdat"],"application/vnd.nokia.n-gage.symbian.install":["n-gage"],"application/vnd.nokia.radio-preset":["rpst"],"application/vnd.nokia.radio-presets":["rpss"],"application/vnd.novadigm.edm":["edm"],"application/vnd.novadigm.edx":["edx"],"application/vnd.novadigm.ext":["ext"],"application/vnd.oasis.opendocument.chart":["odc"],"application/vnd.oasis.opendocument.chart-template":["otc"],"application/vnd.oasis.opendocument.database":["odb"],"application/vnd.oasis.opendocument.formula":["odf"],"application/vnd.oasis.opendocument.formula-template":["odft"],"application/vnd.oasis.opendocument.graphics":["odg"],"application/vnd.oasis.opendocument.graphics-template":["otg"],"application/vnd.oasis.opendocument.image":["odi"],"application/vnd.oasis.opendocument.image-template":["oti"],"application/vnd.oasis.opendocument.presentation":["odp"],"application/vnd.oasis.opendocument.presentation-template":["otp"],"application/vnd.oasis.opendocument.spreadsheet":["ods"],"application/vnd.oasis.opendocument.spreadsheet-template":["ots"],"application/vnd.oasis.opendocument.text":["odt"],"application/vnd.oasis.opendocument.text-master":["odm"],"application/vnd.oasis.opendocument.text-template":["ott"],"application/vnd.oasis.opendocument.text-web":["oth"],"application/vnd.olpc-sugar":["xo"],"application/vnd.oma.dd2+xml":["dd2"],"application/vnd.openblox.game+xml":["obgx"],"application/vnd.openofficeorg.extension":["oxt"],"application/vnd.openstreetmap.data+xml":["osm"],"application/vnd.openxmlformats-officedocument.presentationml.presentation":["pptx"],"application/vnd.openxmlformats-officedocument.presentationml.slide":["sldx"],"application/vnd.openxmlformats-officedocument.presentationml.slideshow":["ppsx"],"application/vnd.openxmlformats-officedocument.presentationml.template":["potx"],"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":["xlsx"],"application/vnd.openxmlformats-officedocument.spreadsheetml.template":["xltx"],"application/vnd.openxmlformats-officedocument.wordprocessingml.document":["docx"],"application/vnd.openxmlformats-officedocument.wordprocessingml.template":["dotx"],"application/vnd.osgeo.mapguide.package":["mgp"],"application/vnd.osgi.dp":["dp"],"application/vnd.osgi.subsystem":["esa"],"application/vnd.palm":["pdb","pqa","oprc"],"application/vnd.pawaafile":["paw"],"application/vnd.pg.format":["str"],"application/vnd.pg.osasli":["ei6"],"application/vnd.picsel":["efif"],"application/vnd.pmi.widget":["wg"],"application/vnd.pocketlearn":["plf"],"application/vnd.powerbuilder6":["pbd"],"application/vnd.previewsystems.box":["box"],"application/vnd.proteus.magazine":["mgz"],"application/vnd.publishare-delta-tree":["qps"],"application/vnd.pvi.ptid1":["ptid"],"application/vnd.quark.quarkxpress":["qxd","qxt","qwd","qwt","qxl","qxb"],"application/vnd.rar":["rar"],"application/vnd.realvnc.bed":["bed"],"application/vnd.recordare.musicxml":["mxl"],"application/vnd.recordare.musicxml+xml":["musicxml"],"application/vnd.rig.cryptonote":["cryptonote"],"application/vnd.rim.cod":["cod"],"application/vnd.rn-realmedia":["rm"],"application/vnd.rn-realmedia-vbr":["rmvb"],"application/vnd.route66.link66+xml":["link66"],"application/vnd.sailingtracker.track":["st"],"application/vnd.seemail":["see"],"application/vnd.sema":["sema"],"application/vnd.semd":["semd"],"application/vnd.semf":["semf"],"application/vnd.shana.informed.formdata":["ifm"],"application/vnd.shana.informed.formtemplate":["itp"],"application/vnd.shana.informed.interchange":["iif"],"application/vnd.shana.informed.package":["ipk"],"application/vnd.simtech-mindmapper":["twd","twds"],"application/vnd.smaf":["mmf"],"application/vnd.smart.teacher":["teacher"],"application/vnd.software602.filler.form+xml":["fo"],"application/vnd.solent.sdkm+xml":["sdkm","sdkd"],"application/vnd.spotfire.dxp":["dxp"],"application/vnd.spotfire.sfs":["sfs"],"application/vnd.stardivision.calc":["sdc"],"application/vnd.stardivision.draw":["sda"],"application/vnd.stardivision.impress":["sdd"],"application/vnd.stardivision.math":["smf"],"application/vnd.stardivision.writer":["sdw","vor"],"application/vnd.stardivision.writer-global":["sgl"],"application/vnd.stepmania.package":["smzip"],"application/vnd.stepmania.stepchart":["sm"],"application/vnd.sun.wadl+xml":["wadl"],"application/vnd.sun.xml.calc":["sxc"],"application/vnd.sun.xml.calc.template":["stc"],"application/vnd.sun.xml.draw":["sxd"],"application/vnd.sun.xml.draw.template":["std"],"application/vnd.sun.xml.impress":["sxi"],"application/vnd.sun.xml.impress.template":["sti"],"application/vnd.sun.xml.math":["sxm"],"application/vnd.sun.xml.writer":["sxw"],"application/vnd.sun.xml.writer.global":["sxg"],"application/vnd.sun.xml.writer.template":["stw"],"application/vnd.sus-calendar":["sus","susp"],"application/vnd.svd":["svd"],"application/vnd.symbian.install":["sis","sisx"],"application/vnd.syncml+xml":["xsm"],"application/vnd.syncml.dm+wbxml":["bdm"],"application/vnd.syncml.dm+xml":["xdm"],"application/vnd.syncml.dmddf+xml":["ddf"],"application/vnd.tao.intent-module-archive":["tao"],"application/vnd.tcpdump.pcap":["pcap","cap","dmp"],"application/vnd.tmobile-livetv":["tmo"],"application/vnd.trid.tpt":["tpt"],"application/vnd.triscape.mxs":["mxs"],"application/vnd.trueapp":["tra"],"application/vnd.ufdl":["ufd","ufdl"],"application/vnd.uiq.theme":["utz"],"application/vnd.umajin":["umj"],"application/vnd.unity":["unityweb"],"application/vnd.uoml+xml":["uoml"],"application/vnd.vcx":["vcx"],"application/vnd.visio":["vsd","vst","vss","vsw"],"application/vnd.visionary":["vis"],"application/vnd.vsf":["vsf"],"application/vnd.wap.wbxml":["wbxml"],"application/vnd.wap.wmlc":["wmlc"],"application/vnd.wap.wmlscriptc":["wmlsc"],"application/vnd.webturbo":["wtb"],"application/vnd.wolfram.player":["nbp"],"application/vnd.wordperfect":["wpd"],"application/vnd.wqd":["wqd"],"application/vnd.wt.stf":["stf"],"application/vnd.xara":["xar"],"application/vnd.xfdl":["xfdl"],"application/vnd.yamaha.hv-dic":["hvd"],"application/vnd.yamaha.hv-script":["hvs"],"application/vnd.yamaha.hv-voice":["hvp"],"application/vnd.yamaha.openscoreformat":["osf"],"application/vnd.yamaha.openscoreformat.osfpvg+xml":["osfpvg"],"application/vnd.yamaha.smaf-audio":["saf"],"application/vnd.yamaha.smaf-phrase":["spf"],"application/vnd.yellowriver-custom-menu":["cmp"],"application/vnd.zul":["zir","zirz"],"application/vnd.zzazz.deck+xml":["zaz"],"application/x-7z-compressed":["7z"],"application/x-abiword":["abw"],"application/x-ace-compressed":["ace"],"application/x-apple-diskimage":["*dmg"],"application/x-arj":["arj"],"application/x-authorware-bin":["aab","x32","u32","vox"],"application/x-authorware-map":["aam"],"application/x-authorware-seg":["aas"],"application/x-bcpio":["bcpio"],"application/x-bdoc":["*bdoc"],"application/x-bittorrent":["torrent"],"application/x-blorb":["blb","blorb"],"application/x-bzip":["bz"],"application/x-bzip2":["bz2","boz"],"application/x-cbr":["cbr","cba","cbt","cbz","cb7"],"application/x-cdlink":["vcd"],"application/x-cfs-compressed":["cfs"],"application/x-chat":["chat"],"application/x-chess-pgn":["pgn"],"application/x-chrome-extension":["crx"],"application/x-cocoa":["cco"],"application/x-conference":["nsc"],"application/x-cpio":["cpio"],"application/x-csh":["csh"],"application/x-debian-package":["*deb","udeb"],"application/x-dgc-compressed":["dgc"],"application/x-director":["dir","dcr","dxr","cst","cct","cxt","w3d","fgd","swa"],"application/x-doom":["wad"],"application/x-dtbncx+xml":["ncx"],"application/x-dtbook+xml":["dtb"],"application/x-dtbresource+xml":["res"],"application/x-dvi":["dvi"],"application/x-envoy":["evy"],"application/x-eva":["eva"],"application/x-font-bdf":["bdf"],"application/x-font-ghostscript":["gsf"],"application/x-font-linux-psf":["psf"],"application/x-font-pcf":["pcf"],"application/x-font-snf":["snf"],"application/x-font-type1":["pfa","pfb","pfm","afm"],"application/x-freearc":["arc"],"application/x-futuresplash":["spl"],"application/x-gca-compressed":["gca"],"application/x-glulx":["ulx"],"application/x-gnumeric":["gnumeric"],"application/x-gramps-xml":["gramps"],"application/x-gtar":["gtar"],"application/x-hdf":["hdf"],"application/x-httpd-php":["php"],"application/x-install-instructions":["install"],"application/x-iso9660-image":["*iso"],"application/x-iwork-keynote-sffkey":["*key"],"application/x-iwork-numbers-sffnumbers":["*numbers"],"application/x-iwork-pages-sffpages":["*pages"],"application/x-java-archive-diff":["jardiff"],"application/x-java-jnlp-file":["jnlp"],"application/x-keepass2":["kdbx"],"application/x-latex":["latex"],"application/x-lua-bytecode":["luac"],"application/x-lzh-compressed":["lzh","lha"],"application/x-makeself":["run"],"application/x-mie":["mie"],"application/x-mobipocket-ebook":["prc","mobi"],"application/x-ms-application":["application"],"application/x-ms-shortcut":["lnk"],"application/x-ms-wmd":["wmd"],"application/x-ms-wmz":["wmz"],"application/x-ms-xbap":["xbap"],"application/x-msaccess":["mdb"],"application/x-msbinder":["obd"],"application/x-mscardfile":["crd"],"application/x-msclip":["clp"],"application/x-msdos-program":["*exe"],"application/x-msdownload":["*exe","*dll","com","bat","*msi"],"application/x-msmediaview":["mvb","m13","m14"],"application/x-msmetafile":["*wmf","*wmz","*emf","emz"],"application/x-msmoney":["mny"],"application/x-mspublisher":["pub"],"application/x-msschedule":["scd"],"application/x-msterminal":["trm"],"application/x-mswrite":["wri"],"application/x-netcdf":["nc","cdf"],"application/x-ns-proxy-autoconfig":["pac"],"application/x-nzb":["nzb"],"application/x-perl":["pl","pm"],"application/x-pilot":["*prc","*pdb"],"application/x-pkcs12":["p12","pfx"],"application/x-pkcs7-certificates":["p7b","spc"],"application/x-pkcs7-certreqresp":["p7r"],"application/x-rar-compressed":["*rar"],"application/x-redhat-package-manager":["rpm"],"application/x-research-info-systems":["ris"],"application/x-sea":["sea"],"application/x-sh":["sh"],"application/x-shar":["shar"],"application/x-shockwave-flash":["swf"],"application/x-silverlight-app":["xap"],"application/x-sql":["sql"],"application/x-stuffit":["sit"],"application/x-stuffitx":["sitx"],"application/x-subrip":["srt"],"application/x-sv4cpio":["sv4cpio"],"application/x-sv4crc":["sv4crc"],"application/x-t3vm-image":["t3"],"application/x-tads":["gam"],"application/x-tar":["tar"],"application/x-tcl":["tcl","tk"],"application/x-tex":["tex"],"application/x-tex-tfm":["tfm"],"application/x-texinfo":["texinfo","texi"],"application/x-tgif":["*obj"],"application/x-ustar":["ustar"],"application/x-virtualbox-hdd":["hdd"],"application/x-virtualbox-ova":["ova"],"application/x-virtualbox-ovf":["ovf"],"application/x-virtualbox-vbox":["vbox"],"application/x-virtualbox-vbox-extpack":["vbox-extpack"],"application/x-virtualbox-vdi":["vdi"],"application/x-virtualbox-vhd":["vhd"],"application/x-virtualbox-vmdk":["vmdk"],"application/x-wais-source":["src"],"application/x-web-app-manifest+json":["webapp"],"application/x-x509-ca-cert":["der","crt","pem"],"application/x-xfig":["fig"],"application/x-xliff+xml":["*xlf"],"application/x-xpinstall":["xpi"],"application/x-xz":["xz"],"application/x-zmachine":["z1","z2","z3","z4","z5","z6","z7","z8"],"audio/vnd.dece.audio":["uva","uvva"],"audio/vnd.digital-winds":["eol"],"audio/vnd.dra":["dra"],"audio/vnd.dts":["dts"],"audio/vnd.dts.hd":["dtshd"],"audio/vnd.lucent.voice":["lvp"],"audio/vnd.ms-playready.media.pya":["pya"],"audio/vnd.nuera.ecelp4800":["ecelp4800"],"audio/vnd.nuera.ecelp7470":["ecelp7470"],"audio/vnd.nuera.ecelp9600":["ecelp9600"],"audio/vnd.rip":["rip"],"audio/x-aac":["aac"],"audio/x-aiff":["aif","aiff","aifc"],"audio/x-caf":["caf"],"audio/x-flac":["flac"],"audio/x-m4a":["*m4a"],"audio/x-matroska":["mka"],"audio/x-mpegurl":["m3u"],"audio/x-ms-wax":["wax"],"audio/x-ms-wma":["wma"],"audio/x-pn-realaudio":["ram","ra"],"audio/x-pn-realaudio-plugin":["rmp"],"audio/x-realaudio":["*ra"],"audio/x-wav":["*wav"],"chemical/x-cdx":["cdx"],"chemical/x-cif":["cif"],"chemical/x-cmdf":["cmdf"],"chemical/x-cml":["cml"],"chemical/x-csml":["csml"],"chemical/x-xyz":["xyz"],"image/prs.btif":["btif"],"image/prs.pti":["pti"],"image/vnd.adobe.photoshop":["psd"],"image/vnd.airzip.accelerator.azv":["azv"],"image/vnd.dece.graphic":["uvi","uvvi","uvg","uvvg"],"image/vnd.djvu":["djvu","djv"],"image/vnd.dvb.subtitle":["*sub"],"image/vnd.dwg":["dwg"],"image/vnd.dxf":["dxf"],"image/vnd.fastbidsheet":["fbs"],"image/vnd.fpx":["fpx"],"image/vnd.fst":["fst"],"image/vnd.fujixerox.edmics-mmr":["mmr"],"image/vnd.fujixerox.edmics-rlc":["rlc"],"image/vnd.microsoft.icon":["ico"],"image/vnd.ms-dds":["dds"],"image/vnd.ms-modi":["mdi"],"image/vnd.ms-photo":["wdp"],"image/vnd.net-fpx":["npx"],"image/vnd.pco.b16":["b16"],"image/vnd.tencent.tap":["tap"],"image/vnd.valve.source.texture":["vtf"],"image/vnd.wap.wbmp":["wbmp"],"image/vnd.xiff":["xif"],"image/vnd.zbrush.pcx":["pcx"],"image/x-3ds":["3ds"],"image/x-cmu-raster":["ras"],"image/x-cmx":["cmx"],"image/x-freehand":["fh","fhc","fh4","fh5","fh7"],"image/x-icon":["*ico"],"image/x-jng":["jng"],"image/x-mrsid-image":["sid"],"image/x-ms-bmp":["*bmp"],"image/x-pcx":["*pcx"],"image/x-pict":["pic","pct"],"image/x-portable-anymap":["pnm"],"image/x-portable-bitmap":["pbm"],"image/x-portable-graymap":["pgm"],"image/x-portable-pixmap":["ppm"],"image/x-rgb":["rgb"],"image/x-tga":["tga"],"image/x-xbitmap":["xbm"],"image/x-xpixmap":["xpm"],"image/x-xwindowdump":["xwd"],"message/vnd.wfa.wsc":["wsc"],"model/vnd.collada+xml":["dae"],"model/vnd.dwf":["dwf"],"model/vnd.gdl":["gdl"],"model/vnd.gtw":["gtw"],"model/vnd.mts":["mts"],"model/vnd.opengex":["ogex"],"model/vnd.parasolid.transmit.binary":["x_b"],"model/vnd.parasolid.transmit.text":["x_t"],"model/vnd.sap.vds":["vds"],"model/vnd.usdz+zip":["usdz"],"model/vnd.valve.source.compiled-map":["bsp"],"model/vnd.vtu":["vtu"],"text/prs.lines.tag":["dsc"],"text/vnd.curl":["curl"],"text/vnd.curl.dcurl":["dcurl"],"text/vnd.curl.mcurl":["mcurl"],"text/vnd.curl.scurl":["scurl"],"text/vnd.dvb.subtitle":["sub"],"text/vnd.fly":["fly"],"text/vnd.fmi.flexstor":["flx"],"text/vnd.graphviz":["gv"],"text/vnd.in3d.3dml":["3dml"],"text/vnd.in3d.spot":["spot"],"text/vnd.sun.j2me.app-descriptor":["jad"],"text/vnd.wap.wml":["wml"],"text/vnd.wap.wmlscript":["wmls"],"text/x-asm":["s","asm"],"text/x-c":["c","cc","cxx","cpp","h","hh","dic"],"text/x-component":["htc"],"text/x-fortran":["f","for","f77","f90"],"text/x-handlebars-template":["hbs"],"text/x-java-source":["java"],"text/x-lua":["lua"],"text/x-markdown":["mkd"],"text/x-nfo":["nfo"],"text/x-opml":["opml"],"text/x-org":["*org"],"text/x-pascal":["p","pas"],"text/x-processing":["pde"],"text/x-sass":["sass"],"text/x-scss":["scss"],"text/x-setext":["etx"],"text/x-sfv":["sfv"],"text/x-suse-ymp":["ymp"],"text/x-uuencode":["uu"],"text/x-vcalendar":["vcs"],"text/x-vcard":["vcf"],"video/vnd.dece.hd":["uvh","uvvh"],"video/vnd.dece.mobile":["uvm","uvvm"],"video/vnd.dece.pd":["uvp","uvvp"],"video/vnd.dece.sd":["uvs","uvvs"],"video/vnd.dece.video":["uvv","uvvv"],"video/vnd.dvb.file":["dvb"],"video/vnd.fvt":["fvt"],"video/vnd.mpegurl":["mxu","m4u"],"video/vnd.ms-playready.media.pyv":["pyv"],"video/vnd.uvvu.mp4":["uvu","uvvu"],"video/vnd.vivo":["viv"],"video/x-f4v":["f4v"],"video/x-fli":["fli"],"video/x-flv":["flv"],"video/x-m4v":["m4v"],"video/x-matroska":["mkv","mk3d","mks"],"video/x-mng":["mng"],"video/x-ms-asf":["asf","asx"],"video/x-ms-vob":["vob"],"video/x-ms-wm":["wm"],"video/x-ms-wmv":["wmv"],"video/x-ms-wmx":["wmx"],"video/x-ms-wvx":["wvx"],"video/x-msvideo":["avi"],"video/x-sgi-movie":["movie"],"video/x-smv":["smv"],"x-conference/x-cooltalk":["ice"]}; \ No newline at end of file diff --git a/node_modules/mime/types/standard.js b/node_modules/mime/types/standard.js new file mode 100644 index 00000000..5ee9937e --- /dev/null +++ b/node_modules/mime/types/standard.js @@ -0,0 +1 @@ +module.exports = {"application/andrew-inset":["ez"],"application/applixware":["aw"],"application/atom+xml":["atom"],"application/atomcat+xml":["atomcat"],"application/atomdeleted+xml":["atomdeleted"],"application/atomsvc+xml":["atomsvc"],"application/atsc-dwd+xml":["dwd"],"application/atsc-held+xml":["held"],"application/atsc-rsat+xml":["rsat"],"application/bdoc":["bdoc"],"application/calendar+xml":["xcs"],"application/ccxml+xml":["ccxml"],"application/cdfx+xml":["cdfx"],"application/cdmi-capability":["cdmia"],"application/cdmi-container":["cdmic"],"application/cdmi-domain":["cdmid"],"application/cdmi-object":["cdmio"],"application/cdmi-queue":["cdmiq"],"application/cu-seeme":["cu"],"application/dash+xml":["mpd"],"application/davmount+xml":["davmount"],"application/docbook+xml":["dbk"],"application/dssc+der":["dssc"],"application/dssc+xml":["xdssc"],"application/ecmascript":["es","ecma"],"application/emma+xml":["emma"],"application/emotionml+xml":["emotionml"],"application/epub+zip":["epub"],"application/exi":["exi"],"application/express":["exp"],"application/fdt+xml":["fdt"],"application/font-tdpfr":["pfr"],"application/geo+json":["geojson"],"application/gml+xml":["gml"],"application/gpx+xml":["gpx"],"application/gxf":["gxf"],"application/gzip":["gz"],"application/hjson":["hjson"],"application/hyperstudio":["stk"],"application/inkml+xml":["ink","inkml"],"application/ipfix":["ipfix"],"application/its+xml":["its"],"application/java-archive":["jar","war","ear"],"application/java-serialized-object":["ser"],"application/java-vm":["class"],"application/javascript":["js","mjs"],"application/json":["json","map"],"application/json5":["json5"],"application/jsonml+json":["jsonml"],"application/ld+json":["jsonld"],"application/lgr+xml":["lgr"],"application/lost+xml":["lostxml"],"application/mac-binhex40":["hqx"],"application/mac-compactpro":["cpt"],"application/mads+xml":["mads"],"application/manifest+json":["webmanifest"],"application/marc":["mrc"],"application/marcxml+xml":["mrcx"],"application/mathematica":["ma","nb","mb"],"application/mathml+xml":["mathml"],"application/mbox":["mbox"],"application/mediaservercontrol+xml":["mscml"],"application/metalink+xml":["metalink"],"application/metalink4+xml":["meta4"],"application/mets+xml":["mets"],"application/mmt-aei+xml":["maei"],"application/mmt-usd+xml":["musd"],"application/mods+xml":["mods"],"application/mp21":["m21","mp21"],"application/mp4":["mp4s","m4p"],"application/msword":["doc","dot"],"application/mxf":["mxf"],"application/n-quads":["nq"],"application/n-triples":["nt"],"application/node":["cjs"],"application/octet-stream":["bin","dms","lrf","mar","so","dist","distz","pkg","bpk","dump","elc","deploy","exe","dll","deb","dmg","iso","img","msi","msp","msm","buffer"],"application/oda":["oda"],"application/oebps-package+xml":["opf"],"application/ogg":["ogx"],"application/omdoc+xml":["omdoc"],"application/onenote":["onetoc","onetoc2","onetmp","onepkg"],"application/oxps":["oxps"],"application/p2p-overlay+xml":["relo"],"application/patch-ops-error+xml":["xer"],"application/pdf":["pdf"],"application/pgp-encrypted":["pgp"],"application/pgp-signature":["asc","sig"],"application/pics-rules":["prf"],"application/pkcs10":["p10"],"application/pkcs7-mime":["p7m","p7c"],"application/pkcs7-signature":["p7s"],"application/pkcs8":["p8"],"application/pkix-attr-cert":["ac"],"application/pkix-cert":["cer"],"application/pkix-crl":["crl"],"application/pkix-pkipath":["pkipath"],"application/pkixcmp":["pki"],"application/pls+xml":["pls"],"application/postscript":["ai","eps","ps"],"application/provenance+xml":["provx"],"application/pskc+xml":["pskcxml"],"application/raml+yaml":["raml"],"application/rdf+xml":["rdf","owl"],"application/reginfo+xml":["rif"],"application/relax-ng-compact-syntax":["rnc"],"application/resource-lists+xml":["rl"],"application/resource-lists-diff+xml":["rld"],"application/rls-services+xml":["rs"],"application/route-apd+xml":["rapd"],"application/route-s-tsid+xml":["sls"],"application/route-usd+xml":["rusd"],"application/rpki-ghostbusters":["gbr"],"application/rpki-manifest":["mft"],"application/rpki-roa":["roa"],"application/rsd+xml":["rsd"],"application/rss+xml":["rss"],"application/rtf":["rtf"],"application/sbml+xml":["sbml"],"application/scvp-cv-request":["scq"],"application/scvp-cv-response":["scs"],"application/scvp-vp-request":["spq"],"application/scvp-vp-response":["spp"],"application/sdp":["sdp"],"application/senml+xml":["senmlx"],"application/sensml+xml":["sensmlx"],"application/set-payment-initiation":["setpay"],"application/set-registration-initiation":["setreg"],"application/shf+xml":["shf"],"application/sieve":["siv","sieve"],"application/smil+xml":["smi","smil"],"application/sparql-query":["rq"],"application/sparql-results+xml":["srx"],"application/srgs":["gram"],"application/srgs+xml":["grxml"],"application/sru+xml":["sru"],"application/ssdl+xml":["ssdl"],"application/ssml+xml":["ssml"],"application/swid+xml":["swidtag"],"application/tei+xml":["tei","teicorpus"],"application/thraud+xml":["tfi"],"application/timestamped-data":["tsd"],"application/toml":["toml"],"application/trig":["trig"],"application/ttml+xml":["ttml"],"application/ubjson":["ubj"],"application/urc-ressheet+xml":["rsheet"],"application/urc-targetdesc+xml":["td"],"application/voicexml+xml":["vxml"],"application/wasm":["wasm"],"application/widget":["wgt"],"application/winhlp":["hlp"],"application/wsdl+xml":["wsdl"],"application/wspolicy+xml":["wspolicy"],"application/xaml+xml":["xaml"],"application/xcap-att+xml":["xav"],"application/xcap-caps+xml":["xca"],"application/xcap-diff+xml":["xdf"],"application/xcap-el+xml":["xel"],"application/xcap-ns+xml":["xns"],"application/xenc+xml":["xenc"],"application/xhtml+xml":["xhtml","xht"],"application/xliff+xml":["xlf"],"application/xml":["xml","xsl","xsd","rng"],"application/xml-dtd":["dtd"],"application/xop+xml":["xop"],"application/xproc+xml":["xpl"],"application/xslt+xml":["*xsl","xslt"],"application/xspf+xml":["xspf"],"application/xv+xml":["mxml","xhvml","xvml","xvm"],"application/yang":["yang"],"application/yin+xml":["yin"],"application/zip":["zip"],"audio/3gpp":["*3gpp"],"audio/adpcm":["adp"],"audio/amr":["amr"],"audio/basic":["au","snd"],"audio/midi":["mid","midi","kar","rmi"],"audio/mobile-xmf":["mxmf"],"audio/mp3":["*mp3"],"audio/mp4":["m4a","mp4a"],"audio/mpeg":["mpga","mp2","mp2a","mp3","m2a","m3a"],"audio/ogg":["oga","ogg","spx","opus"],"audio/s3m":["s3m"],"audio/silk":["sil"],"audio/wav":["wav"],"audio/wave":["*wav"],"audio/webm":["weba"],"audio/xm":["xm"],"font/collection":["ttc"],"font/otf":["otf"],"font/ttf":["ttf"],"font/woff":["woff"],"font/woff2":["woff2"],"image/aces":["exr"],"image/apng":["apng"],"image/avif":["avif"],"image/bmp":["bmp"],"image/cgm":["cgm"],"image/dicom-rle":["drle"],"image/emf":["emf"],"image/fits":["fits"],"image/g3fax":["g3"],"image/gif":["gif"],"image/heic":["heic"],"image/heic-sequence":["heics"],"image/heif":["heif"],"image/heif-sequence":["heifs"],"image/hej2k":["hej2"],"image/hsj2":["hsj2"],"image/ief":["ief"],"image/jls":["jls"],"image/jp2":["jp2","jpg2"],"image/jpeg":["jpeg","jpg","jpe"],"image/jph":["jph"],"image/jphc":["jhc"],"image/jpm":["jpm"],"image/jpx":["jpx","jpf"],"image/jxr":["jxr"],"image/jxra":["jxra"],"image/jxrs":["jxrs"],"image/jxs":["jxs"],"image/jxsc":["jxsc"],"image/jxsi":["jxsi"],"image/jxss":["jxss"],"image/ktx":["ktx"],"image/ktx2":["ktx2"],"image/png":["png"],"image/sgi":["sgi"],"image/svg+xml":["svg","svgz"],"image/t38":["t38"],"image/tiff":["tif","tiff"],"image/tiff-fx":["tfx"],"image/webp":["webp"],"image/wmf":["wmf"],"message/disposition-notification":["disposition-notification"],"message/global":["u8msg"],"message/global-delivery-status":["u8dsn"],"message/global-disposition-notification":["u8mdn"],"message/global-headers":["u8hdr"],"message/rfc822":["eml","mime"],"model/3mf":["3mf"],"model/gltf+json":["gltf"],"model/gltf-binary":["glb"],"model/iges":["igs","iges"],"model/mesh":["msh","mesh","silo"],"model/mtl":["mtl"],"model/obj":["obj"],"model/step+xml":["stpx"],"model/step+zip":["stpz"],"model/step-xml+zip":["stpxz"],"model/stl":["stl"],"model/vrml":["wrl","vrml"],"model/x3d+binary":["*x3db","x3dbz"],"model/x3d+fastinfoset":["x3db"],"model/x3d+vrml":["*x3dv","x3dvz"],"model/x3d+xml":["x3d","x3dz"],"model/x3d-vrml":["x3dv"],"text/cache-manifest":["appcache","manifest"],"text/calendar":["ics","ifb"],"text/coffeescript":["coffee","litcoffee"],"text/css":["css"],"text/csv":["csv"],"text/html":["html","htm","shtml"],"text/jade":["jade"],"text/jsx":["jsx"],"text/less":["less"],"text/markdown":["markdown","md"],"text/mathml":["mml"],"text/mdx":["mdx"],"text/n3":["n3"],"text/plain":["txt","text","conf","def","list","log","in","ini"],"text/richtext":["rtx"],"text/rtf":["*rtf"],"text/sgml":["sgml","sgm"],"text/shex":["shex"],"text/slim":["slim","slm"],"text/spdx":["spdx"],"text/stylus":["stylus","styl"],"text/tab-separated-values":["tsv"],"text/troff":["t","tr","roff","man","me","ms"],"text/turtle":["ttl"],"text/uri-list":["uri","uris","urls"],"text/vcard":["vcard"],"text/vtt":["vtt"],"text/xml":["*xml"],"text/yaml":["yaml","yml"],"video/3gpp":["3gp","3gpp"],"video/3gpp2":["3g2"],"video/h261":["h261"],"video/h263":["h263"],"video/h264":["h264"],"video/iso.segment":["m4s"],"video/jpeg":["jpgv"],"video/jpm":["*jpm","jpgm"],"video/mj2":["mj2","mjp2"],"video/mp2t":["ts"],"video/mp4":["mp4","mp4v","mpg4"],"video/mpeg":["mpeg","mpg","mpe","m1v","m2v"],"video/ogg":["ogv"],"video/quicktime":["qt","mov"],"video/webm":["webm"]}; \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..3830d447 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,27 @@ +{ + "name": "a2-aarshzadaphiya", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "a2-aarshzadaphiya", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "mime": "^2.4.4" + } + }, + "node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + } + } +} diff --git a/package.json b/package.json index 988f135f..c47dce93 100644 --- a/package.json +++ b/package.json @@ -1,12 +1,15 @@ { - "name": "", - "version": "", - "description": "", + "name": "a2-aarshzadaphiya", + "description": "Assignment 2 - Short Stack: Basic Two-tier Web Application using HTML/CSS/JS and Node.js ===", "author": "", "scripts": { "start": "node server.improved.js" }, "dependencies": { "mime": "^2.4.4" - } + }, + "version": "1.0.0", + "main": "server.improved.js", + "keywords": [], + "license": "ISC" } diff --git a/public/css/main.css b/public/css/main.css index 7cf6207b..39891120 100644 --- a/public/css/main.css +++ b/public/css/main.css @@ -1,4 +1,31 @@ body { - background:black; - color:white; + font-family: Arial, Helvetica, sans-serif; + text-align: center; + padding: 0; + margin: 0; +} + +h1{ + color:#333; +} + +form{ + margin-top: 20px; +} + +label{ + font-weight: bold; +} + +input[type="text"]{ + padding: 5px; + width: 200px; +} + +button{ + padding: 5px 10px; + background-color: #333; + color: white; + border: none; + cursor: pointer; } \ No newline at end of file diff --git a/public/index.html b/public/index.html index b6de0443..9f484c2b 100644 --- a/public/index.html +++ b/public/index.html @@ -1,7 +1,7 @@ - CS4241 Assignment 2 + Grocery List Generator @@ -10,9 +10,26 @@ -
- - +

To Do List Form

+ + + + + + + + + + + + +
+ + + +
+ + diff --git a/public/js/main.js b/public/js/main.js index a569258f..31f909a0 100644 --- a/public/js/main.js +++ b/public/js/main.js @@ -7,13 +7,18 @@ const submit = async function( event ) { // remains to this day event.preventDefault() - const input = document.querySelector( '#yourname' ), - json = { yourname: input.value }, + const taskName= document.querySelector( '#taskName' ), + dueDate= document.querySelector('#dueDate'), + taskPriority= document.querySelector('#taskPriority') + json = { tasks: taskName.value , date: dueDate.value , priority: taskPriority.value }, body = JSON.stringify( json ) - - const response = await fetch( '/submit', { + fetch( '/submit', { method:'POST', body + }).then(async function (response){ //console.log(response) + console.log("hello world") + let data= await response.json() + console.log(data) }) const text = await response.text() diff --git a/server.improved.js b/server.improved.js index 9ac27fb8..36ddac37 100644 --- a/server.improved.js +++ b/server.improved.js @@ -9,9 +9,8 @@ const http = require( 'http' ), port = 3000 const appdata = [ - { 'model': 'toyota', 'year': 1999, 'mpg': 23 }, - { 'model': 'honda', 'year': 2004, 'mpg': 30 }, - { 'model': 'ford', 'year': 1987, 'mpg': 14} + + ] const server = http.createServer( function( request,response ) { @@ -40,12 +39,16 @@ const handlePost = function( request, response ) { }) request.on( 'end', function() { - console.log( JSON.parse( dataString ) ) + //console.log( JSON.parse( dataString ) ) // ... do something with the data here!!! - + + let newData= JSON.parse(dataString) + appdata.push (newData) + // console.log(appdata) response.writeHead( 200, "OK", {'Content-Type': 'text/plain' }) - response.end('test') + response.write(JSON.stringify(appdata)) + response.end() }) } From 9c714e71ecc09758aa738039b2041b67d360b03e Mon Sep 17 00:00:00 2001 From: AarshZadaphiya Date: Fri, 8 Sep 2023 10:20:31 -0400 Subject: [PATCH 02/23] Can take data update --- public/js/main.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/public/js/main.js b/public/js/main.js index 31f909a0..b323ce38 100644 --- a/public/js/main.js +++ b/public/js/main.js @@ -20,10 +20,6 @@ const submit = async function( event ) { let data= await response.json() console.log(data) }) - - const text = await response.text() - - console.log( 'text:', text ) } window.onload = function() { From 2445f2376cca0aef178f8103e93d2a8cccbe6622 Mon Sep 17 00:00:00 2001 From: AarshZadaphiya Date: Fri, 8 Sep 2023 22:52:54 -0400 Subject: [PATCH 03/23] More Update --- public/index.html | 2 +- public/js/main.js | 40 +++++++++++++++++++++++++++++++++------- server.improved.js | 10 ++++------ 3 files changed, 38 insertions(+), 14 deletions(-) diff --git a/public/index.html b/public/index.html index 9f484c2b..21c6a668 100644 --- a/public/index.html +++ b/public/index.html @@ -13,7 +13,7 @@

To Do List Form

-
+ diff --git a/public/js/main.js b/public/js/main.js index b323ce38..8672100d 100644 --- a/public/js/main.js +++ b/public/js/main.js @@ -1,4 +1,12 @@ -// FRONT-END (CLIENT) JAVASCRIPT HERE +const list = document.createElement('ul') + +/*data.map( d => d.model ) + .map( d => d[0].toUpperCase() + d.slice(1) ) + .forEach( d => { + const li = document.createElement('li') + li.innerText = d + list.appendChild( li ) + })*/// FRONT-END (CLIENT) JAVASCRIPT HERE const submit = async function( event ) { // stop form submission from trying to load @@ -10,17 +18,35 @@ const submit = async function( event ) { const taskName= document.querySelector( '#taskName' ), dueDate= document.querySelector('#dueDate'), taskPriority= document.querySelector('#taskPriority') - json = { tasks: taskName.value , date: dueDate.value , priority: taskPriority.value }, - body = JSON.stringify( json ) + + const json = { tasks: taskName.value , date: dueDate.value , priority: taskPriority.value }; + + console.log(json); + fetch( '/submit', { method:'POST', - body + body: JSON.stringify(json) + }).then(async function (response){ //console.log(response) - console.log("hello world") + //console.log("hello world") let data= await response.json() console.log(data) - }) -} + + const list = document.createElement('ul') + + for (const key in data) { + if (data.hasOwnProperty(key)) { + const li = document.createElement('li'); + li.innerText = `${key}: ${data[key]}`; + list.appendChild(li); + } + } + const resultContainer = document.querySelector('#result'); + resultContainer.innerHTML = ''; + resultContainer.appendChild(list); + }) + } + window.onload = function() { const button = document.querySelector("button"); diff --git a/server.improved.js b/server.improved.js index 36ddac37..53633cdd 100644 --- a/server.improved.js +++ b/server.improved.js @@ -8,9 +8,7 @@ const http = require( 'http' ), dir = 'public/', port = 3000 -const appdata = [ - - +let appdata = [ ] const server = http.createServer( function( request,response ) { @@ -39,12 +37,12 @@ const handlePost = function( request, response ) { }) request.on( 'end', function() { - //console.log( JSON.parse( dataString ) ) + console.log( dataString ) // ... do something with the data here!!! - let newData= JSON.parse(dataString) - appdata.push (newData) + //let newData= JSON.parse(dataString) + //appdata.push (newData) // console.log(appdata) response.writeHead( 200, "OK", {'Content-Type': 'text/plain' }) response.write(JSON.stringify(appdata)) From 4c282e6bea924f90a9ce3baf4e8973e97a1f0bc0 Mon Sep 17 00:00:00 2001 From: AarshZadaphiya Date: Sun, 10 Sep 2023 15:34:10 -0400 Subject: [PATCH 04/23] CSS Selectors Update --- public/index.html | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/public/index.html b/public/index.html index 21c6a668..b41e93c0 100644 --- a/public/index.html +++ b/public/index.html @@ -1,7 +1,7 @@ - Grocery List Generator + TO Do List Generator @@ -10,20 +10,22 @@ -

To Do List Form

+

To Do List Form

- - - + + - - + + - - + + - + + + + From e43d2910fc832222f8a9f61ff917e15dd23ae35e Mon Sep 17 00:00:00 2001 From: AarshZadaphiya Date: Sun, 10 Sep 2023 20:55:52 -0400 Subject: [PATCH 05/23] Progress --- README.md | 82 ----------------------------------------------- public/js/main.js | 2 ++ 2 files changed, 2 insertions(+), 82 deletions(-) diff --git a/README.md b/README.md index 493995c1..27918b92 100644 --- a/README.md +++ b/README.md @@ -1,82 +1,4 @@ Assignment 2 - Short Stack: Basic Two-tier Web Application using HTML/CSS/JS and Node.js -=== - -Due: September 11th, by 11:59 AM. - -This assignment aims to introduce you to creating a prototype two-tiered web application. -Your application will include the use of HTML, CSS, JavaScript, and Node.js functionality, with active communication between the client and the server over the life of a user session. - -Baseline Requirements ---- - -There is a large range of application areas and possibilities that meet these baseline requirements. -Try to make your application do something useful! A todo list, storing / retrieving high scores for a very simple game... have a little fun with it. - -Your application is required to implement the following functionalities: - -- a `Server` which not only serves files, but also maintains a tabular dataset with 3 or more fields related to your application -- a `Results` functionality which shows the entire dataset residing in the server's memory -- a `Form/Entry` functionality which allows a user to add or delete data items residing in the server's memory -- a `Server Logic` which, upon receiving new or modified "incoming" data, includes and uses a function that adds at least one additional derived field to this incoming data before integrating it with the existing dataset -- the `Derived field` for a new row of data must be computed based on fields already existing in the row. -For example, a `todo` dataset with `task`, `priority`, and `creation_date` may generate a new field `deadline` by looking at `creation_date` and `priority` - -Your application is required to demonstrate the use of the following concepts: - -HTML: -- One or more [HTML Forms](https://developer.mozilla.org/en-US/docs/Learn/HTML/Forms), with any combination of form tags appropriate for the user input portion of the application -- A results page displaying all data currently available on the server. You will most likely use a `
` tag for this, but `
    ` or `
      ` could also work and might be simpler to work with. Alternatively, you can create a single-page app (see Technical Acheivements) but this is not a requirement. -- All pages should [validate](https://validator.w3.org) -- If your app contains multple pages, they should all be accessible from the homepage (index.html) - -CSS: -- CSS styling of the primary visual elements in the application -- Various CSS Selector functionality must be demonstrated: - - Element selectors - - ID selectors - - Class selectors -- CSS positioning and styling of the primary visual elements in the application: - - Use of either a CSS grid or flexbox for layout - - Rules defining fonts for all text used; no default fonts! Be sure to use a web safe font or a font from a web service like [Google Fonts](http://fonts.google.com/) - -- CSS defined in a maintainable, readable form, in external stylesheets - -JavaScript: -- At minimum, a small amount of front-end JavaScript to get / fetch data from the server; a sample is provided in this repository. - -Node.js: -- An HTTP Server that delivers all necessary files and data for the application, and also creates the required `Derived Fields` in your data. -A starting point is provided in this repository. - -Deliverables ---- - -Do the following to complete this assignment and acheive a base grade of 85%: - -1. Fork the starting project code (make sure to fork the 2023 repo!). This repo contains some starter code that may be used or discarded as needed. -2. Implement your project with the above requirements. -3. Test your project to make sure that when someone goes to your main page, it displays correctly. -4. Deploy your project to Glitch, and fill in the appropriate fields in your package.json file. -5. Ensure that your project has the proper naming scheme `a2-yourGithubUsername` so we can find it. -6. Modify the README to the specifications below, and delete all of the instructions originally found in this README. -7. Create and submit a Pull Request to the original repo. Label the pull request as follows: a2-gitusername-firstname-lastname - -Acheivements ---- - -Below are suggested technical and design achievements. You can use these to help boost your grade up to an A and customize the assignment to your personal interests. These are recommended acheivements, but feel free to create/implement your own... just make sure you thoroughly describe what you did in your README and why it was challenging. ALL ACHIEVEMENTS MUST BE DESCRIBED IN YOUR README IN ORDER TO GET CREDIT FOR THEM. Remember, the highest grade you can get on any individual assignment is a 100%. - -*Technical* -- (5 points) Create a single-page app that both provides a form for users to submit data and always shows the current state of the server-side data. To put it another way, when the user submits data, the server should respond sending back the updated data (including the derived field calculated on the server) and the client should then update its data display. - -- (5 points) In addition to a form enabling adding and deleting data on the server, also add the ability to modify existing data. - -*Design/UX* -- (5 points per person, with a max of 10 points) Test your user interface with other students in the class. Define a specific task for them to complete (ideally something short that takes <10 minutes), and then use the [think-aloud protocol](https://en.wikipedia.org/wiki/Think_aloud_protocol) to obtain feedback on your design (talk-aloud is also fine). Important considerations when designing your study: - -1. Make sure you start the study by clearly stating the task that you expect your user to accomplish. -2. You shouldn't provide any verbal instructions on how to use your interface / accomplish the task you give them. Make sure that your interface is clear enough that users can figure it out without any instruction, or provide text instructions from within the interface itself. -3. If users get stuck to the point where they give up, you can then provde instruction so that the study can continue, but make sure to discuss this in your README. You won't lose any points for this... all feedback is good feedback! You'll need to use sometype of collaborative software that will enable you both to see the test subject's screen and listen to their voice as they describe their thoughts, or conduct the studies in person. After completing each study, briefly (one to two sentences for each question) address the following in your README: @@ -85,10 +7,6 @@ You'll need to use sometype of collaborative software that will enable you both 3. What comments did they make that surprised you? 4. What would you change about the interface based on their feedback? -*You do not need to actually make changes based on their feedback*. This acheivement is designed to help gain experience testing user interfaces. If you run two user studies, you should answer two sets of questions. - -Sample Readme (delete the above when you're ready to submit, and modify the below so with your links and descriptions) ---- ## Your Web Application Title Include a very brief summary of your project here. Be sure to include the CSS positioning technique you used, and any required instructions to use your application. diff --git a/public/js/main.js b/public/js/main.js index 8672100d..01d3b515 100644 --- a/public/js/main.js +++ b/public/js/main.js @@ -39,6 +39,8 @@ const submit = async function( event ) { const li = document.createElement('li'); li.innerText = `${key}: ${data[key]}`; list.appendChild(li); + console.log(data) + console.log(key) } } const resultContainer = document.querySelector('#result'); From 47f4bb94414bb25e3bab671c44f3655aeb6a06a2 Mon Sep 17 00:00:00 2001 From: AarshZadaphiya Date: Sun, 10 Sep 2023 21:08:30 -0400 Subject: [PATCH 06/23] Progress --- public/css/main.css | 22 ++++++++++++++-------- public/js/main.js | 2 +- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/public/css/main.css b/public/css/main.css index 39891120..7c1d2f82 100644 --- a/public/css/main.css +++ b/public/css/main.css @@ -1,30 +1,36 @@ -body { +/* Styles for the body with class "my-body" */ +.my-body { font-family: Arial, Helvetica, sans-serif; text-align: center; padding: 0; margin: 0; } -h1{ - color:#333; +/* Styles for h1 elements with class "my-heading" */ +.my-heading { + color: #333333; } -form{ +/* Styles for form elements with class "my-form" */ +.my-form { margin-top: 20px; } -label{ +/* Styles for label elements with class "my-label" */ +.my-label { font-weight: bold; } -input[type="text"]{ +/* Styles for input elements of type "text" with class "my-input" */ +.my-input { padding: 5px; width: 200px; } -button{ +/* Styles for button elements with class "my-button" */ +.my-button { padding: 5px 10px; - background-color: #333; + background-color: #333333; color: white; border: none; cursor: pointer; diff --git a/public/js/main.js b/public/js/main.js index 01d3b515..588c53b2 100644 --- a/public/js/main.js +++ b/public/js/main.js @@ -35,12 +35,12 @@ const submit = async function( event ) { const list = document.createElement('ul') for (const key in data) { + console.log(key) if (data.hasOwnProperty(key)) { const li = document.createElement('li'); li.innerText = `${key}: ${data[key]}`; list.appendChild(li); console.log(data) - console.log(key) } } const resultContainer = document.querySelector('#result'); From 8c8a0cf87748c050c44a5b86365a03ca9e6e4706 Mon Sep 17 00:00:00 2001 From: AarshZadaphiya Date: Sun, 10 Sep 2023 21:52:43 -0400 Subject: [PATCH 07/23] Display Data --- public/index.html | 2 +- public/js/main.js | 26 ++++++++++++++++++++------ server.improved.js | 6 +++--- 3 files changed, 24 insertions(+), 10 deletions(-) diff --git a/public/index.html b/public/index.html index b41e93c0..2f8cdb39 100644 --- a/public/index.html +++ b/public/index.html @@ -28,7 +28,7 @@

      To Do List Form

      -
+
diff --git a/public/js/main.js b/public/js/main.js index 588c53b2..15096f34 100644 --- a/public/js/main.js +++ b/public/js/main.js @@ -28,28 +28,42 @@ const submit = async function( event ) { body: JSON.stringify(json) }).then(async function (response){ //console.log(response) - //console.log("hello world") let data= await response.json() console.log(data) - const list = document.createElement('ul') - + + //const list = document.createElement('ul') + let resultListHTML = ''; + +/* for (const key in data) { + console.log(key) + if (data.hasOwnProperty(key)) { + const li = document.createElement('li'); + li.innerText = `${key}: ${data[key]}`; + list.appendChild(li); + console.log(data) + } + } +*/ + for (const key in data) { - console.log(key) + console.log(key); if (data.hasOwnProperty(key)) { const li = document.createElement('li'); - li.innerText = `${key}: ${data[key]}`; + resultListHTML += `
  • ${key}: ${data[key]}
  • `; list.appendChild(li); console.log(data) } } + const resultContainer = document.querySelector('#result'); - resultContainer.innerHTML = ''; + resultContainer.innerHTML = resultListHTML; resultContainer.appendChild(list); }) } + window.onload = function() { const button = document.querySelector("button"); button.onclick = submit; diff --git a/server.improved.js b/server.improved.js index 53633cdd..b1256f42 100644 --- a/server.improved.js +++ b/server.improved.js @@ -41,9 +41,9 @@ const handlePost = function( request, response ) { // ... do something with the data here!!! - //let newData= JSON.parse(dataString) - //appdata.push (newData) - // console.log(appdata) + let newData= JSON.parse(dataString) + appdata.push (newData) + console.log(appdata) response.writeHead( 200, "OK", {'Content-Type': 'text/plain' }) response.write(JSON.stringify(appdata)) response.end() From e7deea4328abb5114e1c5c4822f3651aa698f474 Mon Sep 17 00:00:00 2001 From: AarshZadaphiya Date: Sun, 10 Sep 2023 22:28:49 -0400 Subject: [PATCH 08/23] Update --- public/js/main.js | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/public/js/main.js b/public/js/main.js index 15096f34..47674587 100644 --- a/public/js/main.js +++ b/public/js/main.js @@ -21,7 +21,7 @@ const submit = async function( event ) { const json = { tasks: taskName.value , date: dueDate.value , priority: taskPriority.value }; - console.log(json); + //console.log(json); fetch( '/submit', { method:'POST', @@ -29,7 +29,7 @@ const submit = async function( event ) { }).then(async function (response){ //console.log(response) let data= await response.json() - console.log(data) + //console.log(data) //const list = document.createElement('ul') @@ -47,10 +47,10 @@ const submit = async function( event ) { */ for (const key in data) { - console.log(key); + //console.log(key); if (data.hasOwnProperty(key)) { const li = document.createElement('li'); - resultListHTML += `
  • ${key}: ${data[key]}
  • `; + resultListHTML += `
  • ${key['tasks']}
  • `; list.appendChild(li); console.log(data) } @@ -62,8 +62,6 @@ const submit = async function( event ) { }) } - - window.onload = function() { const button = document.querySelector("button"); button.onclick = submit; From bf826d9abceb614acf63fb9818531aff7bcee11b Mon Sep 17 00:00:00 2001 From: AarshZadaphiya Date: Sun, 10 Sep 2023 22:51:40 -0400 Subject: [PATCH 09/23] Display results on page works --- public/js/main.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/public/js/main.js b/public/js/main.js index 47674587..573edeea 100644 --- a/public/js/main.js +++ b/public/js/main.js @@ -49,9 +49,10 @@ const submit = async function( event ) { for (const key in data) { //console.log(key); if (data.hasOwnProperty(key)) { - const li = document.createElement('li'); - resultListHTML += `
  • ${key['tasks']}
  • `; - list.appendChild(li); + //const li = document.createElement('li'); + resultListHTML += `
  • ${data[key]['tasks']}
  • `; + resultListHTML += `
  • ${data[key]['date']}
  • `; + resultListHTML += `
  • ${data[key]['priority']}
  • `; console.log(data) } } From acdeceb9ee44b8a92e72770b008a8e5d5a750391 Mon Sep 17 00:00:00 2001 From: AarshZadaphiya Date: Mon, 11 Sep 2023 01:35:26 -0400 Subject: [PATCH 10/23] CSS Update --- README.md | 2 +- public/css/main.css | 75 +++++++++++++++++++++++++++++++++++---------- public/index.html | 33 +++++++++++++++++--- public/js/main.js | 12 -------- server.improved.js | 1 + 5 files changed, 88 insertions(+), 35 deletions(-) diff --git a/README.md b/README.md index 27918b92..0fe29d83 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ You'll need to use sometype of collaborative software that will enable you both 4. What would you change about the interface based on their feedback? -## Your Web Application Title +## Web Application Title: To DO List Generator Include a very brief summary of your project here. Be sure to include the CSS positioning technique you used, and any required instructions to use your application. ## Technical Achievements diff --git a/public/css/main.css b/public/css/main.css index 7c1d2f82..df73372a 100644 --- a/public/css/main.css +++ b/public/css/main.css @@ -1,37 +1,78 @@ -/* Styles for the body with class "my-body" */ -.my-body { - font-family: Arial, Helvetica, sans-serif; +body { + font-family: 'Dosis'; text-align: center; - padding: 0; margin: 0; + padding: 0; + background-color: #f9f9f9; + display: flex; + flex-direction: column; + align-items: center; } -/* Styles for h1 elements with class "my-heading" */ .my-heading { - color: #333333; + font-family: 'Dosis'; + font-size: 50px; + font-weight: bold; + color: #bbe4e9; + background: #5585b5; + text-align: center; + padding: 20px; + width: 100%; } -/* Styles for form elements with class "my-form" */ .my-form { - margin-top: 20px; + font-family: 'Dosis'; + width: 100%; } -/* Styles for label elements with class "my-label" */ .my-label { + font-size: 20px; font-weight: bold; } -/* Styles for input elements of type "text" with class "my-input" */ .my-input { - padding: 5px; - width: 200px; + padding: 6px; + width: 100%; + border: 1px solid #53a8b6; + border-radius: 3px; + margin-bottom: 10px; + text-align: center; } -/* Styles for button elements with class "my-button" */ .my-button { - padding: 5px 10px; - background-color: #333333; - color: white; + font-family: 'Dosis'; + font-size: 20px; + padding: 10px 20px; + background-color: #53a8b6; border: none; cursor: pointer; -} \ No newline at end of file + border-radius: 3px; +} + +.my-button:hover { + background-color: #bbe4e9; +} + +.my-table { + font-family: 'Dosis'; + width: 100%; + border-collapse: collapse; +} + +.my-table th, .my-table td { + padding: 12px; + border: 1px solid #ddd; +} + +.my-table th { + background-color: #f2f2f2; + text-align: left; +} + +.my-table tr:nth-child(even) { + background-color: #f9f9f9; +} + +.my-table tr:hover { + background-color: #f2f2f2; +} diff --git a/public/index.html b/public/index.html index 2f8cdb39..789bf848 100644 --- a/public/index.html +++ b/public/index.html @@ -5,7 +5,7 @@ - + @@ -17,7 +17,7 @@

    To Do List Form

    - + @@ -25,12 +25,35 @@

    To Do List Form

    - + - - +
    + +
    + +
    + + + + + + + + + + + + + + + + + +
    TaskDeadlinePriorityRemove
    Example TaskExample DeadlineExample PriorityDelete
    Example Task 2Example Deadline 2Example Priority 2Delete
    + + diff --git a/public/js/main.js b/public/js/main.js index 573edeea..145484a7 100644 --- a/public/js/main.js +++ b/public/js/main.js @@ -35,19 +35,7 @@ const submit = async function( event ) { //const list = document.createElement('ul') let resultListHTML = ''; -/* for (const key in data) { - console.log(key) - if (data.hasOwnProperty(key)) { - const li = document.createElement('li'); - li.innerText = `${key}: ${data[key]}`; - list.appendChild(li); - console.log(data) - } - } -*/ - for (const key in data) { - //console.log(key); if (data.hasOwnProperty(key)) { //const li = document.createElement('li'); resultListHTML += `
  • ${data[key]['tasks']}
  • `; diff --git a/server.improved.js b/server.improved.js index b1256f42..07d1c827 100644 --- a/server.improved.js +++ b/server.improved.js @@ -50,6 +50,7 @@ const handlePost = function( request, response ) { }) } + const sendFile = function( response, filename ) { const type = mime.getType( filename ) From 93e3b00e10ad41fa671fde66863c19602f334fc8 Mon Sep 17 00:00:00 2001 From: AarshZadaphiya Date: Mon, 11 Sep 2023 11:37:37 -0400 Subject: [PATCH 11/23] Table Update --- public/css/main.css | 16 ++++++++++++++++ public/index.html | 15 ++++++++++----- public/js/main.js | 18 ++++++++++++++++++ 3 files changed, 44 insertions(+), 5 deletions(-) diff --git a/public/css/main.css b/public/css/main.css index df73372a..ebe6f03a 100644 --- a/public/css/main.css +++ b/public/css/main.css @@ -53,6 +53,22 @@ body { background-color: #bbe4e9; } +.my-deletebutton { + font-family: 'Dosis'; + font-size: 15px; + padding: 5px 10px; + color: black; + background-color: #dc2f2f; + border: none; + cursor: pointer; + border-radius: 3px; +} + +.my-deletebutton:hover { + color: white; + background-color: #f95959; +} + .my-table { font-family: 'Dosis'; width: 100%; diff --git a/public/index.html b/public/index.html index 789bf848..507a383c 100644 --- a/public/index.html +++ b/public/index.html @@ -33,28 +33,33 @@

    To Do List Form

    + + + + + - + - + + +
    Task Deadline Priority Remove
    Example Task Example Deadline Example PriorityDelete
    Example Task 2 Example Deadline 2 Example Priority 2Delete
    - - - + diff --git a/public/js/main.js b/public/js/main.js index 145484a7..d2b1ada3 100644 --- a/public/js/main.js +++ b/public/js/main.js @@ -45,12 +45,30 @@ const submit = async function( event ) { } } +const tableparse=document.querySelector('.my-table') + +for (const key in data) { + if (data.hasOwnProperty(key)) { + resultListHTML += ''; + resultListHTML += `${data[key]['tasks']}`; + resultListHTML += `${data[key]['date']}`; + resultListHTML += `${data[key]['priority']}`; + resultListHTML += ''; + //console.log(data) + } +} +tableparse.innerHTML= resultListHTML; + + const resultContainer = document.querySelector('#result'); resultContainer.innerHTML = resultListHTML; resultContainer.appendChild(list); }) } + + const deletedata = document.createElement('button') + window.onload = function() { const button = document.querySelector("button"); button.onclick = submit; From e329310ab89fcf18c9632a440a4ddb385df0c945 Mon Sep 17 00:00:00 2001 From: AarshZadaphiya Date: Mon, 11 Sep 2023 12:31:59 -0400 Subject: [PATCH 12/23] Data Displays on the table --- public/css/main.css | 1 + public/index.html | 2 +- public/js/main.js | 22 ++++++++-------------- 3 files changed, 10 insertions(+), 15 deletions(-) diff --git a/public/css/main.css b/public/css/main.css index ebe6f03a..d44fcc5b 100644 --- a/public/css/main.css +++ b/public/css/main.css @@ -23,6 +23,7 @@ body { .my-form { font-family: 'Dosis'; width: 100%; + display: flex; } .my-label { diff --git a/public/index.html b/public/index.html index 507a383c..4c26a0e0 100644 --- a/public/index.html +++ b/public/index.html @@ -43,7 +43,7 @@

    To Do List Form

    - + Example Task Example Deadline diff --git a/public/js/main.js b/public/js/main.js index d2b1ada3..e8379e52 100644 --- a/public/js/main.js +++ b/public/js/main.js @@ -35,24 +35,17 @@ const submit = async function( event ) { //const list = document.createElement('ul') let resultListHTML = ''; - for (const key in data) { - if (data.hasOwnProperty(key)) { - //const li = document.createElement('li'); - resultListHTML += `
  • ${data[key]['tasks']}
  • `; - resultListHTML += `
  • ${data[key]['date']}
  • `; - resultListHTML += `
  • ${data[key]['priority']}
  • `; - console.log(data) - } - } -const tableparse=document.querySelector('.my-table') +const tableparse=document.querySelector('.my-table') +resultHTML = tableparse.innerHTML for (const key in data) { if (data.hasOwnProperty(key)) { resultListHTML += ''; resultListHTML += `${data[key]['tasks']}`; resultListHTML += `${data[key]['date']}`; resultListHTML += `${data[key]['priority']}`; + resultListHTML += ` `; resultListHTML += ''; //console.log(data) } @@ -60,14 +53,15 @@ for (const key in data) { tableparse.innerHTML= resultListHTML; - const resultContainer = document.querySelector('#result'); + /*const resultContainer = document.querySelector('#result'); resultContainer.innerHTML = resultListHTML; - resultContainer.appendChild(list); + resultContainer.appendChild(list);*/ }) + } + - - const deletedata = document.createElement('button') +const deletedata = document.createElement('button') window.onload = function() { const button = document.querySelector("button"); From 4c81d3196f9f400ef7429655ffa1e6f46bf99ed7 Mon Sep 17 00:00:00 2001 From: AarshZadaphiya Date: Mon, 11 Sep 2023 15:41:25 -0400 Subject: [PATCH 13/23] Fixed table --- public/css/main.css | 6 +++--- public/index.html | 18 ++-------------- public/js/main.js | 50 ++++++++++++++++++++++++++++++++------------- 3 files changed, 41 insertions(+), 33 deletions(-) diff --git a/public/css/main.css b/public/css/main.css index d44fcc5b..251256d1 100644 --- a/public/css/main.css +++ b/public/css/main.css @@ -23,7 +23,6 @@ body { .my-form { font-family: 'Dosis'; width: 100%; - display: flex; } .my-label { @@ -74,16 +73,17 @@ body { font-family: 'Dosis'; width: 100%; border-collapse: collapse; + margin: 10px; } .my-table th, .my-table td { padding: 12px; - border: 1px solid #ddd; + border: 1px solid #dddddd; } .my-table th { background-color: #f2f2f2; - text-align: left; + text-align: center; } .my-table tr:nth-child(even) { diff --git a/public/index.html b/public/index.html index 4c26a0e0..ba4248f6 100644 --- a/public/index.html +++ b/public/index.html @@ -41,23 +41,9 @@

    To Do List Form

    Remove + - - - - Example Task - Example Deadline - Example Priority - - - - Example Task 2 - Example Deadline 2 - Example Priority 2 - - - - + diff --git a/public/js/main.js b/public/js/main.js index e8379e52..3ddb2e1b 100644 --- a/public/js/main.js +++ b/public/js/main.js @@ -37,25 +37,47 @@ const submit = async function( event ) { -const tableparse=document.querySelector('.my-table') -resultHTML = tableparse.innerHTML +const tableparse=document.querySelector('tbody') +tableparse.innerHTML = ''; + +let resultHTML = tableparse.innerHTML +const del = index => { + console.log( 'index: ', index ) + // add the fetch request here to delete the item +} +let i = 0 + +// for loop for each row for (const key in data) { if (data.hasOwnProperty(key)) { - resultListHTML += ''; - resultListHTML += `${data[key]['tasks']}`; - resultListHTML += `${data[key]['date']}`; - resultListHTML += `${data[key]['priority']}`; - resultListHTML += ` `; - resultListHTML += ''; + const row = document.createElement('tr') + + // for loop for each cell + for( const cellKey in data[key] ) { + const cell = document.createElement('td') + cell.innerText = data[key][cellKey] + row.appendChild( cell ) + } + + + + const deleteButton = document.createElement('button') + deleteButton.innerText = 'Delete Item'; + deleteButton.className = 'my-deletebutton'; + // store current value of i + let _i = i + deleteButton.onclick = function() { del( _i ) } + + const deleteCell = document.createElement('td'); + deleteCell.appendChild(deleteButton); + row.appendChild(deleteCell); + + + i++ + tableparse.appendChild( row ) //console.log(data) } } -tableparse.innerHTML= resultListHTML; - - - /*const resultContainer = document.querySelector('#result'); - resultContainer.innerHTML = resultListHTML; - resultContainer.appendChild(list);*/ }) } From c0423d964f3006b516c0f58754399233565c6a18 Mon Sep 17 00:00:00 2001 From: AarshZadaphiya Date: Mon, 11 Sep 2023 16:54:03 -0400 Subject: [PATCH 14/23] derived field added --- public/index.html | 89 ++++++++++++++++++++++---------- public/js/main.js | 23 +++++++-- server.improved.js | 125 +++++++++++++++++++++------------------------ 3 files changed, 142 insertions(+), 95 deletions(-) diff --git a/public/index.html b/public/index.html index ba4248f6..b5122630 100644 --- a/public/index.html +++ b/public/index.html @@ -1,51 +1,88 @@ - + TO Do List Generator - + - - + + - + -

    To Do List Form

    +

    To Do List Form

    - -
    - + + - + - + - - + + - +
    -
    - -
    +
    + + + + + + + + + +
    TaskDeadlinePriorityRemaining DaysRemove
    - - diff --git a/public/js/main.js b/public/js/main.js index 3ddb2e1b..f08154a9 100644 --- a/public/js/main.js +++ b/public/js/main.js @@ -59,10 +59,16 @@ for (const key in data) { row.appendChild( cell ) } - + const dueDate = new Date(data[key]["date"]); + const currentDate = new Date(); + const daysRemaining = Math.ceil((dueDate - currentDate) / (1000 * 60 * 60 * 24)); + + const daysRemainingCell = document.createElement("td"); + daysRemainingCell.innerText = daysRemaining > 0 ? `${daysRemaining} days` : "Expired"; + row.appendChild(daysRemainingCell); const deleteButton = document.createElement('button') - deleteButton.innerText = 'Delete Item'; + deleteButton.innerText = 'Delete'; deleteButton.className = 'my-deletebutton'; // store current value of i let _i = i @@ -72,12 +78,23 @@ for (const key in data) { deleteCell.appendChild(deleteButton); row.appendChild(deleteCell); - + /*resultListHTML += ''; + resultListHTML += `${data[key]['tasks']}`; + resultListHTML += `${data[key]['date']}`; + resultListHTML += `${data[key]['priority']}`; + resultListHTML += ` `; + resultListHTML += '';*/ + i++ tableparse.appendChild( row ) //console.log(data) } } +//tableparse.innerHTML= resultListHTML; + + /*const resultContainer = document.querySelector('#result'); + resultContainer.innerHTML = resultListHTML; + resultContainer.appendChild(list);*/ }) } diff --git a/server.improved.js b/server.improved.js index 07d1c827..9d5e08b4 100644 --- a/server.improved.js +++ b/server.improved.js @@ -1,76 +1,69 @@ -const http = require( 'http' ), - fs = require( 'fs' ), - // IMPORTANT: you must run `npm install` in the directory for this assignment - // to install the mime library if you're testing this on your local machine. - // However, Glitch will install it automatically by looking in your package.json - // file. - mime = require( 'mime' ), - dir = 'public/', - port = 3000 - -let appdata = [ -] - -const server = http.createServer( function( request,response ) { - if( request.method === 'GET' ) { - handleGet( request, response ) - }else if( request.method === 'POST' ){ - handlePost( request, response ) +const http = require("http"), + fs = require("fs"), + // IMPORTANT: you must run `npm install` in the directory for this assignment + // to install the mime library if you're testing this on your local machine. + // However, Glitch will install it automatically by looking in your package.json + // file. + mime = require("mime"), + dir = "public/", + port = 3000; + +let appdata = []; + +const server = http.createServer(function (request, response) { + if (request.method === "GET") { + handleGet(request, response); + } else if (request.method === "POST") { + handlePost(request, response); } -}) +}); -const handleGet = function( request, response ) { - const filename = dir + request.url.slice( 1 ) +const handleGet = function (request, response) { + const filename = dir + request.url.slice(1); - if( request.url === '/' ) { - sendFile( response, 'public/index.html' ) - }else{ - sendFile( response, filename ) + if (request.url === "/") { + sendFile(response, "public/index.html"); + } else { + sendFile(response, filename); } -} +}; -const handlePost = function( request, response ) { - let dataString = '' +const handlePost = function (request, response) { + let dataString = ""; - request.on( 'data', function( data ) { - dataString += data - }) + request.on("data", function (data) { + dataString += data; + }); - request.on( 'end', function() { - console.log( dataString ) + request.on("end", function () { + console.log(dataString); // ... do something with the data here!!! - - let newData= JSON.parse(dataString) - appdata.push (newData) - console.log(appdata) - response.writeHead( 200, "OK", {'Content-Type': 'text/plain' }) - response.write(JSON.stringify(appdata)) - response.end() - }) -} - - -const sendFile = function( response, filename ) { - const type = mime.getType( filename ) - - fs.readFile( filename, function( err, content ) { - - // if the error = null, then we've loaded the file successfully - if( err === null ) { - - // status code: https://httpstatuses.com - response.writeHeader( 200, { 'Content-Type': type }) - response.end( content ) - - }else{ - - // file not found, error code 404 - response.writeHeader( 404 ) - response.end( '404 Error: File Not Found' ) - - } - }) -} -server.listen( process.env.PORT || port ) + let newData = JSON.parse(dataString); + appdata.push(newData); + console.log(appdata); + response.writeHead(200, "OK", { "Content-Type": "text/plain" }); + response.write(JSON.stringify(appdata)); + response.end(); + }); +}; + +const sendFile = function (response, filename) { + const type = mime.getType(filename); + + fs.readFile(filename, function (err, content) { + // if the error = null, then we've loaded the file successfully + if (err === null) { + // status code: https://httpstatuses.com + response.writeHeader(200, { "Content-Type": type }); + response.end(content); + } else { + // file not found, error code 404 + response.writeHeader(404); + response.end("404 Error: File Not Found"); + } + }); +}; + +server.listen(process.env.PORT || port); From 3a9a55e6df0e77fbc5489bc002f49129f04e3e7f Mon Sep 17 00:00:00 2001 From: AarshZadaphiya Date: Mon, 11 Sep 2023 20:37:19 -0400 Subject: [PATCH 15/23] derived field on server --- public/js/main.js | 38 +++++++++++++++----------------------- server.improved.js | 14 +++++++++++--- 2 files changed, 26 insertions(+), 26 deletions(-) diff --git a/public/js/main.js b/public/js/main.js index f08154a9..376e49c5 100644 --- a/public/js/main.js +++ b/public/js/main.js @@ -27,12 +27,8 @@ const submit = async function( event ) { method:'POST', body: JSON.stringify(json) - }).then(async function (response){ //console.log(response) + }).then(async function (response){ let data= await response.json() - //console.log(data) - - - //const list = document.createElement('ul') let resultListHTML = ''; @@ -44,6 +40,7 @@ let resultHTML = tableparse.innerHTML const del = index => { console.log( 'index: ', index ) // add the fetch request here to delete the item + } let i = 0 @@ -53,20 +50,27 @@ for (const key in data) { const row = document.createElement('tr') // for loop for each cell - for( const cellKey in data[key] ) { - const cell = document.createElement('td') - cell.innerText = data[key][cellKey] - row.appendChild( cell ) + for (const cellKey in data[key]) { + const cell = document.createElement('td'); + if (cellKey === 'daysRemaining') { + const daysRemainingCell = document.createElement('td'); + daysRemainingCell.innerText = data[key][cellKey]; + row.appendChild(daysRemainingCell); + } else { + cell.innerText = data[key][cellKey]; + row.appendChild(cell); + } } - const dueDate = new Date(data[key]["date"]); + /* const dueDate = new Date(data[key]["date"]); const currentDate = new Date(); const daysRemaining = Math.ceil((dueDate - currentDate) / (1000 * 60 * 60 * 24)); const daysRemainingCell = document.createElement("td"); daysRemainingCell.innerText = daysRemaining > 0 ? `${daysRemaining} days` : "Expired"; row.appendChild(daysRemainingCell); - + */ + const deleteButton = document.createElement('button') deleteButton.innerText = 'Delete'; deleteButton.className = 'my-deletebutton'; @@ -78,23 +82,11 @@ for (const key in data) { deleteCell.appendChild(deleteButton); row.appendChild(deleteCell); - /*resultListHTML += ''; - resultListHTML += `${data[key]['tasks']}`; - resultListHTML += `${data[key]['date']}`; - resultListHTML += `${data[key]['priority']}`; - resultListHTML += ` `; - resultListHTML += '';*/ - i++ tableparse.appendChild( row ) //console.log(data) } } -//tableparse.innerHTML= resultListHTML; - - /*const resultContainer = document.querySelector('#result'); - resultContainer.innerHTML = resultListHTML; - resultContainer.appendChild(list);*/ }) } diff --git a/server.improved.js b/server.improved.js index 9d5e08b4..89538498 100644 --- a/server.improved.js +++ b/server.improved.js @@ -38,17 +38,25 @@ const handlePost = function (request, response) { request.on("end", function () { console.log(dataString); - // ... do something with the data here!!! - let newData = JSON.parse(dataString); appdata.push(newData); + calculateDaysRemaining(appdata); console.log(appdata); - response.writeHead(200, "OK", { "Content-Type": "text/plain" }); + response.writeHead(200, 'OK', { 'Content-Type': 'application/json' }); response.write(JSON.stringify(appdata)); response.end(); }); }; +const calculateDaysRemaining = (data) => { + const currentDate = new Date(); + for (const item of data) { + const dueDate = new Date(item.date); + const daysRemaining = Math.ceil((dueDate - currentDate) / (1000 * 60 * 60 * 24)); + item.daysRemaining = daysRemaining > 0 ? `${daysRemaining} days` : 'Expired'; + } +}; + const sendFile = function (response, filename) { const type = mime.getType(filename); From 10c8c2e876b3bcd77d7c1b3250d945e060be14d5 Mon Sep 17 00:00:00 2001 From: AarshZadaphiya Date: Tue, 12 Sep 2023 11:46:53 -0400 Subject: [PATCH 16/23] delete being called on main and server update --- public/css/main.css | 38 ++++++++--- public/index.html | 19 +----- public/js/main.js | 161 +++++++++++++++++++++++--------------------- server.improved.js | 16 +++-- 4 files changed, 123 insertions(+), 111 deletions(-) diff --git a/public/css/main.css b/public/css/main.css index 251256d1..b85f1e77 100644 --- a/public/css/main.css +++ b/public/css/main.css @@ -1,5 +1,5 @@ body { - font-family: 'Dosis'; + font-family: "Dosis"; text-align: center; margin: 0; padding: 0; @@ -10,7 +10,7 @@ body { } .my-heading { - font-family: 'Dosis'; + font-family: "Dosis"; font-size: 50px; font-weight: bold; color: #bbe4e9; @@ -21,8 +21,9 @@ body { } .my-form { - font-family: 'Dosis'; + font-family: "Dosis"; width: 100%; + display: flex; } .my-label { @@ -40,7 +41,7 @@ body { } .my-button { - font-family: 'Dosis'; + font-family: "Dosis"; font-size: 20px; padding: 10px 20px; background-color: #53a8b6; @@ -54,7 +55,7 @@ body { } .my-deletebutton { - font-family: 'Dosis'; + font-family: "Dosis"; font-size: 15px; padding: 5px 10px; color: black; @@ -69,21 +70,38 @@ body { background-color: #f95959; } +.my-editbutton { + font-family: "Dosis"; + font-size: 15px; + padding: 5px 10px; + color: black; + background-color: #0e7cf4; + border: none; + cursor: pointer; + border-radius: 3px; +} + +.my-editbutton:hover { + color: white; + background-color: #0aa0f6; +} + + .my-table { - font-family: 'Dosis'; + font-family: "Dosis"; width: 100%; border-collapse: collapse; - margin: 10px; } -.my-table th, .my-table td { +.my-table th, +.my-table td { padding: 12px; - border: 1px solid #dddddd; + border: 1px solid #ddd; } .my-table th { background-color: #f2f2f2; - text-align: center; + text-align: left; } .my-table tr:nth-child(even) { diff --git a/public/index.html b/public/index.html index b5122630..19f13508 100644 --- a/public/index.html +++ b/public/index.html @@ -50,7 +50,7 @@

    To Do List Form

    required /> - +
    @@ -66,22 +66,7 @@

    To Do List Form

    - + diff --git a/public/js/main.js b/public/js/main.js index 376e49c5..e1ddfbe1 100644 --- a/public/js/main.js +++ b/public/js/main.js @@ -1,68 +1,70 @@ -const list = document.createElement('ul') - +const list = document.createElement("ul"); + /*data.map( d => d.model ) .map( d => d[0].toUpperCase() + d.slice(1) ) .forEach( d => { const li = document.createElement('li') li.innerText = d list.appendChild( li ) - })*/// FRONT-END (CLIENT) JAVASCRIPT HERE + })*/ // FRONT-END (CLIENT) JAVASCRIPT HERE -const submit = async function( event ) { +const submit = async function (event) { // stop form submission from trying to load // a new .html page for displaying results... // this was the original browser behavior and still // remains to this day - event.preventDefault() - - const taskName= document.querySelector( '#taskName' ), - dueDate= document.querySelector('#dueDate'), - taskPriority= document.querySelector('#taskPriority') - - const json = { tasks: taskName.value , date: dueDate.value , priority: taskPriority.value }; - - //console.log(json); - - fetch( '/submit', { - method:'POST', - body: JSON.stringify(json) - - }).then(async function (response){ - let data= await response.json() - let resultListHTML = ''; - - - -const tableparse=document.querySelector('tbody') -tableparse.innerHTML = ''; - -let resultHTML = tableparse.innerHTML -const del = index => { - console.log( 'index: ', index ) - // add the fetch request here to delete the item - -} -let i = 0 - -// for loop for each row -for (const key in data) { - if (data.hasOwnProperty(key)) { - const row = document.createElement('tr') - - // for loop for each cell - for (const cellKey in data[key]) { - const cell = document.createElement('td'); - if (cellKey === 'daysRemaining') { - const daysRemainingCell = document.createElement('td'); - daysRemainingCell.innerText = data[key][cellKey]; - row.appendChild(daysRemainingCell); - } else { - cell.innerText = data[key][cellKey]; - row.appendChild(cell); - } + event.preventDefault(); + let evt = event.target + let json = {} + if (evt.getAttribute('formaction') === '/submit'){ + json = { + tasks: document.querySelector("#taskName").value, + date: document.querySelector("#dueDate").value, + priority: document.querySelector("#taskPriority").value, } - - /* const dueDate = new Date(data[key]["date"]); + } else if (evt.getAttribute('formaction') === '/delete') { + //Add data to delete json = {Data to delete} + console.log('delete') + } + + //console.log(json); + + fetch(evt.getAttribute('formaction'), { + method: "POST", + body: JSON.stringify(json), + }).then(async function (response) { + let data = await response.json(); + let resultListHTML = ""; + + const tableparse = document.querySelector("tbody"); + tableparse.innerHTML = ""; + + let resultHTML = tableparse.innerHTML; + /*const del = (index) => { + console.log("index: ", index); + // add the fetch request here to delete the item + };*/ + let i = 0; + + // for loop for each row + for (const key in data) { + if (data.hasOwnProperty(key)) { + const row = document.createElement("tr"); + + // for loop for each cell + for (const cellKey in data[key]) { + const cell = document.createElement("td"); + if (cellKey === "daysRemaining") { + const daysRemainingCell = document.createElement("td"); + daysRemainingCell.innerText = data[key][cellKey]; + row.appendChild(daysRemainingCell); + } else { + cell.innerText = data[key][cellKey]; + row.appendChild(cell); + } + } + + /* const dueDate = new Date(data[key]["date"]); const currentDate = new Date(); const daysRemaining = Math.ceil((dueDate - currentDate) / (1000 * 60 * 60 * 24)); @@ -70,31 +72,34 @@ for (const key in data) { daysRemainingCell.innerText = daysRemaining > 0 ? `${daysRemaining} days` : "Expired"; row.appendChild(daysRemainingCell); */ - - const deleteButton = document.createElement('button') - deleteButton.innerText = 'Delete'; - deleteButton.className = 'my-deletebutton'; - // store current value of i - let _i = i - deleteButton.onclick = function() { del( _i ) } - - const deleteCell = document.createElement('td'); - deleteCell.appendChild(deleteButton); - row.appendChild(deleteCell); - - i++ - tableparse.appendChild( row ) - //console.log(data) - } -} - }) - - } - -const deletedata = document.createElement('button') + const deleteButton = document.createElement("button"); + deleteButton.innerText = "Delete"; + deleteButton.className = "my-deletebutton"; + deleteButton.formAction = '/delete' + deleteButton.onclick = submit + + // store current value of i + /*let _i = i; + deleteButton.onclick = function () { + del(_i); + };*/ + + const deleteCell = document.createElement("td"); + deleteCell.appendChild(deleteButton); + row.appendChild(deleteCell); + + i++; + tableparse.appendChild(row); + //console.log(data) + } + } + }); +}; + +const deletedata = document.createElement("button"); -window.onload = function() { - const button = document.querySelector("button"); +window.onload = function () { + const button = document.querySelector("button"); button.onclick = submit; -} \ No newline at end of file +}; diff --git a/server.improved.js b/server.improved.js index 89538498..9538d879 100644 --- a/server.improved.js +++ b/server.improved.js @@ -13,7 +13,7 @@ let appdata = []; const server = http.createServer(function (request, response) { if (request.method === "GET") { handleGet(request, response); - } else if (request.method === "POST") { + } else if (request.method === "POST") {`` handlePost(request, response); } }); @@ -37,11 +37,15 @@ const handlePost = function (request, response) { request.on("end", function () { console.log(dataString); - - let newData = JSON.parse(dataString); - appdata.push(newData); - calculateDaysRemaining(appdata); - console.log(appdata); + if (request.url === '/submit') { //handle form requests + let newData = JSON.parse(dataString); + appdata.push(newData); + calculateDaysRemaining(appdata); + console.log(appdata); + } else if (request.url === '/delete'){ + //Delete some data -- look into array.splice + console.log('deleted') + } response.writeHead(200, 'OK', { 'Content-Type': 'application/json' }); response.write(JSON.stringify(appdata)); response.end(); From cac3b51a54cb0f732ce10337e5a40120a4dc370c Mon Sep 17 00:00:00 2001 From: AarshZadaphiya Date: Tue, 12 Sep 2023 11:51:15 -0400 Subject: [PATCH 17/23] delete being called on main and server update --- public/js/main.js | 9 --------- 1 file changed, 9 deletions(-) diff --git a/public/js/main.js b/public/js/main.js index e1ddfbe1..1b99dc2d 100644 --- a/public/js/main.js +++ b/public/js/main.js @@ -64,15 +64,6 @@ const submit = async function (event) { } } - /* const dueDate = new Date(data[key]["date"]); - const currentDate = new Date(); - const daysRemaining = Math.ceil((dueDate - currentDate) / (1000 * 60 * 60 * 24)); - - const daysRemainingCell = document.createElement("td"); - daysRemainingCell.innerText = daysRemaining > 0 ? `${daysRemaining} days` : "Expired"; - row.appendChild(daysRemainingCell); - */ - const deleteButton = document.createElement("button"); deleteButton.innerText = "Delete"; deleteButton.className = "my-deletebutton"; From 2e625dedae33b8262f6d9ca2fe5161b20f9f5bd2 Mon Sep 17 00:00:00 2001 From: AarshZadaphiya Date: Tue, 12 Sep 2023 17:38:24 -0400 Subject: [PATCH 18/23] Working On delete Button --- public/index.html | 2 ++ public/js/main.js | 64 ++++++++++++++++++++++++++++++++++++---------- server.improved.js | 29 +++++++++++++++++---- 3 files changed, 77 insertions(+), 18 deletions(-) diff --git a/public/index.html b/public/index.html index 19f13508..d3e16d27 100644 --- a/public/index.html +++ b/public/index.html @@ -58,9 +58,11 @@

    To Do List Form

    + + diff --git a/public/js/main.js b/public/js/main.js index 1b99dc2d..38c49205 100644 --- a/public/js/main.js +++ b/public/js/main.js @@ -16,25 +16,33 @@ const submit = async function (event) { event.preventDefault(); let evt = event.target let json = {} + id = 1 if (evt.getAttribute('formaction') === '/submit'){ json = { tasks: document.querySelector("#taskName").value, date: document.querySelector("#dueDate").value, priority: document.querySelector("#taskPriority").value, - } - } else if (evt.getAttribute('formaction') === '/delete') { - //Add data to delete json = {Data to delete} - console.log('delete') - } + id:id + }} else { + json={id:event.target.id}} + + } + + + id=id++ + console.log(id) + //console.log(json); - fetch(evt.getAttribute('formaction'), { - method: "POST", - body: JSON.stringify(json), - }).then(async function (response) { - let data = await response.json(); - let resultListHTML = ""; + //fetch('/submit'), { + fetch(evt.getAttribute('formaction'), { + method: "POST", + body: JSON.stringify(json), + }).then(async function (response) { + let data = await response.json(); + let resultListHTML = ""; + appdata = [] const tableparse = document.querySelector("tbody"); tableparse.innerHTML = ""; @@ -44,12 +52,14 @@ const submit = async function (event) { console.log("index: ", index); // add the fetch request here to delete the item };*/ - let i = 0; + // let i = 0; // for loop for each row for (const key in data) { if (data.hasOwnProperty(key)) { const row = document.createElement("tr"); + // row.id = `row-${i}`; + row.id = data[key].id; // for loop for each cell for (const cellKey in data[key]) { @@ -62,12 +72,26 @@ const submit = async function (event) { cell.innerText = data[key][cellKey]; row.appendChild(cell); } + } const deleteButton = document.createElement("button"); deleteButton.innerText = "Delete"; deleteButton.className = "my-deletebutton"; deleteButton.formAction = '/delete' + deleteButton.id=data[key].id; + + /*if (evt.getAttribute('formaction') === '/delete') { + //Add data to delete json = {Data to delete} + + json={id:data[key].id} + fetch('/delete'),{ + method:"POST", + body: JSON.stringify(json) + } + console.log('delete') + } +*/ deleteButton.onclick = submit // store current value of i @@ -80,12 +104,26 @@ const submit = async function (event) { deleteCell.appendChild(deleteButton); row.appendChild(deleteCell); - i++; + // i++; tableparse.appendChild(row); //console.log(data) } } }); + +//Delete Row Function +const deleteRow = (rowId) => { + const rowToDelete = document.getElementById(rowId); + if (rowToDelete) { + rowToDelete.remove(); +/* + const idToDelete = rowId.replace('row-', ''); + fetch('/delete', { + method: "POST", + body: JSON.stringify({ id: idToDelete }), + }).then(async function (response) { + }); */ + } }; const deletedata = document.createElement("button"); diff --git a/server.improved.js b/server.improved.js index 9538d879..39732be6 100644 --- a/server.improved.js +++ b/server.improved.js @@ -9,6 +9,7 @@ const http = require("http"), port = 3000; let appdata = []; +let counter = 0; const server = http.createServer(function (request, response) { if (request.method === "GET") { @@ -36,21 +37,39 @@ const handlePost = function (request, response) { }); request.on("end", function () { - console.log(dataString); + + //console.log(dataString); + // console.log(request.url); if (request.url === '/submit') { //handle form requests let newData = JSON.parse(dataString); appdata.push(newData); + newData.id = counter++; calculateDaysRemaining(appdata); console.log(appdata); } else if (request.url === '/delete'){ //Delete some data -- look into array.splice - console.log('deleted') - } + //console.log('deleted') + + console.log(dataString) + const deleteData = JSON.parse(dataString); + const idToDelete = deleteData.id; + +c + // Index delete + const indexToDelete = appdata.findIndex(item => item.id === idToDelete); + if (indexToDelete !== -1) { + console.log(indexToDelete) + console.log(appdata[indexToDelete]) + appdata.splice(indexToDelete, 1); + + } + }; + console.log(appdata) response.writeHead(200, 'OK', { 'Content-Type': 'application/json' }); response.write(JSON.stringify(appdata)); response.end(); - }); -}; +}); +} const calculateDaysRemaining = (data) => { const currentDate = new Date(); From 099d9169adb6f2b6207f0b76354e6ed29de297df Mon Sep 17 00:00:00 2001 From: AarshZadaphiya Date: Tue, 12 Sep 2023 19:01:19 -0400 Subject: [PATCH 19/23] Working On delete Button --- public/js/main.js | 11 +++++++++-- server.improved.js | 1 - 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/public/js/main.js b/public/js/main.js index 38c49205..fa9425e6 100644 --- a/public/js/main.js +++ b/public/js/main.js @@ -23,7 +23,7 @@ const submit = async function (event) { date: document.querySelector("#dueDate").value, priority: document.querySelector("#taskPriority").value, id:id - }} else { + }else { json={id:event.target.id}} } @@ -31,7 +31,7 @@ const submit = async function (event) { id=id++ console.log(id) - + } //console.log(json); @@ -110,6 +110,13 @@ const submit = async function (event) { } } }); +}; + +const response = await fetch('/submit',{ + method: 'POST', + body = JSON.stringify(row json) +}) + //Delete Row Function const deleteRow = (rowId) => { diff --git a/server.improved.js b/server.improved.js index 39732be6..7d94ccd9 100644 --- a/server.improved.js +++ b/server.improved.js @@ -54,7 +54,6 @@ const handlePost = function (request, response) { const deleteData = JSON.parse(dataString); const idToDelete = deleteData.id; -c // Index delete const indexToDelete = appdata.findIndex(item => item.id === idToDelete); if (indexToDelete !== -1) { From 9190f4055007d677d8daacab80abe6c03ada23ee Mon Sep 17 00:00:00 2001 From: Akim Date: Tue, 12 Sep 2023 19:18:54 -0400 Subject: [PATCH 20/23] Office Hours --- public/js/main.js | 74 ++-------------------------------------------- server.improved.js | 22 ++------------ 2 files changed, 6 insertions(+), 90 deletions(-) diff --git a/public/js/main.js b/public/js/main.js index fa9425e6..54733e78 100644 --- a/public/js/main.js +++ b/public/js/main.js @@ -1,13 +1,3 @@ -const list = document.createElement("ul"); - -/*data.map( d => d.model ) - .map( d => d[0].toUpperCase() + d.slice(1) ) - .forEach( d => { - const li = document.createElement('li') - li.innerText = d - list.appendChild( li ) - })*/ // FRONT-END (CLIENT) JAVASCRIPT HERE - const submit = async function (event) { // stop form submission from trying to load // a new .html page for displaying results... @@ -16,49 +6,30 @@ const submit = async function (event) { event.preventDefault(); let evt = event.target let json = {} - id = 1 if (evt.getAttribute('formaction') === '/submit'){ json = { tasks: document.querySelector("#taskName").value, date: document.querySelector("#dueDate").value, priority: document.querySelector("#taskPriority").value, - id:id + } }else { - json={id:event.target.id}} - + json={id:evt.getAttribute('id')} } - - - id=id++ - console.log(id) - } - //console.log(json); - - //fetch('/submit'), { fetch(evt.getAttribute('formaction'), { method: "POST", body: JSON.stringify(json), }).then(async function (response) { let data = await response.json(); - let resultListHTML = ""; appdata = [] const tableparse = document.querySelector("tbody"); tableparse.innerHTML = ""; let resultHTML = tableparse.innerHTML; - /*const del = (index) => { - console.log("index: ", index); - // add the fetch request here to delete the item - };*/ - // let i = 0; - - // for loop for each row for (const key in data) { if (data.hasOwnProperty(key)) { const row = document.createElement("tr"); - // row.id = `row-${i}`; row.id = data[key].id; // for loop for each cell @@ -81,58 +52,19 @@ const submit = async function (event) { deleteButton.formAction = '/delete' deleteButton.id=data[key].id; - /*if (evt.getAttribute('formaction') === '/delete') { - //Add data to delete json = {Data to delete} - - json={id:data[key].id} - fetch('/delete'),{ - method:"POST", - body: JSON.stringify(json) - } - console.log('delete') - } -*/ deleteButton.onclick = submit - // store current value of i - /*let _i = i; - deleteButton.onclick = function () { - del(_i); - };*/ - const deleteCell = document.createElement("td"); deleteCell.appendChild(deleteButton); row.appendChild(deleteCell); - // i++; tableparse.appendChild(row); - //console.log(data) + } } }); }; -const response = await fetch('/submit',{ - method: 'POST', - body = JSON.stringify(row json) -}) - - -//Delete Row Function -const deleteRow = (rowId) => { - const rowToDelete = document.getElementById(rowId); - if (rowToDelete) { - rowToDelete.remove(); -/* - const idToDelete = rowId.replace('row-', ''); - fetch('/delete', { - method: "POST", - body: JSON.stringify({ id: idToDelete }), - }).then(async function (response) { - }); */ - } -}; - const deletedata = document.createElement("button"); window.onload = function () { diff --git a/server.improved.js b/server.improved.js index 7d94ccd9..3bdfbeaf 100644 --- a/server.improved.js +++ b/server.improved.js @@ -37,9 +37,6 @@ const handlePost = function (request, response) { }); request.on("end", function () { - - //console.log(dataString); - // console.log(request.url); if (request.url === '/submit') { //handle form requests let newData = JSON.parse(dataString); appdata.push(newData); @@ -47,22 +44,9 @@ const handlePost = function (request, response) { calculateDaysRemaining(appdata); console.log(appdata); } else if (request.url === '/delete'){ - //Delete some data -- look into array.splice - //console.log('deleted') - - console.log(dataString) - const deleteData = JSON.parse(dataString); - const idToDelete = deleteData.id; - - // Index delete - const indexToDelete = appdata.findIndex(item => item.id === idToDelete); - if (indexToDelete !== -1) { - console.log(indexToDelete) - console.log(appdata[indexToDelete]) - appdata.splice(indexToDelete, 1); - - } - }; + let index = JSON.parse(dataString); + appdata.splice(parseInt(index.id), 1); + } console.log(appdata) response.writeHead(200, 'OK', { 'Content-Type': 'application/json' }); response.write(JSON.stringify(appdata)); From cff79a8f553f1196503cf69231b3cde90993fd76 Mon Sep 17 00:00:00 2001 From: AarshZadaphiya Date: Tue, 12 Sep 2023 19:36:47 -0400 Subject: [PATCH 21/23] Delete almost working --- public/js/main.js | 70 +++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 67 insertions(+), 3 deletions(-) diff --git a/public/js/main.js b/public/js/main.js index 54733e78..10627434 100644 --- a/public/js/main.js +++ b/public/js/main.js @@ -1,3 +1,13 @@ +const list = document.createElement("ul"); + +/*data.map( d => d.model ) + .map( d => d[0].toUpperCase() + d.slice(1) ) + .forEach( d => { + const li = document.createElement('li') + li.innerText = d + list.appendChild( li ) + })*/ // FRONT-END (CLIENT) JAVASCRIPT HERE + const submit = async function (event) { // stop form submission from trying to load // a new .html page for displaying results... @@ -6,30 +16,49 @@ const submit = async function (event) { event.preventDefault(); let evt = event.target let json = {} + id = 1 if (evt.getAttribute('formaction') === '/submit'){ json = { tasks: document.querySelector("#taskName").value, date: document.querySelector("#dueDate").value, priority: document.querySelector("#taskPriority").value, - } + id:id }else { - json={id:evt.getAttribute('id')} + json={id:event.target.id}} + } + + + id=id++ + console.log(id) + } + //console.log(json); + + //fetch('/submit'), { fetch(evt.getAttribute('formaction'), { method: "POST", body: JSON.stringify(json), }).then(async function (response) { let data = await response.json(); + let resultListHTML = ""; appdata = [] const tableparse = document.querySelector("tbody"); tableparse.innerHTML = ""; let resultHTML = tableparse.innerHTML; + /*const del = (index) => { + console.log("index: ", index); + // add the fetch request here to delete the item + };*/ + // let i = 0; + + // for loop for each row for (const key in data) { if (data.hasOwnProperty(key)) { const row = document.createElement("tr"); + // row.id = `row-${i}`; row.id = data[key].id; // for loop for each cell @@ -52,19 +81,54 @@ const submit = async function (event) { deleteButton.formAction = '/delete' deleteButton.id=data[key].id; + /*if (evt.getAttribute('formaction') === '/delete') { + //Add data to delete json = {Data to delete} + + json={id:data[key].id} + fetch('/delete'),{ + method:"POST", + body: JSON.stringify(json) + } + console.log('delete') + } +*/ deleteButton.onclick = submit + // store current value of i + /*let _i = i; + deleteButton.onclick = function () { + del(_i); + };*/ + const deleteCell = document.createElement("td"); deleteCell.appendChild(deleteButton); row.appendChild(deleteCell); + // i++; tableparse.appendChild(row); - + //console.log(data) } } }); }; + + +//Delete Row Function +const deleteRow = (rowId) => { + const rowToDelete = document.getElementById(rowId); + if (rowToDelete) { + rowToDelete.remove(); +/* + const idToDelete = rowId.replace('row-', ''); + fetch('/delete', { + method: "POST", + body: JSON.stringify({ id: idToDelete }), + }).then(async function (response) { + }); */ + } +}; + const deletedata = document.createElement("button"); window.onload = function () { From 2e545056546eb3ffa1f16c1993dfb02bfd61d610 Mon Sep 17 00:00:00 2001 From: AarshZadaphiya Date: Wed, 13 Sep 2023 11:12:32 -0400 Subject: [PATCH 22/23] Complete Working Update --- public/js/main.js | 75 +++------------------------------------------- server.improved.js | 7 +++-- 2 files changed, 9 insertions(+), 73 deletions(-) diff --git a/public/js/main.js b/public/js/main.js index 10627434..30d1ec8a 100644 --- a/public/js/main.js +++ b/public/js/main.js @@ -1,13 +1,3 @@ -const list = document.createElement("ul"); - -/*data.map( d => d.model ) - .map( d => d[0].toUpperCase() + d.slice(1) ) - .forEach( d => { - const li = document.createElement('li') - li.innerText = d - list.appendChild( li ) - })*/ // FRONT-END (CLIENT) JAVASCRIPT HERE - const submit = async function (event) { // stop form submission from trying to load // a new .html page for displaying results... @@ -16,49 +6,29 @@ const submit = async function (event) { event.preventDefault(); let evt = event.target let json = {} - id = 1 if (evt.getAttribute('formaction') === '/submit'){ json = { tasks: document.querySelector("#taskName").value, date: document.querySelector("#dueDate").value, priority: document.querySelector("#taskPriority").value, - id:id + } }else { - json={id:event.target.id}} - + json={id:evt.getAttribute('id')} } - - - id=id++ - console.log(id) - } - - //console.log(json); - //fetch('/submit'), { fetch(evt.getAttribute('formaction'), { method: "POST", body: JSON.stringify(json), }).then(async function (response) { let data = await response.json(); - let resultListHTML = ""; - appdata = [] const tableparse = document.querySelector("tbody"); tableparse.innerHTML = ""; let resultHTML = tableparse.innerHTML; - /*const del = (index) => { - console.log("index: ", index); - // add the fetch request here to delete the item - };*/ - // let i = 0; - - // for loop for each row for (const key in data) { if (data.hasOwnProperty(key)) { const row = document.createElement("tr"); - // row.id = `row-${i}`; row.id = data[key].id; // for loop for each cell @@ -81,57 +51,20 @@ const submit = async function (event) { deleteButton.formAction = '/delete' deleteButton.id=data[key].id; - /*if (evt.getAttribute('formaction') === '/delete') { - //Add data to delete json = {Data to delete} - - json={id:data[key].id} - fetch('/delete'),{ - method:"POST", - body: JSON.stringify(json) - } - console.log('delete') - } -*/ deleteButton.onclick = submit - // store current value of i - /*let _i = i; - deleteButton.onclick = function () { - del(_i); - };*/ - const deleteCell = document.createElement("td"); deleteCell.appendChild(deleteButton); row.appendChild(deleteCell); - // i++; tableparse.appendChild(row); - //console.log(data) + } } }); }; - - -//Delete Row Function -const deleteRow = (rowId) => { - const rowToDelete = document.getElementById(rowId); - if (rowToDelete) { - rowToDelete.remove(); -/* - const idToDelete = rowId.replace('row-', ''); - fetch('/delete', { - method: "POST", - body: JSON.stringify({ id: idToDelete }), - }).then(async function (response) { - }); */ - } -}; - -const deletedata = document.createElement("button"); - window.onload = function () { const button = document.querySelector("button"); button.onclick = submit; -}; +}; \ No newline at end of file diff --git a/server.improved.js b/server.improved.js index 3bdfbeaf..cc738f5d 100644 --- a/server.improved.js +++ b/server.improved.js @@ -39,13 +39,16 @@ const handlePost = function (request, response) { request.on("end", function () { if (request.url === '/submit') { //handle form requests let newData = JSON.parse(dataString); + newData.id = appdata.length; appdata.push(newData); - newData.id = counter++; calculateDaysRemaining(appdata); console.log(appdata); } else if (request.url === '/delete'){ let index = JSON.parse(dataString); appdata.splice(parseInt(index.id), 1); + for(let idRst = 0; idRst < appdata.length; idRst++){ + appdata[idRst].id = idRst; + } } console.log(appdata) response.writeHead(200, 'OK', { 'Content-Type': 'application/json' }); @@ -80,4 +83,4 @@ const sendFile = function (response, filename) { }); }; -server.listen(process.env.PORT || port); +server.listen(process.env.PORT || port); \ No newline at end of file From 189e03979d6f11d129fa7c79fc3ff8c6a849e123 Mon Sep 17 00:00:00 2001 From: AarshZadaphiya Date: Wed, 13 Sep 2023 13:21:13 -0400 Subject: [PATCH 23/23] Final To Do List Generator --- README.md | 37 ++++++++++++++++++++++++++----------- 1 file changed, 26 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 0fe29d83..df689277 100644 --- a/README.md +++ b/README.md @@ -1,18 +1,33 @@ Assignment 2 - Short Stack: Basic Two-tier Web Application using HTML/CSS/JS and Node.js -You'll need to use sometype of collaborative software that will enable you both to see the test subject's screen and listen to their voice as they describe their thoughts, or conduct the studies in person. After completing each study, briefly (one to two sentences for each question) address the following in your README: - -1. Provide the last name of each student you conduct the evaluation with. -2. What problems did the user have with your design? -3. What comments did they make that surprised you? -4. What would you change about the interface based on their feedback? - +Aarsh Zadaphiya https://a2-aarshzadaphiya.glitch.me/ ## Web Application Title: To DO List Generator -Include a very brief summary of your project here. Be sure to include the CSS positioning technique you used, and any required instructions to use your application. +I have developed a dynamic To-Do List Generator using HTML, CSS, and JavaScript. The application utilizes CSS Flexbox positioning for responsive design. To use this application, simply input your task details in the provided form and click "Generate To-Do List." Your tasks will be displayed in a table, and you can delete items as needed by clicking the adjacent delete buttons. The app also calculates and displays the remaining days until each task's due date, offering valuable task management assistance. ## Technical Achievements -- **Tech Achievement 1**: Using a combination of... +**Tech Achievement 1**: This single-page web application, named "TO Do List Generator," allows users to manage their tasks efficiently. The app provides a user-friendly form where users can submit task details, including the task name, due date, and task priority. Upon submission, the server processes the data, calculates the remaining days until the task's due date, and updates the task list. The app always displays the current state of the server-side data, ensuring real-time synchronization between the client and server. Task Submission: Users can submit new tasks with details such as task name, due date, and priority. +Real-time Updates: When a user submits a task, the server responds with updated task data, including the calculated remaining days until the due date. The client then updates the task list without the need for page reload. +Task Deletion: Users can delete tasks individually, and the app will automatically remove the task from the list, ensuring data consistency. + +Technologies Used: +Front-end: HTML, CSS, JavaScript +Back-end: Node.js +Server: HTTP Server +Data Storage: In-memory array (appdata) + +## Design/Evaluation Achievements +**Design Achievement 1**: + +Testing with Nicholas Borrello: +Last name: Borrello +Problems with design: No option to dynamically sort the items in the table based on priority. +Comments: Derived field "Remaining days" is usefull for the user to know how many days they have left to comple the tak +Changes suggested: Adding the Sort feature. + +Testing with Matthew McAlarney: +Last name: McAlarney +Problems with design: The header needs to be at the top so there is no gat at the top, and the table needs to be lowered so that there is a gab between the generate button and the table. +Comments: User friendly design for an average ueser. Delete buttons next to the items to easyly identify the items to delete. +Changes suggested: Fixing the header and the spacing between the button and the table. -### Design/Evaluation Achievements -- **Design Achievement 1**:
    Task Deadline PriorityIndex Remaining Days Remove