@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.
Files changed (45) hide show
  1. package/LICENSE +20 -0
  2. package/README.md +187 -0
  3. package/dist/commands/testHTTPFunction.d.ts +12 -0
  4. package/dist/commands/testHTTPFunction.js +156 -0
  5. package/dist/commands/testHTTPFunction.js.map +1 -0
  6. package/dist/commands/testHTTPFunction.mjs +136 -0
  7. package/dist/commands/testHTTPFunction.mjs.map +1 -0
  8. package/dist/index.d.ts +18 -0
  9. package/dist/index.js +299 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/index.mjs +265 -0
  12. package/dist/index.mjs.map +1 -0
  13. package/dist/libs/utils.d.ts +5 -0
  14. package/dist/libs/utils.js +39 -0
  15. package/dist/libs/utils.js.map +1 -0
  16. package/dist/libs/utils.mjs +27 -0
  17. package/dist/libs/utils.mjs.map +1 -0
  18. package/dist/services/_autoload.d.ts +17 -0
  19. package/dist/services/_autoload.js +121 -0
  20. package/dist/services/_autoload.js.map +1 -0
  21. package/dist/services/_autoload.mjs +107 -0
  22. package/dist/services/_autoload.mjs.map +1 -0
  23. package/dist/services/log.d.ts +2 -0
  24. package/dist/services/log.js +14 -0
  25. package/dist/services/log.js.map +1 -0
  26. package/dist/services/log.mjs +4 -0
  27. package/dist/services/log.mjs.map +1 -0
  28. package/dist/services/log.test.d.ts +1 -0
  29. package/dist/services/log.test.js +12 -0
  30. package/dist/services/log.test.js.map +1 -0
  31. package/dist/services/log.test.mjs +7 -0
  32. package/dist/services/log.test.mjs.map +1 -0
  33. package/dist/wrappers/googleHTTPFunction.d.ts +22 -0
  34. package/dist/wrappers/googleHTTPFunction.js +310 -0
  35. package/dist/wrappers/googleHTTPFunction.js.map +1 -0
  36. package/dist/wrappers/googleHTTPFunction.mjs +289 -0
  37. package/dist/wrappers/googleHTTPFunction.mjs.map +1 -0
  38. package/package.json +215 -0
  39. package/src/commands/testHTTPFunction.ts +181 -0
  40. package/src/index.ts +443 -0
  41. package/src/libs/utils.ts +43 -0
  42. package/src/services/_autoload.ts +161 -0
  43. package/src/services/log.test.ts +7 -0
  44. package/src/services/log.ts +4 -0
  45. 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
+ }