{{&methodName}}URL(parameters: {
{{#parameters}}{{^isSingleton}}'{{&camelCaseName}}'{{&cardinality}}: {{> type}},
{{/isSingleton}}{{/parameters}}
} & CommonRequestOptions): string {
    let queryParameters: any = {};
    const domain = parameters.$domain ? parameters.$domain : this.domain;
    let path = '{{&path}}';
    if (parameters.$path) {
        path = (typeof(parameters.$path) === 'function') ? parameters.$path(path) : parameters.$path;
    } 

    {{#parameters}}
        {{#isQueryParameter}}
            {{#isSingleton}}
                queryParameters['{{&name}}'] = '{{&singleton}}';
            {{/isSingleton}}
            {{^isSingleton}}
                {{#isPatternType}}
                    Object.keys(parameters).forEach(function(parameterName) {
                    if(new RegExp('{{&pattern}}').test(parameterName)){
                    queryParameters[parameterName] = parameters[parameterName];
                    }
                    });
                {{/isPatternType}}
                {{^isPatternType}}
                    if(parameters['{{&camelCaseName}}'] !== undefined){
                    queryParameters['{{&name}}'] = parameters['{{&camelCaseName}}'];
                    }
                {{/isPatternType}}
            {{/isSingleton}}
        {{/isQueryParameter}}

        {{#isPathParameter}}
            path = path.replace('{{=<% %>=}}{<%&name%>}<%={{ }}=%>', `${parameters['{{&camelCaseName}}']}`);
        {{/isPathParameter}}
    {{/parameters}}
    
    if (parameters.$queryParameters !== undefined && parameters.$queryParameters !== null) {
        queryParameters = {
            ...queryParameters,
            ...parameters.$queryParameters
        }
    }

    {{^isBodyParameter}}
        {{#isPOST}}
    queryParameters = {};
        {{/isPOST}}
    {{/isBodyParameter}}


    let keys = Object.keys(queryParameters);
    return domain + path + (keys.length > 0 ? '?' + (keys.map(key => key + '=' + encodeURIComponent(queryParameters[key])).join('&')): '');
}

/**
* {{&summary}}
* @method
{{#externalDocs}}
* @see {@link {{&url}}|{{#description}}{{&description}}{{/description}}{{^description}}External docs{{/description}}}
{{/externalDocs}}
* @name {{&className}}#{{&methodName}}
{{#parameters}}
    {{^isSingleton}} * @param {{=<% %>=}}{<%&type%>}<%={{ }}=%> {{&camelCaseName}} - {{&description}}{{/isSingleton}}
{{/parameters}}
*/
{{&methodName}}(parameters: {
{{#parameters}}{{^isSingleton}}'{{&camelCaseName}}'{{&cardinality}}: {{> type}},
{{/isSingleton}}{{/parameters}}
    $queryParameters?: any,
    $domain?: string,
    $path?: string | ((path: string) => string)
}): Promise<ResponseWithBody<{{&successfulResponseType}}>> {
    const domain = parameters.$domain ? parameters.$domain : this.domain;
    let path = '{{&path}}';
    if (parameters.$path) {
        path = (typeof(parameters.$path) === 'function') ? parameters.$path(path) : parameters.$path;
    } 

    let body: any;
    let queryParameters: any = {};
    let headers: any = {};
    let form: any = {};
    return new Promise((resolve, reject) => {
{{#headers}}
    headers['{{&name}}'] = {{&value}};
{{/headers}}

{{#parameters}}

    {{#isQueryParameter}}
        {{#isSingleton}}
            queryParameters['{{&name}}'] = '{{&singleton}}';
        {{/isSingleton}}
        {{^isSingleton}}
            {{#isPatternType}}
                Object.keys(parameters).forEach(function(parameterName) {
                    if(new RegExp('{{&pattern}}').test(parameterName)){
                        queryParameters[parameterName] = parameters[parameterName];
                    }
                });
            {{/isPatternType}}
            {{^isPatternType}}
                if(parameters['{{&camelCaseName}}'] !== undefined) {
                    queryParameters['{{&name}}'] = parameters['{{&camelCaseName}}'];
                }
            {{/isPatternType}}
        {{/isSingleton}}
    {{/isQueryParameter}}

    {{#isPathParameter}}
        path = path.replace('{{=<% %>=}}{<%&name%>}<%={{ }}=%>', `${parameters['{{&camelCaseName}}']}`);
    {{/isPathParameter}}

    {{#isHeaderParameter}}
        {{#isSingleton}}
            headers['{{&name}}'] = '{{&singleton}}';
        {{/isSingleton}}
        {{^isSingleton}}
            if(parameters['{{&camelCaseName}}'] !== undefined) {
                headers['{{&name}}'] = parameters['{{&camelCaseName}}'];
            }
        {{/isSingleton}}
    {{/isHeaderParameter}}

    {{#isBodyParameter}}
        if(parameters['{{&camelCaseName}}'] !== undefined) {
            body = parameters['{{&camelCaseName}}'];
        }
    {{/isBodyParameter}}

    {{#isFormParameter}}
        {{#isSingleton}}
            form['{{&name}}'] = '{{&singleton}}';
        {{/isSingleton}}
        {{^isSingleton}}
            if(parameters['{{&camelCaseName}}'] !== undefined) {
                form['{{&name}}'] = parameters['{{&camelCaseName}}'];
            }
        {{/isSingleton}}
    {{/isFormParameter}}

    {{#required}}
        if(parameters['{{&camelCaseName}}'] === undefined) {
            reject(new Error('Missing required {{&paramType}} parameter: {{&camelCaseName}}'));
            return;
        }
    {{/required}}

{{/parameters}}

if(parameters.$queryParameters) {
    Object.keys(parameters.$queryParameters).forEach(function(parameterName){
        queryParameters[parameterName] = parameters.$queryParameters[parameterName];
    });
}

    {{^isBodyParameter}}
        {{#isPOST}}
            form = queryParameters;
            queryParameters = {};
        {{/isPOST}}
    {{/isBodyParameter}}

    this.request('{{method}}', domain + path, body, headers, queryParameters, form, reject, resolve);
    });
}
