/*
Licensed 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.
*/
const PROXY_CONFIG = {
    "/query-service/*": {
        "target": "http://localhost:19002",
        "secure": false,
        logLevel: "debug",
        pathRewrite: function (path) { return path.replace('/query-service', '/query/service')}
    }
}

module.exports = PROXY_CONFIG;