Compare commits
10 Commits
b79c2f96cd
...
c1abe8c2a4
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c1abe8c2a4 | ||
|
|
6051c7c7d2 | ||
|
|
5e69fd0590 | ||
|
|
bef3b9e780 | ||
|
|
70bfe862e4 | ||
|
|
ef3af370fd | ||
|
|
f7d790818a | ||
|
|
93ed774609 | ||
|
|
cfb23f309a | ||
|
|
5c31dc285a |
@@ -1,7 +1,8 @@
|
||||
*
|
||||
!src/*
|
||||
!backend/src/*
|
||||
!public/*
|
||||
!views/*
|
||||
!backend/views/*
|
||||
!backend/test/*
|
||||
|
||||
!bio-proxy-configuration-for-docker/*
|
||||
!package.json
|
||||
|
||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -5,6 +5,7 @@ tmp/redis-data/*
|
||||
!tmp/default-external.conf
|
||||
bundle.js
|
||||
*.map
|
||||
*.css
|
||||
|
||||
# Created by https://www.toptal.com/developers/gitignore/api/webstorm,node,sass
|
||||
# Edit at https://www.toptal.com/developers/gitignore?templates=webstorm,node,sass
|
||||
|
||||
12
Dockerfile
12
Dockerfile
@@ -21,19 +21,25 @@ USER appuser
|
||||
# copy data
|
||||
COPY . .
|
||||
|
||||
# install
|
||||
# install and test
|
||||
USER root
|
||||
RUN chown -R appuser:appuser /app && . /etc/profile && apk add --virtual .npm-install-virt --no-cache git
|
||||
USER appuser
|
||||
RUN npm run install-prod
|
||||
USER root
|
||||
RUN apk del .npm-install-virt
|
||||
USER appuser
|
||||
ENV NODE_ENV production
|
||||
|
||||
# cleanup
|
||||
USER root
|
||||
RUN rm -r ./src ./public/js-source ./bio-proxy-configuration-for-docker && \
|
||||
RUN rm -r ./backend/src ./backend/test ./public/js-source ./bio-proxy-configuration-for-docker && \
|
||||
npm cache clean --force
|
||||
USER appuser
|
||||
|
||||
# healthcheck
|
||||
HEALTHCHECK --interval=10s --timeout=2s --start-period=15s \
|
||||
CMD node ./out/healthcheck.js
|
||||
CMD node ./backend/out/healthcheck.js
|
||||
|
||||
# set command
|
||||
CMD npm run production
|
||||
|
||||
46
backend/.eslintrc.js
Normal file
46
backend/.eslintrc.js
Normal file
@@ -0,0 +1,46 @@
|
||||
// eslint-disable-next-line no-undef
|
||||
module.exports = {
|
||||
root: true,
|
||||
parser: '@typescript-eslint/parser',
|
||||
plugins: [
|
||||
'@typescript-eslint',
|
||||
'no-null',
|
||||
'promise',
|
||||
],
|
||||
extends: [
|
||||
'eslint:recommended',
|
||||
'plugin:@typescript-eslint/eslint-recommended',
|
||||
'plugin:@typescript-eslint/recommended',
|
||||
'plugin:promise/recommended',
|
||||
],
|
||||
rules: {
|
||||
'no-console': 'error',
|
||||
'max-len': ['error', {'code': 128}],
|
||||
'no-process-env': 'error',
|
||||
'no-process-exit': 'error',
|
||||
'no-null/no-null': 'error',
|
||||
'no-useless-return': 'error',
|
||||
'prefer-arrow-callback': 'warn',
|
||||
'consistent-return': 'error',
|
||||
'@typescript-eslint/explicit-function-return-type': [
|
||||
'error', {
|
||||
'allowExpressions': true,
|
||||
},
|
||||
],
|
||||
'no-void': 'error',
|
||||
'comma-spacing': 'error',
|
||||
'comma-dangle': ['error', 'always-multiline'],
|
||||
'comma-style': 'error',
|
||||
'semi': 'error',
|
||||
'no-implicit-coercion': 'error',
|
||||
'quotes': ['error', 'single', 'avoid-escape'],
|
||||
'keyword-spacing': 'error',
|
||||
'semi-spacing': 'error',
|
||||
'arrow-spacing': 'error',
|
||||
'object-curly-spacing': 'error',
|
||||
'array-bracket-spacing': 'error',
|
||||
'key-spacing': 'error',
|
||||
'block-spacing': 'error',
|
||||
'promise/always-return': 'off',
|
||||
},
|
||||
};
|
||||
@@ -11,11 +11,11 @@ export const app = express();
|
||||
|
||||
// Permissions
|
||||
PermManager
|
||||
.grant("user")
|
||||
.execute("read").on("userinfo")
|
||||
.grant("coe_bs")
|
||||
.extend("user")
|
||||
.execute("write").on("userinfo");
|
||||
.grant('user')
|
||||
.execute('read').on('userinfo')
|
||||
.grant('coe_bs')
|
||||
.extend('user')
|
||||
.execute('write').on('userinfo');
|
||||
|
||||
// view engine setup
|
||||
app.set('views', path.join(__dirname, '../views'));
|
||||
@@ -38,20 +38,22 @@ const router = express.Router();
|
||||
// auth proxy middleware
|
||||
router.use(AuthProxy.router);
|
||||
// auto reloader (when running in debug mode)
|
||||
router.use(AutoReloader.router);
|
||||
router.use(AutoReloader.getRouter({
|
||||
frontendDirs: './public',
|
||||
}));
|
||||
|
||||
// session
|
||||
//router.use(Session.getRouter());
|
||||
|
||||
// static config
|
||||
router.use("/js/polyfill.js", Polyfill.getRouter('./public/js/bundle.js'));
|
||||
router.use('/js/polyfill.js', Polyfill.getRouter('./public/js/bundle.js'));
|
||||
router.use(sassMiddleware({
|
||||
src: path.join(__dirname, '../public'),
|
||||
dest: path.join(__dirname, '../public'),
|
||||
src: path.join(__dirname, '../../public'),
|
||||
dest: path.join(__dirname, '../../public'),
|
||||
indentedSyntax: true, // true = .sass and false = .scss
|
||||
sourceMap: true,
|
||||
}));
|
||||
router.use(express.static(path.join(__dirname, '../public')));
|
||||
router.use(express.static(path.join(__dirname, '../../public')));
|
||||
|
||||
router.use(indexRouter);
|
||||
app.use(DefaultConfig.BASE_PATH, router);
|
||||
@@ -1,5 +1,5 @@
|
||||
/* eslint-disable no-process-exit,no-console */
|
||||
import * as http from "http";
|
||||
import * as http from 'http';
|
||||
import {DefaultConfig, urlJoin} from 'pkg-express-utils';
|
||||
|
||||
const options = {
|
||||
@@ -9,9 +9,9 @@ import {DefaultConfig, Logger} from 'pkg-express-utils';
|
||||
app.set('port', DefaultConfig.PORT);
|
||||
const server = http.createServer(app);
|
||||
|
||||
app.listen(DefaultConfig.PORT);
|
||||
server.on('error', onError);
|
||||
server.on('listening', onListening);
|
||||
server.listen(DefaultConfig.PORT);
|
||||
|
||||
function onError(error: HttpError): void {
|
||||
if (error.syscall !== 'listen') {
|
||||
@@ -3,8 +3,8 @@ import {PermManager} from 'pkg-express-utils';
|
||||
|
||||
const userRouter = express.Router();
|
||||
|
||||
/* GET users listing. */
|
||||
userRouter.get('/', PermManager.getRouter("userinfo", {action: "read"}), async (req, res) => {
|
||||
/* GET user info. */
|
||||
userRouter.get('/', PermManager.getRouter('userinfo', {action: 'read'}), async (req, res) => {
|
||||
res.json(await req.getUserInfo() || {});
|
||||
});
|
||||
|
||||
@@ -3,6 +3,7 @@ import * as express from 'express';
|
||||
const healthRouter = express.Router();
|
||||
|
||||
healthRouter.get('/', async (req, res) => {
|
||||
req.noHttpLogging = true;
|
||||
res.sendStatus(200);
|
||||
});
|
||||
|
||||
@@ -5,12 +5,12 @@ import healthRouter from './healthcheck';
|
||||
const router = express.Router();
|
||||
export default router;
|
||||
|
||||
router.use("/api/user", userRouter);
|
||||
router.use("/health", healthRouter);
|
||||
router.use('/api/user', userRouter);
|
||||
router.use('/health', healthRouter);
|
||||
|
||||
/* GET home page. */
|
||||
router.get('/', async (req, res) => {
|
||||
const email = (await req.getUserInfo())?.email ?? "No email found!";
|
||||
const email = (await req.getUserInfo())?.email ?? 'No email found!';
|
||||
res.render('index', {title: 'Express', email});
|
||||
});
|
||||
|
||||
23
backend/src/types/extend-request.d.ts
vendored
Normal file
23
backend/src/types/extend-request.d.ts
vendored
Normal file
@@ -0,0 +1,23 @@
|
||||
// extend-request.d.ts
|
||||
|
||||
declare global {
|
||||
namespace Express {
|
||||
interface Request {
|
||||
// fetch user info (needs AuthProxy and some headers)
|
||||
getUserInfo(): Promise<import('pkg-express-utils').UserInfo|undefined>;
|
||||
// fetch user info (needed for HttpLogger)
|
||||
noHttpLogging: boolean|undefined;
|
||||
// permission details (after a Permission route)
|
||||
permissionDetails: import('role-acl').Permission;
|
||||
// switch session to another user;does not close old session (after Session router)
|
||||
setSessionById(sessionId: string): Promise<boolean>;
|
||||
}
|
||||
|
||||
interface Response {
|
||||
// initialize a logout (needs AuthProxy and some headers)
|
||||
initLogout(): boolean;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export {};
|
||||
18
backend/test/routes/healthcheck.ts
Normal file
18
backend/test/routes/healthcheck.ts
Normal file
@@ -0,0 +1,18 @@
|
||||
import healthRouter from '../../src/routes/healthcheck';
|
||||
import * as request from 'supertest';
|
||||
import * as express from 'express';
|
||||
|
||||
describe('backend:routes/healthcheck', () => {
|
||||
it('should return 200', (done) => {
|
||||
const app = express();
|
||||
app.use(healthRouter);
|
||||
request(app)
|
||||
.get("/")
|
||||
.set('Accept', 'application/json')
|
||||
.expect(200)
|
||||
.end((err, res) => {
|
||||
if (err) throw err;
|
||||
done();
|
||||
});
|
||||
});
|
||||
});
|
||||
@@ -12,7 +12,10 @@
|
||||
"./src/**/*.ts"
|
||||
],
|
||||
"exclude": [
|
||||
"./node_modules",
|
||||
"../node_modules",
|
||||
"./public"
|
||||
]
|
||||
],
|
||||
"ts-node": {
|
||||
"files": true
|
||||
}
|
||||
}
|
||||
@@ -3,5 +3,5 @@ extends layout
|
||||
block content
|
||||
h1= title
|
||||
p Welcome to #{title}!
|
||||
a(href="/logout") Want so say goodbye?
|
||||
a(href=baseUrl+"/logout") Want so say goodbye?
|
||||
p This name is fetched on server-side: #{email}
|
||||
@@ -1,4 +1,4 @@
|
||||
- const baseUrl = DefaultConfig.EXTERNAL_BASE_URL;
|
||||
- const baseUrl = DefaultConfig.EXTERNAL_BASE_URL || DefaultConfig.BASE_PATH;
|
||||
doctype html
|
||||
html
|
||||
head
|
||||
@@ -15,18 +15,19 @@ services:
|
||||
depends_on:
|
||||
- redis
|
||||
environment:
|
||||
- "PROXY_USERINFO_SECRET=3d513168-c92d-4f57-8c78-8fb2efad8a34"
|
||||
- "PROXY_TARGET_URI=http://host.docker.internal:3000"
|
||||
- "HOST=0.0.0.0"
|
||||
- "COOKIE_SECRET=05e8cc4b-f95f-4a70-b4a1-b22ce295348d"
|
||||
- "NODE_ENV=debug"
|
||||
- "PORT=3000"
|
||||
- "EXTERNAL_BASE_URL=http://localhost"
|
||||
- "REDIS_URL=redis://redis:6379"
|
||||
- "WELLKNOWN_CONFIG_URI=https://nodejs1-2.biotronik.int/auth/realms/CoE-BS/.well-known/openid-configuration"
|
||||
- "CLIENT_ID=demo"
|
||||
- "CLIENT_SECRET=fb49b346-c515-4680-adb1-beee0bd5b66e"
|
||||
- "CLIENT_SCOPE=openid email profile roles groups"
|
||||
- "NODE_ENV=debug"
|
||||
- "EXT_REDIRECT_URI=http://localhost/oauth/redirect"
|
||||
- "EXT_POST_LOGOUT_REDIRECT_URI=http://localhost"
|
||||
- "EXT_POST_LOGIN_REDIRECT_URI=http://localhost"
|
||||
- "PROXY_TARGET_URI=http://host.docker.internal:3000"
|
||||
- "SSL_VERIFY=false"
|
||||
- "EXT_RESOURCE_URI=http://localhost/base"
|
||||
- "REDIS_URL=redis://redis:6379"
|
||||
- "NO_PROXY=redis:6379"
|
||||
ports:
|
||||
- 3001:3000
|
||||
|
||||
@@ -11,7 +11,7 @@ services:
|
||||
- "SESSION_SECRET=replace with random"
|
||||
- "USERINFO_HEADER=X-Userinfo-Token"
|
||||
- "AUTH_PROXY_URL=http://proxy:3000/oauth"
|
||||
- "NO_PROXY=redis:6379"
|
||||
- "NO_PROXY=redis:6379,proxy:3000"
|
||||
depends_on:
|
||||
- redis
|
||||
networks:
|
||||
@@ -29,19 +29,20 @@ services:
|
||||
- app
|
||||
- redis
|
||||
environment:
|
||||
- "PROXY_USERINFO_SECRET=3d513168-c92d-4f57-8c78-8fb2efad8a34"
|
||||
- "PROXY_TARGET_URI=http://app:3000"
|
||||
- "HOST=0.0.0.0"
|
||||
- "COOKIE_SECRET=05e8cc4b-f95f-4a70-b4a1-b22ce295348d"
|
||||
- "NODE_ENV=debug"
|
||||
- "PORT=3000"
|
||||
- "EXTERNAL_BASE_URL=http://localhost"
|
||||
- "REDIS_URL=redis://redis:6379"
|
||||
- "WELLKNOWN_CONFIG_URI=https://nodejs1-2.biotronik.int/auth/realms/CoE-BS/.well-known/openid-configuration"
|
||||
- "CLIENT_ID=demo"
|
||||
- "CLIENT_SECRET=fb49b346-c515-4680-adb1-beee0bd5b66e"
|
||||
- "CLIENT_SCOPE=openid email profile roles groups"
|
||||
- "NODE_ENV=debug"
|
||||
- "EXT_REDIRECT_URI=http://localhost/oauth/redirect"
|
||||
- "EXT_POST_LOGOUT_REDIRECT_URI=http://localhost"
|
||||
- "EXT_POST_LOGIN_REDIRECT_URI=http://localhost"
|
||||
- "PROXY_TARGET_URI=http://app:3000"
|
||||
- "SSL_VERIFY=false"
|
||||
- "EXT_RESOURCE_URI=http://localhost"
|
||||
- "REDIS_URL=redis://redis:6379"
|
||||
- "NO_PROXY=redis:6379"
|
||||
- "NO_PROXY=redis:6379,app:3000"
|
||||
networks:
|
||||
- backend
|
||||
- frontend
|
||||
|
||||
385
package-lock.json
generated
385
package-lock.json
generated
@@ -54,9 +54,9 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"debug": {
|
||||
"version": "4.2.0",
|
||||
"resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz",
|
||||
"integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==",
|
||||
"version": "4.3.1",
|
||||
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
|
||||
"integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"ms": "2.1.2"
|
||||
@@ -281,9 +281,9 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"debug": {
|
||||
"version": "4.2.0",
|
||||
"resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz",
|
||||
"integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==",
|
||||
"version": "4.3.1",
|
||||
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
|
||||
"integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"ms": "2.1.2"
|
||||
@@ -351,9 +351,9 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"debug": {
|
||||
"version": "4.2.0",
|
||||
"resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz",
|
||||
"integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==",
|
||||
"version": "4.3.1",
|
||||
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
|
||||
"integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"ms": "2.1.2"
|
||||
@@ -400,13 +400,6 @@
|
||||
"integrity": "sha512-Mv027hcLFjE45K8UJ8PjRpdDGfR0aManEFj1KzoN8zXNveHGEygpZGfFf/FTTMl+QEVSrPAUlyxaCApvmv47AQ==",
|
||||
"requires": {
|
||||
"tslib": "^2.0.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"tslib": {
|
||||
"version": "2.0.3",
|
||||
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz",
|
||||
"integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ=="
|
||||
}
|
||||
}
|
||||
},
|
||||
"@formatjs/intl-datetimeformat": {
|
||||
@@ -416,13 +409,6 @@
|
||||
"requires": {
|
||||
"@formatjs/ecma402-abstract": "^1.2.6",
|
||||
"tslib": "^2.0.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"tslib": {
|
||||
"version": "2.0.3",
|
||||
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz",
|
||||
"integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ=="
|
||||
}
|
||||
}
|
||||
},
|
||||
"@formatjs/intl-displaynames": {
|
||||
@@ -432,13 +418,6 @@
|
||||
"requires": {
|
||||
"@formatjs/ecma402-abstract": "^1.2.6",
|
||||
"tslib": "^2.0.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"tslib": {
|
||||
"version": "2.0.3",
|
||||
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz",
|
||||
"integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ=="
|
||||
}
|
||||
}
|
||||
},
|
||||
"@formatjs/intl-getcanonicallocales": {
|
||||
@@ -448,13 +427,6 @@
|
||||
"requires": {
|
||||
"cldr-core": "37.0.0",
|
||||
"tslib": "^2.0.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"tslib": {
|
||||
"version": "2.0.3",
|
||||
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz",
|
||||
"integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ=="
|
||||
}
|
||||
}
|
||||
},
|
||||
"@formatjs/intl-listformat": {
|
||||
@@ -464,13 +436,6 @@
|
||||
"requires": {
|
||||
"@formatjs/ecma402-abstract": "^1.2.6",
|
||||
"tslib": "^2.0.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"tslib": {
|
||||
"version": "2.0.3",
|
||||
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz",
|
||||
"integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ=="
|
||||
}
|
||||
}
|
||||
},
|
||||
"@formatjs/intl-numberformat": {
|
||||
@@ -480,13 +445,6 @@
|
||||
"requires": {
|
||||
"@formatjs/ecma402-abstract": "^1.2.6",
|
||||
"tslib": "^2.0.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"tslib": {
|
||||
"version": "2.0.3",
|
||||
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz",
|
||||
"integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ=="
|
||||
}
|
||||
}
|
||||
},
|
||||
"@formatjs/intl-pluralrules": {
|
||||
@@ -496,13 +454,6 @@
|
||||
"requires": {
|
||||
"@formatjs/ecma402-abstract": "^1.2.6",
|
||||
"tslib": "^2.0.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"tslib": {
|
||||
"version": "2.0.3",
|
||||
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz",
|
||||
"integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ=="
|
||||
}
|
||||
}
|
||||
},
|
||||
"@formatjs/intl-relativetimeformat": {
|
||||
@@ -512,13 +463,6 @@
|
||||
"requires": {
|
||||
"@formatjs/ecma402-abstract": "^1.2.6",
|
||||
"tslib": "^2.0.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"tslib": {
|
||||
"version": "2.0.3",
|
||||
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz",
|
||||
"integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ=="
|
||||
}
|
||||
}
|
||||
},
|
||||
"@istanbuljs/load-nyc-config": {
|
||||
@@ -668,6 +612,12 @@
|
||||
"@types/node": "*"
|
||||
}
|
||||
},
|
||||
"@types/cookiejar": {
|
||||
"version": "2.1.2",
|
||||
"resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.2.tgz",
|
||||
"integrity": "sha512-t73xJJrvdTjXrn4jLS9VSGRbz0nUY3cl2DMGDU48lKl+HR9dbbjW2A9r3g40VA++mQpy6uuHg33gy7du2BKpog==",
|
||||
"dev": true
|
||||
},
|
||||
"@types/express": {
|
||||
"version": "4.17.9",
|
||||
"resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.9.tgz",
|
||||
@@ -690,9 +640,9 @@
|
||||
}
|
||||
},
|
||||
"@types/express-session": {
|
||||
"version": "1.17.2",
|
||||
"resolved": "https://registry.npmjs.org/@types/express-session/-/express-session-1.17.2.tgz",
|
||||
"integrity": "sha512-QRm/fUuvr/BAosL9CvK351SDQP7wpD8+h3S8ZEE/8IvHJ/ZqHrjZbjx/flYfazyPw7yNi9O5fbjFZbh0vZ1ccg==",
|
||||
"version": "1.17.3",
|
||||
"resolved": "https://registry.npmjs.org/@types/express-session/-/express-session-1.17.3.tgz",
|
||||
"integrity": "sha512-57DnyxiqClXOIjoCgeKCUYfKxBPOlOY/k+l1TPK+7bSwyiPTrS5FIk1Ycql7twk4wO7P5lfOVy6akDGiaMSLfw==",
|
||||
"requires": {
|
||||
"@types/express": "*"
|
||||
}
|
||||
@@ -703,6 +653,17 @@
|
||||
"integrity": "sha512-2aoSC4UUbHDj2uCsCxcG/vRMXey/m17bC7UwitVm5hn22nI8O8Y9iDpA76Orc+DWkQ4zZrOKEshCqR/jSuXAHA==",
|
||||
"dev": true
|
||||
},
|
||||
"@types/jsdom": {
|
||||
"version": "16.2.5",
|
||||
"resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-16.2.5.tgz",
|
||||
"integrity": "sha512-k/ZaTXtReAjwWu0clU0KLS53dyqZnA8mm+jwKFeFrvufXgICp+VNbskETFxKKAguv0pkaEKTax5MaRmvalM+TA==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"@types/node": "*",
|
||||
"@types/parse5": "*",
|
||||
"@types/tough-cookie": "*"
|
||||
}
|
||||
},
|
||||
"@types/json-schema": {
|
||||
"version": "7.0.6",
|
||||
"resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz",
|
||||
@@ -726,9 +687,9 @@
|
||||
"dev": true
|
||||
},
|
||||
"@types/node": {
|
||||
"version": "14.14.7",
|
||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.7.tgz",
|
||||
"integrity": "sha512-Zw1vhUSQZYw+7u5dAwNbIA9TuTotpzY/OF7sJM9FqPOF3SPjKnxrjoTktXDZgUjybf4cWVBP7O8wvKdSaGHweg=="
|
||||
"version": "14.14.9",
|
||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.9.tgz",
|
||||
"integrity": "sha512-JsoLXFppG62tWTklIoO4knA+oDTYsmqWxHRvd4lpmfQRNhX6osheUOWETP2jMoV/2bEHuMra8Pp3Dmo/stBFcw=="
|
||||
},
|
||||
"@types/node-sass": {
|
||||
"version": "4.11.1",
|
||||
@@ -749,6 +710,12 @@
|
||||
"@types/node-sass": "*"
|
||||
}
|
||||
},
|
||||
"@types/parse5": {
|
||||
"version": "5.0.3",
|
||||
"resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-5.0.3.tgz",
|
||||
"integrity": "sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw==",
|
||||
"dev": true
|
||||
},
|
||||
"@types/proper-url-join": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/@types/proper-url-join/-/proper-url-join-2.0.0.tgz",
|
||||
@@ -775,23 +742,54 @@
|
||||
"@types/node": "*"
|
||||
}
|
||||
},
|
||||
"@types/rewire": {
|
||||
"version": "2.5.28",
|
||||
"resolved": "https://registry.npmjs.org/@types/rewire/-/rewire-2.5.28.tgz",
|
||||
"integrity": "sha512-uD0j/AQOa5le7afuK+u+woi8jNKF1vf3DN0H7LCJhft/lNNibUr7VcAesdgtWfEKveZol3ZG1CJqwx2Bhrnl8w==",
|
||||
"dev": true
|
||||
},
|
||||
"@types/serve-static": {
|
||||
"version": "1.13.7",
|
||||
"resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.7.tgz",
|
||||
"integrity": "sha512-3diZWucbR+xTmbDlU+FRRxBf+31OhFew7cJXML/zh9NmvSPTNoFecAwHB66BUqFgENJtqMiyl7JAwUE/siqdLw==",
|
||||
"version": "1.13.8",
|
||||
"resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.8.tgz",
|
||||
"integrity": "sha512-MoJhSQreaVoL+/hurAZzIm8wafFR6ajiTM1m4A0kv6AGeVBl4r4pOV8bGFrjjq1sGxDTnCoF8i22o0/aE5XCyA==",
|
||||
"requires": {
|
||||
"@types/mime": "*",
|
||||
"@types/node": "*"
|
||||
}
|
||||
},
|
||||
"@typescript-eslint/eslint-plugin": {
|
||||
"version": "4.7.0",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.7.0.tgz",
|
||||
"integrity": "sha512-li9aiSVBBd7kU5VlQlT1AqP0uWGDK6JYKUQ9cVDnOg34VNnd9t4jr0Yqc/bKxJr/tDCPDaB4KzoSFN9fgVxe/Q==",
|
||||
"@types/superagent": {
|
||||
"version": "4.1.10",
|
||||
"resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-4.1.10.tgz",
|
||||
"integrity": "sha512-xAgkb2CMWUMCyVc/3+7iQfOEBE75NvuZeezvmixbUw3nmENf2tCnQkW5yQLTYqvXUQ+R6EXxdqKKbal2zM5V/g==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"@typescript-eslint/experimental-utils": "4.7.0",
|
||||
"@typescript-eslint/scope-manager": "4.7.0",
|
||||
"@types/cookiejar": "*",
|
||||
"@types/node": "*"
|
||||
}
|
||||
},
|
||||
"@types/supertest": {
|
||||
"version": "2.0.10",
|
||||
"resolved": "https://registry.npmjs.org/@types/supertest/-/supertest-2.0.10.tgz",
|
||||
"integrity": "sha512-Xt8TbEyZTnD5Xulw95GLMOkmjGICrOQyJ2jqgkSjAUR3mm7pAIzSR0NFBaMcwlzVvlpCjNwbATcWWwjNiZiFrQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"@types/superagent": "*"
|
||||
}
|
||||
},
|
||||
"@types/tough-cookie": {
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.0.tgz",
|
||||
"integrity": "sha512-I99sngh224D0M7XgW1s120zxCt3VYQ3IQsuw3P3jbq5GG4yc79+ZjyKznyOGIQrflfylLgcfekeZW/vk0yng6A==",
|
||||
"dev": true
|
||||
},
|
||||
"@typescript-eslint/eslint-plugin": {
|
||||
"version": "4.8.1",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.8.1.tgz",
|
||||
"integrity": "sha512-d7LeQ7dbUrIv5YVFNzGgaW3IQKMmnmKFneRWagRlGYOSfLJVaRbj/FrBNOBC1a3tVO+TgNq1GbHvRtg1kwL0FQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"@typescript-eslint/experimental-utils": "4.8.1",
|
||||
"@typescript-eslint/scope-manager": "4.8.1",
|
||||
"debug": "^4.1.1",
|
||||
"functional-red-black-tree": "^1.0.1",
|
||||
"regexpp": "^3.0.0",
|
||||
@@ -800,9 +798,9 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"debug": {
|
||||
"version": "4.2.0",
|
||||
"resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz",
|
||||
"integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==",
|
||||
"version": "4.3.1",
|
||||
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
|
||||
"integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"ms": "2.1.2"
|
||||
@@ -823,35 +821,35 @@
|
||||
}
|
||||
},
|
||||
"@typescript-eslint/experimental-utils": {
|
||||
"version": "4.7.0",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.7.0.tgz",
|
||||
"integrity": "sha512-cymzovXAiD4EF+YoHAB5Oh02MpnXjvyaOb+v+BdpY7lsJXZQN34oIETeUwVT2XfV9rSNpXaIcknDLfupO/tUoA==",
|
||||
"version": "4.8.1",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.8.1.tgz",
|
||||
"integrity": "sha512-WigyLn144R3+lGATXW4nNcDJ9JlTkG8YdBWHkDlN0lC3gUGtDi7Pe3h5GPvFKMcRz8KbZpm9FJV9NTW8CpRHpg==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"@types/json-schema": "^7.0.3",
|
||||
"@typescript-eslint/scope-manager": "4.7.0",
|
||||
"@typescript-eslint/types": "4.7.0",
|
||||
"@typescript-eslint/typescript-estree": "4.7.0",
|
||||
"@typescript-eslint/scope-manager": "4.8.1",
|
||||
"@typescript-eslint/types": "4.8.1",
|
||||
"@typescript-eslint/typescript-estree": "4.8.1",
|
||||
"eslint-scope": "^5.0.0",
|
||||
"eslint-utils": "^2.0.0"
|
||||
}
|
||||
},
|
||||
"@typescript-eslint/parser": {
|
||||
"version": "4.7.0",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.7.0.tgz",
|
||||
"integrity": "sha512-+meGV8bMP1sJHBI2AFq1GeTwofcGiur8LoIr6v+rEmD9knyCqDlrQcFHR0KDDfldHIFDU/enZ53fla6ReF4wRw==",
|
||||
"version": "4.8.1",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.8.1.tgz",
|
||||
"integrity": "sha512-QND8XSVetATHK9y2Ltc/XBl5Ro7Y62YuZKnPEwnNPB8E379fDsvzJ1dMJ46fg/VOmk0hXhatc+GXs5MaXuL5Uw==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"@typescript-eslint/scope-manager": "4.7.0",
|
||||
"@typescript-eslint/types": "4.7.0",
|
||||
"@typescript-eslint/typescript-estree": "4.7.0",
|
||||
"@typescript-eslint/scope-manager": "4.8.1",
|
||||
"@typescript-eslint/types": "4.8.1",
|
||||
"@typescript-eslint/typescript-estree": "4.8.1",
|
||||
"debug": "^4.1.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"debug": {
|
||||
"version": "4.2.0",
|
||||
"resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz",
|
||||
"integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==",
|
||||
"version": "4.3.1",
|
||||
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
|
||||
"integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"ms": "2.1.2"
|
||||
@@ -866,29 +864,29 @@
|
||||
}
|
||||
},
|
||||
"@typescript-eslint/scope-manager": {
|
||||
"version": "4.7.0",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.7.0.tgz",
|
||||
"integrity": "sha512-ILITvqwDJYbcDCROj6+Ob0oCKNg3SH46iWcNcTIT9B5aiVssoTYkhKjxOMNzR1F7WSJkik4zmuqve5MdnA0DyA==",
|
||||
"version": "4.8.1",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.8.1.tgz",
|
||||
"integrity": "sha512-r0iUOc41KFFbZdPAdCS4K1mXivnSZqXS5D9oW+iykQsRlTbQRfuFRSW20xKDdYiaCoH+SkSLeIF484g3kWzwOQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"@typescript-eslint/types": "4.7.0",
|
||||
"@typescript-eslint/visitor-keys": "4.7.0"
|
||||
"@typescript-eslint/types": "4.8.1",
|
||||
"@typescript-eslint/visitor-keys": "4.8.1"
|
||||
}
|
||||
},
|
||||
"@typescript-eslint/types": {
|
||||
"version": "4.7.0",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.7.0.tgz",
|
||||
"integrity": "sha512-uLszFe0wExJc+I7q0Z/+BnP7wao/kzX0hB5vJn4LIgrfrMLgnB2UXoReV19lkJQS1a1mHWGGODSxnBx6JQC3Sg==",
|
||||
"version": "4.8.1",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.8.1.tgz",
|
||||
"integrity": "sha512-ave2a18x2Y25q5K05K/U3JQIe2Av4+TNi/2YuzyaXLAsDx6UZkz1boZ7nR/N6Wwae2PpudTZmHFXqu7faXfHmA==",
|
||||
"dev": true
|
||||
},
|
||||
"@typescript-eslint/typescript-estree": {
|
||||
"version": "4.7.0",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.7.0.tgz",
|
||||
"integrity": "sha512-5XZRQznD1MfUmxu1t8/j2Af4OxbA7EFU2rbo0No7meb46eHgGkSieFdfV6omiC/DGIBhH9H9gXn7okBbVOm8jw==",
|
||||
"version": "4.8.1",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.8.1.tgz",
|
||||
"integrity": "sha512-bJ6Fn/6tW2g7WIkCWh3QRlaSU7CdUUK52shx36/J7T5oTQzANvi6raoTsbwGM11+7eBbeem8hCCKbyvAc0X3sQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"@typescript-eslint/types": "4.7.0",
|
||||
"@typescript-eslint/visitor-keys": "4.7.0",
|
||||
"@typescript-eslint/types": "4.8.1",
|
||||
"@typescript-eslint/visitor-keys": "4.8.1",
|
||||
"debug": "^4.1.1",
|
||||
"globby": "^11.0.1",
|
||||
"is-glob": "^4.0.1",
|
||||
@@ -898,9 +896,9 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"debug": {
|
||||
"version": "4.2.0",
|
||||
"resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz",
|
||||
"integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==",
|
||||
"version": "4.3.1",
|
||||
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
|
||||
"integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"ms": "2.1.2"
|
||||
@@ -921,12 +919,12 @@
|
||||
}
|
||||
},
|
||||
"@typescript-eslint/visitor-keys": {
|
||||
"version": "4.7.0",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.7.0.tgz",
|
||||
"integrity": "sha512-aDJDWuCRsf1lXOtignlfiPODkzSxxop7D0rZ91L6ZuMlcMCSh0YyK+gAfo5zN/ih6WxMwhoXgJWC3cWQdaKC+A==",
|
||||
"version": "4.8.1",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.8.1.tgz",
|
||||
"integrity": "sha512-3nrwXFdEYALQh/zW8rFwP4QltqsanCDz4CwWMPiIZmwlk9GlvBeueEIbq05SEq4ganqM0g9nh02xXgv5XI3PeQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"@typescript-eslint/types": "4.7.0",
|
||||
"@typescript-eslint/types": "4.8.1",
|
||||
"eslint-visitor-keys": "^2.0.0"
|
||||
}
|
||||
},
|
||||
@@ -1579,6 +1577,11 @@
|
||||
"integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=",
|
||||
"dev": true
|
||||
},
|
||||
"component-emitter": {
|
||||
"version": "1.3.0",
|
||||
"resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
|
||||
"integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg=="
|
||||
},
|
||||
"compressible": {
|
||||
"version": "2.0.18",
|
||||
"resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
|
||||
@@ -1749,6 +1752,11 @@
|
||||
"resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
|
||||
"integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
|
||||
},
|
||||
"cookiejar": {
|
||||
"version": "2.1.2",
|
||||
"resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz",
|
||||
"integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA=="
|
||||
},
|
||||
"core-js": {
|
||||
"version": "3.7.0",
|
||||
"resolved": "https://registry.npmjs.org/core-js/-/core-js-3.7.0.tgz",
|
||||
@@ -2222,9 +2230,9 @@
|
||||
}
|
||||
},
|
||||
"debug": {
|
||||
"version": "4.2.0",
|
||||
"resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz",
|
||||
"integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==",
|
||||
"version": "4.3.1",
|
||||
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
|
||||
"integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"ms": "2.1.2"
|
||||
@@ -2607,9 +2615,9 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"debug": {
|
||||
"version": "4.2.0",
|
||||
"resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz",
|
||||
"integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==",
|
||||
"version": "4.3.1",
|
||||
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
|
||||
"integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"ms": "2.1.2"
|
||||
@@ -2775,6 +2783,11 @@
|
||||
"mime-types": "^2.1.12"
|
||||
}
|
||||
},
|
||||
"formidable": {
|
||||
"version": "1.2.2",
|
||||
"resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.2.tgz",
|
||||
"integrity": "sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q=="
|
||||
},
|
||||
"forwarded": {
|
||||
"version": "0.1.2",
|
||||
"resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
|
||||
@@ -3581,9 +3594,9 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"debug": {
|
||||
"version": "4.2.0",
|
||||
"resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz",
|
||||
"integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==",
|
||||
"version": "4.3.1",
|
||||
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
|
||||
"integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"ms": "2.1.2"
|
||||
@@ -4402,8 +4415,7 @@
|
||||
"node-watch": {
|
||||
"version": "0.7.0",
|
||||
"resolved": "https://registry.npmjs.org/node-watch/-/node-watch-0.7.0.tgz",
|
||||
"integrity": "sha512-OOBiglke5SlRQT5WYfwXTmYqTfXjcTNBHpalyHLtLxDpQYVpVRkJqabcch1kmwJsjV/J4OZuzEafeb4soqtFZA==",
|
||||
"dev": true
|
||||
"integrity": "sha512-OOBiglke5SlRQT5WYfwXTmYqTfXjcTNBHpalyHLtLxDpQYVpVRkJqabcch1kmwJsjV/J4OZuzEafeb4soqtFZA=="
|
||||
},
|
||||
"nopt": {
|
||||
"version": "3.0.6",
|
||||
@@ -4956,7 +4968,7 @@
|
||||
}
|
||||
},
|
||||
"pkg-express-utils": {
|
||||
"version": "git+https://git.biotronik.int/scm/coe-bs-website/node-pkg-express-utils.git#d58aa134ecdb8c86eff83b0d63db283918ad35d7",
|
||||
"version": "git+https://git.biotronik.int/scm/coe-bs-website/node-pkg-express-utils.git#8dc481b551bb0d73144b111d5e50271b27e8dc64",
|
||||
"from": "git+https://git.biotronik.int/scm/coe-bs-website/node-pkg-express-utils.git",
|
||||
"requires": {
|
||||
"@10xjs/polyfill-analyzer": "^0.1.0",
|
||||
@@ -4970,6 +4982,7 @@
|
||||
"express-session": "^1.17.1",
|
||||
"json-prune": "^1.1.0",
|
||||
"node-fetch": "^2.6.1",
|
||||
"node-watch": "^0.7.0",
|
||||
"polyfill-library": "^3.97.0",
|
||||
"proper-url-join": "^2.1.1",
|
||||
"redis": "^3.0.2",
|
||||
@@ -5553,9 +5566,9 @@
|
||||
}
|
||||
},
|
||||
"debug": {
|
||||
"version": "4.2.0",
|
||||
"resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz",
|
||||
"integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==",
|
||||
"version": "4.3.1",
|
||||
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
|
||||
"integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"ms": "2.1.2"
|
||||
@@ -5787,6 +5800,14 @@
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"tslib": "^1.9.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"tslib": {
|
||||
"version": "1.14.1",
|
||||
"resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
|
||||
"integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
|
||||
"dev": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"safe-buffer": {
|
||||
@@ -6221,6 +6242,83 @@
|
||||
"integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
|
||||
"dev": true
|
||||
},
|
||||
"superagent": {
|
||||
"version": "6.1.0",
|
||||
"resolved": "https://registry.npmjs.org/superagent/-/superagent-6.1.0.tgz",
|
||||
"integrity": "sha512-OUDHEssirmplo3F+1HWKUrUjvnQuA+nZI6i/JJBdXb5eq9IyEQwPyPpqND+SSsxf6TygpBEkUjISVRN4/VOpeg==",
|
||||
"requires": {
|
||||
"component-emitter": "^1.3.0",
|
||||
"cookiejar": "^2.1.2",
|
||||
"debug": "^4.1.1",
|
||||
"fast-safe-stringify": "^2.0.7",
|
||||
"form-data": "^3.0.0",
|
||||
"formidable": "^1.2.2",
|
||||
"methods": "^1.1.2",
|
||||
"mime": "^2.4.6",
|
||||
"qs": "^6.9.4",
|
||||
"readable-stream": "^3.6.0",
|
||||
"semver": "^7.3.2"
|
||||
},
|
||||
"dependencies": {
|
||||
"debug": {
|
||||
"version": "4.3.1",
|
||||
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
|
||||
"integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
|
||||
"requires": {
|
||||
"ms": "2.1.2"
|
||||
}
|
||||
},
|
||||
"form-data": {
|
||||
"version": "3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.0.tgz",
|
||||
"integrity": "sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg==",
|
||||
"requires": {
|
||||
"asynckit": "^0.4.0",
|
||||
"combined-stream": "^1.0.8",
|
||||
"mime-types": "^2.1.12"
|
||||
}
|
||||
},
|
||||
"mime": {
|
||||
"version": "2.4.6",
|
||||
"resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz",
|
||||
"integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA=="
|
||||
},
|
||||
"ms": {
|
||||
"version": "2.1.2",
|
||||
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
|
||||
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
|
||||
},
|
||||
"qs": {
|
||||
"version": "6.9.4",
|
||||
"resolved": "https://registry.npmjs.org/qs/-/qs-6.9.4.tgz",
|
||||
"integrity": "sha512-A1kFqHekCTM7cz0udomYUoYNWjBebHm/5wzU/XqrBRBNWectVH0QIiN+NEcZ0Dte5hvzHwbr8+XQmguPhJ6WdQ=="
|
||||
},
|
||||
"readable-stream": {
|
||||
"version": "3.6.0",
|
||||
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
|
||||
"integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
|
||||
"requires": {
|
||||
"inherits": "^2.0.3",
|
||||
"string_decoder": "^1.1.1",
|
||||
"util-deprecate": "^1.0.1"
|
||||
}
|
||||
},
|
||||
"semver": {
|
||||
"version": "7.3.2",
|
||||
"resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
|
||||
"integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ=="
|
||||
}
|
||||
}
|
||||
},
|
||||
"supertest": {
|
||||
"version": "6.0.1",
|
||||
"resolved": "https://registry.npmjs.org/supertest/-/supertest-6.0.1.tgz",
|
||||
"integrity": "sha512-8yDNdm+bbAN/jeDdXsRipbq9qMpVF7wRsbwLgsANHqdjPsCoecmlTuqEcLQMGpmojFBhxayZ0ckXmLXYq7e+0g==",
|
||||
"requires": {
|
||||
"methods": "1.1.2",
|
||||
"superagent": "6.1.0"
|
||||
}
|
||||
},
|
||||
"supports-color": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
|
||||
@@ -6328,9 +6426,9 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"debug": {
|
||||
"version": "4.2.0",
|
||||
"resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz",
|
||||
"integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==",
|
||||
"version": "4.3.1",
|
||||
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
|
||||
"integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
|
||||
"requires": {
|
||||
"ms": "2.1.2"
|
||||
}
|
||||
@@ -6504,10 +6602,9 @@
|
||||
}
|
||||
},
|
||||
"tslib": {
|
||||
"version": "1.14.1",
|
||||
"resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
|
||||
"integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
|
||||
"dev": true
|
||||
"version": "2.0.3",
|
||||
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz",
|
||||
"integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ=="
|
||||
},
|
||||
"tsutils": {
|
||||
"version": "3.17.1",
|
||||
@@ -6516,6 +6613,14 @@
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"tslib": "^1.8.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"tslib": {
|
||||
"version": "1.14.1",
|
||||
"resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
|
||||
"integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
|
||||
"dev": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"tunnel-agent": {
|
||||
|
||||
20
package.json
20
package.json
@@ -6,13 +6,17 @@
|
||||
"lint": "eslint . --ext .ts",
|
||||
"lint-fix": "eslint . --ext .ts --fix",
|
||||
"debug-client": "tsc-watch --project ./public/js-source",
|
||||
"debug-server": "tsc-watch --project . --onSuccess \"node --enable-source-maps --use-openssl-ca --unhandled-rejections=strict ./out/index\"",
|
||||
"debug-server": "tsc-watch --project ./backend --onSuccess \"node --enable-source-maps --use-openssl-ca --unhandled-rejections=strict ./backend/out/index\"",
|
||||
"debug": "concurrently npm:debug-*",
|
||||
"test": "nyc mocha -r ts-node/register ./public/js-source/test/**/*.ts",
|
||||
"build": "tsc",
|
||||
"production": "node --use-openssl-ca --unhandled-rejections=strict ./out/index",
|
||||
"test-client": "nyc mocha -r ts-node/register ./public/js-source/test/**/*.ts",
|
||||
"test-server:default": "TS_NODE_PROJECT=backend/tsconfig.json nyc mocha -r ts-node/register ./backend/test/**/*.ts",
|
||||
"test-server:windows": "SET TS_NODE_PROJECT=backend/tsconfig.json&& nyc mocha -r ts-node/register ./backend/test/**/*.ts",
|
||||
"test-server": "run-script-os",
|
||||
"test": "npm run test-server && npm run test-client",
|
||||
"build": "tsc -b ./backend ./public/js-source",
|
||||
"production": "node --use-openssl-ca --unhandled-rejections=strict ./backend/out/index",
|
||||
"install-debug": "npm install && npm run build",
|
||||
"install-prod": "npm install --only=dev && npm install --only=prod && npm run build && npm run del-node-module && npm install --only=prod",
|
||||
"install-prod": "npm install --only=dev && npm install --only=prod && npm run build && npm test && npm run del-node-module && npm install --only=prod",
|
||||
"del-node-module:default": "rm -r node_modules",
|
||||
"del-node-module:windows": "if exist node_modules rmdir /Q/S node_modules",
|
||||
"del-node-module": "run-script-os"
|
||||
@@ -25,16 +29,20 @@
|
||||
"node-sass-middleware": "0.11.0",
|
||||
"pkg-express-utils": "git+https://git.biotronik.int/scm/coe-bs-website/node-pkg-express-utils.git",
|
||||
"pug": "^3.0.0",
|
||||
"role-acl": "^4.5.4"
|
||||
"role-acl": "^4.5.4",
|
||||
"supertest": "^6.0.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/chai": "^4.2.14",
|
||||
"@types/compression": "^1.7.0",
|
||||
"@types/express": "^4.17.8",
|
||||
"@types/http-errors": "^1.8.0",
|
||||
"@types/jsdom": "^16.2.5",
|
||||
"@types/mocha": "^8.0.4",
|
||||
"@types/node": "^14.14.7",
|
||||
"@types/node-sass-middleware": "0.0.31",
|
||||
"@types/rewire": "^2.5.28",
|
||||
"@types/supertest": "^2.0.10",
|
||||
"@typescript-eslint/eslint-plugin": "^4.7.0",
|
||||
"@typescript-eslint/parser": "^4.7.0",
|
||||
"chai": "^4.2.0",
|
||||
|
||||
0
public/images/.gitkeep
Normal file
0
public/images/.gitkeep
Normal file
@@ -5,38 +5,48 @@ module.exports = {
|
||||
plugins: [
|
||||
'@typescript-eslint',
|
||||
'no-null',
|
||||
'promise',
|
||||
],
|
||||
extends: [
|
||||
'eslint:recommended',
|
||||
"plugin:@typescript-eslint/eslint-recommended",
|
||||
"plugin:@typescript-eslint/recommended",
|
||||
'plugin:@typescript-eslint/eslint-recommended',
|
||||
'plugin:@typescript-eslint/recommended',
|
||||
'plugin:promise/recommended',
|
||||
],
|
||||
rules: {
|
||||
"no-console": "error",
|
||||
"max-len": ["error", {"code": 128}],
|
||||
"no-process-env": "error",
|
||||
"no-process-exit": "error",
|
||||
"no-null/no-null": "error",
|
||||
"no-useless-return": "error",
|
||||
"prefer-arrow-callback": "warn",
|
||||
"object-curly-spacing": "error",
|
||||
"consistent-return": "error",
|
||||
"@typescript-eslint/explicit-function-return-type": [
|
||||
"error", {
|
||||
"allowExpressions": true,
|
||||
'max-len': ['error', {'code': 128}],
|
||||
'no-process-env': 'error',
|
||||
'no-process-exit': 'error',
|
||||
'no-null/no-null': 'error',
|
||||
'no-useless-return': 'error',
|
||||
'prefer-arrow-callback': 'warn',
|
||||
'consistent-return': 'error',
|
||||
'@typescript-eslint/explicit-function-return-type': [
|
||||
'error', {
|
||||
'allowExpressions': true,
|
||||
},
|
||||
],
|
||||
"no-void": "error",
|
||||
"comma-spacing": "error",
|
||||
"comma-dangle": ["error", "always-multiline"],
|
||||
"comma-style": "error",
|
||||
"semi": "error",
|
||||
"no-implicit-coercion": "error",
|
||||
'no-void': 'error',
|
||||
'comma-spacing': 'error',
|
||||
'comma-dangle': ['error', 'always-multiline'],
|
||||
'comma-style': 'error',
|
||||
'semi': 'error',
|
||||
'no-implicit-coercion': 'error',
|
||||
'quotes': ['error', 'single', 'avoid-escape'],
|
||||
'keyword-spacing': 'error',
|
||||
'semi-spacing': 'error',
|
||||
'arrow-spacing': 'error',
|
||||
'object-curly-spacing': 'error',
|
||||
'array-bracket-spacing': 'error',
|
||||
'key-spacing': 'error',
|
||||
'block-spacing': 'error',
|
||||
'promise/always-return': 'off',
|
||||
|
||||
"no-restricted-imports": ["error",
|
||||
"assert", "buffer", "child_process", "cluster", "crypto", "dgram", "dns", "domain", "events", "freelist",
|
||||
"fs", "http", "https", "module", "net", "os", "path", "punycode", "querystring", "readline", "repl",
|
||||
"smalloc", "stream", "string_decoder", "sys", "timers", "tls", "tracing", "tty", "url", "util", "vm", "zlib",
|
||||
'no-restricted-imports': ['error',
|
||||
'assert', 'buffer', 'child_process', 'cluster', 'crypto', 'dgram', 'dns', 'domain', 'events', 'freelist',
|
||||
'fs', 'http', 'https', 'module', 'net', 'os', 'path', 'punycode', 'querystring', 'readline', 'repl',
|
||||
'smalloc', 'stream', 'string_decoder', 'sys', 'timers', 'tls', 'tracing', 'tty', 'url', 'util', 'vm', 'zlib',
|
||||
],
|
||||
'no-console': ['error', {allow: ['warn', 'error']}],
|
||||
},
|
||||
};
|
||||
|
||||
@@ -2,6 +2,6 @@ import {getUserInfo} from './utils/utils';
|
||||
|
||||
export async function getUserName(): Promise<string> {
|
||||
const info = await getUserInfo();
|
||||
return info?.name ?? "No name found!";
|
||||
return info?.name ?? 'No name found!';
|
||||
}
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@ import {getUserName} from './SomeModule';
|
||||
function updateUserName(name: string): void {
|
||||
const node = document.createElement('span');
|
||||
node.innerText = `This user name is fetched with Javascript: ${name}`;
|
||||
document.getElementsByTagName("body")[0].appendChild(node);
|
||||
document.getElementsByTagName('body')[0].appendChild(node);
|
||||
}
|
||||
|
||||
getUserName().then(updateUserName);
|
||||
getUserName().then(updateUserName).catch((err) => console.error(err));
|
||||
|
||||
32
public/js-source/src/utils/userinfo.ts
Normal file
32
public/js-source/src/utils/userinfo.ts
Normal file
@@ -0,0 +1,32 @@
|
||||
export interface UserInfo {
|
||||
sub: string;
|
||||
name?: string;
|
||||
given_name?: string;
|
||||
family_name?: string;
|
||||
middle_name?: string;
|
||||
nickname?: string;
|
||||
preferred_username?: string;
|
||||
profile?: string;
|
||||
picture?: string;
|
||||
website?: string;
|
||||
email?: string;
|
||||
email_verified?: boolean;
|
||||
gender?: string;
|
||||
birthdate?: string;
|
||||
zoneinfo?: string;
|
||||
locale?: string;
|
||||
phone_number?: string;
|
||||
updated_at?: number;
|
||||
address?: {
|
||||
formatted?: string;
|
||||
street_address?: string;
|
||||
locality?: string;
|
||||
region?: string;
|
||||
postal_code?: string;
|
||||
country?: string;
|
||||
|
||||
[key: string]: unknown;
|
||||
};
|
||||
groups?: string[];
|
||||
[key: string]: unknown;
|
||||
}
|
||||
@@ -1,4 +1,5 @@
|
||||
import {WaitForSync} from './resolvable';
|
||||
import {UserInfo} from './userinfo';
|
||||
|
||||
export interface ClientConfig {
|
||||
EXTERNAL_BASE_URL: string
|
||||
@@ -20,19 +21,8 @@ export function resetConfig(): void {
|
||||
return configWaiter.reset();
|
||||
}
|
||||
|
||||
export async function getUserInfo(): Promise<Partial<UserInfo>|undefined> {
|
||||
export async function getUserInfo(): Promise<UserInfo|undefined> {
|
||||
const config = await getConfig();
|
||||
const res = await fetch(config.EXTERNAL_BASE_URL + "/api/user");
|
||||
const res = await fetch(config.EXTERNAL_BASE_URL + '/api/user');
|
||||
return res.json();
|
||||
}
|
||||
|
||||
export type UserInfo = {
|
||||
email: string,
|
||||
email_verified: boolean,
|
||||
family_name: string,
|
||||
given_name: string,
|
||||
groups: string[],
|
||||
name: string,
|
||||
preferred_username: string,
|
||||
sub: string,
|
||||
};
|
||||
|
||||
@@ -4,25 +4,26 @@ import {expect} from 'chai';
|
||||
// @ts-ignore
|
||||
import * as fetchMock from 'fetch-mock';
|
||||
import {getUserName} from '../src/SomeModule';
|
||||
import {setConfig, UserInfo} from '../src/utils/utils';
|
||||
import {setConfig} from '../src/utils/utils';
|
||||
import {UserInfo} from '../src/utils/userinfo';
|
||||
|
||||
describe('frontend:SomeModule', () => {
|
||||
const CONFIG = {EXTERNAL_BASE_URL: "http://demo.url"};
|
||||
before(() => {
|
||||
const CONFIG = {EXTERNAL_BASE_URL: 'http://demo.url'};
|
||||
beforeEach(() => {
|
||||
setConfig(CONFIG);
|
||||
fetchMock.config.overwriteRoutes = true;
|
||||
});
|
||||
it('should return username', async () => {
|
||||
const tests: [Partial<UserInfo>, string][] = [
|
||||
[
|
||||
{name: "John Doe"},
|
||||
"John Doe",
|
||||
{name: 'John Doe'},
|
||||
'John Doe',
|
||||
], [
|
||||
{name: "John Doe", email: "some.mail@example.com"},
|
||||
"John Doe",
|
||||
{name: 'John Doe', email: 'some.mail@example.com'},
|
||||
'John Doe',
|
||||
], [
|
||||
{name: "", email: "some.mail@example.com"},
|
||||
"",
|
||||
{name: '', email: 'some.mail@example.com'},
|
||||
'',
|
||||
],
|
||||
];
|
||||
for (const [USER_INFO, RESULT] of tests) {
|
||||
@@ -35,13 +36,13 @@ describe('frontend:SomeModule', () => {
|
||||
}
|
||||
});
|
||||
it('should return default string', async () => {
|
||||
const RESULT = "No name found!";
|
||||
const RESULT = 'No name found!';
|
||||
const tests: (Partial<UserInfo>|unknown)[] = [
|
||||
// eslint-disable-next-line no-null/no-null
|
||||
{name: null},
|
||||
// eslint-disable-next-line no-null/no-null
|
||||
null,
|
||||
{email: "some.mail@example.com"},
|
||||
{email: 'some.mail@example.com'},
|
||||
{name: undefined},
|
||||
{},
|
||||
];
|
||||
|
||||
@@ -7,13 +7,13 @@ import {JSDOM} from 'jsdom';
|
||||
// @ts-ignore
|
||||
import * as rewire from 'rewire';
|
||||
|
||||
describe("frontend:index", () => {
|
||||
const updateUserName = rewire("../src/index").__get__("updateUserName") as (name: string) => void;
|
||||
describe('frontend:index', () => {
|
||||
const updateUserName = rewire('../src/index').__get__('updateUserName') as (name: string) => void;
|
||||
|
||||
beforeEach(() => {
|
||||
const dom = new JSDOM(
|
||||
`
|
||||
<html>
|
||||
<html lang="en">
|
||||
<body>
|
||||
</body>
|
||||
</html>
|
||||
@@ -21,19 +21,21 @@ describe("frontend:index", () => {
|
||||
{url: 'http://localhost'},
|
||||
);
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
||||
// @ts-ignore
|
||||
// noinspection JSConstantReassignment
|
||||
global.window = dom.window;
|
||||
// noinspection JSConstantReassignment
|
||||
global.document = dom.window.document;
|
||||
});
|
||||
|
||||
it("updateUserName", (done) => {
|
||||
const NAME = "Patrick Star";
|
||||
const RESULT = "This user name is fetched with Javascript: Patrick Star";
|
||||
it('updateUserName', (done) => {
|
||||
const NAME = 'Patrick Star';
|
||||
const RESULT = 'This user name is fetched with Javascript: Patrick Star';
|
||||
updateUserName(NAME);
|
||||
// give the browser a chance to update the DOM
|
||||
setTimeout(() => {
|
||||
const span = document.getElementsByTagName("span");
|
||||
const span = document.getElementsByTagName('span');
|
||||
expect(span).to.not.be.null;
|
||||
expect(span.length).to.be.greaterThan(0);
|
||||
expect(span[0].innerText).to.deep.equal(RESULT);
|
||||
|
||||
@@ -1,13 +1,15 @@
|
||||
import {setConfig, getConfig, resetConfig, getUserInfo, UserInfo} from '../src/utils/utils';
|
||||
/* eslint-disable promise/catch-or-return,promise/no-callback-in-promise */
|
||||
import {setConfig, getConfig, resetConfig, getUserInfo} from '../src/utils/utils';
|
||||
import {Resolvable, WaitForSync} from '../src/utils/resolvable';
|
||||
import {describe, it} from 'mocha';
|
||||
import {expect} from 'chai';
|
||||
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
||||
// @ts-ignore
|
||||
import * as fetchMock from 'fetch-mock';
|
||||
import {UserInfo} from '../src/utils/userinfo';
|
||||
|
||||
describe('frontend:utils - setConfig/getConfig', () => {
|
||||
const CONFIG = {EXTERNAL_BASE_URL: "http://demo.url"};
|
||||
const CONFIG = {EXTERNAL_BASE_URL: 'http://demo.url'};
|
||||
afterEach(() => resetConfig());
|
||||
|
||||
it('should return config (afterwards)', async () => {
|
||||
@@ -25,9 +27,9 @@ describe('frontend:utils - setConfig/getConfig', () => {
|
||||
});
|
||||
|
||||
describe('frontend:utils - getUserInfo', () => {
|
||||
const CONFIG = {EXTERNAL_BASE_URL: "http://demo.url"};
|
||||
const CONFIG = {EXTERNAL_BASE_URL: 'http://demo.url'};
|
||||
const USER_INFO: Partial<UserInfo> = {
|
||||
name: "John Doe",
|
||||
name: 'John Doe',
|
||||
};
|
||||
|
||||
beforeEach(() => setConfig(CONFIG));
|
||||
@@ -46,7 +48,7 @@ describe('frontend:utils - getUserInfo', () => {
|
||||
|
||||
describe('frontend:utils - resolvable', () => {
|
||||
const DATA = 5;
|
||||
const ERROR = new Error("Custom error!");
|
||||
const ERROR = new Error('Custom error!');
|
||||
|
||||
it('waitForSync should return data (afterwards)', async () => {
|
||||
const resolvable = new WaitForSync<number>();
|
||||
|
||||
@@ -1,8 +0,0 @@
|
||||
body {
|
||||
padding: 50px;
|
||||
font: 14px "Lucida Grande", Helvetica, Arial, sans-serif; }
|
||||
|
||||
a {
|
||||
color: #00B7FF; }
|
||||
|
||||
/*# sourceMappingURL=style.css.map */
|
||||
@@ -1,40 +0,0 @@
|
||||
// eslint-disable-next-line no-undef
|
||||
module.exports = {
|
||||
root: true,
|
||||
parser: '@typescript-eslint/parser',
|
||||
plugins: [
|
||||
'@typescript-eslint',
|
||||
'no-null',
|
||||
'promise',
|
||||
],
|
||||
extends: [
|
||||
'eslint:recommended',
|
||||
"plugin:@typescript-eslint/eslint-recommended",
|
||||
"plugin:@typescript-eslint/recommended",
|
||||
"plugin:promise/recommended",
|
||||
],
|
||||
rules: {
|
||||
"no-console": "error",
|
||||
"max-len": ["error", {"code": 128}],
|
||||
"no-process-env": "error",
|
||||
"no-process-exit": "error",
|
||||
"no-null/no-null": "error",
|
||||
"no-useless-return": "error",
|
||||
"prefer-arrow-callback": "warn",
|
||||
"object-curly-spacing": "error",
|
||||
"consistent-return": "error",
|
||||
"@typescript-eslint/explicit-function-return-type": [
|
||||
"error", {
|
||||
"allowExpressions": true,
|
||||
},
|
||||
],
|
||||
"no-void": "error",
|
||||
"comma-spacing": "error",
|
||||
"comma-dangle": ["error", "always-multiline"],
|
||||
"comma-style": "error",
|
||||
"semi": "error",
|
||||
"no-implicit-coercion": "error",
|
||||
|
||||
"promise/always-return": "off",
|
||||
},
|
||||
};
|
||||
28
src/types/extend-request.d.ts
vendored
28
src/types/extend-request.d.ts
vendored
@@ -1,28 +0,0 @@
|
||||
// extend-request.d.ts
|
||||
|
||||
declare global {
|
||||
namespace Express {
|
||||
interface UserInfo {
|
||||
email: string,
|
||||
email_verified: boolean,
|
||||
family_name: string,
|
||||
given_name: string,
|
||||
groups: string[],
|
||||
name: string,
|
||||
preferred_username: string,
|
||||
sub: string,
|
||||
}
|
||||
|
||||
interface Request {
|
||||
getUserInfo(): Promise<Partial<UserInfo>|undefined>;
|
||||
noLogging: boolean|undefined;
|
||||
permissionDetails?: import('role-acl').Permission;
|
||||
}
|
||||
|
||||
interface Response {
|
||||
initLogout(): boolean;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export {};
|
||||
Reference in New Issue
Block a user