@stuntman/shared 0.1.6 → 0.1.8

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/dist/appError.d.ts +1 -2
  2. package/dist/appError.d.ts.map +1 -0
  3. package/dist/appError.js +1 -0
  4. package/dist/appError.js.map +1 -0
  5. package/dist/config.d.ts +7 -2
  6. package/dist/config.d.ts.map +1 -0
  7. package/dist/config.js +27 -11
  8. package/dist/config.js.map +1 -0
  9. package/dist/constants.d.ts +2 -0
  10. package/dist/constants.d.ts.map +1 -0
  11. package/dist/constants.js +3 -1
  12. package/dist/constants.js.map +1 -0
  13. package/dist/escapeStringRegexp.d.ts +2 -0
  14. package/dist/escapeStringRegexp.d.ts.map +1 -0
  15. package/dist/escapeStringRegexp.js +6 -0
  16. package/dist/escapeStringRegexp.js.map +1 -0
  17. package/dist/gqlParser.d.ts +4 -0
  18. package/dist/gqlParser.d.ts.map +1 -0
  19. package/dist/gqlParser.js +48 -0
  20. package/dist/gqlParser.js.map +1 -0
  21. package/dist/index.d.ts +13 -8
  22. package/dist/index.d.ts.map +1 -0
  23. package/dist/index.js +7 -2
  24. package/dist/index.js.map +1 -0
  25. package/dist/logger.d.ts +1 -0
  26. package/dist/logger.d.ts.map +1 -0
  27. package/dist/logger.js +1 -0
  28. package/dist/logger.js.map +1 -0
  29. package/dist/rawHeaders.d.ts +1 -0
  30. package/dist/rawHeaders.d.ts.map +1 -0
  31. package/dist/rawHeaders.js +10 -5
  32. package/dist/rawHeaders.js.map +1 -0
  33. package/dist/stringify.d.ts +1 -0
  34. package/dist/stringify.d.ts.map +1 -0
  35. package/dist/stringify.js +2 -1
  36. package/dist/stringify.js.map +1 -0
  37. package/package.json +4 -4
  38. package/src/appError.ts +0 -2
  39. package/src/config.ts +27 -10
  40. package/src/constants.ts +1 -0
  41. package/src/escapeStringRegexp.ts +1 -0
  42. package/src/gqlParser.ts +40 -0
  43. package/src/index.ts +16 -9
  44. package/src/rawHeaders.ts +7 -6
  45. package/src/stringify.ts +1 -1
@@ -6,9 +6,8 @@ export interface AppErrorInterface {
6
6
  isOperational?: boolean;
7
7
  }
8
8
  export declare class AppError extends Error {
9
- readonly name: string;
10
9
  readonly httpCode: Stuntman.HttpCode;
11
- readonly uuid?: string;
12
10
  readonly isOperational: boolean;
13
11
  constructor(args: AppErrorInterface);
14
12
  }
13
+ //# sourceMappingURL=appError.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"appError.d.ts","sourceRoot":"","sources":["../src/appError.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,QAAQ,MAAM,GAAG,CAAC;AAEnC,MAAM,WAAW,iBAAiB;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,qBAAa,QAAS,SAAQ,KAAK;IAC/B,SAAgB,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC;IAC5C,SAAgB,aAAa,EAAE,OAAO,CAAQ;gBAElC,IAAI,EAAE,iBAAiB;CActC"}
package/dist/appError.js CHANGED
@@ -15,3 +15,4 @@ class AppError extends Error {
15
15
  }
16
16
  }
17
17
  exports.AppError = AppError;
18
+ //# sourceMappingURL=appError.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"appError.js","sourceRoot":"","sources":["../src/appError.ts"],"names":[],"mappings":";;;AASA,MAAa,QAAS,SAAQ,KAAK;IAI/B,YAAY,IAAuB;QAC/B,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAHR,kBAAa,GAAY,IAAI,CAAC;QAK1C,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAElD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC;QACjC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAE9B,IAAI,IAAI,CAAC,aAAa,KAAK,SAAS,EAAE;YAClC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;SAC3C;QAED,KAAK,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;CACJ;AAlBD,4BAkBC"}
package/dist/config.d.ts CHANGED
@@ -1,2 +1,7 @@
1
- import { ServerConfig } from '.';
2
- export declare const serverConfig: ServerConfig;
1
+ import { Config } from '.';
2
+ declare class ConfigWrapper {
3
+ get stuntmanConfig(): Config;
4
+ }
5
+ declare const configWrapper: ConfigWrapper;
6
+ export = configWrapper;
7
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,MAAM,EAST,MAAM,GAAG,CAAC;AAwCX,cAAM,aAAa;IACf,IAAI,cAAc,IAAI,MAAM,CAc3B;CACJ;AACD,QAAA,MAAM,aAAa,eAAsB,CAAC;AAE1C,SAAS,aAAa,CAAC"}
package/dist/config.js CHANGED
@@ -2,8 +2,6 @@
2
2
  var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.serverConfig = void 0;
7
5
  const _1 = require(".");
8
6
  const config_1 = __importDefault(require("config"));
9
7
  const path_1 = __importDefault(require("path"));
@@ -32,14 +30,32 @@ const defaultConfig = {
32
30
  webgui: {
33
31
  disabled: false,
34
32
  },
33
+ client: {
34
+ timeout: 60000,
35
+ host: 'localhost',
36
+ protocol: 'http',
37
+ port: _1.DEFAULT_API_PORT,
38
+ },
35
39
  };
36
- config_1.default.util.setModuleDefaults('stuntman', defaultConfig);
37
- let configFromFile = {};
38
- try {
39
- configFromFile = config_1.default.get('stuntman');
40
- }
41
- catch (error) {
42
- // eslint-disable-next-line no-console
43
- console.warn('unable to find correct config - starting with defaults');
40
+ let configFromFile = null;
41
+ class ConfigWrapper {
42
+ get stuntmanConfig() {
43
+ if (!configFromFile) {
44
+ config_1.default.util.setModuleDefaults('stuntman', defaultConfig);
45
+ try {
46
+ configFromFile = config_1.default.get('stuntman');
47
+ }
48
+ catch (error) {
49
+ // eslint-disable-next-line no-console
50
+ console.warn('unable to find correct config - starting with defaults');
51
+ }
52
+ }
53
+ if (!configFromFile) {
54
+ throw new Error('error getting config');
55
+ }
56
+ return configFromFile;
57
+ }
44
58
  }
45
- exports.serverConfig = configFromFile;
59
+ const configWrapper = new ConfigWrapper();
60
+ module.exports = configWrapper;
61
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":";;;;AAAA,wBAUW;AACX,oDAA4B;AAC5B,gDAAwB;AAExB,6BAA6B;AAE7B,MAAM,aAAa,GAAW;IAC1B,GAAG,EAAE;QACD,QAAQ,EAAE,KAAK;QACf,IAAI,EAAE,mBAAgB;QACtB,cAAc,EAAE,IAAI;QACpB,eAAe,EAAE,IAAI;KACxB;IACD,IAAI,EAAE;QACF,MAAM,EAAE,sBAAmB;QAC3B,WAAW,EAAE,eAAY;QACzB,IAAI,EAAE,oBAAiB;QACvB,OAAO,EAAE,wBAAqB;QAC9B,SAAS,EAAE,cAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC;KAC/C;IACD,OAAO,EAAE;QACL,OAAO,EAAE;YACL,UAAU,EAAE,4BAAyB;YACrC,SAAS,EAAE,yBAAsB;YACjC,GAAG,EAAE,oBAAiB;SACzB;KACJ;IACD,MAAM,EAAE;QACJ,QAAQ,EAAE,KAAK;KAClB;IACD,MAAM,EAAE;QACJ,OAAO,EAAE,KAAK;QACd,IAAI,EAAE,WAAW;QACjB,QAAQ,EAAE,MAAM;QAChB,IAAI,EAAE,mBAAgB;KACzB;CACJ,CAAC;AAEF,IAAI,cAAc,GAAkB,IAAI,CAAC;AAEzC,MAAM,aAAa;IACf,IAAI,cAAc;QACd,IAAI,CAAC,cAAc,EAAE;YACjB,gBAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;YACzD,IAAI;gBACA,cAAc,GAAG,gBAAM,CAAC,GAAG,CAAS,UAAU,CAAC,CAAC;aACnD;YAAC,OAAO,KAAK,EAAE;gBACZ,sCAAsC;gBACtC,OAAO,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAC;aAC1E;SACJ;QACD,IAAI,CAAC,cAAc,EAAE;YACjB,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;SAC3C;QACD,OAAO,cAAc,CAAC;IAC1B,CAAC;CACJ;AACD,MAAM,aAAa,GAAG,IAAI,aAAa,EAAE,CAAC;AAE1C,iBAAS,aAAa,CAAC"}
@@ -12,3 +12,5 @@ export declare const MAX_RULE_TTL_SECONDS: number;
12
12
  export declare const CATCH_ALL_RULE_PRIORITY: number;
13
13
  export declare const CATCH_RULE_NAME = "internal/catch-all";
14
14
  export declare const EXTERNAL_DNS: string[];
15
+ export declare const VALID_HOSTNAME_REGEX: RegExp;
16
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,qBAAqB,QAAQ,CAAC;AAC3C,eAAO,MAAM,qBAAqB,MAAM,CAAC;AACzC,eAAO,MAAM,iBAAiB,OAAO,CAAC;AACtC,eAAO,MAAM,gBAAgB,OAAO,CAAC;AACrC,eAAO,MAAM,yBAAyB,MAAM,CAAC;AAC7C,eAAO,MAAM,sBAAsB,QAAoB,CAAC;AACxD,eAAO,MAAM,iBAAiB,QAAiB,CAAC;AAChD,eAAO,MAAM,mBAAmB,aAAa,CAAC;AAC9C,eAAO,MAAM,wBAAwB,QAAU,CAAC;AAChD,eAAO,MAAM,oBAAoB,KAAK,CAAC;AACvC,eAAO,MAAM,oBAAoB,QAAU,CAAC;AAC5C,eAAO,MAAM,uBAAuB,QAAW,CAAC;AAChD,eAAO,MAAM,eAAe,uBAAuB,CAAC;AACpD,eAAO,MAAM,YAAY,UAAyB,CAAC;AACnD,eAAO,MAAM,oBAAoB,QAA2F,CAAC"}
package/dist/constants.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.EXTERNAL_DNS = exports.CATCH_RULE_NAME = exports.CATCH_ALL_RULE_PRIORITY = exports.MAX_RULE_TTL_SECONDS = exports.MIN_RULE_TTL_SECONDS = exports.DEFAULT_RULE_TTL_SECONDS = exports.DEFAULT_MOCK_DOMAIN = exports.DEFAULT_CACHE_TTL = exports.DEFAULT_CACHE_MAX_SIZE = exports.DEFAULT_CACHE_MAX_ENTRIES = exports.DEFAULT_API_PORT = exports.DEFAULT_MOCK_PORT = exports.DEFAULT_RULE_PRIORITY = exports.DEFAULT_PROXY_TIMEOUT = void 0;
3
+ exports.VALID_HOSTNAME_REGEX = exports.EXTERNAL_DNS = exports.CATCH_RULE_NAME = exports.CATCH_ALL_RULE_PRIORITY = exports.MAX_RULE_TTL_SECONDS = exports.MIN_RULE_TTL_SECONDS = exports.DEFAULT_RULE_TTL_SECONDS = exports.DEFAULT_MOCK_DOMAIN = exports.DEFAULT_CACHE_TTL = exports.DEFAULT_CACHE_MAX_SIZE = exports.DEFAULT_CACHE_MAX_ENTRIES = exports.DEFAULT_API_PORT = exports.DEFAULT_MOCK_PORT = exports.DEFAULT_RULE_PRIORITY = exports.DEFAULT_PROXY_TIMEOUT = void 0;
4
4
  exports.DEFAULT_PROXY_TIMEOUT = 60000;
5
5
  exports.DEFAULT_RULE_PRIORITY = 100;
6
6
  exports.DEFAULT_MOCK_PORT = 2015;
@@ -15,3 +15,5 @@ exports.MAX_RULE_TTL_SECONDS = 60 * 60;
15
15
  exports.CATCH_ALL_RULE_PRIORITY = Infinity;
16
16
  exports.CATCH_RULE_NAME = 'internal/catch-all';
17
17
  exports.EXTERNAL_DNS = ['8.8.8.8', '1.1.1.1'];
18
+ exports.VALID_HOSTNAME_REGEX = /^(([a-z0-9]|[a-z0-9][a-z0-9\\-]*[a-z0-9])\.)*([a-z0-9]|[a-z0-9][a-z0-9\\-]*[a-z0-9])$/i;
19
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,qBAAqB,GAAG,KAAK,CAAC;AAC9B,QAAA,qBAAqB,GAAG,GAAG,CAAC;AAC5B,QAAA,iBAAiB,GAAG,IAAI,CAAC;AACzB,QAAA,gBAAgB,GAAG,IAAI,CAAC;AACxB,QAAA,yBAAyB,GAAG,GAAG,CAAC;AAChC,QAAA,sBAAsB,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC;AAC3C,QAAA,iBAAiB,GAAG,IAAI,GAAG,EAAE,GAAG,EAAE,CAAC;AACnC,QAAA,mBAAmB,GAAG,UAAU,CAAC;AACjC,QAAA,wBAAwB,GAAG,EAAE,GAAG,EAAE,CAAC;AACnC,QAAA,oBAAoB,GAAG,EAAE,CAAC;AAC1B,QAAA,oBAAoB,GAAG,EAAE,GAAG,EAAE,CAAC;AAC/B,QAAA,uBAAuB,GAAG,QAAQ,CAAC;AACnC,QAAA,eAAe,GAAG,oBAAoB,CAAC;AACvC,QAAA,YAAY,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;AACtC,QAAA,oBAAoB,GAAG,wFAAwF,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const escapeStringRegexp: (input: string) => string;
2
+ //# sourceMappingURL=escapeStringRegexp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"escapeStringRegexp.d.ts","sourceRoot":"","sources":["../src/escapeStringRegexp.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,kBAAkB,UAAW,MAAM,WAAwE,CAAC"}
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.escapeStringRegexp = void 0;
4
+ const escapeStringRegexp = (input) => input.replace(/[|\\{}()[\]^$+*?.]/g, '\\$&').replace(/-/g, '\\x2d');
5
+ exports.escapeStringRegexp = escapeStringRegexp;
6
+ //# sourceMappingURL=escapeStringRegexp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"escapeStringRegexp.js","sourceRoot":"","sources":["../src/escapeStringRegexp.ts"],"names":[],"mappings":";;;AAAO,MAAM,kBAAkB,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AAA5G,QAAA,kBAAkB,sBAA0F"}
@@ -0,0 +1,4 @@
1
+ /// <reference types="node" />
2
+ import type * as Stuntman from './index';
3
+ export declare const naiveGQLParser: (body: Buffer | string) => Stuntman.GQLRequestBody | undefined;
4
+ //# sourceMappingURL=gqlParser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gqlParser.d.ts","sourceRoot":"","sources":["../src/gqlParser.ts"],"names":[],"mappings":";AAAA,OAAO,KAAK,KAAK,QAAQ,MAAM,SAAS,CAAC;AAGzC,eAAO,MAAM,cAAc,SAAU,MAAM,GAAG,MAAM,KAAG,SAAS,cAAc,GAAG,SAoChF,CAAC"}
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.naiveGQLParser = void 0;
4
+ const logger_1 = require("./logger");
5
+ const naiveGQLParser = (body) => {
6
+ // TODO consider real parser :P
7
+ try {
8
+ let json = undefined;
9
+ try {
10
+ json = JSON.parse(Buffer.isBuffer(body) ? body.toString('utf-8') : body);
11
+ }
12
+ catch (kiss) {
13
+ // and swallow
14
+ }
15
+ if (!(json === null || json === void 0 ? void 0 : json.query) && !(json === null || json === void 0 ? void 0 : json.operationName)) {
16
+ return undefined;
17
+ }
18
+ const lines = json.query
19
+ .split('\n')
20
+ .map((l) => l.replace(/^\s+/g, '').trim())
21
+ .filter((l) => !!l);
22
+ if (!lines[0]) {
23
+ throw new Error('unable to find query');
24
+ }
25
+ if (/^query /.test(lines[0])) {
26
+ json.type = 'query';
27
+ }
28
+ else if (/^mutation /.test(lines[0])) {
29
+ json.type = 'mutation';
30
+ }
31
+ else {
32
+ throw new Error(`Unable to resolve query type of ${lines[0]}`);
33
+ }
34
+ if (json.operationName && lines[1]) {
35
+ json.methodName = lines[1].split('(')[0].split('{')[0];
36
+ }
37
+ else if (json.operationName) {
38
+ json.methodName = lines[0].split('(')[0].split('{')[0];
39
+ }
40
+ return json;
41
+ }
42
+ catch (error) {
43
+ logger_1.logger.debug(error, 'unable to parse GQL');
44
+ }
45
+ return undefined;
46
+ };
47
+ exports.naiveGQLParser = naiveGQLParser;
48
+ //# sourceMappingURL=gqlParser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gqlParser.js","sourceRoot":"","sources":["../src/gqlParser.ts"],"names":[],"mappings":";;;AACA,qCAAkC;AAE3B,MAAM,cAAc,GAAG,CAAC,IAAqB,EAAuC,EAAE;IACzF,+BAA+B;IAC/B,IAAI;QACA,IAAI,IAAI,GAAwC,SAAS,CAAC;QAC1D,IAAI;YACA,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;SAC5E;QAAC,OAAO,IAAI,EAAE;YACX,cAAc;SACjB;QACD,IAAI,CAAC,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,KAAK,CAAA,IAAI,CAAC,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,aAAa,CAAA,EAAE;YACtC,OAAO,SAAS,CAAC;SACpB;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK;aACnB,KAAK,CAAC,IAAI,CAAC;aACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;aACzC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACxB,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;YACX,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;SAC3C;QACD,IAAI,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE;YAC1B,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC;SACvB;aAAM,IAAI,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE;YACpC,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;SAC1B;aAAM;YACH,MAAM,IAAI,KAAK,CAAC,mCAAmC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;SAClE;QACD,IAAI,IAAI,CAAC,aAAa,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE;YAChC,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;SAC5D;aAAM,IAAI,IAAI,CAAC,aAAa,EAAE;YAC3B,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;SAC5D;QACD,OAAO,IAAI,CAAC;KACf;IAAC,OAAO,KAAK,EAAE;QACZ,eAAM,CAAC,KAAK,CAAC,KAAK,EAAE,qBAAqB,CAAC,CAAC;KAC9C;IACD,OAAO,SAAS,CAAC;AACrB,CAAC,CAAC;AApCW,QAAA,cAAc,kBAoCzB"}
package/dist/index.d.ts CHANGED
@@ -3,7 +3,9 @@ export * from './appError';
3
3
  export * from './logger';
4
4
  export * from './stringify';
5
5
  export * from './rawHeaders';
6
- export * from './config';
6
+ export * from './gqlParser';
7
+ export * from './escapeStringRegexp';
8
+ export declare const stuntmanConfig: Config;
7
9
  export declare const INDEX_DTS: string;
8
10
  type NonObject = string | number | boolean | symbol | undefined | null | any[];
9
11
  interface SerializableTypesRecord<T> {
@@ -62,7 +64,7 @@ export type BaseRequest = {
62
64
  export type Request = BaseRequest & {
63
65
  id: string;
64
66
  timestamp: number;
65
- gqlBody?: GQLRequestBody;
67
+ gqlBody?: GQLRequestBody | undefined;
66
68
  };
67
69
  export type Response = {
68
70
  rawHeaders?: RawHeadersInterface;
@@ -72,7 +74,7 @@ export type Response = {
72
74
  };
73
75
  export type LogEntry = {
74
76
  originalRequest: Request;
75
- labels?: string[];
77
+ labels?: string[] | undefined;
76
78
  mockRuleId?: string;
77
79
  originalResponse?: Response;
78
80
  modifiedRequest?: Request;
@@ -139,10 +141,11 @@ export type ApiConfig = {
139
141
  apiKeyReadOnly: string | null;
140
142
  };
141
143
  export type ClientConfig = {
142
- protocol?: 'http' | 'https';
143
- host?: string;
144
- port?: number;
145
- timeout?: number;
144
+ protocol: 'http' | 'https';
145
+ host: string;
146
+ port: number;
147
+ timeout: number;
148
+ apiKey?: string;
146
149
  };
147
150
  export type MockConfig = {
148
151
  domain: string;
@@ -160,13 +163,14 @@ export type StorageConfig = {
160
163
  limitSize: number;
161
164
  ttl: number;
162
165
  };
163
- export type ServerConfig = {
166
+ export type Config = {
164
167
  webgui: WebGuiConfig;
165
168
  api: ApiConfig;
166
169
  mock: MockConfig;
167
170
  storage: {
168
171
  traffic: StorageConfig;
169
172
  };
173
+ client: ClientConfig;
170
174
  };
171
175
  export interface RuleExecutorInterface {
172
176
  addRule: (rule: Rule, overwrite?: boolean) => Promise<LiveRule>;
@@ -177,3 +181,4 @@ export interface RuleExecutorInterface {
177
181
  getRules: () => Promise<readonly LiveRule[]>;
178
182
  getRule: (id: string) => Promise<LiveRule | undefined>;
179
183
  }
184
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -17,15 +17,19 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
17
17
  return (mod && mod.__esModule) ? mod : { "default": mod };
18
18
  };
19
19
  Object.defineProperty(exports, "__esModule", { value: true });
20
- exports.HttpCode = exports.INDEX_DTS = void 0;
20
+ exports.HttpCode = exports.INDEX_DTS = exports.stuntmanConfig = void 0;
21
21
  /* eslint-disable @typescript-eslint/ban-types */
22
22
  __exportStar(require("./constants"), exports);
23
23
  __exportStar(require("./appError"), exports);
24
24
  __exportStar(require("./logger"), exports);
25
25
  __exportStar(require("./stringify"), exports);
26
26
  __exportStar(require("./rawHeaders"), exports);
27
- __exportStar(require("./config"), exports);
27
+ __exportStar(require("./gqlParser"), exports);
28
+ __exportStar(require("./escapeStringRegexp"), exports);
28
29
  const fs_1 = __importDefault(require("fs"));
30
+ const config_1 = __importDefault(require("./config"));
31
+ exports.stuntmanConfig = config_1.default.stuntmanConfig;
32
+ // TODO this file read sucks
29
33
  exports.INDEX_DTS = fs_1.default.readFileSync(`${__dirname}/index.d.ts`, 'utf-8');
30
34
  var HttpCode;
31
35
  (function (HttpCode) {
@@ -38,3 +42,4 @@ var HttpCode;
38
42
  HttpCode[HttpCode["UNPROCESSABLE_ENTITY"] = 422] = "UNPROCESSABLE_ENTITY";
39
43
  HttpCode[HttpCode["INTERNAL_SERVER_ERROR"] = 500] = "INTERNAL_SERVER_ERROR";
40
44
  })(HttpCode = exports.HttpCode || (exports.HttpCode = {}));
45
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA,iDAAiD;AACjD,8CAA4B;AAC5B,6CAA2B;AAC3B,2CAAyB;AACzB,8CAA4B;AAC5B,+CAA6B;AAC7B,8CAA4B;AAC5B,uDAAqC;AACrC,4CAAoB;AAEpB,sDAA8B;AACjB,QAAA,cAAc,GAAG,gBAAM,CAAC,cAAc,CAAC;AAEpD,4BAA4B;AACf,QAAA,SAAS,GAAG,YAAE,CAAC,YAAY,CAAC,GAAG,SAAS,aAAa,EAAE,OAAO,CAAC,CAAC;AAsB7E,IAAY,QASX;AATD,WAAY,QAAQ;IAChB,qCAAQ,CAAA;IACR,qDAAgB,CAAA;IAChB,uDAAiB,CAAA;IACjB,yDAAkB,CAAA;IAClB,mDAAe,CAAA;IACf,iDAAc,CAAA;IACd,yEAA0B,CAAA;IAC1B,2EAA2B,CAAA;AAC/B,CAAC,EATW,QAAQ,GAAR,gBAAQ,KAAR,gBAAQ,QASnB"}
package/dist/logger.d.ts CHANGED
@@ -7,3 +7,4 @@ export declare const logger: import("pino").Logger<{
7
7
  };
8
8
  };
9
9
  }>;
10
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,MAAM;;;;;;;;EAQjB,CAAC"}
package/dist/logger.js CHANGED
@@ -15,3 +15,4 @@ exports.logger = (0, pino_1.default)({
15
15
  },
16
16
  },
17
17
  });
18
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":";;;;;;;AAAA,gDAAwB;AAEX,QAAA,MAAM,GAAG,IAAA,cAAI,EAAC;IACvB,KAAK,EAAE,MAAA,OAAO,CAAC,GAAG,CAAC,SAAS,mCAAI,MAAM;IACtC,UAAU,EAAE,SAAS;IACrB,UAAU,EAAE;QACR,KAAK,CAAC,KAAK;YACP,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;QAC5B,CAAC;KACJ;CACJ,CAAC,CAAC"}
@@ -10,3 +10,4 @@ export declare class RawHeaders extends Array<string> implements Stuntman.RawHea
10
10
  static fromHeadersRecord(headersRecord: Record<string, string | string[] | undefined>): RawHeaders;
11
11
  static toHeaderPairs(rawHeaders: string[]): readonly [string, string][];
12
12
  }
13
+ //# sourceMappingURL=rawHeaders.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rawHeaders.d.ts","sourceRoot":"","sources":["../src/rawHeaders.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,QAAQ,MAAM,GAAG,CAAC;AAEnC,qBAAa,UAAW,SAAQ,KAAK,CAAC,MAAM,CAAE,YAAW,QAAQ,CAAC,mBAAmB;IACjF,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAYrC,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO;IAQ1C,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAiBtC,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAKtC,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAe1B,aAAa,IAAI,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE;IAI5C,MAAM,CAAC,eAAe,CAAC,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,UAAU;IAInE,MAAM,CAAC,iBAAiB,CAAC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,GAAG,UAAU;IAclG,MAAM,CAAC,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE;CAO1E"}
@@ -3,13 +3,14 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.RawHeaders = void 0;
4
4
  class RawHeaders extends Array {
5
5
  get(name) {
6
+ var _a;
6
7
  const headers = this.toHeaderPairs();
7
8
  const matchingHeaders = headers.filter((h) => h[0].toLowerCase() === name.toLowerCase());
8
9
  if (matchingHeaders.length === 0) {
9
- return;
10
+ return undefined;
10
11
  }
11
12
  if (matchingHeaders.length === 1) {
12
- return matchingHeaders[0][1];
13
+ return (_a = matchingHeaders[0]) === null || _a === void 0 ? void 0 : _a[1];
13
14
  }
14
15
  throw new Error('Multiple headers with same name. Manipulate rawHeaders instead');
15
16
  }
@@ -21,15 +22,17 @@ class RawHeaders extends Array {
21
22
  return foundValue === value;
22
23
  }
23
24
  set(name, value) {
25
+ var _a;
24
26
  let foundHeaders = 0;
25
27
  for (let headerIndex = 0; headerIndex < this.length; headerIndex += 2) {
26
- if (this[headerIndex].toLowerCase() === name.toLowerCase()) {
28
+ if (((_a = this[headerIndex]) === null || _a === void 0 ? void 0 : _a.toLowerCase()) === name.toLowerCase()) {
27
29
  this[headerIndex + 1] = value;
28
30
  ++foundHeaders;
29
31
  }
30
32
  }
31
33
  if (foundHeaders === 0) {
32
- return this.add(name, value);
34
+ this.add(name, value);
35
+ return;
33
36
  }
34
37
  if (foundHeaders > 1) {
35
38
  throw new Error('Multiple headers with same name. Manipulate rawHeaders instead');
@@ -40,10 +43,11 @@ class RawHeaders extends Array {
40
43
  this.push(value);
41
44
  }
42
45
  remove(name) {
46
+ var _a;
43
47
  const headersCopy = [...this];
44
48
  let foundHeaders = 0;
45
49
  for (let headerIndex = 0; headerIndex < headersCopy.length; headerIndex += 2) {
46
- if (this[headerIndex - foundHeaders * 2].toLowerCase() === name.toLowerCase()) {
50
+ if (((_a = this[headerIndex - foundHeaders * 2]) === null || _a === void 0 ? void 0 : _a.toLowerCase()) === name.toLowerCase()) {
47
51
  delete this[headerIndex];
48
52
  delete this[headerIndex];
49
53
  ++foundHeaders;
@@ -81,3 +85,4 @@ class RawHeaders extends Array {
81
85
  }
82
86
  }
83
87
  exports.RawHeaders = RawHeaders;
88
+ //# sourceMappingURL=rawHeaders.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rawHeaders.js","sourceRoot":"","sources":["../src/rawHeaders.ts"],"names":[],"mappings":"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"}
@@ -1 +1,2 @@
1
1
  export declare const stringify: (obj: any) => string;
2
+ //# sourceMappingURL=stringify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stringify.d.ts","sourceRoot":"","sources":["../src/stringify.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,SAAS,QAAS,GAAG,WAM5B,CAAC"}
package/dist/stringify.js CHANGED
@@ -1,10 +1,11 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.stringify = void 0;
4
- const stringify = (obj) => JSON.stringify(obj, (key, value) => {
4
+ const stringify = (obj) => JSON.stringify(obj, (_key, value) => {
5
5
  if (typeof value === 'function' || value instanceof RegExp) {
6
6
  return value.toString();
7
7
  }
8
8
  return value;
9
9
  });
10
10
  exports.stringify = stringify;
11
+ //# sourceMappingURL=stringify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stringify.js","sourceRoot":"","sources":["../src/stringify.ts"],"names":[],"mappings":";;;AAAO,MAAM,SAAS,GAAG,CAAC,GAAQ,EAAE,EAAE,CAClC,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;IAChC,IAAI,OAAO,KAAK,KAAK,UAAU,IAAI,KAAK,YAAY,MAAM,EAAE;QACxD,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAC;KAC3B;IACD,OAAO,KAAK,CAAC;AACjB,CAAC,CAAC,CAAC;AANM,QAAA,SAAS,aAMf"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stuntman/shared",
3
- "version": "0.1.6",
3
+ "version": "0.1.8",
4
4
  "description": "Stuntman - HTTP proxy / mock shared types and utils",
5
5
  "main": "dist/index.js",
6
6
  "repository": {
@@ -49,10 +49,10 @@
49
49
  "CHANGELOG.md"
50
50
  ],
51
51
  "scripts": {
52
- "test": "SUPPRESS_NO_CONFIG_WARNING=1 jest",
52
+ "test": "SUPPRESS_NO_CONFIG_WARNING=1 jest --coverage",
53
53
  "clean": "rm -fr dist",
54
54
  "build": "tsc",
55
- "lint": "prettier --check . && eslint . --ext ts",
56
- "lint:fix": "prettier --write ./{src,test} && eslint ./{src,test} --ext ts --fix"
55
+ "lint": "prettier --check \"./{src,test}/**/*\" && eslint \"./{src,test}/**/*\"",
56
+ "lint:fix": "prettier --write \"./{src,test}/**/*\" && eslint \"./{src,test}/**/*\" --fix"
57
57
  }
58
58
  }
package/src/appError.ts CHANGED
@@ -8,9 +8,7 @@ export interface AppErrorInterface {
8
8
  }
9
9
 
10
10
  export class AppError extends Error {
11
- public readonly name: string;
12
11
  public readonly httpCode: Stuntman.HttpCode;
13
- public readonly uuid?: string;
14
12
  public readonly isOperational: boolean = true;
15
13
 
16
14
  constructor(args: AppErrorInterface) {
package/src/config.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import {
2
- ServerConfig,
2
+ Config,
3
3
  DEFAULT_API_PORT,
4
4
  DEFAULT_MOCK_DOMAIN,
5
5
  EXTERNAL_DNS,
@@ -14,7 +14,7 @@ import path from 'path';
14
14
 
15
15
  // TODO safeguards & defaults
16
16
 
17
- const defaultConfig: ServerConfig = {
17
+ const defaultConfig: Config = {
18
18
  api: {
19
19
  disabled: false,
20
20
  port: DEFAULT_API_PORT,
@@ -38,16 +38,33 @@ const defaultConfig: ServerConfig = {
38
38
  webgui: {
39
39
  disabled: false,
40
40
  },
41
+ client: {
42
+ timeout: 60000,
43
+ host: 'localhost',
44
+ protocol: 'http',
45
+ port: DEFAULT_API_PORT,
46
+ },
41
47
  };
42
48
 
43
- config.util.setModuleDefaults('stuntman', defaultConfig);
49
+ let configFromFile: Config | null = null;
44
50
 
45
- let configFromFile = {} as ServerConfig;
46
- try {
47
- configFromFile = config.get<ServerConfig>('stuntman');
48
- } catch (error) {
49
- // eslint-disable-next-line no-console
50
- console.warn('unable to find correct config - starting with defaults');
51
+ class ConfigWrapper {
52
+ get stuntmanConfig(): Config {
53
+ if (!configFromFile) {
54
+ config.util.setModuleDefaults('stuntman', defaultConfig);
55
+ try {
56
+ configFromFile = config.get<Config>('stuntman');
57
+ } catch (error) {
58
+ // eslint-disable-next-line no-console
59
+ console.warn('unable to find correct config - starting with defaults');
60
+ }
61
+ }
62
+ if (!configFromFile) {
63
+ throw new Error('error getting config');
64
+ }
65
+ return configFromFile;
66
+ }
51
67
  }
68
+ const configWrapper = new ConfigWrapper();
52
69
 
53
- export const serverConfig = configFromFile;
70
+ export = configWrapper;
package/src/constants.ts CHANGED
@@ -12,3 +12,4 @@ export const MAX_RULE_TTL_SECONDS = 60 * 60;
12
12
  export const CATCH_ALL_RULE_PRIORITY = Infinity;
13
13
  export const CATCH_RULE_NAME = 'internal/catch-all';
14
14
  export const EXTERNAL_DNS = ['8.8.8.8', '1.1.1.1'];
15
+ export const VALID_HOSTNAME_REGEX = /^(([a-z0-9]|[a-z0-9][a-z0-9\\-]*[a-z0-9])\.)*([a-z0-9]|[a-z0-9][a-z0-9\\-]*[a-z0-9])$/i;
@@ -0,0 +1 @@
1
+ export const escapeStringRegexp = (input: string) => input.replace(/[|\\{}()[\]^$+*?.]/g, '\\$&').replace(/-/g, '\\x2d');
@@ -0,0 +1,40 @@
1
+ import type * as Stuntman from './index';
2
+ import { logger } from './logger';
3
+
4
+ export const naiveGQLParser = (body: Buffer | string): Stuntman.GQLRequestBody | undefined => {
5
+ // TODO consider real parser :P
6
+ try {
7
+ let json: Stuntman.GQLRequestBody | undefined = undefined;
8
+ try {
9
+ json = JSON.parse(Buffer.isBuffer(body) ? body.toString('utf-8') : body);
10
+ } catch (kiss) {
11
+ // and swallow
12
+ }
13
+ if (!json?.query && !json?.operationName) {
14
+ return undefined;
15
+ }
16
+ const lines = json.query
17
+ .split('\n')
18
+ .map((l) => l.replace(/^\s+/g, '').trim())
19
+ .filter((l) => !!l);
20
+ if (!lines[0]) {
21
+ throw new Error('unable to find query');
22
+ }
23
+ if (/^query /.test(lines[0])) {
24
+ json.type = 'query';
25
+ } else if (/^mutation /.test(lines[0])) {
26
+ json.type = 'mutation';
27
+ } else {
28
+ throw new Error(`Unable to resolve query type of ${lines[0]}`);
29
+ }
30
+ if (json.operationName && lines[1]) {
31
+ json.methodName = lines[1].split('(')[0]!.split('{')[0]!;
32
+ } else if (json.operationName) {
33
+ json.methodName = lines[0].split('(')[0]!.split('{')[0]!;
34
+ }
35
+ return json;
36
+ } catch (error) {
37
+ logger.debug(error, 'unable to parse GQL');
38
+ }
39
+ return undefined;
40
+ };
package/src/index.ts CHANGED
@@ -4,9 +4,14 @@ export * from './appError';
4
4
  export * from './logger';
5
5
  export * from './stringify';
6
6
  export * from './rawHeaders';
7
- export * from './config';
8
-
7
+ export * from './gqlParser';
8
+ export * from './escapeStringRegexp';
9
9
  import fs from 'fs';
10
+
11
+ import config from './config';
12
+ export const stuntmanConfig = config.stuntmanConfig;
13
+
14
+ // TODO this file read sucks
10
15
  export const INDEX_DTS = fs.readFileSync(`${__dirname}/index.d.ts`, 'utf-8');
11
16
 
12
17
  type NonObject = string | number | boolean | symbol | undefined | null | any[];
@@ -92,7 +97,7 @@ export type BaseRequest = {
92
97
  export type Request = BaseRequest & {
93
98
  id: string;
94
99
  timestamp: number;
95
- gqlBody?: GQLRequestBody;
100
+ gqlBody?: GQLRequestBody | undefined;
96
101
  };
97
102
 
98
103
  export type Response = {
@@ -104,7 +109,7 @@ export type Response = {
104
109
 
105
110
  export type LogEntry = {
106
111
  originalRequest: Request;
107
- labels?: string[];
112
+ labels?: string[] | undefined;
108
113
  mockRuleId?: string;
109
114
  originalResponse?: Response;
110
115
  modifiedRequest?: Request;
@@ -185,10 +190,11 @@ export type ApiConfig = {
185
190
  };
186
191
 
187
192
  export type ClientConfig = {
188
- protocol?: 'http' | 'https';
189
- host?: string;
190
- port?: number;
191
- timeout?: number;
193
+ protocol: 'http' | 'https';
194
+ host: string;
195
+ port: number;
196
+ timeout: number;
197
+ apiKey?: string;
192
198
  };
193
199
 
194
200
  export type MockConfig = {
@@ -209,13 +215,14 @@ export type StorageConfig = {
209
215
  ttl: number;
210
216
  };
211
217
 
212
- export type ServerConfig = {
218
+ export type Config = {
213
219
  webgui: WebGuiConfig;
214
220
  api: ApiConfig;
215
221
  mock: MockConfig;
216
222
  storage: {
217
223
  traffic: StorageConfig;
218
224
  };
225
+ client: ClientConfig;
219
226
  };
220
227
 
221
228
  export interface RuleExecutorInterface {
package/src/rawHeaders.ts CHANGED
@@ -5,10 +5,10 @@ export class RawHeaders extends Array<string> implements Stuntman.RawHeadersInte
5
5
  const headers = this.toHeaderPairs();
6
6
  const matchingHeaders = headers.filter((h) => h[0].toLowerCase() === name.toLowerCase());
7
7
  if (matchingHeaders.length === 0) {
8
- return;
8
+ return undefined;
9
9
  }
10
10
  if (matchingHeaders.length === 1) {
11
- return matchingHeaders[0][1];
11
+ return matchingHeaders[0]?.[1];
12
12
  }
13
13
  throw new Error('Multiple headers with same name. Manipulate rawHeaders instead');
14
14
  }
@@ -24,13 +24,14 @@ export class RawHeaders extends Array<string> implements Stuntman.RawHeadersInte
24
24
  set(name: string, value: string): void {
25
25
  let foundHeaders = 0;
26
26
  for (let headerIndex = 0; headerIndex < this.length; headerIndex += 2) {
27
- if (this[headerIndex].toLowerCase() === name.toLowerCase()) {
27
+ if (this[headerIndex]?.toLowerCase() === name.toLowerCase()) {
28
28
  this[headerIndex + 1] = value;
29
29
  ++foundHeaders;
30
30
  }
31
31
  }
32
32
  if (foundHeaders === 0) {
33
- return this.add(name, value);
33
+ this.add(name, value);
34
+ return;
34
35
  }
35
36
  if (foundHeaders > 1) {
36
37
  throw new Error('Multiple headers with same name. Manipulate rawHeaders instead');
@@ -46,7 +47,7 @@ export class RawHeaders extends Array<string> implements Stuntman.RawHeadersInte
46
47
  const headersCopy = [...this];
47
48
  let foundHeaders = 0;
48
49
  for (let headerIndex = 0; headerIndex < headersCopy.length; headerIndex += 2) {
49
- if (this[headerIndex - foundHeaders * 2].toLowerCase() === name.toLowerCase()) {
50
+ if (this[headerIndex - foundHeaders * 2]?.toLowerCase() === name.toLowerCase()) {
50
51
  delete this[headerIndex];
51
52
  delete this[headerIndex];
52
53
  ++foundHeaders;
@@ -82,7 +83,7 @@ export class RawHeaders extends Array<string> implements Stuntman.RawHeadersInte
82
83
  static toHeaderPairs(rawHeaders: string[]): readonly [string, string][] {
83
84
  const headers = new Array<[string, string]>();
84
85
  for (let headerIndex = 0; headerIndex < rawHeaders.length; headerIndex += 2) {
85
- headers.push([rawHeaders[headerIndex], rawHeaders[headerIndex + 1]]);
86
+ headers.push([rawHeaders[headerIndex]!, rawHeaders[headerIndex + 1]!]);
86
87
  }
87
88
  return headers;
88
89
  }
package/src/stringify.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  export const stringify = (obj: any) =>
2
- JSON.stringify(obj, (key, value) => {
2
+ JSON.stringify(obj, (_key, value) => {
3
3
  if (typeof value === 'function' || value instanceof RegExp) {
4
4
  return value.toString();
5
5
  }