blob: 08f0c9f8e934ba166541b3f6bcb569350e257799 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
'use strict';
const fs = require('fs-extra');
const path = require('path');
// path inside docker container where action code is mounted
const CODE_MOUNT = "/code";
module.exports = {
description: "Node.js V8 inspect debugger on port 9229. Supports source mount",
// additional debug port to expose
port: 9229,
// modified docker image command/entrypoint to enable debugging
command: function(invoker) {
return `node --expose-gc --inspect=0.0.0.0:${invoker.debug.internalPort} app.js`
},
// return extra docker arguments such as mounting the source path
dockerArgs: function(invoker) {
if (invoker.sourceDir) {
if (!invoker.sourceFile) {
throw new Error("[source-path] or --build-path must point to the action javascript source file, it cannot be a folder.");
}
return `-v "${invoker.sourceDir}:${CODE_MOUNT}"`;
}
},
// return action for /init that mounts the sources specified by invoker.sourcePath
mountAction: function(invoker) {
// bridge that mounts local source path
// test if code uses commonjs require()
const isCommonJS = /(\s|=)require\(\s*['"`]/.test(fs.readFileSync(invoker.sourcePath));
// is it a require() based action or a plain JS one?
const bridgeSource = isCommonJS ? "mount-require.js" : "mount-plain.js";
let code = fs.readFileSync(`${__dirname}/${bridgeSource}`, {encoding: 'utf8'});
let sourceFile = invoker.sourceFile.toString();
// On Windows, the path set on the cli would typically be in windows format,
// but the nodejs container is Unix and requires Unix paths
if (path.sep !== path.posix.sep) {
sourceFile = sourceFile.split(path.sep).join(path.posix.sep);
}
code = code.replace("$$main$$", invoker.main || "main");
code = code.replace("$$sourcePath$$", `${CODE_MOUNT}/${sourceFile}`);
code = code.replace("$$sourceFile$$", sourceFile);
return {
binary: false,
main: "main",
code: code,
};
}
}