| /* |
| * 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, |
| }; |
| } |
| } |