@spytecgps/lambda-utils 0.9.2 → 0.9.4
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/errors/BadRequestError.js +25 -0
- package/dist/errors/NotFoundError.js +26 -0
- package/dist/errors/UnauthorizedError.js +26 -0
- package/dist/errors/index.js +9 -0
- package/dist/index.js +16 -2
- package/dist/types.js +2 -0
- package/dist/validation/custom.js +37 -0
- package/dist/validation/index.js +17 -0
- package/dist/validation/requestContext.js +35 -0
- package/dist/validation/validateEvent.js +24 -0
- package/dist/wrappers/apiGatewayEventWrapper.js +70 -0
- package/dist/wrappers/index.js +16 -0
- package/dist/wrappers/response.js +35 -0
- package/package.json +2 -4
- package/dist/apiGwWrapper.d.ts +0 -4
- package/dist/index.js.map +0 -1
- package/dist/response.d.ts +0 -8
- package/dist/wrapper.d.ts +0 -4
- package/dist/wrappers/apiGwWrapper.d.ts +0 -4
package/dist/types.js
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.urlEncoded = exports.json = void 0;
|
|
4
|
+
var Joi = require("joi");
|
|
5
|
+
var qs = require("qs");
|
|
6
|
+
exports.json = Joi.extend(function (joi) {
|
|
7
|
+
return {
|
|
8
|
+
type: 'object',
|
|
9
|
+
base: joi.object(),
|
|
10
|
+
messages: {
|
|
11
|
+
'json.valid': 'must be valid JSON',
|
|
12
|
+
},
|
|
13
|
+
coerce: function (value) {
|
|
14
|
+
try {
|
|
15
|
+
return { value: JSON.parse(value) };
|
|
16
|
+
}
|
|
17
|
+
catch (err) {
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
validate: function (value, helpers) {
|
|
22
|
+
if (!value) {
|
|
23
|
+
return { value: value, errors: helpers.error('json.valid') };
|
|
24
|
+
}
|
|
25
|
+
return { value: value };
|
|
26
|
+
},
|
|
27
|
+
};
|
|
28
|
+
});
|
|
29
|
+
exports.urlEncoded = Joi.extend(function (joi) {
|
|
30
|
+
return {
|
|
31
|
+
type: 'object',
|
|
32
|
+
base: joi.object(),
|
|
33
|
+
coerce: function (value) {
|
|
34
|
+
return { value: qs.parse(value) };
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
});
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
5
|
+
}) : (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
o[k2] = m[k];
|
|
8
|
+
}));
|
|
9
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
10
|
+
for (var p in m) if (p !== "default" && !exports.hasOwnProperty(p)) __createBinding(exports, m, p);
|
|
11
|
+
};
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.validateEvent = void 0;
|
|
14
|
+
var validateEvent_1 = require("./validateEvent");
|
|
15
|
+
exports.validateEvent = validateEvent_1.default;
|
|
16
|
+
__exportStar(require("./custom"), exports);
|
|
17
|
+
__exportStar(require("./requestContext"), exports);
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getRequestContextValidator = exports.requestContextValidator = exports.getAuthorizerValidator = void 0;
|
|
4
|
+
var Joi = require("joi");
|
|
5
|
+
var errors_1 = require("../errors");
|
|
6
|
+
var custom_1 = require("./custom");
|
|
7
|
+
exports.getAuthorizerValidator = function (_a) {
|
|
8
|
+
var _b = _a === void 0 ? {} : _a, scope = _b.scope, type = _b.type;
|
|
9
|
+
return Joi.object({
|
|
10
|
+
clientId: Joi.number(),
|
|
11
|
+
resources: custom_1.json.object({}),
|
|
12
|
+
scope: scope
|
|
13
|
+
? Joi.string()
|
|
14
|
+
.pattern(new RegExp("" + scope))
|
|
15
|
+
.error(function () { return new errors_1.UnauthorizedError("missing scope " + scope); })
|
|
16
|
+
: Joi.optional(),
|
|
17
|
+
type: type
|
|
18
|
+
? Joi.any()
|
|
19
|
+
.valid(type)
|
|
20
|
+
.error(function () { return new errors_1.UnauthorizedError("missing user type " + type); })
|
|
21
|
+
: Joi.optional(),
|
|
22
|
+
});
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* @deprecated
|
|
26
|
+
*/
|
|
27
|
+
exports.requestContextValidator = Joi.object({
|
|
28
|
+
authorizer: exports.getAuthorizerValidator(),
|
|
29
|
+
});
|
|
30
|
+
exports.getRequestContextValidator = function (params) {
|
|
31
|
+
if (params === void 0) { params = {}; }
|
|
32
|
+
return Joi.object({
|
|
33
|
+
authorizer: exports.getAuthorizerValidator(params),
|
|
34
|
+
});
|
|
35
|
+
};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
var errors_1 = require("../errors");
|
|
4
|
+
var validateEvent = function (event, schema, validateOptions) {
|
|
5
|
+
if (!schema) {
|
|
6
|
+
console.warn("skipping validation");
|
|
7
|
+
return event;
|
|
8
|
+
}
|
|
9
|
+
var _a = schema.validate(event, {
|
|
10
|
+
allowUnknown: (validateOptions === null || validateOptions === void 0 ? void 0 : validateOptions.allowUnknown) || true,
|
|
11
|
+
errors: {
|
|
12
|
+
label: 'key',
|
|
13
|
+
wrap: {
|
|
14
|
+
label: false,
|
|
15
|
+
},
|
|
16
|
+
},
|
|
17
|
+
}), error = _a.error, value = _a.value;
|
|
18
|
+
if (error) {
|
|
19
|
+
console.error(error);
|
|
20
|
+
throw error.isJoi ? new errors_1.BadRequestError(error.message) : error;
|
|
21
|
+
}
|
|
22
|
+
return value;
|
|
23
|
+
};
|
|
24
|
+
exports.default = validateEvent;
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
12
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
13
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
14
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
15
|
+
function step(op) {
|
|
16
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
17
|
+
while (_) try {
|
|
18
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
19
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
20
|
+
switch (op[0]) {
|
|
21
|
+
case 0: case 1: t = op; break;
|
|
22
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
23
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
24
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
25
|
+
default:
|
|
26
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
27
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
28
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
29
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
30
|
+
if (t[2]) _.ops.pop();
|
|
31
|
+
_.trys.pop(); continue;
|
|
32
|
+
}
|
|
33
|
+
op = body.call(thisArg, _);
|
|
34
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
35
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
var validation_1 = require("../validation");
|
|
40
|
+
var response_1 = require("./response");
|
|
41
|
+
var apiGatewayEventWrapper = function (_a) {
|
|
42
|
+
var event = _a.event, schema = _a.schema, handler = _a.handler;
|
|
43
|
+
return __awaiter(void 0, void 0, void 0, function () {
|
|
44
|
+
var validatedEvent, result, err_1;
|
|
45
|
+
return __generator(this, function (_b) {
|
|
46
|
+
switch (_b.label) {
|
|
47
|
+
case 0:
|
|
48
|
+
console.log("apiGwWrapper - got event", event);
|
|
49
|
+
_b.label = 1;
|
|
50
|
+
case 1:
|
|
51
|
+
_b.trys.push([1, 3, , 4]);
|
|
52
|
+
validatedEvent = validation_1.validateEvent(event, schema);
|
|
53
|
+
return [4 /*yield*/, handler(validatedEvent)];
|
|
54
|
+
case 2:
|
|
55
|
+
result = _b.sent();
|
|
56
|
+
console.log("apiGwWrapper - finished", result);
|
|
57
|
+
return [2 /*return*/, response_1.buildProxyResult(result)];
|
|
58
|
+
case 3:
|
|
59
|
+
err_1 = _b.sent();
|
|
60
|
+
console.error("apiGwWrapper - caught error", err_1);
|
|
61
|
+
return [2 /*return*/, response_1.buildProxyResult({
|
|
62
|
+
statusCode: err_1.code || 500,
|
|
63
|
+
message: err_1.message || 'Error',
|
|
64
|
+
})];
|
|
65
|
+
case 4: return [2 /*return*/];
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
};
|
|
70
|
+
exports.default = apiGatewayEventWrapper;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
5
|
+
}) : (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
o[k2] = m[k];
|
|
8
|
+
}));
|
|
9
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
10
|
+
for (var p in m) if (p !== "default" && !exports.hasOwnProperty(p)) __createBinding(exports, m, p);
|
|
11
|
+
};
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.apiGatewayEventWrapper = void 0;
|
|
14
|
+
var apiGatewayEventWrapper_1 = require("./apiGatewayEventWrapper");
|
|
15
|
+
exports.apiGatewayEventWrapper = apiGatewayEventWrapper_1.default;
|
|
16
|
+
__exportStar(require("./response"), exports);
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __assign = (this && this.__assign) || function () {
|
|
3
|
+
__assign = Object.assign || function(t) {
|
|
4
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
5
|
+
s = arguments[i];
|
|
6
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
7
|
+
t[p] = s[p];
|
|
8
|
+
}
|
|
9
|
+
return t;
|
|
10
|
+
};
|
|
11
|
+
return __assign.apply(this, arguments);
|
|
12
|
+
};
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.buildProxyResult = exports.buildResponseBody = void 0;
|
|
15
|
+
var baseHeaders = {
|
|
16
|
+
'Content-Type': 'application/json',
|
|
17
|
+
'Access-Control-Allow-Origin': '*',
|
|
18
|
+
'Access-Control-Allow-Credentials': true,
|
|
19
|
+
};
|
|
20
|
+
exports.buildResponseBody = function (statusCode, message, data) {
|
|
21
|
+
return {
|
|
22
|
+
success: statusCode < 400,
|
|
23
|
+
message: message,
|
|
24
|
+
result: data ? data : undefined,
|
|
25
|
+
};
|
|
26
|
+
};
|
|
27
|
+
exports.buildProxyResult = function (_a) {
|
|
28
|
+
var _b = _a.statusCode, statusCode = _b === void 0 ? 200 : _b, _c = _a.message, message = _c === void 0 ? 'ok' : _c, data = _a.data, _d = _a.headers, headers = _d === void 0 ? {} : _d;
|
|
29
|
+
var resp = exports.buildResponseBody(statusCode, message, data);
|
|
30
|
+
return {
|
|
31
|
+
headers: __assign(__assign({}, baseHeaders), headers),
|
|
32
|
+
statusCode: statusCode,
|
|
33
|
+
body: resp && JSON.stringify(resp),
|
|
34
|
+
};
|
|
35
|
+
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@spytecgps/lambda-utils",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.4",
|
|
4
4
|
"description": "Lambda Utils",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -8,10 +8,8 @@
|
|
|
8
8
|
"version": "npm run format && git add -A src",
|
|
9
9
|
"preversion": "npm test",
|
|
10
10
|
"postversion": "git push && git push --tags",
|
|
11
|
-
"prepublishOnly": "npm test && npm run lint",
|
|
12
11
|
"prepare": "npm run build",
|
|
13
|
-
"build
|
|
14
|
-
"build": "webpack --mode=production",
|
|
12
|
+
"build": "tsc",
|
|
15
13
|
"test": "jest",
|
|
16
14
|
"format": "prettier --write \"src/**/*.ts\" \"src/**/*.js\"",
|
|
17
15
|
"lint": "eslint . --ext .ts --fix && eslint . --ext .ts",
|
package/dist/apiGwWrapper.d.ts
DELETED