@sylvesterllc/aws-constructs 1.0.26 → 1.0.28
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/config/types/TsgLambdaRoutable.d.ts +2 -0
- package/dist/config/types/TsgLambdaRoutable.js +1 -1
- package/dist/resources/helpers/createRoutes.d.ts +3 -0
- package/dist/resources/helpers/createRoutes.js +17 -2
- package/package.json +1 -1
- package/src/config/types/TsgLambdaRoutable.ts +2 -0
- package/src/resources/helpers/createRoutes.ts +28 -8
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVHNnTGFtYmRhUm91dGFibGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29uZmlnL3R5cGVzL1RzZ0xhbWJkYVJvdXRhYmxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgaW50ZXJmYWNlIFRzZ0xhbWJkYVJvdXRhYmxlIHtcbiAgICByb3V0ZTogc3RyaW5nO1xuICAgIHNlY3VyZT86IGJvb2xlYW47XG4gICAgbWV0aG9kPzogXCJnZXRcIiB8IFwicG9zdFwiIHwgXCJkZWxldGVcIiB8IFwicHV0XCIgfCBcInBhdGNoXCI7XG4gICAgdmVyc2lvbj86IG51bWJlcjtcbiAgICB1c2VSb3V0ZU92ZXJyaWRlPzogYm9vbGVhbjtcbiAgICByZXF1aXJlQXBpS2V5PzogYm9vbGVhbjtcbiAgICBxdWVyeVN0cmluZ3M/OiBzdHJpbmdbXTtcbn0iXX0=
|
|
@@ -5,4 +5,7 @@ export declare class Routes {
|
|
|
5
5
|
static Resources: Resource[];
|
|
6
6
|
private static routeMap;
|
|
7
7
|
static createResource(prop: TsgLambdaProp, api: IRestApi, lambdaNode: NodejsFunction, authorizer?: TokenAuthorizer): void;
|
|
8
|
+
static createQueryStringObject(queryStrings: string[] | undefined): {
|
|
9
|
+
[key: string]: boolean;
|
|
10
|
+
};
|
|
8
11
|
}
|
|
@@ -26,11 +26,26 @@ class Routes {
|
|
|
26
26
|
activeResource = secondaryResource;
|
|
27
27
|
}
|
|
28
28
|
// Finally, we attach our function to the last resource
|
|
29
|
-
activeResource.addMethod(prop.apiGateway.method || 'GET', new aws_apigateway_1.LambdaIntegration(lambdaNode, { proxy: true, }),
|
|
29
|
+
activeResource.addMethod(prop.apiGateway.method || 'GET', new aws_apigateway_1.LambdaIntegration(lambdaNode, { proxy: true, }), {
|
|
30
|
+
requestParameters: Routes.createQueryStringObject(prop.apiGateway.queryStrings),
|
|
31
|
+
apiKeyRequired: (prop.apiGateway.requireApiKey) ? true : false,
|
|
32
|
+
authorizer: prop.apiGateway.secure ? authorizer : undefined,
|
|
33
|
+
authorizationType: prop.apiGateway.secure ? aws_apigateway_1.AuthorizationType.CUSTOM : undefined,
|
|
34
|
+
});
|
|
30
35
|
}
|
|
31
36
|
}
|
|
37
|
+
static createQueryStringObject(queryStrings) {
|
|
38
|
+
if (!queryStrings || queryStrings.length === 0) {
|
|
39
|
+
return {};
|
|
40
|
+
}
|
|
41
|
+
const obj = {};
|
|
42
|
+
queryStrings.forEach((qs) => {
|
|
43
|
+
obj[`method.request.querystring.${qs}`] = true;
|
|
44
|
+
});
|
|
45
|
+
return obj;
|
|
46
|
+
}
|
|
32
47
|
}
|
|
33
48
|
Routes.Resources = [];
|
|
34
49
|
Routes.routeMap = new Map();
|
|
35
50
|
exports.Routes = Routes;
|
|
36
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
51
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlUm91dGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3Jlc291cmNlcy9oZWxwZXJzL2NyZWF0ZVJvdXRlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwrREFBdUg7QUFLdkgsTUFBYSxNQUFNO0lBS1IsTUFBTSxDQUFDLGNBQWMsQ0FDeEIsSUFBbUIsRUFDbkIsR0FBYSxFQUNiLFVBQTBCLEVBQzFCLFVBQTRCO1FBRTVCLE1BQU0sUUFBUSxHQUEwQixJQUFJLEdBQUcsRUFBRSxDQUFDO1FBRWxELElBQUksZUFBZSxHQUFHLEVBQUUsQ0FBQztRQUN6QixJQUFJLGNBQWMsR0FBeUIsU0FBUyxDQUFDO1FBRXJELHlEQUF5RDtRQUN6RCxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsS0FBSyxFQUFFO1lBRXhCLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFOUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLEVBQUU7Z0JBQ25DLDBEQUEwRDtnQkFDMUQsNkVBQTZFO2dCQUM3RSxlQUFlLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDaEYsY0FBYyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGVBQWUsQ0FBQyxDQUFDO2dCQUMvRixNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxlQUFlLEVBQUUsY0FBYyxDQUFDLENBQUM7YUFDeEQ7WUFHRCx1RUFBdUU7WUFDdkUsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUV4RSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDMUMsZUFBZSxHQUFHLEdBQUcsZUFBZSxJQUFJLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUMxRCxJQUFJLGlCQUFpQixHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxJQUFJLGNBQWMsRUFBRSxXQUFXLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3RKLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLGVBQWUsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO2dCQUN4RCxjQUFjLEdBQUcsaUJBQWlCLENBQUM7YUFDdEM7WUFFRCx3REFBd0Q7WUFDeEQsY0FBZSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sSUFBSSxLQUFLLEVBQ3JELElBQUksa0NBQWlCLENBQUMsVUFBVSxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksR0FBRyxDQUFDLEVBQ25EO2dCQUNJLGlCQUFpQixFQUFFLE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQztnQkFDL0UsY0FBYyxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLO2dCQUM5RCxVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsU0FBUztnQkFDM0QsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLGtDQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUzthQUNuRixDQUFDLENBQUM7U0FDVjtJQUNMLENBQUM7SUFFTSxNQUFNLENBQUMsdUJBQXVCLENBQUMsWUFBa0M7UUFFcEUsSUFBSSxDQUFDLFlBQVksSUFBSSxZQUFZLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUM1QyxPQUFPLEVBQUUsQ0FBQztTQUNiO1FBRUQsTUFBTSxHQUFHLEdBQStCLEVBQUUsQ0FBQztRQUUzQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBVSxFQUFFLEVBQUU7WUFDaEMsR0FBRyxDQUFDLDhCQUE4QixFQUFFLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQztRQUNqRCxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sR0FBRyxDQUFDO0lBQ2pCLENBQUM7O0FBL0RhLGdCQUFTLEdBQWUsRUFBRSxDQUFDO0FBQzFCLGVBQVEsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO0FBSDNCLHdCQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXV0aG9yaXphdGlvblR5cGUsIElSZXN0QXBpLCBMYW1iZGFJbnRlZ3JhdGlvbiwgUmVzb3VyY2UsIFRva2VuQXV0aG9yaXplciB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtYXBpZ2F0ZXdheVwiO1xuaW1wb3J0IHsgTm9kZWpzRnVuY3Rpb24gfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxhbWJkYS1ub2RlanNcIjtcbmltcG9ydCB7IFRzZ0xhbWJkYVByb3AgfSBmcm9tIFwiLi4vLi4vY29uZmlnL3R5cGVzXCI7XG5cblxuZXhwb3J0IGNsYXNzIFJvdXRlcyB7XG5cbiAgICBwdWJsaWMgc3RhdGljIFJlc291cmNlczogUmVzb3VyY2VbXSA9IFtdO1xuICAgIHByaXZhdGUgc3RhdGljIHJvdXRlTWFwID0gbmV3IE1hcCgpO1xuXG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGVSZXNvdXJjZShcbiAgICAgICAgcHJvcDogVHNnTGFtYmRhUHJvcCxcbiAgICAgICAgYXBpOiBJUmVzdEFwaSxcbiAgICAgICAgbGFtYmRhTm9kZTogTm9kZWpzRnVuY3Rpb24sXG4gICAgICAgIGF1dGhvcml6ZXI/OiBUb2tlbkF1dGhvcml6ZXIpIHtcblxuICAgICAgICBjb25zdCByb3V0ZU1hcDogTWFwPHN0cmluZywgUmVzb3VyY2U+ID0gbmV3IE1hcCgpO1xuXG4gICAgICAgIGxldCBhY3RpdmVSb3V0ZVBhdGggPSBcIlwiO1xuICAgICAgICBsZXQgYWN0aXZlUmVzb3VyY2U6IFJlc291cmNlIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gICAgICAgIC8vICBPbmx5IGF0dGFjaCBsYW1iZGEgdG8gYW4gQXBpIEdhdGV3YXkgaWYgYSByb3V0ZSBleGlzdFxuICAgICAgICBpZiAocHJvcC5hcGlHYXRld2F5Py5yb3V0ZSkge1xuXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnUk91dGU6ICcsIHByb3AuYXBpR2F0ZXdheS5yb3V0ZSk7XG5cbiAgICAgICAgICAgIGlmICghcHJvcC5hcGlHYXRld2F5LnVzZVJvdXRlT3ZlcnJpZGUpIHtcbiAgICAgICAgICAgICAgICAvLyAgRmlyc3Qgd2UgY3JlYXRlIHRoZSByb290IHJlc291cmNlIGlmIGl0IGRvZXNuJ3QgZXhpc3QuXG4gICAgICAgICAgICAgICAgLy8gIE5vdGU6ICB0aGlzIG5vdyB1c2VzIHRoZSBidW5kbGUgdmVyc2lvbiBhcyB0aGUgZmlyc3Qgc2VnbWVudCBpbiB0aGUgcGF0aC5cbiAgICAgICAgICAgICAgICBhY3RpdmVSb3V0ZVBhdGggPSBgdiR7KHByb3AuYXBpR2F0ZXdheS52ZXJzaW9uKSA/IHByb3AuYXBpR2F0ZXdheS52ZXJzaW9uIDogMX1gO1xuICAgICAgICAgICAgICAgIGFjdGl2ZVJlc291cmNlID0gUm91dGVzLnJvdXRlTWFwLmdldChhY3RpdmVSb3V0ZVBhdGgpIHx8IGFwaS5yb290LmFkZFJlc291cmNlKGFjdGl2ZVJvdXRlUGF0aCk7XG4gICAgICAgICAgICAgICAgUm91dGVzLnJvdXRlTWFwLnNldChhY3RpdmVSb3V0ZVBhdGgsIGFjdGl2ZVJlc291cmNlKTtcbiAgICAgICAgICAgIH1cblxuXG4gICAgICAgICAgICAvLyAgTm93IHdlIGdvIHRocm91Z2ggb3VyIHJvdXRlIHNlZ21lbnRzIGNyZWF0aW5nIHRoZSByZXN0IG9mIHRoZSBwYXRoLlxuICAgICAgICAgICAgY29uc3QgcGF0aFNlZ21lbnRzID0gcHJvcC5hcGlHYXRld2F5Py5yb3V0ZS5zcGxpdChcIi9cIikuZmlsdGVyKHggPT4gKHgpKTtcblxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXRoU2VnbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBhY3RpdmVSb3V0ZVBhdGggPSBgJHthY3RpdmVSb3V0ZVBhdGh9LyR7cGF0aFNlZ21lbnRzW2ldfWA7XG4gICAgICAgICAgICAgICAgbGV0IHNlY29uZGFyeVJlc291cmNlID0gUm91dGVzLnJvdXRlTWFwLmdldChhY3RpdmVSb3V0ZVBhdGgpIHx8IGFjdGl2ZVJlc291cmNlPy5hZGRSZXNvdXJjZShwYXRoU2VnbWVudHNbaV0pIHx8IGFwaS5yb290LmFkZFJlc291cmNlKHBhdGhTZWdtZW50c1tpXSk7XG4gICAgICAgICAgICAgICAgUm91dGVzLnJvdXRlTWFwLnNldChhY3RpdmVSb3V0ZVBhdGgsIHNlY29uZGFyeVJlc291cmNlKTtcbiAgICAgICAgICAgICAgICBhY3RpdmVSZXNvdXJjZSA9IHNlY29uZGFyeVJlc291cmNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyAgRmluYWxseSwgd2UgYXR0YWNoIG91ciBmdW5jdGlvbiB0byB0aGUgbGFzdCByZXNvdXJjZVxuICAgICAgICAgICAgYWN0aXZlUmVzb3VyY2UhLmFkZE1ldGhvZChwcm9wLmFwaUdhdGV3YXkubWV0aG9kIHx8ICdHRVQnLFxuICAgICAgICAgICAgICAgIG5ldyBMYW1iZGFJbnRlZ3JhdGlvbihsYW1iZGFOb2RlLCB7IHByb3h5OiB0cnVlLCB9KSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RQYXJhbWV0ZXJzOiBSb3V0ZXMuY3JlYXRlUXVlcnlTdHJpbmdPYmplY3QocHJvcC5hcGlHYXRld2F5LnF1ZXJ5U3RyaW5ncyksXG4gICAgICAgICAgICAgICAgICAgIGFwaUtleVJlcXVpcmVkOiAocHJvcC5hcGlHYXRld2F5LnJlcXVpcmVBcGlLZXkpID8gdHJ1ZSA6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBhdXRob3JpemVyOiBwcm9wLmFwaUdhdGV3YXkuc2VjdXJlID8gYXV0aG9yaXplciA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgYXV0aG9yaXphdGlvblR5cGU6IHByb3AuYXBpR2F0ZXdheS5zZWN1cmUgPyBBdXRob3JpemF0aW9uVHlwZS5DVVNUT00gOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZVF1ZXJ5U3RyaW5nT2JqZWN0KHF1ZXJ5U3RyaW5nczogc3RyaW5nW10gfCB1bmRlZmluZWQpOiB7IFtrZXk6IHN0cmluZ106IGJvb2xlYW4gfSAge1xuXG4gICAgICAgIGlmICghcXVlcnlTdHJpbmdzIHx8IHF1ZXJ5U3RyaW5ncy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG9iajogeyBba2V5OiBzdHJpbmddOiBib29sZWFuIH0gPSB7fTtcblxuICAgICAgICBxdWVyeVN0cmluZ3MuZm9yRWFjaCgocXM6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgb2JqW2BtZXRob2QucmVxdWVzdC5xdWVyeXN0cmluZy4ke3FzfWBdID0gdHJ1ZTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHJldHVybiBvYmo7ICAgXG4gICAgfVxuXG59Il19
|
package/package.json
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { IRestApi, LambdaIntegration, Resource, TokenAuthorizer } from "aws-cdk-lib/aws-apigateway";
|
|
1
|
+
import { AuthorizationType, IRestApi, LambdaIntegration, Resource, TokenAuthorizer } from "aws-cdk-lib/aws-apigateway";
|
|
2
2
|
import { NodejsFunction } from "aws-cdk-lib/aws-lambda-nodejs";
|
|
3
3
|
import { TsgLambdaProp } from "../../config/types";
|
|
4
4
|
|
|
@@ -21,18 +21,18 @@ export class Routes {
|
|
|
21
21
|
|
|
22
22
|
// Only attach lambda to an Api Gateway if a route exist
|
|
23
23
|
if (prop.apiGateway?.route) {
|
|
24
|
-
|
|
24
|
+
|
|
25
25
|
console.log('ROute: ', prop.apiGateway.route);
|
|
26
26
|
|
|
27
|
-
if (!prop.apiGateway.useRouteOverride)
|
|
28
|
-
|
|
27
|
+
if (!prop.apiGateway.useRouteOverride) {
|
|
28
|
+
// First we create the root resource if it doesn't exist.
|
|
29
29
|
// Note: this now uses the bundle version as the first segment in the path.
|
|
30
|
-
activeRoutePath =
|
|
30
|
+
activeRoutePath = `v${(prop.apiGateway.version) ? prop.apiGateway.version : 1}`;
|
|
31
31
|
activeResource = Routes.routeMap.get(activeRoutePath) || api.root.addResource(activeRoutePath);
|
|
32
32
|
Routes.routeMap.set(activeRoutePath, activeResource);
|
|
33
33
|
}
|
|
34
|
-
|
|
35
|
-
|
|
34
|
+
|
|
35
|
+
|
|
36
36
|
// Now we go through our route segments creating the rest of the path.
|
|
37
37
|
const pathSegments = prop.apiGateway?.route.split("/").filter(x => (x));
|
|
38
38
|
|
|
@@ -46,8 +46,28 @@ export class Routes {
|
|
|
46
46
|
// Finally, we attach our function to the last resource
|
|
47
47
|
activeResource!.addMethod(prop.apiGateway.method || 'GET',
|
|
48
48
|
new LambdaIntegration(lambdaNode, { proxy: true, }),
|
|
49
|
-
|
|
49
|
+
{
|
|
50
|
+
requestParameters: Routes.createQueryStringObject(prop.apiGateway.queryStrings),
|
|
51
|
+
apiKeyRequired: (prop.apiGateway.requireApiKey) ? true : false,
|
|
52
|
+
authorizer: prop.apiGateway.secure ? authorizer : undefined,
|
|
53
|
+
authorizationType: prop.apiGateway.secure ? AuthorizationType.CUSTOM : undefined,
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
public static createQueryStringObject(queryStrings: string[] | undefined): { [key: string]: boolean } {
|
|
59
|
+
|
|
60
|
+
if (!queryStrings || queryStrings.length === 0) {
|
|
61
|
+
return {};
|
|
50
62
|
}
|
|
63
|
+
|
|
64
|
+
const obj: { [key: string]: boolean } = {};
|
|
65
|
+
|
|
66
|
+
queryStrings.forEach((qs: string) => {
|
|
67
|
+
obj[`method.request.querystring.${qs}`] = true;
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
return obj;
|
|
51
71
|
}
|
|
52
72
|
|
|
53
73
|
}
|