Url Shortner
Url Shortner
BONAFIDE CERTIFICATE
This is to certify that this project work “TO BUILD AN EFFICIENT LINK
SHORTNER AND MAKING BY URL COMPACTIVELY STORED AND
SHARED BY USING NODE JS AND MONGO DB “is the Bonafide Work
done by Mr/Miss………………………………………………….in partial
fulfilment of the requirements for the Diploma in Computer Engineering during
the academic year of 2023-2024.
A URL shortened decreases the length of the URL for you. Large URLs
can be complicated to remember or share with others. A shortened URL version
can help you share your favorite link more easily. A URL shortener can help you
in many other ways as well. For example, Links shortened with the same tool like
nearly identical, at least for the domain section. This overall increases the
authenticity of the URL. Also, adding a large and complicated URL in your social
media bio or where the link is clearly visible looks cluttered. Instead, a shortened
URL looks professional and minimal. A shortened URL further lets you easily
track the number of clicks to the page. This is not possible using Third-party
websites without a URL shortener. These metrics can help you measure the
performance of the link. They limit the number of shortened URLs you can
generate. Using your own URL shortening services will cost you a lot less if you
set it up properly in a cloud hosting services, like AWS. And if you are eligible
for the AWS free tier, you can easily run your basic URL shortening services for
free for a complete year excluding the domain name changes. Next, Mostly URL
shortening services don’t allow you to use custom domains for your shortened
URLs. The options for using a custom domain charges a lot extra. But without
using custom domain Your brand will not stand out. Finally, most of the free or
basic plans of URL shortening services don’t allow you to view analytics. But by
doing some simple tweaks in your custom application, you can easily track the
analytics, like how many clicks were made to the link. The basic workings of a
URL shortener is a straightforward. In the short URL generation part, the API
takes in a POST request with the original URL as a pay load, A unique ID is
generated that corresponds to the original URL. This ID is added to the end of the
base URL. The generated URL and the original URL are stored in the database.
TABLE OF CONTENT
ABSTRACT
1 INTRODUCTION 1
2 SYSTEM ANALYSIS 3
3 SYSTEM REQUIREMENTS 5
4 PROGRAMMING LANGUAGE 6
5 PROJECT OVERVIEW 8
6 MODULES 17
7 SOURCECODE 19
8 SCREEN SHOTS 51
9 REFERENCE 54
10 CONCLUSION 56
1
CHAPTER-1
INTRODUCTION
For several years now, research has looked at phishing website removal
times and the number of visitors that the website attracts. Surprisingly very little
research has looked at answering the same questions for malware websites. One
reason for this may be because the data needed to perform such an analysis is
generally hard to come by. Research that looks at phishing website removal times
and number of visitors mostly makes use of resources such as log files, third party
resources, and honeypots to gather data. How ever the last two resources are not
always easy to get a hold of or to set up. As for the first resource option, log files
are becoming scarce since people are instead using tools such as Google analytics
to track their website click traffic. These analytics are not public information for
understandable reasons. URL shortening services, which provide users with a
smaller equivalent of any provided long URL, are an example of a service which
sometimes provide analytics as public information on their shortened URLs.
Some URL shortening providers such as bit.ly1 or goo.gl2, allow viewing in real
time the click traffic of a given short URL, including referrers and countries
referring it. Unfortunately, attackers abuse URL shortening services, perhaps to
mask the final destination where the victim will land after clicking on the
malicious link. In our research we make use of the Bitly URL shortening service,
reportedly the most popular service to analyze clicks for phishing and malware
attacks. By phishing attacks, we mean websites that trick a user into providing
personal or financial information by falsely claiming to be a legitimate website.
By malware attacks we mean websites that install data transmitting programs
without the user’s knowledge. We rely on two independent services to gather and
classify these attacks: we use the popular community driven portal PhishTank3
as a main source of phishing attack reports, as well as IBM’s threat intelligence
sharing platform X-Force Exchange4 for both phishing and malware attacks. We
2
CHAPTER -2
SYSTEM ANALYSIS
EXISTING SYSTEM
DISADVANTAGES
.
4
PROPOSED SYSTEM
ADVANTAGES
CHAPTER-3
SYSTEM REQUIREMENT
HARDWARE SPECIFICATION
Ram : 4GB
SOFTWARE SPECIFICATION
Backend :Node.js
6
CHAPTER-4
PROGRAMMING LANGUAGE
combines static and dynamic analysis to detect smells in client-side code. This
automated technique can help developers to spot code that could benefit from
refactoring. We evaluate the smell finding capabilities of our technique through
an empirical study. By analyzing web applications, we investigate which smells
detected by JSNOSE are more prevalent
CHAPTER-5
PROJECT OVERVIEW
METHODOLOGY
Purposes
There are several reasons to use URL shortening. Often regular unshorten
links may be aesthetically unpleasing. Many web developers pass descriptive
attributes in the URL to represent data hierarchies, command structures,
transaction paths or session information. This can result in URLs that are
hundreds of characters long and that contain complex character patterns. Such
URLs are difficult to memorize, type out or distribute. As a result, long URLs
must be copied and pasted for reliability. Thus, short URLs may be more
convenient for websites or hard copy publications (e.g. a printed magazine or a
book), the latter often requiring that very long strings be broken into multiple
lines (as is the case with some e-mail software or internet forums) or truncated.
On Twitter and some instant messaging services, there is a limit to the number of
characters a message can carry – however, Twitter now shortens links
automatically using its own URL shortening service, t.co, so there is no need to
use a separate URL shortening service just to shorten URLs in a tweet. On other
such services, using a URL shortener can allow linking to web pages which would
otherwise violate this constraint. Some shortening services, such as goo.gl,
tinyurl.com, and bit.ly can generate URLs that are human-readable, although the
resulting strings are longer than those generated by a length-optimized service.
Finally, URL shortening sites provide detailed information on the clicks a link
receives, which can be simpler than setting up an equally powerful server-side
analytics engine, and unlike the latter, does not require any access to the server
Some websites create short links to make sharing links via instant
messaging easier, and to make it cheaper to send them via SMS. This can be done
online, at the web pages of a URL shortening service to do it in batch via bulk
upload with tools like CSV importer or on demand may require the use of an API.
Techniques
In URL shortening, every long URL is associated with a unique key, which is the
part after its top-level domain name. For example, https://tinyurl.com/m3q2xt has
a key of m3q2xt, these keys are case-sensitive most of the time and using the
wrong case may lead to a different destination URL. Not all redirection is treated
equally; the redirection instruction sent to a browser can contain in its header
HTTP response status codes such as 301 (moved permanently), 302 (found), 307
(temporary redirect) or 308 (permanent redirect).
Not all URI schemes are capable of being shortened as of 2011, although URI
schemes such as http, https, ftp, ftps, mail to, mms, rtmp, rtmpt, ed2k, pop, imap,
nntp, news, ldap, gopher, dict and dns are being addressed by such services as
URL shorteners. Typically, data: and JavaScript: URLs are not supported for
security reasons (to combat attacks like cross-site scripting and session
hijacking). Some URL shortening services support the forwarding of mail to
URLs, as an alternative to address munging, to avoid unwanted harvest by web
crawlers or bots. This may sometimes be done using short, CAPTCHA-protected
URLs, but this is not common.
URLs. This may include URLs that expire after a certain amount of time, on a
certain date or after a certain number of usages.[citation needed] A Microsoft
Security Brief recommends the creation of short-lived URLs, but for reasons
explicitly of security rather than convenience.
Abuse
Linkrot
many existing URL shortening services may not have a sustainable business
model in the long term In late 2009, the Internet Archive started the "301 Works"
projects, together with twenty collaborating companies (initially), whose short
URLs will be preserved by the project.
Transnational law
Shortened internet links typically use ccTLD domains, and are therefore
often under the jurisdiction of a nation other than where the service provider is
located. Libya, for instance, exercised its control over the .ly domain in October
2010 to shut down vb.ly for violating Libyan pornography laws. Failure to predict
such problems with URL shorteners and investment in URL shortening
companies may reflect a lack of due diligence.
A short URL obscures the target address and can be used to redirect to
an unexpected site. Examples of this are "rick rolling", and redirecting to shock
sites, or to affiliate websites. The short URL can allow blocked URLs to be
accessed, bypassing site blocklists; this facilitates redirection of a user to blocked
scam pages or pages containing malware or XSS attacks. Tiny URL tries to
14
disable spam-related links from redirecting. Zone Alarm, however, has warned
its users: "Tiny URL may be unsafe. This website has been known to distribute
spyware." Tiny URL countered this problem by offering an option to view a link's
destination before using a shortened URL. This ability is installed on the browser
via the Tiny URL website and requires the use of cookies.[33] A destination
preview may also be obtained by prefixing the word "preview" to the URL of the
Tiny URL; for example, the destination of https://tinyurl.com/8kmfp is revealed
by entering https://preview.tinyurl.com/8kmfp. Other URL shortening services
provide a similar destination display. Security professionals suggest that users
check a short URL's destination before accessing it, following an instance where
the shortening service cli.gs was compromised, exposing millions of users to
security uncertainties. There are several web applications that can display the
destination URL of a shortened URL.
BLOCK DIAGRAM
17
CHAPTER-6
MODULES
Create Project Directory Open the terminal and go to the path where you want
to create the project and create a folder with your project name. Step 3: Install
the dependencies like express, node Mon etc. This will create package-lock.
Json file and node modules folder.
Install the necessary packages. Open the command line interface and tell NPM
to download the package you want. Now you have downloaded and installed your
first package! NPM creates a folder named "node modules", where the package
will be placed. All packages you install in the future will be placed in this folder.
Set up the env NodeJS Install the Node Nv package. Now that you have
initialized the project in the above section and created a package. Json file
Project structure Now, we can delve into what I commonly refer to as the
application structure flow, which encompasses a set of rules and common
practices aimed at enhancing the Node.js developer experience. The best
practices outlined below can serve as a cheat sheet to assist you in establishing
the ideal architecture flow for your upcoming project.
18
Create URL The get () method returns the first value found for the given query
parameter. So, if there is a duplicate query parameter, only the value of the first
one will be returned. You can use the get All () method to return all values for a
given query parameter
19
CHAPTER-7
SOURCE CODE
App.js
// Include controller
const convert Controller = require('./controllers/convert')
const home Controller = require('./controllers/home')
// error connection
db. On('error', () => {
console.log ('MongoDB error!')
})
// successful connection
db. Once('open', () => {
console.log('MongoDB connected!')
})
// set up handlebars
app. Engine ('handlebars', exphbs({ default Layout: 'main' }))
app. Set ('view engine', 'handlebars')
app.get('/convert', convertController.getShortened)
url.js
index.js
const urlForm = document.querySelector('form')
const URL Result = document.getElementById('url-result')
const input URL = urlForm.querySelector('[name="url"]')
const resetBtn = document.getElementById('reset')
function handleAnimationEnd(event) {
21
event.preventDefault()
urlForm.classList.add('was-validated')
if (!inputUrl.checkValidity()) { return }
fetch(`${window.location.href}convert?url=${inputUrl.value}`)
.then(data => {
return data.json()
})
.then(shortenedUrl => {
urlResult.classList.remove('d-none')
urlResult.classList.add('animated', 'bounceIn')
urlResult.addEventListener('animation end', handleAnimationEnd)
urlResult.querySelector('[name="result"]').value =
`${window.location.href}${shortenedUrl.url}`
Index.css
body {
font-family: 'Bangers', cursive;
}
section {
22
max-width: 500px;
margin: 0 auto;
}
.link-picture .fa-link:before {
background: -webkit-linear-gradient(45deg,#1fddff,#1fddff 50% ,#ff4b1f
50%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
input {
font-family: 'Caveat', cursive;
font-weight: 700;
}
.form-control:hover,
.form-control:focus {
border-color: #686868;
}
.form-control:focus,
.form-control.is-valid:focus, .was-validated .form-control:valid:focus,
.form-control.is-invalid:focus, .was-validated .form-control:invalid:focus {
box-shadow: none;
}
Main.handlebars
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
23
<body>
{{{body}}}
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js"
integrity="sha384-
q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6j
izo"
crossorigin="anonymous"></script>
<script
src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js"
integrity="sha384-
UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIH
NDz0W1"
crossorigin="anonymous"></script>
<script
src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js"
integrity="sha384-
JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07j
RM"
crossorigin="anonymous"></script>
<script src="/javascripts/index.js"></script>
</body>
</html>
24
Index.handlebars
<span></span>
Package-lock.json
{
"name": "url-shortener",
"version": "1.0.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "url-shortener",
"version": "1.0.0",
"license": "ISC",
"dependencies": {
"express": "^4.17.1",
"express-handlebars": "^3.1.0",
"mongoose": "^5.6.6"
}
},
"node_modules/accepts": {
"version": "1.3.7",
"resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
"integrity": "sha512-
Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3
WCwAGVOtauxh1hOxNgIf5bv7dQpA==",
"dependencies": {
"mime-types": "~2.1.24",
"negotiator": "0.6.2"
},
"engines": {
"node": ">= 0.6"
}
},
"node_modules/array-flatten": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-
1.1.1.tgz",
"integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
},
"node_modules/asap": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
"integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY="
26
},
"node_modules/async": {
"version": "2.6.2",
"resolved": "https://registry.npmjs.org/async/-/async-2.6.2.tgz",
"integrity": "sha512-
H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/y
CW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==",
"dependencies": {
"lodash": "^4.17.11"
}
},
"node_modules/balanced-match": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-
1.0.0.tgz",
"integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
},
"node_modules/bluebird": {
"version": "3.5.1",
"resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz",
"integrity": "sha512-
MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQS
Gczs5jZVxV339chE8iwk6F64wjA=="
},
"node_modules/body-parser": {
"version": "1.19.0",
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-
1.19.0.tgz",
"integrity": "sha512-
dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4
XWW9CuFNK22krhrj1+rgzifNCsw==",
"dependencies": {
"bytes": "3.1.0",
"content-type": "~1.0.4",
"debug": "2.6.9",
"depd": "~1.1.2",
"http-errors": "1.7.2",
"iconv-lite": "0.4.24",
"on-finished": "~2.3.0",
"qs": "6.7.0",
"raw-body": "2.4.0",
"type-is": "~1.6.17"
},
27
"engines": {
"node": ">= 0.8"
}
},
"node_modules/brace-expansion": {
"version": "1.1.11",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-
1.1.11.tgz",
"integrity": "sha512-
iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYF
ldEBl0g187ufozdaHgWKcYFb61qGiA==",
"dependencies": {
"balanced-match": "^1.0.0",
"concat-map": "0.0.1"
}
},
"node_modules/bson": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/bson/-/bson-1.1.1.tgz",
"integrity": "sha512-
jCGVYLoYMHDkOsbwJZBCqwMHyH4c+wzgI9hG7Z6SZJRXWr+x58pdIb
m2i9a/jFGCkRJqRUr8eoI7lDWa0hTkxg==",
"deprecated": "Fixed a critical issue with BSON serialization documented in
CVE-2019-2391, see https://bit.ly/2KcpXdo for more details",
"engines": {
"node": ">=0.6.19"
}
},
"node_modules/bytes": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
"integrity": "sha512-
zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aH
BLZSMOopbzwv8f+wZcVzfVTI2Dg==",
"engines": {
"node": ">= 0.8"
}
},
"node_modules/commander": {
"version": "2.20.0",
"resolved": "https://registry.npmjs.org/commander/-/commander-
2.20.0.tgz",
28
"integrity": "sha512-
7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQ
R4OyN/UnE5KLyEBnKHd4aG3rskjpQ==",
"optional": true
},
"node_modules/concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
"integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
},
"node_modules/content-disposition": {
"version": "0.5.3",
"resolved": "https://registry.npmjs.org/content-disposition/-/content-
disposition-0.5.3.tgz",
"integrity": "sha512-
ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8
G6uBJjkqLrhT0qEYFcWng8z1z0g==",
"dependencies": {
"safe-buffer": "5.1.2"
},
"engines": {
"node": ">= 0.6"
}
},
"node_modules/content-type": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/content-type/-/content-type-
1.0.4.tgz",
"integrity": "sha512-
hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQ
LXBCBFBk/tvIG/tUc9mOUJiPBhPXA==",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/cookie": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz",
"integrity": "sha512-
+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6
ZaPDOUbnjOt/99w66zk+l1Xg==",
"engines": {
"node": ">= 0.6"
29
}
},
"node_modules/cookie-signature": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-
1.0.6.tgz",
"integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
},
"node_modules/debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-
bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDj
m/E7AdgFBVeAPVMNcKGsHMA==",
"dependencies": {
"ms": "2.0.0"
}
},
"node_modules/define-properties": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/define-properties/-/define-properties-
1.1.3.tgz",
"integrity": "sha512-
3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46I
YYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
"dependencies": {
"object-keys": "^1.0.12"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/depd": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
"integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/destroy": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
30
"integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
},
"node_modules/ee-first": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
"integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
},
"node_modules/encodeurl": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
"integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=",
"engines": {
"node": ">= 0.8"
}
},
"node_modules/escape-html": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
"integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
},
"node_modules/etag": {
"version": "1.8.1",
"resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
"integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/express": {
"version": "4.17.1",
"resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz",
"integrity": "sha512-
mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w
2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==",
"dependencies": {
"accepts": "~1.3.7",
"array-flatten": "1.1.1",
"body-parser": "1.19.0",
"content-disposition": "0.5.3",
"content-type": "~1.0.4",
"cookie": "0.4.0",
"cookie-signature": "1.0.6",
"debug": "2.6.9",
31
"depd": "~1.1.2",
"encodeurl": "~1.0.2",
"escape-html": "~1.0.3",
"etag": "~1.8.1",
"finalhandler": "~1.1.2",
"fresh": "0.5.2",
"merge-descriptors": "1.0.1",
"methods": "~1.1.2",
"on-finished": "~2.3.0",
"parseurl": "~1.3.3",
"path-to-regexp": "0.1.7",
"proxy-addr": "~2.0.5",
"qs": "6.7.0",
"range-parser": "~1.2.1",
"safe-buffer": "5.1.2",
"send": "0.17.1",
"serve-static": "1.14.1",
"setprototypeof": "1.1.1",
"statuses": "~1.5.0",
"type-is": "~1.6.18",
"utils-merge": "1.0.1",
"vary": "~1.1.2"
},
"engines": {
"node": ">= 0.10.0"
}
},
"node_modules/express-handlebars": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/express-handlebars/-/express-
handlebars-3.1.0.tgz",
"integrity": "sha512-
7QlaXnSREMmN5P2o4gmpUZDfJlLtfBka9d6r7/ccXaU7rPp76odw9YYtwZY
dIiha2JqwiaG6o2Wu6NZJQ0u7Fg==",
"dependencies": {
"glob": "^7.1.3",
"graceful-fs": "^4.1.2",
"handlebars": "^4.1.2",
"object.assign": "^4.1.0",
"promise": "^8.0.2"
},
"engines": {
"node": ">=0.10"
32
}
},
"node_modules/finalhandler": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
"integrity": "sha512-
aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOl
NjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
"dependencies": {
"debug": "2.6.9",
"encodeurl": "~1.0.2",
"escape-html": "~1.0.3",
"on-finished": "~2.3.0",
"parseurl": "~1.3.3",
"statuses": "~1.5.0",
"unpipe": "~1.0.0"
},
"engines": {
"node": ">= 0.8"
}
},
"node_modules/forwarded": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
"integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/fresh": {
"version": "0.5.2",
"resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
"integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/fs.realpath": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
"integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
},
"node_modules/function-bind": {
33
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-
1.1.1.tgz",
"integrity": "sha512-
yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9
NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
},
"node_modules/glob": {
"version": "7.1.4",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz",
"integrity": "sha512-
hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT
9RBKMGjnq6kMuyYwha6csxbiM1A==",
"dependencies": {
"fs.realpath": "^1.0.0",
"inflight": "^1.0.4",
"inherits": "2",
"minimatch": "^3.0.4",
"once": "^1.3.0",
"path-is-absolute": "^1.0.0"
},
"engines": {
"node": "*"
}
},
"node_modules/graceful-fs": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.0.tgz",
"integrity": "sha512-
jpSvDPV4Cq/bgtpndIWbI5hmYxhQGHPC4d4cqBPb4DLniCfhJokdXhwhaDu
LBGLQdvvRum/UiX6ECVIPvDXqdg=="
},
"node_modules/handlebars": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.2.tgz",
"integrity": "sha512-
nvfrjqvt9xQ8Z/w0ijewdD/vvWDTOweBUm96NTr66Wfvo1mJenBLwcYmPs3
TIBP5ruzYGD7Hx/DaM9RmhroGPw==",
"dependencies": {
"neo-async": "^2.6.0",
"optimist": "^0.6.1",
"source-map": "^0.6.1"
},
34
"bin": {
"handlebars": "bin/handlebars"
},
"engines": {
"node": ">=0.4.7"
},
"optionalDependencies": {
"uglify-js": "^3.1.4"
}
},
"node_modules/has-symbols": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-
1.0.0.tgz",
"integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=",
"engines": {
"node": ">= 0.4"
}
},
"node_modules/http-errors": {
"version": "1.7.2",
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz",
"integrity": "sha512-
uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqc
oFVI4lQJ5plg63TvGfRSDCRg==",
"dependencies": {
"depd": "~1.1.2",
"inherits": "2.0.3",
"setprototypeof": "1.1.1",
"statuses": ">= 1.5.0 < 2",
"toidentifier": "1.0.0"
},
"engines": {
"node": ">= 0.6"
}
},
"node_modules/iconv-lite": {
"version": "0.4.24",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
"integrity": "sha512-
v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQ
Wne1TcRwhCL1HwLI21bEqdpj8/rA==",
"dependencies": {
35
},
"node_modules/media-typer": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
"integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/memory-pager": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-
1.5.0.tgz",
"integrity": "sha512-
ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNC
StjQjM6NU1okjQGSxgEZN8eBYKg==",
"optional": true
},
"node_modules/merge-descriptors": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-
descriptors-1.0.1.tgz",
"integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E="
},
"node_modules/methods": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
"integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/mime": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
"integrity": "sha512-
x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+Nkm
YmmRgP68mc70j2EbeTFRsrswaQeg==",
"bin": {
"mime": "cli.js"
},
"engines": {
"node": ">=4"
37
}
},
"node_modules/mime-db": {
"version": "1.40.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz",
"integrity": "sha512-
jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzd
bmaIvnhZ9v2P+CuecK+fpUfsV2mA==",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/mime-types": {
"version": "2.1.24",
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-
2.1.24.tgz",
"integrity": "sha512-
WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZs
YpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==",
"dependencies": {
"mime-db": "1.40.0"
},
"engines": {
"node": ">= 0.6"
}
},
"node_modules/minimatch": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
"integrity": "sha512-
yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0H
Rot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
"dependencies": {
"brace-expansion": "^1.1.7"
},
"engines": {
"node": "*"
}
},
"node_modules/minimist": {
"version": "0.0.10",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz",
"integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8="
38
},
"node_modules/mongodb": {
"version": "3.2.7",
"resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.2.7.tgz",
"integrity": "sha512-
2YdWrdf1PJgxcCrT1tWoL6nHuk6hCxhddAAaEh8QJL231ci4+P9FLyqopbTm
2Z2sAU6mhCri+wd9r1hOcHdoMw==",
"dependencies": {
"mongodb-core": "3.2.7",
"safe-buffer": "^5.1.2"
},
"engines": {
"node": ">=4"
}
},
"node_modules/mongodb-core": {
"version": "3.2.7",
"resolved": "https://registry.npmjs.org/mongodb-core/-/mongodb-core-
3.2.7.tgz",
"integrity": "sha512-
WypKdLxFNPOH/Jy6i9z47IjG2wIldA54iDZBmHMINcgKOUcWJh8og+Wix7
6oGd7EyYkHJKssQ2FAOw5Su/n4XQ==",
"dependencies": {
"bson": "^1.1.1",
"require_optional": "^1.0.1",
"safe-buffer": "^5.1.2"
},
"optionalDependencies": {
"saslprep": "^1.0.0"
}
},
"node_modules/mongoose": {
"version": "5.6.6",
"resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.6.6.tgz",
"integrity": "sha512-
5uecJSyl2TwbGM9vJteP4C54zsQL6qllq1qe/JPGO3oqIWcK/PnzCL91E0gfPH
5VVpvWGX+6PafNYmU3NK8S7w==",
"dependencies": {
"async": "2.6.2",
"bson": "~1.1.1",
"kareem": "2.3.0",
"mongodb": "3.2.7",
"mongodb-core": "3.2.7",
39
"mongoose-legacy-pluralize": "1.0.2",
"mpath": "0.6.0",
"mquery": "3.2.1",
"ms": "2.1.2",
"regexp-clone": "1.0.0",
"safe-buffer": "5.1.2",
"sift": "7.0.1",
"sliced": "1.0.1"
},
"engines": {
"node": ">=4.0.0"
}
},
"node_modules/mongoose-legacy-pluralize": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/mongoose-legacy-pluralize/-
/mongoose-legacy-pluralize-1.0.2.tgz",
"integrity": "sha512-
Yo/7qQU4/EyIS8YDFSeenIvXxZN+ld7YdV9LqFVQJzTLye8unujAWPZ4NW
KfFA+RNjh+wvTWKY9Z3E5XM6ZZiQ==",
"peerDependencies": {
"mongoose": "*"
}
},
"node_modules/mongoose/node_modules/ms": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-
sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKW
P0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
},
"node_modules/mpath": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/mpath/-/mpath-0.6.0.tgz",
"integrity": "sha512-
i75qh79MJ5Xo/sbhxrDrPSEG0H/mr1kcZXJ8dH6URU5jD/knFxCVqVC/gVS
W7GIXL/9hHWlT9haLbCXWOll3qw==",
"engines": {
"node": ">=4.0.0"
}
},
"node_modules/mquery": {
"version": "3.2.1",
40
"resolved": "https://registry.npmjs.org/mquery/-/mquery-3.2.1.tgz",
"integrity": "sha512-
kY/K8QToZWTTocm0U+r8rqcJCp5PRl6e8tPmoDs5OeSO3DInZE2rAL6AYH
+V406JTo8305LdASOQcxRDqHojyw==",
"dependencies": {
"bluebird": "3.5.1",
"debug": "3.1.0",
"regexp-clone": "^1.0.0",
"safe-buffer": "5.1.2",
"sliced": "1.0.1"
},
"engines": {
"node": ">=4.0.0"
}
},
"node_modules/mquery/node_modules/debug": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
"integrity": "sha512-
OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjc
E2VqQpDslf55723cKPUOGSmMY3g==",
"dependencies": {
"ms": "2.0.0"
}
},
"node_modules/ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
},
"node_modules/negotiator": {
"version": "0.6.2",
"resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
"integrity": "sha512-
hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF
574pFQI7mum2AUqDidoKqcTOw==",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/neo-async": {
"version": "2.6.1",
"resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz",
41
"integrity": "sha512-
iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZa
DpPjcOKiiXCPINZC1GczQ7iTq3Zw=="
},
"node_modules/object-keys": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
"integrity": "sha512-
NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxh
uNguS2XG+GjkyMwOzsN5ZktImfhLA==",
"engines": {
"node": ">= 0.4"
}
},
"node_modules/object.assign": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/object.assign/-/object.assign-
4.1.0.tgz",
"integrity": "sha512-
exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc
9VZrXf7DarreEwMpurG3dd+CNyW5w==",
"dependencies": {
"define-properties": "^1.1.2",
"function-bind": "^1.1.1",
"has-symbols": "^1.0.0",
"object-keys": "^1.0.11"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/on-finished": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
"integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
"dependencies": {
"ee-first": "1.1.1"
},
"engines": {
"node": ">= 0.8"
}
},
"node_modules/once": {
42
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
"integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
"dependencies": {
"wrappy": "1"
}
},
"node_modules/optimist": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz",
"integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=",
"dependencies": {
"minimist": "~0.0.1",
"wordwrap": "~0.0.2"
}
},
"node_modules/parseurl": {
"version": "1.3.3",
"resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
"integrity": "sha512-
CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p6
3hoG1fcj3fHynXi9NYO4nWOL+qQ==",
"engines": {
"node": ">= 0.8"
}
},
"node_modules/path-is-absolute": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-
1.0.1.tgz",
"integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/path-to-regexp": {
"version": "0.1.7",
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-
0.1.7.tgz",
"integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
},
"node_modules/promise": {
"version": "8.0.3",
43
"resolved": "https://registry.npmjs.org/promise/-/promise-8.0.3.tgz",
"integrity": "sha512-
HeRDUL1RJiLhyA0/grn+PTShlBAcLuh/1BJGtrvjwbvRDCTLLMEz9rOGCV
+R3vHY4MixIuoMEd9Yq/XvsTPcjw==",
"dependencies": {
"asap": "~2.0.6"
}
},
"node_modules/proxy-addr": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz",
"integrity": "sha512-
t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdf
OwZEMyIh3/xHb8PX3t+lfL9z+YVQ==",
"dependencies": {
"forwarded": "~0.1.2",
"ipaddr.js": "1.9.0"
},
"engines": {
"node": ">= 0.10"
}
},
"node_modules/qs": {
"version": "6.7.0",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
"integrity": "sha512-
VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxF
mmX56+HZphIGtV0XeCirBtpDrTyQ==",
"engines": {
"node": ">=0.6"
}
},
"node_modules/range-parser": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/range-parser/-/range-parser-
1.2.1.tgz",
"integrity": "sha512-
Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3cc
AveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
"engines": {
"node": ">= 0.6"
}
},
44
"node_modules/raw-body": {
"version": "2.4.0",
"resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz",
"integrity": "sha512-
4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepX
s+EsQ9XJ8ipEDoiH70ySUJP3Q==",
"dependencies": {
"bytes": "3.1.0",
"http-errors": "1.7.2",
"iconv-lite": "0.4.24",
"unpipe": "1.0.0"
},
"engines": {
"node": ">= 0.8"
}
},
"node_modules/regexp-clone": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/regexp-clone/-/regexp-clone-
1.0.0.tgz",
"integrity": "sha512-
TuAasHQNamyyJ2hb97IuBEif4qBHGjPHBS64sZwytpLEqtBQ1gPJTnOaQ6q
mpET16cK14kkjbazl6+p0RRv0yw=="
},
"node_modules/require_optional": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/require_optional/-/require_optional-
1.0.1.tgz",
"integrity": "sha512-
qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/ty
loNqJyN6kXSl3RyyM8Ll5D/sJP8g==",
"dependencies": {
"resolve-from": "^2.0.0",
"semver": "^5.1.0"
}
},
"node_modules/resolve-from": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-
2.0.0.tgz",
"integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=",
"engines": {
"node": ">=0.10.0"
45
}
},
"node_modules/safe-buffer": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
"integrity": "sha512-
Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscS
mMJSoF8LOIrt8ud/wPtojys4G6+g=="
},
"node_modules/safer-buffer": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
"integrity": "sha512-
YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2AD
xGcQbHG7vcyRHk0cbwqcQriUtg=="
},
"node_modules/saslprep": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz",
"integrity": "sha512-
/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9o
JLsl3LnQwSvZDKagDGBsBwSooag==",
"optional": true,
"dependencies": {
"sparse-bitfield": "^3.0.3"
},
"engines": {
"node": ">=6"
}
},
"node_modules/semver": {
"version": "5.7.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz",
"integrity": "sha512-
Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQ
coSERyZ5sl3LDIOw0nAn/5DA==",
"bin": {
"semver": "bin/semver"
}
},
"node_modules/send": {
"version": "0.17.1",
"resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz",
46
"integrity": "sha512-
BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJ
CrTP2xVN6yI+XjPJcNuE3V4fT9sAg==",
"dependencies": {
"debug": "2.6.9",
"depd": "~1.1.2",
"destroy": "~1.0.4",
"encodeurl": "~1.0.2",
"escape-html": "~1.0.3",
"etag": "~1.8.1",
"fresh": "0.5.2",
"http-errors": "~1.7.2",
"mime": "1.6.0",
"ms": "2.1.1",
"on-finished": "~2.3.0",
"range-parser": "~1.2.1",
"statuses": "~1.5.0"
},
"engines": {
"node": ">= 0.8.0"
}
},
"node_modules/send/node_modules/ms": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
"integrity": "sha512-
tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF
8hDVesS/FpnYaD/kOWhYQvyg=="
},
"node_modules/serve-static": {
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz",
"integrity": "sha512-
JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MO
fFnpFntl7ecpZs+3mW+XbQZu9QCg==",
"dependencies": {
"encodeurl": "~1.0.2",
"escape-html": "~1.0.3",
"parseurl": "~1.3.3",
"send": "0.17.1"
},
"engines": {
"node": ">= 0.8.0"
47
}
},
"node_modules/setprototypeof": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-
1.1.1.tgz",
"integrity": "sha512-
JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfD
w7OaMYwEbHMOxEZ1lqVRYP2OAw=="
},
"node_modules/sift": {
"version": "7.0.1",
"resolved": "https://registry.npmjs.org/sift/-/sift-7.0.1.tgz",
"integrity": "sha512-
oqD7PMJ+uO6jV9EQCl0LrRw1OwsiPsiFQR5AR30heR+4Dl7jBBbDLnNvWi
ak20tzZlSE1H7RB30SX/1j/YYT7g=="
},
"node_modules/sliced": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz",
"integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E="
},
"node_modules/source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha512-
UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1
Zbq2l5WaqYnrVbwWOWMyF3F47g==",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/sparse-bitfield": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-
3.0.3.tgz",
"integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=",
"optional": true,
"dependencies": {
"memory-pager": "^1.0.2"
}
},
"node_modules/statuses": {
48
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
"integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/toidentifier": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
"integrity": "sha512-
yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxok
p0vcYnvteJln5FNQDRrxj3YcbVw==",
"engines": {
"node": ">=0.6"
}
},
"node_modules/type-is": {
"version": "1.6.18",
"resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
"integrity": "sha512-
TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnl
FPW4ky9Q+iA+ma9BGm06XQBy8g==",
"dependencies": {
"media-typer": "0.3.0",
"mime-types": "~2.1.24"
},
"engines": {
"node": ">= 0.6"
}
},
"node_modules/uglify-js": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.0.tgz",
"integrity": "sha512-
W+jrUHJr3DXKhrsS7NUVxn3zqMOFn0hL/Ei6v0anCIMoKC93TjcflTagwIH
LW7SfMFfiQuktQyFVCFHGUE0+yg==",
"optional": true,
"dependencies": {
"commander": "~2.20.0",
"source-map": "~0.6.1"
},
"bin": {
49
"uglifyjs": "bin/uglifyjs"
},
"engines": {
"node": ">=0.8.0"
}
},
"node_modules/unpipe": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
"integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=",
"engines": {
"node": ">= 0.8"
}
},
"node_modules/utils-merge": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
"integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=",
"engines": {
"node": ">= 0.4.0"
}
},
"node_modules/vary": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
"integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=",
"engines": {
"node": ">= 0.8"
}
},
"node_modules/wordwrap": {
"version": "0.0.3",
"resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz",
"integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=",
"engines": {
"node": ">=0.4.0"
}
},
"node_modules/wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
}
50
}
}
Package.json
{
"name": "url-shortener",
"version": "1.0.0",
"description": "",
"main": "app.js",
"scripts": {
"start": "node app.js",
"dev": "nodemon app.js",
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"express": "^4.17.1",
"express-handlebars": "^3.1.0",
"mongoose": "^5.6.6"
}
}
51
CHAPTER-8
1. Open visual studio code ->File ->Open Folder ->Select URL link
shortener file folder and open.
Node app.js
4.Now MongoDB connection was successful
5.Open chrome browser ->Type our URL link shortener server address to
open URL link shortener website.
http://localhost:3000
6.copy any URL and gives the input of URL website and submit the URL. For
example Nodejs installation website URL.
53
7.Now copy the shortened URL and paste to open the website are same.
54
CHAPTER-9
REFERENCES
CHAPTER-10
CONCLUSION