# Licensed to the Apache Software Foundation (ASF) under one or more contributor
# license agreements; and to You under the Apache License, Version 2.0.

packages:
    helloworld:
        actions:
            helloworld1:
                function: actions/hello.js
            helloworld2:
                code: const main = ({ msg }) => { console.log(msg); return {msg}; }
                runtime: nodejs:6
            helloworld3:
                function: actions/hello.js
                annotations:
                    annotation1: value1
                    annotation2: value2
                inputs:
                    parameter1: value1
                    parameter2: value2
            helloworld4:
                function: actions/hello.js
                web: true
            helloworld5:
                function: actions/hello.js
                conductor: true
            helloworld6:
                function: actions/hello.js
                docker: openwhisk/skeleton


