diff --git a/.drone.yml b/.drone.yml index 3ab3a00..afa3d8f 100644 --- a/.drone.yml +++ b/.drone.yml @@ -7,7 +7,6 @@ steps: image: node:12 commands: - npm install - - cd views && npm install && cd .. - npm run build - name: Publish to docker image: plugins/docker diff --git a/locales/de.json b/locales/de.json index d5a5bdb..6963aaa 100644 --- a/locales/de.json +++ b/locales/de.json @@ -36,5 +36,6 @@ "User": "User", "No special token": "No special token", "Login token invalid": "Login token invalid", - "No login token": "No login token" + "No login token": "No login token", + "You are not logged in or your login is expired (Login token invalid)": "You are not logged in or your login is expired (Login token invalid)" } \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index dec605f..895f9f8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -418,8 +418,7 @@ "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, "base32.js": { "version": "0.0.1", @@ -572,7 +571,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -655,7 +653,6 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -666,7 +663,6 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, "requires": { "has-flag": "^3.0.0" } @@ -812,8 +808,7 @@ "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "concurrently": { "version": "5.1.0", @@ -943,6 +938,14 @@ "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "dev": true }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "requires": { + "object-keys": "^1.0.12" + } + }, "denque": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/denque/-/denque-1.4.1.tgz", @@ -1082,7 +1085,6 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, "requires": { "is-arrayish": "^0.2.1" }, @@ -1090,11 +1092,38 @@ "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" } } }, + "es-abstract": { + "version": "1.17.4", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", + "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==", + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.1.5", + "is-regex": "^1.0.5", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.1", + "string.prototype.trimright": "^2.1.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -1103,8 +1132,7 @@ "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=", - "dev": true + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "etag": { "version": "1.8.1", @@ -1269,6 +1297,11 @@ "dev": true, "optional": true }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -1335,8 +1368,7 @@ "graceful-fs": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", - "dev": true + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" }, "handlebars": { "version": "4.7.3", @@ -1349,6 +1381,14 @@ "uglify-js": "^3.1.4" } }, + "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-binary2": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", @@ -1372,14 +1412,17 @@ "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==" }, "hosted-git-info": { "version": "2.8.5", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.5.tgz", - "integrity": "sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg==", - "dev": true + "integrity": "sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg==" }, "http-errors": { "version": "1.7.2", @@ -1483,6 +1526,11 @@ "binary-extensions": "^2.0.0" } }, + "is-callable": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==" + }, "is-ci": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", @@ -1492,6 +1540,11 @@ "ci-info": "^1.5.0" } }, + "is-date-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==" + }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -1555,6 +1608,14 @@ "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=", "dev": true }, + "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" + } + }, "is-retry-allowed": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", @@ -1567,6 +1628,14 @@ "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", "dev": true }, + "is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "requires": { + "has-symbols": "^1.0.1" + } + }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -1575,14 +1644,12 @@ "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, "json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" }, "jsonfile": { "version": "4.0.0", @@ -1677,6 +1744,17 @@ "uc.micro": "^1.0.1" } }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, "locate-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", @@ -1813,6 +1891,11 @@ "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", "optional": true }, + "memorystream": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=" + }, "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", @@ -1882,7 +1965,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, "requires": { "brace-expansion": "^1.1.7" } @@ -1930,6 +2012,11 @@ "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==" }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + }, "node-rsa": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/node-rsa/-/node-rsa-1.0.7.tgz", @@ -2001,7 +2088,6 @@ "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, "requires": { "hosted-git-info": "^2.1.4", "resolve": "^1.10.0", @@ -2015,6 +2101,46 @@ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true }, + "npm-run-all": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", + "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", + "requires": { + "ansi-styles": "^3.2.1", + "chalk": "^2.4.1", + "cross-spawn": "^6.0.5", + "memorystream": "^0.3.1", + "minimatch": "^3.0.4", + "pidtree": "^0.3.0", + "read-pkg": "^3.0.0", + "shell-quote": "^1.6.1", + "string.prototype.padend": "^3.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + } + } + } + }, "npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", @@ -2034,6 +2160,27 @@ "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=" }, + "object-inspect": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", + "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==" + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, "on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", @@ -2121,7 +2268,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, "requires": { "error-ex": "^1.3.1", "json-parse-better-errors": "^1.0.1" @@ -2168,31 +2314,41 @@ "path-key": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" }, "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==", - "dev": true + "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=" }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "requires": { + "pify": "^3.0.0" + } + }, "picomatch": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.1.1.tgz", "integrity": "sha512-OYMyqkKzK7blWO/+XZYP6w8hH0LDvkBvdvKukti+7kqYFCiEAk+gI3DWnryapc0Dau05ugGTy0foQ6mqn4AHYA==", "dev": true }, + "pidtree": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.0.tgz", + "integrity": "sha512-9CT4NFlDcosssyg8KVFltgokyKZIFjoBxw8CTGy+5F38Y1eQWrt8tRayiUOXE+zVKQnYu5BR8JjCtvK3BcnBhg==" + }, "pify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" }, "pngjs": { "version": "3.4.0", @@ -2458,7 +2614,6 @@ "version": "1.15.1", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", - "dev": true, "requires": { "path-parse": "^1.0.6" } @@ -2562,7 +2717,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, "requires": { "shebang-regex": "^1.0.0" } @@ -2570,8 +2724,12 @@ "shebang-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" + }, + "shell-quote": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", + "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==" }, "signal-exit": { "version": "3.0.2", @@ -2668,7 +2826,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", - "dev": true, "requires": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" @@ -2677,14 +2834,12 @@ "spdx-exceptions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", - "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", - "dev": true + "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==" }, "spdx-expression-parse": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", - "dev": true, "requires": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" @@ -2693,8 +2848,7 @@ "spdx-license-ids": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", - "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", - "dev": true + "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==" }, "speakeasy": { "version": "2.0.0", @@ -2731,6 +2885,33 @@ "strip-ansi": "^5.1.0" } }, + "string.prototype.padend": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.0.tgz", + "integrity": "sha512-3aIv8Ffdp8EZj8iLwREGpQaUZiPyrWrpzMBHvkiSW/bK/EGve9np07Vwy7IJ5waydpGXzQZu/F8Oze2/IWkBaA==", + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + } + }, + "string.prototype.trimleft": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", + "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==", + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "string.prototype.trimright": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz", + "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==", + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, "string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -2757,6 +2938,11 @@ "ansi-regex": "^4.1.0" } }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" + }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", @@ -2977,7 +3163,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, "requires": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" @@ -2992,7 +3177,6 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, "requires": { "isexe": "^2.0.0" } diff --git a/package.json b/package.json index e6c8f64..faa6b96 100644 --- a/package.json +++ b/package.json @@ -6,16 +6,27 @@ "license": "MIT", "scripts": { "start": "node lib/index.js", - "install": "cd views && npm install && cd .. && git submodule init && git submodule update && cd views_repo && npm i ", + "install": "run-s install-views install-views_repo", + "build": "run-s build-ts build-doc build-views build-views_repo", + "watch": "concurrently \"npm:watch-*\"", "build-doc": "apidoc -i src/ -p apidoc/", "build-ts": "tsc", - "build": "tsc && cd views && npm run build && cd .. && cd views_repo && npm run build", - "build-server": "tsc", "watch-ts": "tsc -w", - "watch-views": "cd views && npm run watch", - "watch-views_repo": "cd views_repo && npm run dev", "watch-node": "nodemon --ignore ./views lib/index.js", - "watch": "concurrently \"npm:watch-*\"" + "install-views": "cd views && npm install", + "build-views": "cd views && npm run build", + "watch-views": "cd views && npm run watch", + "install-views_repo": "git submodule init && git submodule update && cd views_repo && npm install ", + "build-views_repo": "cd views_repo && npm run build", + "watch-views_repo": "cd views_repo && npm run dev" + }, + "pipelines": { + "install": [ + "cd views && npm install", + "git submodule init", + "git submodule update", + "cd views_repo && npm install" + ] }, "devDependencies": { "@types/body-parser": "^1.19.0", @@ -55,10 +66,11 @@ "moment": "^2.24.0", "mongodb": "^3.5.4", "node-rsa": "^1.0.7", + "npm-run-all": "^4.1.5", "qrcode": "^1.4.4", "reflect-metadata": "^0.1.13", "speakeasy": "^2.0.0", "u2f": "^0.1.3", "uuid": "^7.0.2" } -} \ No newline at end of file +} diff --git a/src/api/user/index.ts b/src/api/user/index.ts index 2700861..8215fb8 100644 --- a/src/api/user/index.ts +++ b/src/api/user/index.ts @@ -49,7 +49,7 @@ UserRoute.post("/register", Register); * @apiParam {String} username Username (either username or uid required) * @apiParam {String} uid (either username or uid required) * @apiParam {String} password Password hashed and salted like specification (only on type password) - * @apiParam {String | Number} time in milliseconds used to hash password. This is used to make passwords "expire" + * @apiParam {Number} time in milliseconds used to hash password. This is used to make passwords "expire" * * @apiSuccess {String} uid On type = "username" * @apiSuccess {String} salt On type = "username" diff --git a/views/build.js b/views/build.js index f8306bc..6e0ef16 100644 --- a/views/build.js +++ b/views/build.js @@ -1,180 +1,170 @@ -const { - lstatSync, - readdirSync, - mkdirSync, - copyFileSync, - writeFileSync, - readFileSync, - exists -} = require('fs') -const { - join, - basename, - dirname -} = require('path') - - - -const isDirectory = source => lstatSync(source).isDirectory() -const getDirectories = source => - readdirSync(source).map(name => join(source, name)).filter(isDirectory) - -function ensureDir(folder) { - try { - if (!isDirectory(folder)) mkdirSync(folder) - } catch (e) { - mkdirSync(folder) - } -} - - -const fileExists = (filename) => new Promise((yes, no) => exists(filename, (exi) => yes(exi))); -ensureDir("./out") - -const sass = require('sass'); - -function findHead(elm) { - if (elm.tagName === "head") return elm; - for (let i = 0; i < elm.childNodes.length; i++) { - let res = findHead(elm.childNodes[i]) - if (res) return res; - } - return undefined; -} - -const rollup = require("rollup") -const includepaths = require("rollup-plugin-includepaths") -const typescript = require("rollup-plugin-typescript2"); -const resolve = require("rollup-plugin-node-resolve"); -const minify = require("html-minifier").minify -const gzipSize = require('gzip-size'); - -async function file_name(folder, name, exts) { - for (let ext of exts) { - let basefile = `${folder}/${name}.${ext}`; - if (await fileExists(basefile)) return basefile; - } - return null; -} - -async function buildPage(folder) { - const pagename = basename(folder); - const outpath = "./out/" + pagename; - - ensureDir(outpath) - - const basefile = await file_name(folder, pagename, ["tsx", "ts", "js"]); - - - let bundle = await rollup.rollup({ - input: basefile, - plugins: [ - includepaths({ - paths: ["shared", "node_modules"] - }), - typescript(), - resolve({ - // some package.json files have a `browser` field which - // specifies alternative files to load for people bundling - // for the browser. If that's you, use this option, otherwise - // pkg.browser will be ignored - browser: true, // Default: false - - // not all files you want to resolve are .js files - extensions: ['.mjs', '.js', '.jsx', '.json'], // Default: [ '.mjs', '.js', '.json', '.node' ] - - // whether to prefer built-in modules (e.g. `fs`, `path`) or - // local ones with the same names - preferBuiltins: false, // Default: true - - // If true, inspect resolved files to check that they are - // ES2015 modules - modulesOnly: true, // Default: false - }) - ], - treeshake: true - }) - - let { output } = await bundle.generate({ - format: "iife", - compact: true - }) - let { code } = output[0]; - - let sass_res = sass.renderSync({ - file: folder + `/${pagename}.scss`, - includePaths: ["./node_modules", folder, "./shared"], - outputStyle: "compressed" - }) - - let css = "\n"; - let script = "\n"; - let html = readFileSync(`${folder}/${pagename}.hbs`).toString("utf8"); - - let idx = html.indexOf("") - if (idx < 0) throw new Error("No head element found") - let idx2 = html.indexOf("") - if (idx2 < 0) throw new Error("No body element found") - - if (idx < idx2) { - let part1 = html.slice(0, idx) - let part2 = html.slice(idx, idx2); - let part3 = html.slice(idx2, html.length); - html = part1 + css + part2 + script + part3; - } else { - let part1 = html.slice(0, idx2) - let part2 = html.slice(idx2, idx); - let part3 = html.slice(idx, html.length); - html = part1 + script + part2 + css + part3; - } - - let result = minify(html, { - removeAttributeQuotes: true, - collapseWhitespace: true, - html5: true, - keepClosingSlash: true, - minifyCSS: false, - minifyJS: false, - removeComments: true, - useShortDoctype: true - }) - - let gzips = await gzipSize(result) - writeFileSync(`${outpath}/${pagename}.html`, result) - let stats = { - sass: sass_res.stats, - js: { - chars: code.length - }, - css: { - chars: css.length - }, - bundle_size: result.length, - gzip_size: gzips - } - - writeFileSync(outpath + `/stats.json`, JSON.stringify(stats, null, " ")) -} - -async function run() { - console.log("Start compiling!"); - let pages = getDirectories("./src"); - await Promise.all(pages.map(async e => { - try { - await buildPage(e) - } catch (er) { - console.error("Failed compiling", basename(e)) - console.log(er) - } - })) - console.log("Finished compiling!") -} - - -const chokidar = require("chokidar"); -if (process.argv.join(" ").toLowerCase().indexOf("watch") >= 0) - chokidar.watch(["./src", "./node_modules", "./package.json", "./package-lock.json"], { - ignoreInitial: true - }) - .on("all", () => run()); -run() +const { + lstatSync, + readdirSync, + mkdirSync, + copyFileSync, + writeFileSync, + readFileSync, + exists +} = require('fs') +const { + join, + basename, + dirname +} = require('path') + + + +const isDirectory = source => lstatSync(source).isDirectory() +const getDirectories = source => + readdirSync(source).map(name => join(source, name)).filter(isDirectory) + +function ensureDir(folder) { + try { + if (!isDirectory(folder)) mkdirSync(folder) + } catch (e) { + mkdirSync(folder) + } +} + + +const fileExists = (filename) => new Promise((yes, no) => exists(filename, (exi) => yes(exi))); +ensureDir("./out") + +const sass = require('sass'); + +function findHead(elm) { + if (elm.tagName === "head") return elm; + for (let i = 0; i < elm.childNodes.length; i++) { + let res = findHead(elm.childNodes[i]) + if (res) return res; + } + return undefined; +} + +const rollup = require("rollup") +const includepaths = require("rollup-plugin-includepaths") +const typescript = require("rollup-plugin-typescript2"); +const resolve = require("rollup-plugin-node-resolve"); +const minify = require("html-minifier").minify +const gzipSize = require('gzip-size'); + +async function file_name(folder, name, exts) { + for (let ext of exts) { + let basefile = `${folder}/${name}.${ext}`; + if (await fileExists(basefile)) return basefile; + } + return null; +} + +async function buildPage(folder) { + const pagename = basename(folder); + const outpath = "./out/" + pagename; + + ensureDir(outpath) + + const basefile = await file_name(folder, pagename, ["tsx", "ts", "js"]); + + + let bundle = await rollup.rollup({ + input: basefile, + plugins: [ + includepaths({ + paths: ["shared", "node_modules"] + }), + typescript(), + resolve({ + // not all files you want to resolve are .js files + extensions: ['.mjs', '.js', '.jsx', '.json'], // Default: [ '.mjs', '.js', '.json', '.node' ] + + // whether to prefer built-in modules (e.g. `fs`, `path`) or + // local ones with the same names + preferBuiltins: false, // Default: true + }) + ], + treeshake: true + }) + + let { output } = await bundle.generate({ + format: "iife", + compact: true + }) + let { code } = output[0]; + + let sass_res = sass.renderSync({ + file: folder + `/${pagename}.scss`, + includePaths: ["./node_modules", folder, "./shared"], + outputStyle: "compressed" + }) + + let css = "\n"; + let script = "\n"; + let html = readFileSync(`${folder}/${pagename}.hbs`).toString("utf8"); + + let idx = html.indexOf("") + if (idx < 0) throw new Error("No head element found") + let idx2 = html.indexOf("") + if (idx2 < 0) throw new Error("No body element found") + + if (idx < idx2) { + let part1 = html.slice(0, idx) + let part2 = html.slice(idx, idx2); + let part3 = html.slice(idx2, html.length); + html = part1 + css + part2 + script + part3; + } else { + let part1 = html.slice(0, idx2) + let part2 = html.slice(idx2, idx); + let part3 = html.slice(idx, html.length); + html = part1 + script + part2 + css + part3; + } + + let result = minify(html, { + removeAttributeQuotes: true, + collapseWhitespace: true, + html5: true, + keepClosingSlash: true, + minifyCSS: false, + minifyJS: false, + removeComments: true, + useShortDoctype: true + }) + + let gzips = await gzipSize(result) + writeFileSync(`${outpath}/${pagename}.html`, result) + let stats = { + sass: sass_res.stats, + js: { + chars: code.length + }, + css: { + chars: css.length + }, + bundle_size: result.length, + gzip_size: gzips + } + + writeFileSync(outpath + `/stats.json`, JSON.stringify(stats, null, " ")) +} + +async function run() { + console.log("Start compiling!"); + let pages = getDirectories("./src"); + await Promise.all(pages.map(async e => { + try { + await buildPage(e) + } catch (er) { + console.error("Failed compiling", basename(e)) + console.log(er) + } + })) + console.log("Finished compiling!") +} + + +const chokidar = require("chokidar"); +if (process.argv.join(" ").toLowerCase().indexOf("watch") >= 0) + chokidar.watch(["./src", "./node_modules", "./package.json", "./package-lock.json"], { + ignoreInitial: true + }) + .on("all", () => run()); +run() diff --git a/views/dummy.js b/views/dummy.js deleted file mode 100644 index e69de29..0000000