javascript - Rocket.Chat WebHook med Typescript
Jag är på väg att skriva ett komplext inkommande WebHook för Rocket.Chat. För att undvika att allt hamnar i en enda fil valde jag Typescript. Rocket.Chat kräver en klass som heter Script med några fördefinierade metoder som process_incoming_request (ett enkelt exempel: https://rocket.chat/docs/administrator-guides/integrations/).
min nuvarande projektuppsättning ser ut så här:
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
}
}
Processen yarn gulp körs smidigt utan fel, men när man använder den genererade koden inuti skriptdelen av webhooken resulterar det i ett fel:
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
Jag är inte så bekant med Typescript, Node och allt det där. Så huvudfrågan är, hur kan jag uppnå att processen genererar en klass (eller ett skript som exponerar en klass) med namnet Script med metoden process_incoming_request. Jag är inte heller säker på om mitt skript genererar felet eller RocketChat-delen.
Tack!
Svar #1
Jag antar att problemet är att Gulp (eller några av dess plugins) genererar en stomme av kod, nödvändig för JS:s (icke-existerande) modulsystem, och det innebär ofta att kompileringsutdata måste omslutas i konstiga flerskiktade anonyma funktioner.
Om du inte behöver någon typ av modulsystem och bara vill att dina flera TS-filer översätts direkt till en enda JS-fil (som förmodligen går till RocketChat), då skulle jag föreslå att du helt slopar Gulp, låter TSC kompilera din kod som vanligt och sedan bundlar de resulterande .js-filerna till en enda med ett script.
Så den övergripande uppställningen skulle vara som följer (förutsatt att src är en källkodsmapp):
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")
Så du programmerar din sak som vanligt, bygger den med ./build.sh, får dist/app.js-filen och använder den i RocketChat.
Det måste finnas ett sätt att göra något i den här stilen i Gulp, men jag är inte bekant med det och tycker inte att ett fullfjädrat byggsystem egentligen behövs här.
