<!--
#
# 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.
#
-->

# NodeJS 12 OpenWhisk Runtime Container

# Apache 1.18
  - Update to openwhisk-client-js 3.21.4 (#194)
  - Constraint all transitive akka-* dependencies (#195)
  - Update NodeJs to gather fixes (#192)
  - Update NodeJs to gather fixes (#188)
  - Update from source build. (#187)
  - Update NodeJs to gather fixes (#186)

Node.js version = [12.22.1](https://nodejs.org/en/blog/release/v12.22.1/)
OpenWhisk version = [OpenWhisk v3.21.4](https://www.npmjs.com/package/openwhisk)

## Apache 1.17
  - Update Node.js and OpenWhisk versions.

Node.js version = [12.19.1](https://nodejs.org/en/blog/release/v12.19.1/)
OpenWhisk version = [OpenWhisk v3.21.3](https://www.npmjs.com/package/openwhisk)

## Apache 1.16
Changes:
  - Update Node.js and OpenWhisk versions.
  - Update OpenWhisk npm package

Node.js version = [12.18.2](https://nodejs.org/en/blog/release/v12.18.2/)
OpenWhisk version = [OpenWhisk v3.21.2](https://www.npmjs.com/package/openwhisk)

## Apache 1.15
Changes:
  - Update Node.js
  - Update OpenWhisk npm package
  - Support for __OW_ACTION_VERSION (openwhisk/4761)

Node.js version = [12.15.0](https://nodejs.org/en/blog/release/v12.15.0/)
OpenWhisk version = [OpenWhisk v3.21.1](https://www.npmjs.com/package/openwhisk)

## Apache 1.14
Changes:
- Adding Nodejs version 12
- Node.js version = [12.8.1](https://nodejs.org/en/blog/release/v12.8.1/)
- [OpenWhisk v3.18.0](https://www.npmjs.com/package/openwhisk) - JavaScript client library for the OpenWhisk platform. Provides a wrapper around the OpenWhisk APIs.

Node.js version = [12.1.0](https://nodejs.org/en/blog/release/v12.1.0/)
