Rocket.Chat WebHook с Typescript - PullRequest
       10

Rocket.Chat WebHook с Typescript

7 голосов
/ 23 марта 2020

Я собираюсь написать сложный Incoming WebHook для Rocket.Chat. Чтобы избежать беспорядка в одном файле, я взял Typescript. Rocket.Chat требует класс с именем Script с некоторыми предопределенными методами, такими как process_incoming_request (один простой пример: https://rocket.chat/docs/administrator-guides/integrations/).

моя текущая настройка проекта выглядит следующим образом:

tsconfig.ts

{
  "files": [
    "src/main.ts"
  ],
  "compilerOptions": {
    "noImplicitAny": true,
    "target": "es2015"
  }
}

gulpfile. js

var gulp = require("gulp");
var browserify = require("browserify");
var source = require("vinyl-source-stream");
var tsify = require("tsify");
var uglify = require("gulp-uglify");
var buffer = require("vinyl-buffer");

gulp.task(
    "default",
    function () {
        return browserify({
            basedir: ".",
            debug: true,
            entries: ["src/main.ts"],
            cache: {},
            packageCache: {}
        })
            .plugin(tsify)
            .transform("babelify", {
                presets: ["es2015"],
                extensions: [".ts"]
            })
            .bundle()
            .pipe(source("bundle.js"))
            .pipe(buffer())
            .pipe(uglify())
            .pipe(gulp.dest("dist"));
    }
);

main.ts

import {RequestInterface} from "./Interface/RequestInterface";

class Script {
    process_incoming_request(request: RequestInterface) {
        // some code
    }
}

Процесс yarn gulp проходит без ошибок, но при использовании сгенерированного кода внутри части скрипта webhook это приводит к ошибке:

Incoming WebHook.error script.js:1   
ReferenceError: module is not defined       
at script.js:1:4307       
at Script.runInContext (vm.js:127:20)       
at Script.runInNewContext (vm.js:133:17)       
at getIntegrationScript (app/integrations/server/api/api.js:70:12)       
at Object.executeIntegrationRest (app/integrations/server/api/api.js:166:13)       
at app/api/server/api.js:343:82       
at Meteor.EnvironmentVariable.EVp.withValue (packages/meteor.js:1234:12)       
at Object._internalRouteActionHandler [as action] (app/api/server/api.js:343:39)       
at Route.share.Route.Route._callEndpoint (packages/nimble_restivus/lib/route.coffee:150:32)       
at packages/nimble_restivus/lib/route.coffee:59:33 

Я не настолько знаком с Typescript, Node и всем прочим. Поэтому главный вопрос заключается в том, как я могу добиться, чтобы процесс генерировал класс (или сценарий, который предоставляет класс) с именем Script с помощью метода process_incoming_request. Я также не уверен, генерирует ли мой скрипт ошибку или часть RocketChat.

Спасибо!

1 Ответ

2 голосов
/ 02 апреля 2020

Думаю, проблема в том, что Gulp (или некоторые из его плагинов) генерирует код скаффолдинга, необходимый для модульной системы JS (несуществующей), и это часто подразумевает оборачивание вывода компилятора в странный многослойный анонимные функции.

Если вам не нужна какая-либо модульная система и вы хотите, чтобы ваши несколько файлов TS транслировались непосредственно в один файл JS (который предположительно идет в RocketChat), тогда я бы предложил полностью отключив Gulp, позволяя TS C скомпилировать ваш код, как обычно, затем объединяя полученные .js файлы в один со скриптом.

Итак, общая настройка будет следующей (при условии src - это папка с исходным кодом):

tsconfig. json

{
  "include": [
    "src/**/*.ts"
  ],
  "compilerOptions": {
    "noImplicitAny": true,
    "target": "es2016"
  }
}

build. sh

#!/bin/bash

# TSC puts compiled JS files along with their TS sources. 
node_modules/typescript/bin/tsc

# Creating an empty bundle file.
echo "">dist/app.js

# Bundling all the JS together.
# sed removes the 'export' keywords & 'import' statements.
while read p; do
  cat $p | sed -E "s/^export\s+(class|function|async|const|var)/\1/" | sed -E "s/import.*$//" >> dist/app.js
done <<< $(find src -type f -name "*.js")

Таким образом, вы программируете свою вещь как обычно, создаете ее с помощью ./build.sh, получаете файл dist/app.js и используете его в RocketChat.

Должен быть способ сделать что-то подобное в Глотай, но я не знаком с этим, я не думаю, что здесь нужна полноценная система сборки.

...