From 8b11c10e32c496424cb0bd615ede06f8ef01f557 Mon Sep 17 00:00:00 2001 From: John Livingston Date: Wed, 7 Apr 2021 16:52:38 +0200 Subject: [PATCH] Server code in typescript. --- package-lock.json | 88 +++++++++++++++++++++++++++++++++++++ package.json | 6 ++- server/{main.js => main.ts} | 32 ++++++++++---- server/tsconfig.json | 27 ++++++++++++ 4 files changed, 143 insertions(+), 10 deletions(-) rename server/{main.js => main.ts} (91%) create mode 100644 server/tsconfig.json diff --git a/package-lock.json b/package-lock.json index 678e31b5..fcdfa1cc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -98,12 +98,94 @@ "integrity": "sha512-Z6DoceYb/1xSg5+e+ZlPZ9v0N16ZvZ+wYMraFue4HYrE4ttONKtsvruIRf6t9TBR0YvSOfi1hUU0fJfBLCDYow==", "dev": true }, + "@tsconfig/node12": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.7.tgz", + "integrity": "sha512-dgasobK/Y0wVMswcipr3k0HpevxFJLijN03A8mYfEPvWvOs14v0ZlYTR4kIgMx8g4+fTyTFv8/jLCIfRqLDJ4A==", + "dev": true + }, + "@types/body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ==", + "dev": true, + "requires": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "@types/connect": { + "version": "3.4.34", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.34.tgz", + "integrity": "sha512-ePPA/JuI+X0vb+gSWlPKOY0NdNAie/rPUqX2GUPpbZwiKTkSPhjXWuee47E4MtE54QVzGCQMQkAL6JhV2E1+cQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/express": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.11.tgz", + "integrity": "sha512-no+R6rW60JEc59977wIxreQVsIEOAYwgCqldrA/vkpCnbD7MqTefO97lmoBe4WE0F156bC4uLSP1XHDOySnChg==", + "dev": true, + "requires": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.18", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "@types/express-serve-static-core": { + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.19.tgz", + "integrity": "sha512-DJOSHzX7pCiSElWaGR8kCprwibCB/3yW6vcT8VG3P0SJjnv19gnWG/AZMfM60Xj/YJIp/YCaDHyvzsFVeniARA==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" + } + }, "@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", "dev": true }, + "@types/mime": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", + "dev": true + }, + "@types/node": { + "version": "14.14.37", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.37.tgz", + "integrity": "sha512-XYmBiy+ohOR4Lh5jE379fV2IU+6Jn4g5qASinhitfyO71b/sCo6MKsMLF5tc7Zf2CE8hViVQyYSobJNke8OvUw==", + "dev": true + }, + "@types/qs": { + "version": "6.9.6", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.6.tgz", + "integrity": "sha512-0/HnwIfW4ki2D8L8c9GVcG5I72s9jP5GSLVF0VIXDW00kmIpA6O33G7a8n59Tmh7Nz0WUC3rSb7PTY/sdW2JzA==", + "dev": true + }, + "@types/range-parser": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz", + "integrity": "sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==", + "dev": true + }, + "@types/serve-static": { + "version": "1.13.9", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.9.tgz", + "integrity": "sha512-ZFqF6qa48XsPdjXV5Gsz0Zqmux2PerNd3a/ktL45mHpa19cuMi/cL8tcxdAx497yRh+QtYPuofjT9oWw9P7nkA==", + "dev": true, + "requires": { + "@types/mime": "^1", + "@types/node": "*" + } + }, "@webassemblyjs/ast": { "version": "1.8.5", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz", @@ -4843,6 +4925,12 @@ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", "dev": true }, + "typescript": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.3.tgz", + "integrity": "sha512-qOcYwxaByStAWrBf4x0fibwZvMRG+r4cQoTjbPtUlrWjBHbmCAww1i448U0GJ+3cNNEtebDteo/cHOR3xJ4wEw==", + "dev": true + }, "union-value": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", diff --git a/package.json b/package.json index ea1e4e5c..f2bd3313 100644 --- a/package.json +++ b/package.json @@ -24,6 +24,9 @@ "dependencies": {}, "devDependencies": { "@purtuga/esm-webpack-plugin": "^1.1.1", + "@tsconfig/node12": "^1.0.7", + "@types/express": "^4.17.11", + "@types/node": "^14.14.37", "converse.js": "^7.0.5", "eslint": "^7.20.0", "eslint-config-standard": "^16.0.2", @@ -32,6 +35,7 @@ "eslint-plugin-promise": "^4.3.1", "npm-run-all": "^4.1.5", "svgo": "^2.2.1", + "typescript": "^4.2.3", "webpack": "^4.41.2", "webpack-cli": "^3.3.10" }, @@ -50,7 +54,7 @@ "build:converse": "mkdir -p dist/client/conversejs && cp -r node_modules/converse.js/dist/* dist/client/conversejs/", "build:images": "mkdir -p dist/client/images && npx svgo -f public/images/ -o dist/client/images/", "build:webpack": "webpack --mode=production", - "build:server": "mkdir -p dist/server && cp ./server/main.js dist/server/", + "build:server": "npx tsc --build server/tsconfig.json", "build:serverconverse": "mkdir -p dist/server/conversejs && cp conversejs/index.html dist/server/conversejs/", "build": "npm-run-all -s clean -p build:converse build:images build:webpack build:server build:serverconverse", "lint": "npx eslint --ext .js ." diff --git a/server/main.js b/server/main.ts similarity index 91% rename from server/main.js rename to server/main.ts index be6fea39..d99e44ae 100644 --- a/server/main.js +++ b/server/main.ts @@ -1,17 +1,31 @@ +import type { NextFunction, Request, Response } from 'express' + const path = require('path') const fs = require('fs').promises +type RegisterServerOptions = { + registerHook: any, + registerSetting: any, + settingsManager: any, + storageManager: any, + videoCategoryManager: any, + videoLicenceManager: any, + videoLanguageManager: any, + getRouter: any, + peertubeHelpers: any +} + async function register ({ - _registerHook, + registerHook, registerSetting, settingsManager, - _storageManager, - _videoCategoryManager, - _videoLicenceManager, - _videoLanguageManager, + storageManager, + videoCategoryManager, + videoLicenceManager, + videoLanguageManager, getRouter, peertubeHelpers -}) { +}: RegisterServerOptions): Promise { registerSetting({ name: 'chat-auto-display', label: 'Automatically open the chat', @@ -142,8 +156,8 @@ async function register ({ const converseJSIndex = await fs.readFile(path.resolve(__dirname, './conversejs/index.html')) const router = getRouter() - router.get('/ping', (req, res) => res.json({ message: 'pong' })) - router.get('/webchat', async (req, res, next) => { + router.get('/ping', (req: Request, res: Response) => res.json({ message: 'pong' })) + router.get('/webchat', async (req: Request, res: Response, next: NextFunction) => { try { const settings = await settingsManager.getSettings([ 'chat-use-builtin', 'chat-room', 'chat-server', @@ -168,7 +182,7 @@ async function register ({ // be /webchat/:videoId // const id = req.param('videoId') // const video = await peertubeHelpers.videos.loadByIdOrUUID(id) - let url = req.query.url + let url: string = req.query.url as string || '' if (!url) { throw new Error('Missing url parameter)') } diff --git a/server/tsconfig.json b/server/tsconfig.json new file mode 100644 index 00000000..2639a901 --- /dev/null +++ b/server/tsconfig.json @@ -0,0 +1,27 @@ +{ + "extends": "@tsconfig/node12/tsconfig.json", + "compilerOptions": { + "moduleResolution": "node", // Tell tsc to look in node_modules for modules + "strict": true, // That implies alwaysStrict, noImplicitAny, noImplicitThis + + "alwaysStrict": true, // should already be true because of strict:true + "noImplicitAny": true, // should already be true because of strict:true + "noImplicitThis": true, // should already be true because of strict:true + "noImplicitReturns": true, + "strictBindCallApply": true, // should already be true because of strict:true + "noUnusedLocals": true, + + "removeComments": true, + "sourceMap": true, + + // "composite": true, + // "declaration": true, + // "tsBuildInfoFile": "./dist/server/main.tsbuildinfo", + // "rootDir": "server", + "outDir": "../dist/server", + // "baseUrl": "./server/", + "paths": {}, + }, + "include": ["./**/*"], + "exclude": [] +}