[init]
This commit is contained in:
		
						commit
						aae4e3df8d
					
				
							
								
								
									
										3
									
								
								.env.sample
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								.env.sample
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,3 @@ | ||||
| APP_PORT=3000 | ||||
| ES_CONNECT=es:9200 | ||||
| # DEBUG=express:* | ||||
							
								
								
									
										4
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,4 @@ | ||||
| nbproject | ||||
| .env | ||||
| .*.sw* | ||||
| node_modules | ||||
							
								
								
									
										19
									
								
								Dockerfile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								Dockerfile
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,19 @@ | ||||
| FROM node:13-alpine | ||||
| 
 | ||||
| # Create app directory | ||||
| WORKDIR /usr/src/app | ||||
| 
 | ||||
| # Install app dependencies | ||||
| # A wildcard is used to ensure both package.json AND package-lock.json are copied | ||||
| # where available (npm@5+) | ||||
| COPY package*.json ./ | ||||
| 
 | ||||
| RUN npm install | ||||
| # If you are building your code for production | ||||
| # RUN npm ci --only=production | ||||
| 
 | ||||
| # Bundle app source | ||||
| COPY . . | ||||
| 
 | ||||
| EXPOSE 3000 | ||||
| CMD [ "node", "index.js" ] | ||||
							
								
								
									
										34
									
								
								docker-compose.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								docker-compose.yml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,34 @@ | ||||
| version: '3.3' | ||||
| 
 | ||||
| volumes: | ||||
|   db: | ||||
|     external: false | ||||
| 
 | ||||
| services: | ||||
| 
 | ||||
|   es: | ||||
|     env_file: .env | ||||
|     image: blacktop/elasticsearch:7.7 | ||||
|     command: ["elasticsearch", "-Elogger.level=ERROR"] | ||||
|     volumes: | ||||
|       - infradb:/opt | ||||
|     environment: | ||||
|       - node.name=es01 | ||||
|       - cluster.name=es-docker-cluster | ||||
|       - bootstrap.memory_lock=true | ||||
|       - "ES_JAVA_OPTS=-Xms512m -Xmx512m" | ||||
|     ulimits: | ||||
|       memlock: | ||||
|         soft: -1 | ||||
|         hard: -1 | ||||
|     volumes: | ||||
|       - db:/usr/share/elasticsearch/data | ||||
|        | ||||
|   app: | ||||
|     env_file: .env | ||||
|     build: .  | ||||
|     image: albancrommer/changelog-server:latest | ||||
|     ports: | ||||
|       - "3000:3000" | ||||
|     depends_on: | ||||
|       - es  | ||||
							
								
								
									
										107
									
								
								index.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										107
									
								
								index.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,107 @@ | ||||
| /* | ||||
|  *  | ||||
|  *  | ||||
| 2020-05-15T20:28:14.357Z | ||||
| PUT /changelog  | ||||
| { | ||||
|   "mappings": { | ||||
|     "properties": { | ||||
|       "author":    { "type": "keyword" },   | ||||
|       "content":  { "type": "text"  },  | ||||
|       "created_at":   { "type": "date","format": "basic_date_time" }      | ||||
|     } | ||||
|   } | ||||
| } | ||||
| 
 | ||||
|  *  | ||||
|  */ | ||||
| 
 | ||||
| /* global process */ | ||||
| 
 | ||||
| "use strict" | ||||
| 
 | ||||
| const elasticsearch = require('elasticsearch'); | ||||
| var client = new elasticsearch.Client({ | ||||
|   host: process.env.ES_CONNECT, | ||||
|   // log: 'trace',
 | ||||
|   apiVersion: '7.7' | ||||
| }); | ||||
| 
 | ||||
| 
 | ||||
| const express = require('express'); | ||||
| const app = express(); | ||||
| 
 | ||||
| 
 | ||||
| app.set('view engine', 'pug'); | ||||
| app.use(express.static('public')); | ||||
| 
 | ||||
| 
 | ||||
| const port = process.env.APP_PORT || 3000; | ||||
| 
 | ||||
| const bodyParser = require('body-parser'); | ||||
| app.use(bodyParser.json()); | ||||
| app.use(bodyParser.raw()); | ||||
| app.use(bodyParser.text({ type : "text/*" })); | ||||
| app.disable('x-powered-by');        | ||||
| 
 | ||||
| 
 | ||||
| const routes = { | ||||
|     main: (req, res) => { | ||||
|       client.search({index:"changelog", "sort":"created_at:desc"}).then( (results,err) => { | ||||
|         res.render('index', { title: 'changelog', error: err, data: JSON.stringify( results) }); | ||||
|          | ||||
|       }); | ||||
| 
 | ||||
|     }, | ||||
|     search: (req, res) => { | ||||
|       const query = req.query.q; | ||||
|       client.search({index:"changelog",body:{query:{multi_match:{query:query}}}}).then( (results,err) => { | ||||
|         res.json(results ); | ||||
|          | ||||
|       }, (err) => { | ||||
|         res.status(404); | ||||
|         res.json({data: {} }); | ||||
|       }); | ||||
| 
 | ||||
|     }, | ||||
|     health: (req, res) => { | ||||
|        | ||||
|       // Do an ES request
 | ||||
|       client.ping({ requestTimeout: 100}).then(  | ||||
|         () => { | ||||
|           res.json({"health":100,"msg":"OK"}); | ||||
|         }, () => { | ||||
|           res.json({"health":0,"msg":"Lost connection to ES"}); | ||||
|       }); | ||||
|     }, | ||||
|     add: (req, res) => { | ||||
| 
 | ||||
|       const body = req.body; | ||||
|       body.created_at = new Date().toISOString(); | ||||
|       client.index({ | ||||
|           index: 'changelog', | ||||
|           body: body | ||||
|       }).then( (e) => { | ||||
|         res.end("ok"); | ||||
|          | ||||
|       }, (e) => { | ||||
|         res.status(400); | ||||
|         res.end("error"); | ||||
|       }); | ||||
|     } | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| app.get('/health', routes.health); | ||||
| app.get('/search', routes.search); | ||||
| 
 | ||||
| app.post('/*', routes.add); | ||||
| app.get('/*', routes.main); | ||||
| app.patch('/*', routes.main); | ||||
| app.put('/*', routes.main); | ||||
| app.delete('/*', routes.main); | ||||
| 
 | ||||
| 
 | ||||
| app.listen(port, () => { | ||||
|     console.log(`Express.js listening on port: ${port}`); | ||||
| });     | ||||
							
								
								
									
										907
									
								
								package-lock.json
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										907
									
								
								package-lock.json
									
									
									
										generated
									
									
									
										Normal file
									
								
							| @ -0,0 +1,907 @@ | ||||
| { | ||||
|   "name": "changelog-server", | ||||
|   "version": "0.0.0", | ||||
|   "lockfileVersion": 1, | ||||
|   "requires": true, | ||||
|   "dependencies": { | ||||
|     "@types/babel-types": { | ||||
|       "version": "7.0.7", | ||||
|       "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-7.0.7.tgz", | ||||
|       "integrity": "sha512-dBtBbrc+qTHy1WdfHYjBwRln4+LWqASWakLHsWHR2NWHIFkv4W3O070IGoGLEBrJBvct3r0L1BUPuvURi7kYUQ==" | ||||
|     }, | ||||
|     "@types/babylon": { | ||||
|       "version": "6.16.5", | ||||
|       "resolved": "https://registry.npmjs.org/@types/babylon/-/babylon-6.16.5.tgz", | ||||
|       "integrity": "sha512-xH2e58elpj1X4ynnKp9qSnWlsRTIs6n3tgLGNfwAGHwePw0mulHQllV34n0T25uYSu1k0hRKkWXF890B1yS47w==", | ||||
|       "requires": { | ||||
|         "@types/babel-types": "7.0.7" | ||||
|       } | ||||
|     }, | ||||
|     "accepts": { | ||||
|       "version": "1.3.7", | ||||
|       "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", | ||||
|       "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", | ||||
|       "requires": { | ||||
|         "mime-types": "2.1.27", | ||||
|         "negotiator": "0.6.2" | ||||
|       } | ||||
|     }, | ||||
|     "acorn": { | ||||
|       "version": "3.3.0", | ||||
|       "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", | ||||
|       "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=" | ||||
|     }, | ||||
|     "acorn-globals": { | ||||
|       "version": "3.1.0", | ||||
|       "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-3.1.0.tgz", | ||||
|       "integrity": "sha1-/YJw9x+7SZawBPqIDuXUZXOnMb8=", | ||||
|       "requires": { | ||||
|         "acorn": "4.0.13" | ||||
|       }, | ||||
|       "dependencies": { | ||||
|         "acorn": { | ||||
|           "version": "4.0.13", | ||||
|           "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", | ||||
|           "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=" | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "agentkeepalive": { | ||||
|       "version": "3.5.2", | ||||
|       "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-3.5.2.tgz", | ||||
|       "integrity": "sha512-e0L/HNe6qkQ7H19kTlRRqUibEAwDK5AFk6y3PtMsuut2VAH6+Q4xZml1tNDJD7kSAyqmbG/K08K5WEJYtUrSlQ==", | ||||
|       "requires": { | ||||
|         "humanize-ms": "1.2.1" | ||||
|       } | ||||
|     }, | ||||
|     "align-text": { | ||||
|       "version": "0.1.4", | ||||
|       "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", | ||||
|       "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", | ||||
|       "requires": { | ||||
|         "kind-of": "3.2.2", | ||||
|         "longest": "1.0.1", | ||||
|         "repeat-string": "1.6.1" | ||||
|       } | ||||
|     }, | ||||
|     "ansi-regex": { | ||||
|       "version": "2.1.1", | ||||
|       "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", | ||||
|       "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" | ||||
|     }, | ||||
|     "ansi-styles": { | ||||
|       "version": "2.2.1", | ||||
|       "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", | ||||
|       "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" | ||||
|     }, | ||||
|     "array-flatten": { | ||||
|       "version": "1.1.1", | ||||
|       "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", | ||||
|       "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" | ||||
|     }, | ||||
|     "asap": { | ||||
|       "version": "2.0.6", | ||||
|       "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", | ||||
|       "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" | ||||
|     }, | ||||
|     "babel-runtime": { | ||||
|       "version": "6.26.0", | ||||
|       "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", | ||||
|       "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", | ||||
|       "requires": { | ||||
|         "core-js": "2.6.11", | ||||
|         "regenerator-runtime": "0.11.1" | ||||
|       } | ||||
|     }, | ||||
|     "babel-types": { | ||||
|       "version": "6.26.0", | ||||
|       "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", | ||||
|       "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", | ||||
|       "requires": { | ||||
|         "babel-runtime": "6.26.0", | ||||
|         "esutils": "2.0.3", | ||||
|         "lodash": "4.17.15", | ||||
|         "to-fast-properties": "1.0.3" | ||||
|       } | ||||
|     }, | ||||
|     "babylon": { | ||||
|       "version": "6.18.0", | ||||
|       "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", | ||||
|       "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==" | ||||
|     }, | ||||
|     "body-parser": { | ||||
|       "version": "1.19.0", | ||||
|       "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", | ||||
|       "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", | ||||
|       "requires": { | ||||
|         "bytes": "3.1.0", | ||||
|         "content-type": "1.0.4", | ||||
|         "debug": "2.6.9", | ||||
|         "depd": "1.1.2", | ||||
|         "http-errors": "1.7.2", | ||||
|         "iconv-lite": "0.4.24", | ||||
|         "on-finished": "2.3.0", | ||||
|         "qs": "6.7.0", | ||||
|         "raw-body": "2.4.0", | ||||
|         "type-is": "1.6.18" | ||||
|       } | ||||
|     }, | ||||
|     "bytes": { | ||||
|       "version": "3.1.0", | ||||
|       "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", | ||||
|       "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" | ||||
|     }, | ||||
|     "camelcase": { | ||||
|       "version": "1.2.1", | ||||
|       "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", | ||||
|       "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=" | ||||
|     }, | ||||
|     "center-align": { | ||||
|       "version": "0.1.3", | ||||
|       "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", | ||||
|       "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", | ||||
|       "requires": { | ||||
|         "align-text": "0.1.4", | ||||
|         "lazy-cache": "1.0.4" | ||||
|       } | ||||
|     }, | ||||
|     "chalk": { | ||||
|       "version": "1.1.3", | ||||
|       "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", | ||||
|       "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", | ||||
|       "requires": { | ||||
|         "ansi-styles": "2.2.1", | ||||
|         "escape-string-regexp": "1.0.5", | ||||
|         "has-ansi": "2.0.0", | ||||
|         "strip-ansi": "3.0.1", | ||||
|         "supports-color": "2.0.0" | ||||
|       } | ||||
|     }, | ||||
|     "character-parser": { | ||||
|       "version": "2.2.0", | ||||
|       "resolved": "https://registry.npmjs.org/character-parser/-/character-parser-2.2.0.tgz", | ||||
|       "integrity": "sha1-x84o821LzZdE5f/CxfzeHHMmH8A=", | ||||
|       "requires": { | ||||
|         "is-regex": "1.0.5" | ||||
|       } | ||||
|     }, | ||||
|     "clean-css": { | ||||
|       "version": "4.2.3", | ||||
|       "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", | ||||
|       "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", | ||||
|       "requires": { | ||||
|         "source-map": "0.6.1" | ||||
|       } | ||||
|     }, | ||||
|     "cliui": { | ||||
|       "version": "2.1.0", | ||||
|       "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", | ||||
|       "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", | ||||
|       "requires": { | ||||
|         "center-align": "0.1.3", | ||||
|         "right-align": "0.1.3", | ||||
|         "wordwrap": "0.0.2" | ||||
|       } | ||||
|     }, | ||||
|     "constantinople": { | ||||
|       "version": "3.1.2", | ||||
|       "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-3.1.2.tgz", | ||||
|       "integrity": "sha512-yePcBqEFhLOqSBtwYOGGS1exHo/s1xjekXiinh4itpNQGCu4KA1euPh1fg07N2wMITZXQkBz75Ntdt1ctGZouw==", | ||||
|       "requires": { | ||||
|         "@types/babel-types": "7.0.7", | ||||
|         "@types/babylon": "6.16.5", | ||||
|         "babel-types": "6.26.0", | ||||
|         "babylon": "6.18.0" | ||||
|       } | ||||
|     }, | ||||
|     "content-disposition": { | ||||
|       "version": "0.5.3", | ||||
|       "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", | ||||
|       "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", | ||||
|       "requires": { | ||||
|         "safe-buffer": "5.1.2" | ||||
|       } | ||||
|     }, | ||||
|     "content-type": { | ||||
|       "version": "1.0.4", | ||||
|       "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", | ||||
|       "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" | ||||
|     }, | ||||
|     "cookie": { | ||||
|       "version": "0.4.0", | ||||
|       "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", | ||||
|       "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" | ||||
|     }, | ||||
|     "cookie-signature": { | ||||
|       "version": "1.0.6", | ||||
|       "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", | ||||
|       "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" | ||||
|     }, | ||||
|     "core-js": { | ||||
|       "version": "2.6.11", | ||||
|       "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", | ||||
|       "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==" | ||||
|     }, | ||||
|     "debug": { | ||||
|       "version": "2.6.9", | ||||
|       "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", | ||||
|       "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", | ||||
|       "requires": { | ||||
|         "ms": "2.0.0" | ||||
|       } | ||||
|     }, | ||||
|     "decamelize": { | ||||
|       "version": "1.2.0", | ||||
|       "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", | ||||
|       "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" | ||||
|     }, | ||||
|     "depd": { | ||||
|       "version": "1.1.2", | ||||
|       "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", | ||||
|       "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" | ||||
|     }, | ||||
|     "destroy": { | ||||
|       "version": "1.0.4", | ||||
|       "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", | ||||
|       "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" | ||||
|     }, | ||||
|     "doctypes": { | ||||
|       "version": "1.1.0", | ||||
|       "resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz", | ||||
|       "integrity": "sha1-6oCxBqh1OHdOijpKWv4pPeSJ4Kk=" | ||||
|     }, | ||||
|     "ee-first": { | ||||
|       "version": "1.1.1", | ||||
|       "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", | ||||
|       "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" | ||||
|     }, | ||||
|     "elasticsearch": { | ||||
|       "version": "16.7.1", | ||||
|       "resolved": "https://registry.npmjs.org/elasticsearch/-/elasticsearch-16.7.1.tgz", | ||||
|       "integrity": "sha512-PL/BxB03VGbbghJwISYvVcrR9KbSSkuQ7OM//jHJg/End/uC2fvXg4QI7RXLvCGbhBuNQ8dPue7DOOPra73PCw==", | ||||
|       "requires": { | ||||
|         "agentkeepalive": "3.5.2", | ||||
|         "chalk": "1.1.3", | ||||
|         "lodash": "4.17.15" | ||||
|       } | ||||
|     }, | ||||
|     "encodeurl": { | ||||
|       "version": "1.0.2", | ||||
|       "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", | ||||
|       "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" | ||||
|     }, | ||||
|     "escape-html": { | ||||
|       "version": "1.0.3", | ||||
|       "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", | ||||
|       "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" | ||||
|     }, | ||||
|     "escape-string-regexp": { | ||||
|       "version": "1.0.5", | ||||
|       "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", | ||||
|       "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" | ||||
|     }, | ||||
|     "esutils": { | ||||
|       "version": "2.0.3", | ||||
|       "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", | ||||
|       "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" | ||||
|     }, | ||||
|     "etag": { | ||||
|       "version": "1.8.1", | ||||
|       "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", | ||||
|       "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" | ||||
|     }, | ||||
|     "express": { | ||||
|       "version": "4.17.1", | ||||
|       "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", | ||||
|       "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", | ||||
|       "requires": { | ||||
|         "accepts": "1.3.7", | ||||
|         "array-flatten": "1.1.1", | ||||
|         "body-parser": "1.19.0", | ||||
|         "content-disposition": "0.5.3", | ||||
|         "content-type": "1.0.4", | ||||
|         "cookie": "0.4.0", | ||||
|         "cookie-signature": "1.0.6", | ||||
|         "debug": "2.6.9", | ||||
|         "depd": "1.1.2", | ||||
|         "encodeurl": "1.0.2", | ||||
|         "escape-html": "1.0.3", | ||||
|         "etag": "1.8.1", | ||||
|         "finalhandler": "1.1.2", | ||||
|         "fresh": "0.5.2", | ||||
|         "merge-descriptors": "1.0.1", | ||||
|         "methods": "1.1.2", | ||||
|         "on-finished": "2.3.0", | ||||
|         "parseurl": "1.3.3", | ||||
|         "path-to-regexp": "0.1.7", | ||||
|         "proxy-addr": "2.0.6", | ||||
|         "qs": "6.7.0", | ||||
|         "range-parser": "1.2.1", | ||||
|         "safe-buffer": "5.1.2", | ||||
|         "send": "0.17.1", | ||||
|         "serve-static": "1.14.1", | ||||
|         "setprototypeof": "1.1.1", | ||||
|         "statuses": "1.5.0", | ||||
|         "type-is": "1.6.18", | ||||
|         "utils-merge": "1.0.1", | ||||
|         "vary": "1.1.2" | ||||
|       } | ||||
|     }, | ||||
|     "finalhandler": { | ||||
|       "version": "1.1.2", | ||||
|       "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", | ||||
|       "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", | ||||
|       "requires": { | ||||
|         "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" | ||||
|       } | ||||
|     }, | ||||
|     "forwarded": { | ||||
|       "version": "0.1.2", | ||||
|       "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", | ||||
|       "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" | ||||
|     }, | ||||
|     "fresh": { | ||||
|       "version": "0.5.2", | ||||
|       "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", | ||||
|       "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" | ||||
|     }, | ||||
|     "function-bind": { | ||||
|       "version": "1.1.1", | ||||
|       "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", | ||||
|       "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" | ||||
|     }, | ||||
|     "has": { | ||||
|       "version": "1.0.3", | ||||
|       "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", | ||||
|       "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", | ||||
|       "requires": { | ||||
|         "function-bind": "1.1.1" | ||||
|       } | ||||
|     }, | ||||
|     "has-ansi": { | ||||
|       "version": "2.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", | ||||
|       "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", | ||||
|       "requires": { | ||||
|         "ansi-regex": "2.1.1" | ||||
|       } | ||||
|     }, | ||||
|     "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+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", | ||||
|       "requires": { | ||||
|         "depd": "1.1.2", | ||||
|         "inherits": "2.0.3", | ||||
|         "setprototypeof": "1.1.1", | ||||
|         "statuses": "1.5.0", | ||||
|         "toidentifier": "1.0.0" | ||||
|       } | ||||
|     }, | ||||
|     "humanize-ms": { | ||||
|       "version": "1.2.1", | ||||
|       "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", | ||||
|       "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=", | ||||
|       "requires": { | ||||
|         "ms": "2.0.0" | ||||
|       } | ||||
|     }, | ||||
|     "iconv-lite": { | ||||
|       "version": "0.4.24", | ||||
|       "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", | ||||
|       "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", | ||||
|       "requires": { | ||||
|         "safer-buffer": "2.1.2" | ||||
|       } | ||||
|     }, | ||||
|     "inherits": { | ||||
|       "version": "2.0.3", | ||||
|       "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", | ||||
|       "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" | ||||
|     }, | ||||
|     "ipaddr.js": { | ||||
|       "version": "1.9.1", | ||||
|       "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", | ||||
|       "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" | ||||
|     }, | ||||
|     "is-buffer": { | ||||
|       "version": "1.1.6", | ||||
|       "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", | ||||
|       "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" | ||||
|     }, | ||||
|     "is-expression": { | ||||
|       "version": "3.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/is-expression/-/is-expression-3.0.0.tgz", | ||||
|       "integrity": "sha1-Oayqa+f9HzRx3ELHQW5hwkMXrJ8=", | ||||
|       "requires": { | ||||
|         "acorn": "4.0.13", | ||||
|         "object-assign": "4.1.1" | ||||
|       }, | ||||
|       "dependencies": { | ||||
|         "acorn": { | ||||
|           "version": "4.0.13", | ||||
|           "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", | ||||
|           "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=" | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "is-promise": { | ||||
|       "version": "2.2.2", | ||||
|       "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", | ||||
|       "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==" | ||||
|     }, | ||||
|     "is-regex": { | ||||
|       "version": "1.0.5", | ||||
|       "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", | ||||
|       "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", | ||||
|       "requires": { | ||||
|         "has": "1.0.3" | ||||
|       } | ||||
|     }, | ||||
|     "js-stringify": { | ||||
|       "version": "1.0.2", | ||||
|       "resolved": "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz", | ||||
|       "integrity": "sha1-Fzb939lyTyijaCrcYjCufk6Weds=" | ||||
|     }, | ||||
|     "jstransformer": { | ||||
|       "version": "1.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-1.0.0.tgz", | ||||
|       "integrity": "sha1-7Yvwkh4vPx7U1cGkT2hwntJHIsM=", | ||||
|       "requires": { | ||||
|         "is-promise": "2.2.2", | ||||
|         "promise": "7.3.1" | ||||
|       } | ||||
|     }, | ||||
|     "kind-of": { | ||||
|       "version": "3.2.2", | ||||
|       "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", | ||||
|       "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", | ||||
|       "requires": { | ||||
|         "is-buffer": "1.1.6" | ||||
|       } | ||||
|     }, | ||||
|     "lazy-cache": { | ||||
|       "version": "1.0.4", | ||||
|       "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", | ||||
|       "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" | ||||
|     }, | ||||
|     "lodash": { | ||||
|       "version": "4.17.15", | ||||
|       "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", | ||||
|       "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" | ||||
|     }, | ||||
|     "longest": { | ||||
|       "version": "1.0.1", | ||||
|       "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", | ||||
|       "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=" | ||||
|     }, | ||||
|     "media-typer": { | ||||
|       "version": "0.3.0", | ||||
|       "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", | ||||
|       "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" | ||||
|     }, | ||||
|     "merge-descriptors": { | ||||
|       "version": "1.0.1", | ||||
|       "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", | ||||
|       "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" | ||||
|     }, | ||||
|     "methods": { | ||||
|       "version": "1.1.2", | ||||
|       "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", | ||||
|       "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" | ||||
|     }, | ||||
|     "mime": { | ||||
|       "version": "1.6.0", | ||||
|       "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", | ||||
|       "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" | ||||
|     }, | ||||
|     "mime-db": { | ||||
|       "version": "1.44.0", | ||||
|       "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", | ||||
|       "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" | ||||
|     }, | ||||
|     "mime-types": { | ||||
|       "version": "2.1.27", | ||||
|       "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", | ||||
|       "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", | ||||
|       "requires": { | ||||
|         "mime-db": "1.44.0" | ||||
|       } | ||||
|     }, | ||||
|     "ms": { | ||||
|       "version": "2.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", | ||||
|       "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" | ||||
|     }, | ||||
|     "negotiator": { | ||||
|       "version": "0.6.2", | ||||
|       "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", | ||||
|       "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" | ||||
|     }, | ||||
|     "object-assign": { | ||||
|       "version": "4.1.1", | ||||
|       "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", | ||||
|       "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" | ||||
|     }, | ||||
|     "on-finished": { | ||||
|       "version": "2.3.0", | ||||
|       "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", | ||||
|       "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", | ||||
|       "requires": { | ||||
|         "ee-first": "1.1.1" | ||||
|       } | ||||
|     }, | ||||
|     "parseurl": { | ||||
|       "version": "1.3.3", | ||||
|       "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", | ||||
|       "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" | ||||
|     }, | ||||
|     "path-parse": { | ||||
|       "version": "1.0.6", | ||||
|       "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", | ||||
|       "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" | ||||
|     }, | ||||
|     "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=" | ||||
|     }, | ||||
|     "promise": { | ||||
|       "version": "7.3.1", | ||||
|       "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", | ||||
|       "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", | ||||
|       "requires": { | ||||
|         "asap": "2.0.6" | ||||
|       } | ||||
|     }, | ||||
|     "proxy-addr": { | ||||
|       "version": "2.0.6", | ||||
|       "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", | ||||
|       "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", | ||||
|       "requires": { | ||||
|         "forwarded": "0.1.2", | ||||
|         "ipaddr.js": "1.9.1" | ||||
|       } | ||||
|     }, | ||||
|     "pug": { | ||||
|       "version": "2.0.4", | ||||
|       "resolved": "https://registry.npmjs.org/pug/-/pug-2.0.4.tgz", | ||||
|       "integrity": "sha512-XhoaDlvi6NIzL49nu094R2NA6P37ijtgMDuWE+ofekDChvfKnzFal60bhSdiy8y2PBO6fmz3oMEIcfpBVRUdvw==", | ||||
|       "requires": { | ||||
|         "pug-code-gen": "2.0.2", | ||||
|         "pug-filters": "3.1.1", | ||||
|         "pug-lexer": "4.1.0", | ||||
|         "pug-linker": "3.0.6", | ||||
|         "pug-load": "2.0.12", | ||||
|         "pug-parser": "5.0.1", | ||||
|         "pug-runtime": "2.0.5", | ||||
|         "pug-strip-comments": "1.0.4" | ||||
|       } | ||||
|     }, | ||||
|     "pug-attrs": { | ||||
|       "version": "2.0.4", | ||||
|       "resolved": "https://registry.npmjs.org/pug-attrs/-/pug-attrs-2.0.4.tgz", | ||||
|       "integrity": "sha512-TaZ4Z2TWUPDJcV3wjU3RtUXMrd3kM4Wzjbe3EWnSsZPsJ3LDI0F3yCnf2/W7PPFF+edUFQ0HgDL1IoxSz5K8EQ==", | ||||
|       "requires": { | ||||
|         "constantinople": "3.1.2", | ||||
|         "js-stringify": "1.0.2", | ||||
|         "pug-runtime": "2.0.5" | ||||
|       } | ||||
|     }, | ||||
|     "pug-code-gen": { | ||||
|       "version": "2.0.2", | ||||
|       "resolved": "https://registry.npmjs.org/pug-code-gen/-/pug-code-gen-2.0.2.tgz", | ||||
|       "integrity": "sha512-kROFWv/AHx/9CRgoGJeRSm+4mLWchbgpRzTEn8XCiwwOy6Vh0gAClS8Vh5TEJ9DBjaP8wCjS3J6HKsEsYdvaCw==", | ||||
|       "requires": { | ||||
|         "constantinople": "3.1.2", | ||||
|         "doctypes": "1.1.0", | ||||
|         "js-stringify": "1.0.2", | ||||
|         "pug-attrs": "2.0.4", | ||||
|         "pug-error": "1.3.3", | ||||
|         "pug-runtime": "2.0.5", | ||||
|         "void-elements": "2.0.1", | ||||
|         "with": "5.1.1" | ||||
|       } | ||||
|     }, | ||||
|     "pug-error": { | ||||
|       "version": "1.3.3", | ||||
|       "resolved": "https://registry.npmjs.org/pug-error/-/pug-error-1.3.3.tgz", | ||||
|       "integrity": "sha512-qE3YhESP2mRAWMFJgKdtT5D7ckThRScXRwkfo+Erqga7dyJdY3ZquspprMCj/9sJ2ijm5hXFWQE/A3l4poMWiQ==" | ||||
|     }, | ||||
|     "pug-filters": { | ||||
|       "version": "3.1.1", | ||||
|       "resolved": "https://registry.npmjs.org/pug-filters/-/pug-filters-3.1.1.tgz", | ||||
|       "integrity": "sha512-lFfjNyGEyVWC4BwX0WyvkoWLapI5xHSM3xZJFUhx4JM4XyyRdO8Aucc6pCygnqV2uSgJFaJWW3Ft1wCWSoQkQg==", | ||||
|       "requires": { | ||||
|         "clean-css": "4.2.3", | ||||
|         "constantinople": "3.1.2", | ||||
|         "jstransformer": "1.0.0", | ||||
|         "pug-error": "1.3.3", | ||||
|         "pug-walk": "1.1.8", | ||||
|         "resolve": "1.17.0", | ||||
|         "uglify-js": "2.8.29" | ||||
|       } | ||||
|     }, | ||||
|     "pug-lexer": { | ||||
|       "version": "4.1.0", | ||||
|       "resolved": "https://registry.npmjs.org/pug-lexer/-/pug-lexer-4.1.0.tgz", | ||||
|       "integrity": "sha512-i55yzEBtjm0mlplW4LoANq7k3S8gDdfC6+LThGEvsK4FuobcKfDAwt6V4jKPH9RtiE3a2Akfg5UpafZ1OksaPA==", | ||||
|       "requires": { | ||||
|         "character-parser": "2.2.0", | ||||
|         "is-expression": "3.0.0", | ||||
|         "pug-error": "1.3.3" | ||||
|       } | ||||
|     }, | ||||
|     "pug-linker": { | ||||
|       "version": "3.0.6", | ||||
|       "resolved": "https://registry.npmjs.org/pug-linker/-/pug-linker-3.0.6.tgz", | ||||
|       "integrity": "sha512-bagfuHttfQOpANGy1Y6NJ+0mNb7dD2MswFG2ZKj22s8g0wVsojpRlqveEQHmgXXcfROB2RT6oqbPYr9EN2ZWzg==", | ||||
|       "requires": { | ||||
|         "pug-error": "1.3.3", | ||||
|         "pug-walk": "1.1.8" | ||||
|       } | ||||
|     }, | ||||
|     "pug-load": { | ||||
|       "version": "2.0.12", | ||||
|       "resolved": "https://registry.npmjs.org/pug-load/-/pug-load-2.0.12.tgz", | ||||
|       "integrity": "sha512-UqpgGpyyXRYgJs/X60sE6SIf8UBsmcHYKNaOccyVLEuT6OPBIMo6xMPhoJnqtB3Q3BbO4Z3Bjz5qDsUWh4rXsg==", | ||||
|       "requires": { | ||||
|         "object-assign": "4.1.1", | ||||
|         "pug-walk": "1.1.8" | ||||
|       } | ||||
|     }, | ||||
|     "pug-parser": { | ||||
|       "version": "5.0.1", | ||||
|       "resolved": "https://registry.npmjs.org/pug-parser/-/pug-parser-5.0.1.tgz", | ||||
|       "integrity": "sha512-nGHqK+w07p5/PsPIyzkTQfzlYfuqoiGjaoqHv1LjOv2ZLXmGX1O+4Vcvps+P4LhxZ3drYSljjq4b+Naid126wA==", | ||||
|       "requires": { | ||||
|         "pug-error": "1.3.3", | ||||
|         "token-stream": "0.0.1" | ||||
|       } | ||||
|     }, | ||||
|     "pug-runtime": { | ||||
|       "version": "2.0.5", | ||||
|       "resolved": "https://registry.npmjs.org/pug-runtime/-/pug-runtime-2.0.5.tgz", | ||||
|       "integrity": "sha512-P+rXKn9un4fQY77wtpcuFyvFaBww7/91f3jHa154qU26qFAnOe6SW1CbIDcxiG5lLK9HazYrMCCuDvNgDQNptw==" | ||||
|     }, | ||||
|     "pug-strip-comments": { | ||||
|       "version": "1.0.4", | ||||
|       "resolved": "https://registry.npmjs.org/pug-strip-comments/-/pug-strip-comments-1.0.4.tgz", | ||||
|       "integrity": "sha512-i5j/9CS4yFhSxHp5iKPHwigaig/VV9g+FgReLJWWHEHbvKsbqL0oP/K5ubuLco6Wu3Kan5p7u7qk8A4oLLh6vw==", | ||||
|       "requires": { | ||||
|         "pug-error": "1.3.3" | ||||
|       } | ||||
|     }, | ||||
|     "pug-walk": { | ||||
|       "version": "1.1.8", | ||||
|       "resolved": "https://registry.npmjs.org/pug-walk/-/pug-walk-1.1.8.tgz", | ||||
|       "integrity": "sha512-GMu3M5nUL3fju4/egXwZO0XLi6fW/K3T3VTgFQ14GxNi8btlxgT5qZL//JwZFm/2Fa64J/PNS8AZeys3wiMkVA==" | ||||
|     }, | ||||
|     "qs": { | ||||
|       "version": "6.7.0", | ||||
|       "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", | ||||
|       "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" | ||||
|     }, | ||||
|     "range-parser": { | ||||
|       "version": "1.2.1", | ||||
|       "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", | ||||
|       "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" | ||||
|     }, | ||||
|     "raw-body": { | ||||
|       "version": "2.4.0", | ||||
|       "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", | ||||
|       "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", | ||||
|       "requires": { | ||||
|         "bytes": "3.1.0", | ||||
|         "http-errors": "1.7.2", | ||||
|         "iconv-lite": "0.4.24", | ||||
|         "unpipe": "1.0.0" | ||||
|       } | ||||
|     }, | ||||
|     "regenerator-runtime": { | ||||
|       "version": "0.11.1", | ||||
|       "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", | ||||
|       "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" | ||||
|     }, | ||||
|     "repeat-string": { | ||||
|       "version": "1.6.1", | ||||
|       "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", | ||||
|       "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" | ||||
|     }, | ||||
|     "resolve": { | ||||
|       "version": "1.17.0", | ||||
|       "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", | ||||
|       "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", | ||||
|       "requires": { | ||||
|         "path-parse": "1.0.6" | ||||
|       } | ||||
|     }, | ||||
|     "right-align": { | ||||
|       "version": "0.1.3", | ||||
|       "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", | ||||
|       "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", | ||||
|       "requires": { | ||||
|         "align-text": "0.1.4" | ||||
|       } | ||||
|     }, | ||||
|     "safe-buffer": { | ||||
|       "version": "5.1.2", | ||||
|       "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", | ||||
|       "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" | ||||
|     }, | ||||
|     "safer-buffer": { | ||||
|       "version": "2.1.2", | ||||
|       "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", | ||||
|       "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" | ||||
|     }, | ||||
|     "send": { | ||||
|       "version": "0.17.1", | ||||
|       "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", | ||||
|       "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", | ||||
|       "requires": { | ||||
|         "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" | ||||
|       }, | ||||
|       "dependencies": { | ||||
|         "ms": { | ||||
|           "version": "2.1.1", | ||||
|           "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", | ||||
|           "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "serve-static": { | ||||
|       "version": "1.14.1", | ||||
|       "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", | ||||
|       "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", | ||||
|       "requires": { | ||||
|         "encodeurl": "1.0.2", | ||||
|         "escape-html": "1.0.3", | ||||
|         "parseurl": "1.3.3", | ||||
|         "send": "0.17.1" | ||||
|       } | ||||
|     }, | ||||
|     "setprototypeof": { | ||||
|       "version": "1.1.1", | ||||
|       "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", | ||||
|       "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" | ||||
|     }, | ||||
|     "source-map": { | ||||
|       "version": "0.6.1", | ||||
|       "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", | ||||
|       "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" | ||||
|     }, | ||||
|     "statuses": { | ||||
|       "version": "1.5.0", | ||||
|       "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", | ||||
|       "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" | ||||
|     }, | ||||
|     "strip-ansi": { | ||||
|       "version": "3.0.1", | ||||
|       "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", | ||||
|       "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", | ||||
|       "requires": { | ||||
|         "ansi-regex": "2.1.1" | ||||
|       } | ||||
|     }, | ||||
|     "supports-color": { | ||||
|       "version": "2.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", | ||||
|       "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" | ||||
|     }, | ||||
|     "to-fast-properties": { | ||||
|       "version": "1.0.3", | ||||
|       "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", | ||||
|       "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=" | ||||
|     }, | ||||
|     "toidentifier": { | ||||
|       "version": "1.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", | ||||
|       "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" | ||||
|     }, | ||||
|     "token-stream": { | ||||
|       "version": "0.0.1", | ||||
|       "resolved": "https://registry.npmjs.org/token-stream/-/token-stream-0.0.1.tgz", | ||||
|       "integrity": "sha1-zu78cXp2xDFvEm0LnbqlXX598Bo=" | ||||
|     }, | ||||
|     "type-is": { | ||||
|       "version": "1.6.18", | ||||
|       "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", | ||||
|       "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", | ||||
|       "requires": { | ||||
|         "media-typer": "0.3.0", | ||||
|         "mime-types": "2.1.27" | ||||
|       } | ||||
|     }, | ||||
|     "uglify-js": { | ||||
|       "version": "2.8.29", | ||||
|       "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", | ||||
|       "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", | ||||
|       "requires": { | ||||
|         "source-map": "0.5.7", | ||||
|         "uglify-to-browserify": "1.0.2", | ||||
|         "yargs": "3.10.0" | ||||
|       }, | ||||
|       "dependencies": { | ||||
|         "source-map": { | ||||
|           "version": "0.5.7", | ||||
|           "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", | ||||
|           "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "uglify-to-browserify": { | ||||
|       "version": "1.0.2", | ||||
|       "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", | ||||
|       "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", | ||||
|       "optional": true | ||||
|     }, | ||||
|     "unpipe": { | ||||
|       "version": "1.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", | ||||
|       "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" | ||||
|     }, | ||||
|     "utils-merge": { | ||||
|       "version": "1.0.1", | ||||
|       "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", | ||||
|       "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" | ||||
|     }, | ||||
|     "vary": { | ||||
|       "version": "1.1.2", | ||||
|       "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", | ||||
|       "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" | ||||
|     }, | ||||
|     "void-elements": { | ||||
|       "version": "2.0.1", | ||||
|       "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", | ||||
|       "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=" | ||||
|     }, | ||||
|     "window-size": { | ||||
|       "version": "0.1.0", | ||||
|       "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", | ||||
|       "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=" | ||||
|     }, | ||||
|     "with": { | ||||
|       "version": "5.1.1", | ||||
|       "resolved": "https://registry.npmjs.org/with/-/with-5.1.1.tgz", | ||||
|       "integrity": "sha1-+k2qktrzLE6pTtRTyB8EaGtXXf4=", | ||||
|       "requires": { | ||||
|         "acorn": "3.3.0", | ||||
|         "acorn-globals": "3.1.0" | ||||
|       } | ||||
|     }, | ||||
|     "wordwrap": { | ||||
|       "version": "0.0.2", | ||||
|       "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", | ||||
|       "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=" | ||||
|     }, | ||||
|     "yargs": { | ||||
|       "version": "3.10.0", | ||||
|       "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", | ||||
|       "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", | ||||
|       "requires": { | ||||
|         "camelcase": "1.2.1", | ||||
|         "cliui": "2.1.0", | ||||
|         "decamelize": "1.2.0", | ||||
|         "window-size": "0.1.0" | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| } | ||||
							
								
								
									
										18
									
								
								package.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								package.json
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,18 @@ | ||||
| { | ||||
|   "name": "changelog-server", | ||||
|   "version": "0.0.0", | ||||
|   "description": "", | ||||
|   "main": "index.js", | ||||
|   "scripts": { | ||||
|     "test": "echo \"Error: no test specified\" && exit 1" | ||||
|   }, | ||||
|   "author": "", | ||||
|   "license": "GPLv3", | ||||
|   "dependencies": { | ||||
|     "body-parser": "^1.18.3", | ||||
|     "elasticsearch": "^16.7.1", | ||||
|     "express": "^4.17.1", | ||||
|     "lodash": "^4.17.10", | ||||
|     "pug": "^2.0.3" | ||||
|   } | ||||
| } | ||||
							
								
								
									
										45
									
								
								public/js/app.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								public/js/app.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,45 @@ | ||||
| /* global initData */ | ||||
| 
 | ||||
| 
 | ||||
| /** | ||||
|  *  | ||||
|  * @type type | ||||
|  */ | ||||
| const serviceContainer = {}; | ||||
| 
 | ||||
| 
 | ||||
| function updatePage(data){ | ||||
|    | ||||
|   var content = ""; | ||||
|   $.each(data.hits.hits, (k,v)=>{ | ||||
|     var item = v._source; | ||||
|     content += ` | ||||
| 
 | ||||
|     <div class="log row-fluid"> | ||||
|       <div class="span9"> | ||||
|         <p>${item.created_at} ${item.author} ${item.server}  | ||||
|         <h4> ${item.content}</h4> | ||||
|       </span> | ||||
|     </div> | ||||
|     `;
 | ||||
|   }); | ||||
|   $("#content").html(content); | ||||
|    | ||||
| } | ||||
| 
 | ||||
| $("input").on("keydown",function(e){ | ||||
|   const el = $(e.target); | ||||
|   const val = el.val(); | ||||
|   if( val.length < 3 ){ return; } | ||||
|   $.ajax("/search",{ | ||||
|     data: {q:val} | ||||
|   })   | ||||
|   .done(function(data) { | ||||
|     updatePage(data); | ||||
|   }) | ||||
|   .fail(function() { | ||||
|     alert( "error" ); | ||||
|   }); | ||||
| }); | ||||
| 
 | ||||
| updatePage( initData ); | ||||
							
								
								
									
										78
									
								
								routes/index.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										78
									
								
								routes/index.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,78 @@ | ||||
| module.exports = { | ||||
|     main: (req, res) => { | ||||
|         console.log("request /") | ||||
|           res.render('index', { title: 'Hey', message: 'Hello there!' }) | ||||
|   res.end('wut') | ||||
| 
 | ||||
| //
 | ||||
| //        res.type('html')
 | ||||
| //        res.send(`<html>
 | ||||
| //<head>
 | ||||
| //<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
 | ||||
| //<title>Welcome to Alex's express.js example</title>
 | ||||
| //</head>
 | ||||
| //<body>
 | ||||
| //    <h3>Hi, thanks for using my Express.js lab 👏</h3>
 | ||||
| //
 | ||||
| //    <p>If you found it useful, <a href="https://github.com/alexellis/">view my other GitHub projects</a> today 👑</p>
 | ||||
| //
 | ||||
| //    <p>Results from <quote>GET <a href="/links">/links</a></quote>:</p>
 | ||||
| //
 | ||||
| //    <div id="links">
 | ||||
| //    </div>
 | ||||
| //
 | ||||
| //    <p>Copyright <a href="https://www.alexellis.io/">Alex Ellis 2020 ®</a></p>
 | ||||
| //    <script>
 | ||||
| //    $(document).ready(function(){
 | ||||
| //        $.get("/links", function(data, status){
 | ||||
| //            var res = "<ul>";
 | ||||
| //            var links = data;
 | ||||
| //            for(var i=0; i < links.length; i++) {
 | ||||
| //                res += "<li><a href=" + links[i].url + ">" + links[i].name + "</a></li>"
 | ||||
| //            }
 | ||||
| //            $("#links").html(res)
 | ||||
| //        });
 | ||||
| //    });
 | ||||
| //    </script>
 | ||||
| //    </body>
 | ||||
| //</html>
 | ||||
| //`);
 | ||||
|     }, | ||||
|     links: (req, res) => { | ||||
|         res.type("json") | ||||
|         res.send( | ||||
|             [ | ||||
|                 { | ||||
|                     "name": "github", | ||||
|                     "url": "https://github.com/alexellis" | ||||
|                 }, | ||||
|                 { | ||||
|                     "name": "twitter", | ||||
|                     "url": "https://twitter.com/alexellisuk" | ||||
|                 }, | ||||
|                 { | ||||
|                     "name": "blog", | ||||
|                     "url": "https://blog.alexellis.io" | ||||
|                 }, | ||||
|                 { | ||||
|                     "name": "sponsors", | ||||
|                     "url": "https://github.com/users/alexellis/sponsorship" | ||||
|                 }, | ||||
|             ]) | ||||
|     }, | ||||
|     health: (req, res) => { | ||||
|        | ||||
|       // Do an ES request
 | ||||
|       client.ping({ | ||||
|       // ping usually has a 3000ms timeout
 | ||||
|       requestTimeout: 1000 | ||||
|         }, function (error) { | ||||
|           if (error) { | ||||
|             console.trace('elasticsearch cluster is down!'); | ||||
|           } else { | ||||
|             console.log('All is well'); | ||||
|           } | ||||
|       }); | ||||
|         res.send("OK"); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										40
									
								
								system/dev_run.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										40
									
								
								system/dev_run.sh
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,40 @@ | ||||
| #!/bin/bash | ||||
| msg(){  | ||||
|     echo -e "  \e[0;31m$@\e[0m";  | ||||
| } | ||||
| docker(){ | ||||
|     local D="$1" | ||||
|     msg "! $D Start reloading" | ||||
|     > /tmp/ci.work | ||||
|     sudo docker-compose down | ||||
|     sudo docker-compose build  | ||||
|     sudo docker-compose up -d  | ||||
|     sleep 3 | ||||
|     rm -f /tmp/ci.work | ||||
|     msg "! $D Finished reloading" | ||||
| } | ||||
| 
 | ||||
| reload(){  | ||||
|     if [[ -f /tmp/ci.work ]] ; then  | ||||
|     #    msg "- $D Reload currently in progress. Skip."  | ||||
|         return | ||||
|     fi | ||||
|     local D=$(date +%s-%N) | ||||
|     msg "= $D Change detected" | ||||
|     echo -n "$D">/tmp/ci | ||||
|     sleep 3 | ||||
|     if [[ "$( cat /tmp/ci )" != "$D" ]] ; then | ||||
|         msg "x $D is now old. Exiting."  | ||||
|         return | ||||
|     fi | ||||
|     docker "$D" | ||||
| } | ||||
| 
 | ||||
| rm -f /tmp/ci* | ||||
| while true; do  | ||||
|     docker & | ||||
|     read something | ||||
| done | ||||
| #while inotifywait -e close_write,close_nowrite,create,delete .; do  | ||||
| #  reload&  | ||||
| #done | ||||
							
								
								
									
										34
									
								
								views/index.pug
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								views/index.pug
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,34 @@ | ||||
| //extends layout | ||||
| doctype html | ||||
| html(lang="en") | ||||
|   head | ||||
|     title= title | ||||
|     meta(charset='utf-8') | ||||
|     meta(name='viewport', content='width=device-width, initial-scale=1') | ||||
|     link(rel='stylesheet', href='https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css') | ||||
|     script(type = "text/javascript",src='/js/lodash.min.js') | ||||
|     script(type = "text/javascript",src='https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.min.js') | ||||
|   body | ||||
|     <nav class="navbar navbar-expand-lg navbar-light bg-light justify-content-between"> | ||||
|       <a class="navbar-brand" href="#">Changelog Server</a> | ||||
|       <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation"> | ||||
|         <span class="navbar-toggler-icon"></span> | ||||
|       </button> | ||||
| 
 | ||||
|       <div class="collapse navbar-collapse" id="navbarSupportedContent"> | ||||
| 
 | ||||
|         <form class="form-inline my-2 my-lg-2"> | ||||
|           input.form-control.mr-sm-2(type='search', name='q', value='',aria-label="Search",placeholder='Search') | ||||
|         </form> | ||||
|       </div> | ||||
|     </nav> | ||||
|     #content.container-fluid | ||||
| 
 | ||||
| 
 | ||||
|       hr | ||||
|       footer | ||||
| 
 | ||||
| 
 | ||||
|   script. | ||||
|     var initData = !{data}; | ||||
|   script(type = "text/javascript",src='/js/app.js') | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user