@whook/gcp-functions 8.3.0
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/LICENSE +20 -0
- package/README.md +187 -0
- package/dist/commands/testHTTPFunction.d.ts +12 -0
- package/dist/commands/testHTTPFunction.js +156 -0
- package/dist/commands/testHTTPFunction.js.map +1 -0
- package/dist/commands/testHTTPFunction.mjs +136 -0
- package/dist/commands/testHTTPFunction.mjs.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.js +299 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +265 -0
- package/dist/index.mjs.map +1 -0
- package/dist/libs/utils.d.ts +5 -0
- package/dist/libs/utils.js +39 -0
- package/dist/libs/utils.js.map +1 -0
- package/dist/libs/utils.mjs +27 -0
- package/dist/libs/utils.mjs.map +1 -0
- package/dist/services/_autoload.d.ts +17 -0
- package/dist/services/_autoload.js +121 -0
- package/dist/services/_autoload.js.map +1 -0
- package/dist/services/_autoload.mjs +107 -0
- package/dist/services/_autoload.mjs.map +1 -0
- package/dist/services/log.d.ts +2 -0
- package/dist/services/log.js +14 -0
- package/dist/services/log.js.map +1 -0
- package/dist/services/log.mjs +4 -0
- package/dist/services/log.mjs.map +1 -0
- package/dist/services/log.test.d.ts +1 -0
- package/dist/services/log.test.js +12 -0
- package/dist/services/log.test.js.map +1 -0
- package/dist/services/log.test.mjs +7 -0
- package/dist/services/log.test.mjs.map +1 -0
- package/dist/wrappers/googleHTTPFunction.d.ts +22 -0
- package/dist/wrappers/googleHTTPFunction.js +310 -0
- package/dist/wrappers/googleHTTPFunction.js.map +1 -0
- package/dist/wrappers/googleHTTPFunction.mjs +289 -0
- package/dist/wrappers/googleHTTPFunction.mjs.map +1 -0
- package/package.json +215 -0
- package/src/commands/testHTTPFunction.ts +181 -0
- package/src/index.ts +443 -0
- package/src/libs/utils.ts +43 -0
- package/src/services/_autoload.ts +161 -0
- package/src/services/log.test.ts +7 -0
- package/src/services/log.ts +4 -0
- package/src/wrappers/googleHTTPFunction.ts +468 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/wrappers/googleHTTPFunction.ts"],"names":["DEFAULT_DEBUG_NODE_ENVS","DEFAULT_BUFFER_LIMIT","DEFAULT_PARSERS","DEFAULT_STRINGIFYERS","DEFAULT_DECODERS","DEFAULT_ENCODERS","extractOperationSecurityParameters","castParameters","reuseSpecialProps","alsoInject","Ajv","addAJVFormats","bytes","HTTPError","prepareParametersValidators","prepareBodyValidator","applyValidators","filterHeaders","extractBodySpec","extractResponseSpec","checkResponseCharset","checkResponseMediaType","executeHandler","extractProduceableMediaTypes","extractConsumableMediaTypes","getBody","sendBody","noop","compose","identity","lowerCaseHeaders","stream","SEARCH_SEPARATOR","PATH_SEPARATOR","wrapHandlerForAWSHTTPFunction","initHandler","initHandlerForAWSHTTPFunction","bind","OPERATION_API","WRAPPERS","NODE_ENV","DEBUG_NODE_ENVS","DECODERS","ENCODERS","log","time","Date","now","services","path","Object","keys","paths","method","OPERATION","consumableCharsets","produceableCharsets","consumableMediaTypes","produceableMediaTypes","ajv","verbose","includes","strict","logger","args","warn","error","useDefaults","coerceTypes","ammendedParameters","validators","operationId","parameters","concat","bodyValidator","applyWrappers","handler","handleForAWSHTTPFunction","PARSERS","STRINGIFYERS","BUFFER_LIMIT","QUERY_PARSER","CORS","obfuscator","req","res","debugging","bufferLimit","parse","JSON","stringify","url","originalUrl","body","headers","obfuscateSensibleHeaders","request","gcpfReqToRequest","response","responseLog","responseSpec","undefined","operation","bodySpec","split","parts","filter","search","substr","length","pathParameters","map","part","index","matches","exec","name","value","reduce","accParameters","retroCompatibleQueryParameters","p","in","schema","authorization","contentType","err","cast","contentTypes","responseObject","responses","status","responseSchema","content","responseHasSchema","type","format","castedError","code","statusCode","httpCode","params","stack","obfuscateEventBody","pipeResponseInGCPFResponse","toLowerCase","rawBody","toString","bodyStream","PassThrough","write","end","forEach","headerName","set","pipe","jsonBody","obfuscateSensibleProps"],"mappings":"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","sourcesContent":["import {\n DEFAULT_DEBUG_NODE_ENVS,\n DEFAULT_BUFFER_LIMIT,\n DEFAULT_PARSERS,\n DEFAULT_STRINGIFYERS,\n DEFAULT_DECODERS,\n DEFAULT_ENCODERS,\n extractOperationSecurityParameters,\n castParameters,\n} from '@whook/http-router';\nimport { reuseSpecialProps, alsoInject } from 'knifecycle';\nimport Ajv from 'ajv';\nimport addAJVFormats from 'ajv-formats';\nimport bytes from 'bytes';\nimport HTTPError from 'yhttperror';\nimport {\n prepareParametersValidators,\n prepareBodyValidator,\n applyValidators,\n filterHeaders,\n extractBodySpec,\n extractResponseSpec,\n checkResponseCharset,\n checkResponseMediaType,\n executeHandler,\n extractProduceableMediaTypes,\n extractConsumableMediaTypes,\n getBody,\n sendBody,\n} from '@whook/http-router';\nimport { noop, compose, identity } from '@whook/whook';\nimport { lowerCaseHeaders } from '@whook/cors';\nimport stream from 'stream';\nimport type { WhookQueryStringParser } from '@whook/http-router';\nimport type { ServiceInitializer, Dependencies, Service } from 'knifecycle';\nimport type {\n WhookRequest,\n WhookResponse,\n WhookHandler,\n ObfuscatorService,\n WhookOperation,\n WhookWrapper,\n} from '@whook/whook';\nimport type { TimeService, LogService } from 'common-services';\nimport type { OpenAPIV3 } from 'openapi-types';\nimport type { Readable } from 'stream';\nimport type { CORSConfig } from '@whook/cors';\n\ntype HTTPWrapperDependencies = {\n NODE_ENV: string;\n DEBUG_NODE_ENVS?: string[];\n OPERATION: WhookOperation;\n DECODERS?: typeof DEFAULT_DECODERS;\n ENCODERS?: typeof DEFAULT_ENCODERS;\n PARSERS?: typeof DEFAULT_PARSERS;\n STRINGIFYERS?: typeof DEFAULT_STRINGIFYERS;\n QUERY_PARSER: WhookQueryStringParser;\n BUFFER_LIMIT?: string;\n obfuscator: ObfuscatorService;\n time?: TimeService;\n log?: LogService;\n WRAPPERS: WhookWrapper<Dependencies, Service>[];\n};\n\nconst SEARCH_SEPARATOR = '?';\nconst PATH_SEPARATOR = '/';\n\nexport default function wrapHandlerForAWSHTTPFunction<\n D,\n S extends WhookHandler,\n>(\n initHandler: ServiceInitializer<D, S>,\n): ServiceInitializer<D & HTTPWrapperDependencies, S> {\n return alsoInject<HTTPWrapperDependencies, D, S>(\n [\n 'OPERATION_API',\n 'WRAPPERS',\n '?DEBUG_NODE_ENVS',\n 'NODE_ENV',\n '?DECODERS',\n '?ENCODERS',\n '?PARSERS',\n '?STRINGIFYERS',\n '?BUFFER_LIMIT',\n 'QUERY_PARSER',\n 'obfuscator',\n '?log',\n '?time',\n ],\n reuseSpecialProps(\n initHandler,\n initHandlerForAWSHTTPFunction.bind(\n null,\n initHandler,\n ) as ServiceInitializer<D, S>,\n ),\n );\n}\n\nasync function initHandlerForAWSHTTPFunction(\n initHandler: ServiceInitializer<unknown, WhookHandler>,\n {\n OPERATION_API,\n WRAPPERS,\n NODE_ENV,\n DEBUG_NODE_ENVS = DEFAULT_DEBUG_NODE_ENVS,\n DECODERS = DEFAULT_DECODERS,\n ENCODERS = DEFAULT_ENCODERS,\n log = noop,\n time = Date.now.bind(Date),\n ...services\n },\n) {\n const path = Object.keys(OPERATION_API.paths)[0];\n const method = Object.keys(OPERATION_API.paths[path])[0];\n const OPERATION: WhookOperation = {\n path,\n method,\n ...OPERATION_API.paths[path][method],\n };\n const consumableCharsets = Object.keys(DECODERS);\n const produceableCharsets = Object.keys(ENCODERS);\n const consumableMediaTypes = extractConsumableMediaTypes(OPERATION);\n const produceableMediaTypes = extractProduceableMediaTypes(OPERATION);\n const ajv = new Ajv({\n verbose: DEBUG_NODE_ENVS.includes(NODE_ENV),\n strict: true,\n logger: {\n log: (...args) => log('debug', ...args),\n warn: (...args) => log('warning', ...args),\n error: (...args) => log('error', ...args),\n },\n useDefaults: true,\n coerceTypes: true,\n });\n addAJVFormats(ajv);\n const ammendedParameters = extractOperationSecurityParameters(\n OPERATION_API,\n OPERATION,\n );\n const validators = prepareParametersValidators(\n ajv,\n OPERATION.operationId,\n ((OPERATION.parameters || []) as OpenAPIV3.ParameterObject[]).concat(\n ammendedParameters,\n ),\n );\n const bodyValidator = prepareBodyValidator(ajv, OPERATION);\n const applyWrappers = compose(...WRAPPERS) as WhookWrapper<\n Dependencies,\n Service\n >;\n\n const handler = await (\n applyWrappers(initHandler) as ServiceInitializer<Dependencies, Service>\n )({\n OPERATION,\n DEBUG_NODE_ENVS,\n NODE_ENV,\n ...services,\n time,\n log,\n });\n\n return handleForAWSHTTPFunction.bind(\n null,\n {\n OPERATION,\n NODE_ENV,\n DEBUG_NODE_ENVS,\n DECODERS,\n ENCODERS,\n log,\n time,\n ...services,\n },\n {\n consumableMediaTypes,\n produceableMediaTypes,\n consumableCharsets,\n produceableCharsets,\n validators,\n bodyValidator,\n ammendedParameters,\n },\n handler,\n );\n}\n\nasync function handleForAWSHTTPFunction(\n {\n OPERATION,\n DEBUG_NODE_ENVS,\n NODE_ENV,\n ENCODERS,\n DECODERS,\n PARSERS = DEFAULT_PARSERS,\n STRINGIFYERS = DEFAULT_STRINGIFYERS,\n BUFFER_LIMIT = DEFAULT_BUFFER_LIMIT,\n QUERY_PARSER,\n CORS,\n log,\n obfuscator,\n }: HTTPWrapperDependencies & { CORS: CORSConfig },\n {\n consumableMediaTypes,\n produceableMediaTypes,\n consumableCharsets,\n produceableCharsets,\n validators,\n bodyValidator,\n },\n handler: WhookHandler,\n req,\n res,\n) {\n const debugging = DEBUG_NODE_ENVS.includes(NODE_ENV);\n const bufferLimit = bytes.parse(BUFFER_LIMIT);\n\n log(\n 'info',\n 'GCP_FUNCTIONS_REQUEST',\n JSON.stringify({\n url: req.originalUrl,\n method: req.method,\n body: req.body,\n // body: obfuscateEventBody(obfuscator, req.body),\n headers: obfuscator.obfuscateSensibleHeaders(req.headers),\n }),\n );\n\n const request = await gcpfReqToRequest(req);\n let parameters;\n let response;\n let responseLog;\n let responseSpec;\n\n log(\n 'debug',\n 'REQUEST',\n JSON.stringify({\n ...request,\n body: request.body ? 'Stream' : undefined,\n headers: obfuscator.obfuscateSensibleHeaders(request.headers),\n }),\n );\n\n try {\n const operation = OPERATION;\n const bodySpec = extractBodySpec(\n request,\n consumableMediaTypes,\n consumableCharsets,\n );\n\n responseSpec = extractResponseSpec(\n operation,\n request,\n produceableMediaTypes,\n produceableCharsets,\n );\n\n try {\n const body = await getBody(\n {\n DECODERS,\n PARSERS,\n bufferLimit,\n },\n operation,\n request.body as Readable,\n bodySpec,\n );\n const path = request.url.split(SEARCH_SEPARATOR)[0];\n const parts = path.split(PATH_SEPARATOR).filter(identity);\n const search = request.url.substr(\n request.url.split(SEARCH_SEPARATOR)[0].length,\n );\n\n const pathParameters = OPERATION.path\n .split(PATH_SEPARATOR)\n .filter(identity)\n .map((part, index) => {\n const matches = /^\\{([\\d\\w]+)\\}$/i.exec(part);\n\n if (matches) {\n return {\n name: matches[1],\n value: parts[index],\n };\n }\n })\n .filter(identity)\n .reduce(\n (accParameters, { name, value }) => ({\n ...accParameters,\n [name]: value,\n }),\n {},\n );\n\n // TODO: Update strictQS to handle OpenAPI 3\n const retroCompatibleQueryParameters = (OPERATION.parameters || [])\n .filter((p) => p.in === 'query')\n .map((p) => ({ ...p, ...p.schema }));\n\n parameters = {\n ...pathParameters,\n ...QUERY_PARSER(retroCompatibleQueryParameters as any, search),\n ...filterHeaders(operation.parameters, request.headers),\n };\n\n parameters = {\n // TODO: Use the security of the operation to infer\n // authorization parameters, see:\n // https://github.com/nfroidure/whook/blob/06ccae93d1d52d97ff70fd5e19fa826bdabf3968/packages/whook-http-router/src/validation.js#L110\n authorization: parameters.authorization,\n ...castParameters(operation.parameters || [], parameters),\n };\n\n applyValidators(operation, validators, parameters);\n\n bodyValidator(operation, bodySpec.contentType, body);\n\n parameters = {\n ...parameters,\n ...('undefined' !== typeof body ? { body } : {}),\n };\n } catch (err) {\n throw HTTPError.cast(err, 400);\n }\n\n response = await executeHandler(operation, handler, parameters);\n\n if (response.body) {\n response.headers['content-type'] =\n response.headers['content-type'] || responseSpec.contentTypes[0];\n }\n\n // Check the stringifyer only when a schema is\n // specified and it is not a binary one\n const responseObject =\n operation.responses &&\n (operation.responses[response.status] as OpenAPIV3.ResponseObject);\n const responseSchema =\n responseObject &&\n responseObject.content &&\n responseObject.content[response.headers['content-type']] &&\n (responseObject.content[response.headers['content-type']]\n .schema as OpenAPIV3.SchemaObject);\n const responseHasSchema =\n responseSchema &&\n (responseSchema.type !== 'string' || responseSchema.format !== 'binary');\n\n if (responseHasSchema && !STRINGIFYERS[response.headers['content-type']]) {\n throw new HTTPError(\n 500,\n 'E_STRINGIFYER_LACK',\n response.headers['content-type'],\n );\n }\n if (response.body) {\n checkResponseMediaType(request, responseSpec, produceableMediaTypes);\n checkResponseCharset(request, responseSpec, produceableCharsets);\n }\n responseLog = {\n type: 'success',\n status: response.status,\n };\n log('debug', JSON.stringify(responseLog));\n } catch (err) {\n const castedError = HTTPError.cast(err);\n\n responseLog = {\n type: 'error',\n code: castedError.code,\n statusCode: castedError.httpCode,\n params: castedError.params || [],\n stack: castedError.stack,\n };\n\n log('error', JSON.stringify(responseLog));\n response = {\n status: castedError.httpCode,\n headers: {\n ...lowerCaseHeaders(CORS),\n ...(castedError.headers ?? {}),\n 'content-type': 'application/json',\n },\n body: {\n error: {\n code: castedError.code,\n stack: debugging ? responseLog.stack : undefined,\n params: debugging ? responseLog.params : undefined,\n },\n },\n };\n }\n\n log(\n 'debug',\n 'RESPONSE',\n JSON.stringify({\n ...response,\n body: obfuscateEventBody(obfuscator, response.body),\n headers: obfuscator.obfuscateSensibleHeaders(response.headers),\n }),\n );\n\n await pipeResponseInGCPFResponse(\n await sendBody(\n {\n ENCODERS,\n STRINGIFYERS,\n },\n response,\n ),\n res,\n );\n}\n\nasync function gcpfReqToRequest(req): Promise<WhookRequest> {\n const request: WhookRequest = {\n method: req.method.toLowerCase(),\n headers: lowerCaseHeaders(req.headers || {}),\n url: req.originalUrl,\n };\n\n if (req.rawBody) {\n request.headers['content-length'] = req.rawBody.length.toString();\n const bodyStream = new stream.PassThrough();\n\n request.body = bodyStream;\n bodyStream.write(req.rawBody);\n bodyStream.end();\n }\n\n return request;\n}\n\nasync function pipeResponseInGCPFResponse(\n response: WhookResponse,\n res,\n): Promise<void> {\n Object.keys(response.headers).forEach((headerName) => {\n res.set(headerName, response.headers[headerName]);\n });\n res.status(response.status);\n\n if (response.body) {\n (response.body as Readable).pipe(res);\n return;\n }\n\n res.end();\n}\n\nfunction obfuscateEventBody(obfuscator, rawBody) {\n if (typeof rawBody === 'string') {\n try {\n const jsonBody = JSON.parse(rawBody);\n\n return JSON.stringify(obfuscator.obfuscateSensibleProps(jsonBody));\n // eslint-disable-next-line\n } catch (err) {}\n }\n return rawBody;\n}\n"],"file":"googleHTTPFunction.mjs"}
|
package/package.json
ADDED
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@whook/gcp-functions",
|
|
3
|
+
"version": "8.3.0",
|
|
4
|
+
"description": "Build and deploy to GCP Cloud Functions with Whook.",
|
|
5
|
+
"main": "dist/index",
|
|
6
|
+
"module": "dist/index.mjs",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"metapak": {
|
|
9
|
+
"configs": [
|
|
10
|
+
"main",
|
|
11
|
+
"readme",
|
|
12
|
+
"eslint",
|
|
13
|
+
"babel",
|
|
14
|
+
"jest",
|
|
15
|
+
"jsdocs",
|
|
16
|
+
"typescript"
|
|
17
|
+
],
|
|
18
|
+
"data": {
|
|
19
|
+
"childPackage": true,
|
|
20
|
+
"files": "'src/**/*.ts'",
|
|
21
|
+
"testsFiles": "'src/**/*.test.ts'",
|
|
22
|
+
"distFiles": "'dist/**/*.js'",
|
|
23
|
+
"ignore": [
|
|
24
|
+
"dist",
|
|
25
|
+
"builds",
|
|
26
|
+
".bin",
|
|
27
|
+
".terraform",
|
|
28
|
+
"*.plan",
|
|
29
|
+
"*.tfstate.d",
|
|
30
|
+
".credentials.json"
|
|
31
|
+
],
|
|
32
|
+
"bundleFiles": [
|
|
33
|
+
"dist",
|
|
34
|
+
"src"
|
|
35
|
+
]
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
"author": {
|
|
39
|
+
"name": "Nicolas Froidure",
|
|
40
|
+
"email": "nicolas.froidure@insertafter.com",
|
|
41
|
+
"url": "http://insertafter.com/en/index.html"
|
|
42
|
+
},
|
|
43
|
+
"license": "MIT",
|
|
44
|
+
"repository": {
|
|
45
|
+
"type": "git",
|
|
46
|
+
"url": "git+https://github.com/nfroidure/whook.git"
|
|
47
|
+
},
|
|
48
|
+
"bugs": {
|
|
49
|
+
"url": "https://github.com/nfroidure/whook/issues"
|
|
50
|
+
},
|
|
51
|
+
"homepage": "https://github.com/nfroidure/whook",
|
|
52
|
+
"dependencies": {
|
|
53
|
+
"@types/bytes": "^3.1.0",
|
|
54
|
+
"@whook/cli": "^8.3.0",
|
|
55
|
+
"@whook/cors": "^8.3.0",
|
|
56
|
+
"@whook/http-router": "^8.3.0",
|
|
57
|
+
"@whook/whook": "^8.3.0",
|
|
58
|
+
"ajv": "^8.6.3",
|
|
59
|
+
"ajv-formats": "^2.1.0",
|
|
60
|
+
"camelcase": "^6.2.0",
|
|
61
|
+
"common-services": "^9.0.1",
|
|
62
|
+
"cpr": "3.0.1",
|
|
63
|
+
"knifecycle": "^11.1.1",
|
|
64
|
+
"mkdirp": "^1.0.4",
|
|
65
|
+
"openapi-types": "^9.3.0",
|
|
66
|
+
"qs": "^6.10.1",
|
|
67
|
+
"strict-qs": "^6.1.4",
|
|
68
|
+
"yerror": "^6.0.1"
|
|
69
|
+
},
|
|
70
|
+
"devDependencies": {
|
|
71
|
+
"@babel/cli": "^7.13.14",
|
|
72
|
+
"@babel/core": "^7.13.15",
|
|
73
|
+
"@babel/eslint-parser": "^7.13.14",
|
|
74
|
+
"@babel/plugin-proposal-class-properties": "^7.13.0",
|
|
75
|
+
"@babel/plugin-proposal-object-rest-spread": "^7.13.8",
|
|
76
|
+
"@babel/plugin-syntax-dynamic-import": "^7.8.3",
|
|
77
|
+
"@babel/plugin-syntax-import-meta": "^7.10.4",
|
|
78
|
+
"@babel/preset-env": "^7.13.15",
|
|
79
|
+
"@babel/preset-typescript": "^7.13.0",
|
|
80
|
+
"@babel/register": "^7.13.14",
|
|
81
|
+
"@types/jest": "^26.0.22",
|
|
82
|
+
"@typescript-eslint/eslint-plugin": "^4.21.0",
|
|
83
|
+
"@typescript-eslint/parser": "^4.21.0",
|
|
84
|
+
"babel-plugin-knifecycle": "^5.0.1",
|
|
85
|
+
"eslint": "^7.23.0",
|
|
86
|
+
"eslint-plugin-prettier": "^3.3.1",
|
|
87
|
+
"jest": "^26.6.3",
|
|
88
|
+
"jsdoc-to-markdown": "^7.0.1",
|
|
89
|
+
"metapak": "^4.0.2",
|
|
90
|
+
"metapak-nfroidure": "11.0.7",
|
|
91
|
+
"prettier": "^2.2.1",
|
|
92
|
+
"rimraf": "^3.0.2",
|
|
93
|
+
"typescript": "^4.2.4"
|
|
94
|
+
},
|
|
95
|
+
"contributors": [],
|
|
96
|
+
"engines": {
|
|
97
|
+
"node": ">=12.19.0"
|
|
98
|
+
},
|
|
99
|
+
"files": [
|
|
100
|
+
"dist",
|
|
101
|
+
"src",
|
|
102
|
+
"LICENSE",
|
|
103
|
+
"README.md",
|
|
104
|
+
"CHANGELOG.md"
|
|
105
|
+
],
|
|
106
|
+
"eslintConfig": {
|
|
107
|
+
"extends": [
|
|
108
|
+
"eslint:recommended",
|
|
109
|
+
"plugin:@typescript-eslint/eslint-recommended",
|
|
110
|
+
"plugin:@typescript-eslint/recommended"
|
|
111
|
+
],
|
|
112
|
+
"parserOptions": {
|
|
113
|
+
"ecmaVersion": 2018,
|
|
114
|
+
"sourceType": "module",
|
|
115
|
+
"modules": true
|
|
116
|
+
},
|
|
117
|
+
"env": {
|
|
118
|
+
"es6": true,
|
|
119
|
+
"node": true,
|
|
120
|
+
"jest": true,
|
|
121
|
+
"mocha": true
|
|
122
|
+
},
|
|
123
|
+
"plugins": [
|
|
124
|
+
"prettier"
|
|
125
|
+
],
|
|
126
|
+
"rules": {
|
|
127
|
+
"prettier/prettier": "error"
|
|
128
|
+
},
|
|
129
|
+
"parser": "@typescript-eslint/parser",
|
|
130
|
+
"ignorePatterns": [
|
|
131
|
+
"*.d.ts"
|
|
132
|
+
]
|
|
133
|
+
},
|
|
134
|
+
"prettier": {
|
|
135
|
+
"semi": true,
|
|
136
|
+
"printWidth": 80,
|
|
137
|
+
"singleQuote": true,
|
|
138
|
+
"trailingComma": "all",
|
|
139
|
+
"proseWrap": "always"
|
|
140
|
+
},
|
|
141
|
+
"babel": {
|
|
142
|
+
"presets": [
|
|
143
|
+
"@babel/typescript",
|
|
144
|
+
[
|
|
145
|
+
"@babel/env",
|
|
146
|
+
{
|
|
147
|
+
"targets": {
|
|
148
|
+
"node": "12.19.0"
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
]
|
|
152
|
+
],
|
|
153
|
+
"plugins": [
|
|
154
|
+
"@babel/proposal-class-properties",
|
|
155
|
+
"@babel/plugin-proposal-object-rest-spread",
|
|
156
|
+
"babel-plugin-knifecycle"
|
|
157
|
+
],
|
|
158
|
+
"env": {
|
|
159
|
+
"cjs": {
|
|
160
|
+
"presets": [
|
|
161
|
+
[
|
|
162
|
+
"@babel/env",
|
|
163
|
+
{
|
|
164
|
+
"targets": {
|
|
165
|
+
"node": "10"
|
|
166
|
+
},
|
|
167
|
+
"modules": "commonjs"
|
|
168
|
+
}
|
|
169
|
+
]
|
|
170
|
+
]
|
|
171
|
+
},
|
|
172
|
+
"mjs": {
|
|
173
|
+
"presets": [
|
|
174
|
+
[
|
|
175
|
+
"@babel/env",
|
|
176
|
+
{
|
|
177
|
+
"targets": {
|
|
178
|
+
"node": "12"
|
|
179
|
+
},
|
|
180
|
+
"modules": false
|
|
181
|
+
}
|
|
182
|
+
]
|
|
183
|
+
]
|
|
184
|
+
}
|
|
185
|
+
},
|
|
186
|
+
"sourceMaps": true
|
|
187
|
+
},
|
|
188
|
+
"jest": {
|
|
189
|
+
"coverageReporters": [
|
|
190
|
+
"lcov",
|
|
191
|
+
"html"
|
|
192
|
+
],
|
|
193
|
+
"testPathIgnorePatterns": [
|
|
194
|
+
"/node_modules/"
|
|
195
|
+
],
|
|
196
|
+
"roots": [
|
|
197
|
+
"<rootDir>/src"
|
|
198
|
+
]
|
|
199
|
+
},
|
|
200
|
+
"scripts": {
|
|
201
|
+
"cli": "env NODE_ENV=${NODE_ENV:-cli}",
|
|
202
|
+
"compile": "rimraf -f 'dist' && npm run compile:cjs && npm run compile:mjs",
|
|
203
|
+
"compile:cjs": "babel --env-name=cjs --out-dir=dist --extensions '.ts,.js' --source-maps=true src",
|
|
204
|
+
"compile:mjs": "babel --env-name=mjs --out-file-extension=.mjs --out-dir=dist --extensions '.ts,.js' --source-maps=true src",
|
|
205
|
+
"cover": "npm run jest -- --coverage",
|
|
206
|
+
"doc": "echo \"# API\" > API.md; jsdoc2md 'dist/**/*.js' >> API.md && git add API.md",
|
|
207
|
+
"jest": "NODE_ENV=test jest",
|
|
208
|
+
"lint": "eslint 'src/**/*.ts'",
|
|
209
|
+
"metapak": "metapak",
|
|
210
|
+
"prettier": "prettier --write 'src/**/*.ts'",
|
|
211
|
+
"test": "npm run jest",
|
|
212
|
+
"types": "rimraf -f 'dist/**/*.d.ts' && tsc --project . --declaration --emitDeclarationOnly --outDir dist"
|
|
213
|
+
},
|
|
214
|
+
"gitHead": "0ad8fae92712bb0a8863bc0d53bf232a62d85d82"
|
|
215
|
+
}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import { loadLambda } from '../libs/utils';
|
|
2
|
+
import { extra, autoService } from 'knifecycle';
|
|
3
|
+
import { readArgs } from '@whook/cli';
|
|
4
|
+
import YError from 'yerror';
|
|
5
|
+
import {
|
|
6
|
+
dereferenceOpenAPIOperations,
|
|
7
|
+
getOpenAPIOperations,
|
|
8
|
+
} from '@whook/http-router';
|
|
9
|
+
import stream from 'stream';
|
|
10
|
+
import camelCase from 'camelcase';
|
|
11
|
+
import type {
|
|
12
|
+
WhookCommandArgs,
|
|
13
|
+
WhookCommandDefinition,
|
|
14
|
+
WhookCommandNamedArgs,
|
|
15
|
+
} from '@whook/cli';
|
|
16
|
+
import type { LogService } from 'common-services';
|
|
17
|
+
import type { OpenAPIV3 } from 'openapi-types';
|
|
18
|
+
|
|
19
|
+
const SEARCH_SEPARATOR = '?';
|
|
20
|
+
const PATH_SEPARATOR = '/';
|
|
21
|
+
|
|
22
|
+
export const definition: WhookCommandDefinition = {
|
|
23
|
+
description: 'A command for testing AWS HTTP lambda',
|
|
24
|
+
example: `whook testHTTPLambda --name getPing`,
|
|
25
|
+
arguments: {
|
|
26
|
+
type: 'object',
|
|
27
|
+
additionalProperties: false,
|
|
28
|
+
required: ['name'],
|
|
29
|
+
properties: {
|
|
30
|
+
name: {
|
|
31
|
+
description: 'Name of the lamda to run',
|
|
32
|
+
type: 'string',
|
|
33
|
+
},
|
|
34
|
+
type: {
|
|
35
|
+
description: 'Type of lambda to test',
|
|
36
|
+
type: 'string',
|
|
37
|
+
enum: ['main', 'index'],
|
|
38
|
+
default: 'index',
|
|
39
|
+
},
|
|
40
|
+
contentType: {
|
|
41
|
+
description: 'Content type of the payload',
|
|
42
|
+
type: 'string',
|
|
43
|
+
default: 'application/json',
|
|
44
|
+
},
|
|
45
|
+
parameters: {
|
|
46
|
+
description: 'The HTTP call parameters',
|
|
47
|
+
type: 'string',
|
|
48
|
+
default: '{}',
|
|
49
|
+
},
|
|
50
|
+
},
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
export default extra(definition, autoService(initTestHTTPLambdaCommand));
|
|
55
|
+
|
|
56
|
+
async function initTestHTTPLambdaCommand({
|
|
57
|
+
NODE_ENV,
|
|
58
|
+
PROJECT_DIR,
|
|
59
|
+
API,
|
|
60
|
+
log,
|
|
61
|
+
args,
|
|
62
|
+
}: {
|
|
63
|
+
NODE_ENV: string;
|
|
64
|
+
PROJECT_DIR: string;
|
|
65
|
+
API: OpenAPIV3.Document;
|
|
66
|
+
log: LogService;
|
|
67
|
+
args: WhookCommandArgs;
|
|
68
|
+
}) {
|
|
69
|
+
return async () => {
|
|
70
|
+
const {
|
|
71
|
+
name,
|
|
72
|
+
type,
|
|
73
|
+
contentType,
|
|
74
|
+
parameters: rawParameters,
|
|
75
|
+
}: WhookCommandNamedArgs = readArgs(definition.arguments, args) as {
|
|
76
|
+
name: string;
|
|
77
|
+
type: string;
|
|
78
|
+
contentType: string;
|
|
79
|
+
parameters: string;
|
|
80
|
+
};
|
|
81
|
+
const handler = await loadLambda(
|
|
82
|
+
{ PROJECT_DIR, log },
|
|
83
|
+
NODE_ENV,
|
|
84
|
+
name,
|
|
85
|
+
type,
|
|
86
|
+
);
|
|
87
|
+
const OPERATION = (
|
|
88
|
+
await dereferenceOpenAPIOperations(API, getOpenAPIOperations(API))
|
|
89
|
+
).find(({ operationId }) => operationId === name);
|
|
90
|
+
|
|
91
|
+
if (!OPERATION) {
|
|
92
|
+
throw new YError('E_OPERATION_NOT_FOUND');
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
const hasBody = !!OPERATION.requestBody;
|
|
96
|
+
const parameters = JSON.parse(rawParameters);
|
|
97
|
+
const search = ((OPERATION.parameters || []) as OpenAPIV3.ParameterObject[])
|
|
98
|
+
.filter((p) => p.in === 'query')
|
|
99
|
+
.reduce((accSearch, p) => {
|
|
100
|
+
if (null != parameters[p.name]) {
|
|
101
|
+
return (
|
|
102
|
+
accSearch +
|
|
103
|
+
(accSearch ? '&' : '') +
|
|
104
|
+
p.name +
|
|
105
|
+
'=' +
|
|
106
|
+
parameters[p.name]
|
|
107
|
+
);
|
|
108
|
+
}
|
|
109
|
+
return accSearch;
|
|
110
|
+
}, '');
|
|
111
|
+
|
|
112
|
+
const path = OPERATION.path
|
|
113
|
+
.split(PATH_SEPARATOR)
|
|
114
|
+
|
|
115
|
+
.map((part) => {
|
|
116
|
+
const matches = /^\{([\d\w]+)\}$/i.exec(part);
|
|
117
|
+
|
|
118
|
+
if (matches) {
|
|
119
|
+
return parameters[matches[1]];
|
|
120
|
+
}
|
|
121
|
+
return part;
|
|
122
|
+
})
|
|
123
|
+
.join(PATH_SEPARATOR);
|
|
124
|
+
const gcpfRequest = {
|
|
125
|
+
method: OPERATION.method,
|
|
126
|
+
originalUrl: path + (search ? SEARCH_SEPARATOR + search : ''),
|
|
127
|
+
headers: ((OPERATION.parameters || []) as OpenAPIV3.ParameterObject[])
|
|
128
|
+
.filter((p) => p.in === 'header')
|
|
129
|
+
.reduce((headerParameters, p) => {
|
|
130
|
+
headerParameters[p.name] = parameters[camelCase(p.name)];
|
|
131
|
+
return headerParameters;
|
|
132
|
+
}, {}),
|
|
133
|
+
rawBody: Buffer.from(
|
|
134
|
+
hasBody
|
|
135
|
+
? contentType === 'application/json'
|
|
136
|
+
? parameters.body
|
|
137
|
+
? JSON.stringify(parameters.body)
|
|
138
|
+
: ''
|
|
139
|
+
: parameters.body || ''
|
|
140
|
+
: '',
|
|
141
|
+
),
|
|
142
|
+
};
|
|
143
|
+
if (hasBody) {
|
|
144
|
+
gcpfRequest.headers['content-type'] = `${contentType};charset=UTF-8`;
|
|
145
|
+
}
|
|
146
|
+
log('info', 'GCPF_REQUEST:', gcpfRequest);
|
|
147
|
+
|
|
148
|
+
const response = {
|
|
149
|
+
status: 0,
|
|
150
|
+
headers: {},
|
|
151
|
+
data: '',
|
|
152
|
+
};
|
|
153
|
+
await new Promise<void>((resolve, reject) => {
|
|
154
|
+
const gcpfResponse: any = new stream.PassThrough();
|
|
155
|
+
|
|
156
|
+
gcpfResponse.set = (name: string, value: string) => {
|
|
157
|
+
response.headers[name] = value;
|
|
158
|
+
};
|
|
159
|
+
gcpfResponse.status = (code: number) => {
|
|
160
|
+
response.status = code;
|
|
161
|
+
};
|
|
162
|
+
|
|
163
|
+
handler(gcpfRequest, gcpfResponse).catch(reject);
|
|
164
|
+
|
|
165
|
+
const chunks = [];
|
|
166
|
+
|
|
167
|
+
gcpfResponse.once('end', () => {
|
|
168
|
+
response.data = Buffer.concat(chunks).toString();
|
|
169
|
+
resolve();
|
|
170
|
+
});
|
|
171
|
+
gcpfResponse.once('error', reject);
|
|
172
|
+
gcpfResponse.on('readable', () => {
|
|
173
|
+
let data;
|
|
174
|
+
while ((data = gcpfResponse.read())) {
|
|
175
|
+
chunks.push(data);
|
|
176
|
+
}
|
|
177
|
+
});
|
|
178
|
+
});
|
|
179
|
+
log('info', 'SUCCESS:', response);
|
|
180
|
+
};
|
|
181
|
+
}
|