@stuntman/server 0.1.7 → 0.1.9

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 (57) hide show
  1. package/README.md +9 -1
  2. package/dist/api/api.d.ts +25 -0
  3. package/dist/api/api.d.ts.map +1 -0
  4. package/dist/api/api.js +212 -0
  5. package/dist/api/api.js.map +1 -0
  6. package/dist/api/utils.d.ts +5 -0
  7. package/dist/api/utils.d.ts.map +1 -0
  8. package/dist/api/utils.js +61 -0
  9. package/dist/api/utils.js.map +1 -0
  10. package/dist/api/validators.d.ts +4 -0
  11. package/dist/api/validators.d.ts.map +1 -0
  12. package/dist/api/validators.js +125 -0
  13. package/dist/api/validators.js.map +1 -0
  14. package/dist/api/webgui/rules.pug +147 -0
  15. package/dist/api/webgui/style.css +28 -0
  16. package/dist/api/webgui/traffic.pug +38 -0
  17. package/dist/bin/stuntman.d.ts +3 -0
  18. package/dist/bin/stuntman.d.ts.map +1 -0
  19. package/dist/bin/stuntman.js +8 -0
  20. package/dist/bin/stuntman.js.map +1 -0
  21. package/dist/index.d.ts +2 -0
  22. package/dist/index.d.ts.map +1 -0
  23. package/dist/index.js +6 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/ipUtils.d.ts +18 -0
  26. package/dist/ipUtils.d.ts.map +1 -0
  27. package/dist/ipUtils.js +102 -0
  28. package/dist/ipUtils.js.map +1 -0
  29. package/dist/mock.d.ts +32 -0
  30. package/dist/mock.d.ts.map +1 -0
  31. package/dist/mock.js +306 -0
  32. package/dist/mock.js.map +1 -0
  33. package/dist/requestContext.d.ts +10 -0
  34. package/dist/requestContext.d.ts.map +1 -0
  35. package/dist/requestContext.js +19 -0
  36. package/dist/requestContext.js.map +1 -0
  37. package/dist/ruleExecutor.d.ts +23 -0
  38. package/dist/ruleExecutor.d.ts.map +1 -0
  39. package/dist/ruleExecutor.js +189 -0
  40. package/dist/ruleExecutor.js.map +1 -0
  41. package/dist/rules/catchAll.d.ts +3 -0
  42. package/dist/rules/catchAll.d.ts.map +1 -0
  43. package/dist/rules/catchAll.js +16 -0
  44. package/dist/rules/catchAll.js.map +1 -0
  45. package/dist/rules/echo.d.ts +3 -0
  46. package/dist/rules/echo.d.ts.map +1 -0
  47. package/dist/rules/echo.js +16 -0
  48. package/dist/rules/echo.js.map +1 -0
  49. package/dist/rules/index.d.ts +4 -0
  50. package/dist/rules/index.d.ts.map +1 -0
  51. package/dist/rules/index.js +71 -0
  52. package/dist/rules/index.js.map +1 -0
  53. package/dist/storage.d.ts +5 -0
  54. package/dist/storage.d.ts.map +1 -0
  55. package/dist/storage.js +43 -0
  56. package/dist/storage.js.map +1 -0
  57. package/package.json +2 -2
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.echoRule = void 0;
4
+ const shared_1 = require("@stuntman/shared");
5
+ exports.echoRule = {
6
+ id: 'internal/echo',
7
+ priority: shared_1.DEFAULT_RULE_PRIORITY + 1,
8
+ matches: (req) => /https?:\/\/echo\/.*/.test(req.url),
9
+ actions: {
10
+ mockResponse: (req) => ({
11
+ body: req,
12
+ status: 200,
13
+ }),
14
+ },
15
+ };
16
+ //# sourceMappingURL=echo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"echo.js","sourceRoot":"","sources":["../../src/rules/echo.ts"],"names":[],"mappings":";;;AAAA,6CAAyD;AAG5C,QAAA,QAAQ,GAA0B;IAC3C,EAAE,EAAE,eAAe;IACnB,QAAQ,EAAE,8BAAqB,GAAG,CAAC;IACnC,OAAO,EAAE,CAAC,GAAqB,EAAE,EAAE,CAAC,qBAAqB,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;IACvE,OAAO,EAAE;QACL,YAAY,EAAE,CAAC,GAAqB,EAAE,EAAE,CAAC,CAAC;YACtC,IAAI,EAAE,GAAG;YACT,MAAM,EAAE,GAAG;SACd,CAAC;KACL;CACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type * as Stuntman from '@stuntman/shared';
2
+ export declare const DEFAULT_RULES: Stuntman.DeployedRule[];
3
+ export declare const CUSTOM_RULES: Stuntman.DeployedRule[];
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/rules/index.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAElD,eAAO,MAAM,aAAa,EAAE,QAAQ,CAAC,YAAY,EAA6B,CAAC;AAC/E,eAAO,MAAM,YAAY,EAAE,QAAQ,CAAC,YAAY,EAAO,CAAC"}
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ exports.CUSTOM_RULES = exports.DEFAULT_RULES = void 0;
30
+ const fs_1 = __importDefault(require("fs"));
31
+ const glob_1 = __importDefault(require("glob"));
32
+ const tsImport = __importStar(require("ts-import"));
33
+ const catchAll_1 = require("./catchAll");
34
+ const echo_1 = require("./echo");
35
+ const shared_1 = require("@stuntman/shared");
36
+ exports.DEFAULT_RULES = [catchAll_1.catchAllRule, echo_1.echoRule];
37
+ exports.CUSTOM_RULES = [];
38
+ const loadAdditionalRules = () => {
39
+ if (!shared_1.stuntmanConfig.mock.rulesPath || !fs_1.default.existsSync(shared_1.stuntmanConfig.mock.rulesPath)) {
40
+ shared_1.logger.debug({ rulesPath: shared_1.stuntmanConfig.mock.rulesPath }, `additional rules directory not found`);
41
+ return;
42
+ }
43
+ shared_1.logger.debug({ rulesPath: shared_1.stuntmanConfig.mock.rulesPath }, `loading additional rules`);
44
+ const filePaths = glob_1.default.sync('*.[tj]s', { absolute: true, cwd: shared_1.stuntmanConfig.mock.rulesPath });
45
+ for (const filePath of filePaths) {
46
+ // TODO add .ts rule support
47
+ try {
48
+ const loadedFile = /\.js$/.test(filePath) ? require(filePath) : tsImport.loadSync(filePath);
49
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
50
+ const exportedRules = Object.values(loadedFile).filter((rule) => {
51
+ if (!rule || !rule.id || typeof rule.matches !== 'function') {
52
+ shared_1.logger.error({ filePath, rule }, 'invalid exported rule');
53
+ return false;
54
+ }
55
+ return true;
56
+ });
57
+ exports.CUSTOM_RULES.push(...exportedRules);
58
+ }
59
+ catch (error) {
60
+ shared_1.logger.error({ filePath, error }, 'error importing rule');
61
+ }
62
+ }
63
+ const ruleIds = [...exports.DEFAULT_RULES, ...exports.CUSTOM_RULES].map((rule) => rule.id);
64
+ const duplicatedRuleIds = ruleIds.filter((currentValue, currentIndex) => ruleIds.indexOf(currentValue) !== currentIndex);
65
+ if (duplicatedRuleIds.length > 0) {
66
+ shared_1.logger.error({ duplicatedRuleIds }, 'duplicated rule ids');
67
+ throw new Error('duplicated rule ids');
68
+ }
69
+ };
70
+ loadAdditionalRules();
71
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/rules/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,4CAAoB;AACpB,gDAAwB;AACxB,oDAAsC;AACtC,yCAA0C;AAC1C,iCAAkC;AAClC,6CAA0D;AAG7C,QAAA,aAAa,GAA4B,CAAC,uBAAY,EAAE,eAAQ,CAAC,CAAC;AAClE,QAAA,YAAY,GAA4B,EAAE,CAAC;AAExD,MAAM,mBAAmB,GAAG,GAAG,EAAE;IAC7B,IAAI,CAAC,uBAAc,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,uBAAc,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE;QACjF,eAAM,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,uBAAc,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,sCAAsC,CAAC,CAAC;QACnG,OAAO;KACV;IACD,eAAM,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,uBAAc,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,0BAA0B,CAAC,CAAC;IACvF,MAAM,SAAS,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,EAAE,uBAAc,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;IAC/F,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE;QAC9B,4BAA4B;QAC5B,IAAI;YACA,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YAC5F,8DAA8D;YAC9D,MAAM,aAAa,GAAI,MAAM,CAAC,MAAM,CAAC,UAAU,CAA6B,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;gBACzF,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,UAAU,EAAE;oBACzD,eAAM,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,uBAAuB,CAAC,CAAC;oBAC1D,OAAO,KAAK,CAAC;iBAChB;gBACD,OAAO,IAAI,CAAC;YAChB,CAAC,CAAC,CAAC;YACH,oBAAY,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,CAAC;SACvC;QAAC,OAAO,KAAK,EAAE;YACZ,eAAM,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,sBAAsB,CAAC,CAAC;SAC7D;KACJ;IACD,MAAM,OAAO,GAAG,CAAC,GAAG,qBAAa,EAAE,GAAG,oBAAY,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC3E,MAAM,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,YAAY,EAAE,YAAY,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,KAAK,YAAY,CAAC,CAAC;IACzH,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE;QAC9B,eAAM,CAAC,KAAK,CAAC,EAAE,iBAAiB,EAAE,EAAE,qBAAqB,CAAC,CAAC;QAC3D,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;KAC1C;AACL,CAAC,CAAC;AAEF,mBAAmB,EAAE,CAAC"}
@@ -0,0 +1,5 @@
1
+ import LRUCache from 'lru-cache';
2
+ import type * as Stuntman from '@stuntman/shared';
3
+ export declare const getTrafficStore: (key: string, options?: Stuntman.StorageConfig) => LRUCache<string, Stuntman.LogEntry>;
4
+ export declare const getDnsResolutionCache: (key: string) => LRUCache<string, string>;
5
+ //# sourceMappingURL=storage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,WAAW,CAAC;AACjC,OAAO,KAAK,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAclD,eAAO,MAAM,eAAe,QAAS,MAAM,YAAY,SAAS,aAAa,wCAgB5E,CAAC;AAEF,eAAO,MAAM,qBAAqB,QAAS,MAAM,6BAKhD,CAAC"}
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.getDnsResolutionCache = exports.getTrafficStore = void 0;
7
+ const lru_cache_1 = __importDefault(require("lru-cache"));
8
+ const object_sizeof_1 = __importDefault(require("object-sizeof"));
9
+ const DNS_CACHE_OPTIONS = {
10
+ max: 1000,
11
+ ttl: 1000 * 60 * 15,
12
+ allowStale: false,
13
+ updateAgeOnGet: false,
14
+ updateAgeOnHas: false,
15
+ };
16
+ const trafficStoreInstances = {};
17
+ const dnsResolutionCacheInstances = {};
18
+ const getTrafficStore = (key, options) => {
19
+ if (!(key in trafficStoreInstances)) {
20
+ if (!options) {
21
+ throw new Error('initialize with options first');
22
+ }
23
+ trafficStoreInstances[key] = new lru_cache_1.default({
24
+ max: options.limitCount,
25
+ maxSize: options.limitSize,
26
+ ttl: options.ttl,
27
+ allowStale: false,
28
+ updateAgeOnGet: false,
29
+ updateAgeOnHas: false,
30
+ sizeCalculation: (value) => (0, object_sizeof_1.default)(value),
31
+ });
32
+ }
33
+ return trafficStoreInstances[key];
34
+ };
35
+ exports.getTrafficStore = getTrafficStore;
36
+ const getDnsResolutionCache = (key) => {
37
+ if (!(key in dnsResolutionCacheInstances)) {
38
+ dnsResolutionCacheInstances[key] = new lru_cache_1.default(DNS_CACHE_OPTIONS);
39
+ }
40
+ return dnsResolutionCacheInstances[key];
41
+ };
42
+ exports.getDnsResolutionCache = getDnsResolutionCache;
43
+ //# sourceMappingURL=storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.js","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":";;;;;;AAAA,0DAAiC;AAEjC,kEAAmC;AAEnC,MAAM,iBAAiB,GAAqC;IACxD,GAAG,EAAE,IAAI;IACT,GAAG,EAAE,IAAI,GAAG,EAAE,GAAG,EAAE;IACnB,UAAU,EAAE,KAAK;IACjB,cAAc,EAAE,KAAK;IACrB,cAAc,EAAE,KAAK;CACxB,CAAC;AAEF,MAAM,qBAAqB,GAAwD,EAAE,CAAC;AACtF,MAAM,2BAA2B,GAA6C,EAAE,CAAC;AAE1E,MAAM,eAAe,GAAG,CAAC,GAAW,EAAE,OAAgC,EAAE,EAAE;IAC7E,IAAI,CAAC,CAAC,GAAG,IAAI,qBAAqB,CAAC,EAAE;QACjC,IAAI,CAAC,OAAO,EAAE;YACV,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;SACpD;QACD,qBAAqB,CAAC,GAAG,CAAC,GAAG,IAAI,mBAAQ,CAA4B;YACjE,GAAG,EAAE,OAAO,CAAC,UAAU;YACvB,OAAO,EAAE,OAAO,CAAC,SAAS;YAC1B,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,UAAU,EAAE,KAAK;YACjB,cAAc,EAAE,KAAK;YACrB,cAAc,EAAE,KAAK;YACrB,eAAe,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAA,uBAAM,EAAC,KAAK,CAAC;SAC5C,CAAC,CAAC;KACN;IACD,OAAO,qBAAqB,CAAC,GAAG,CAAE,CAAC;AACvC,CAAC,CAAC;AAhBW,QAAA,eAAe,mBAgB1B;AAEK,MAAM,qBAAqB,GAAG,CAAC,GAAW,EAAE,EAAE;IACjD,IAAI,CAAC,CAAC,GAAG,IAAI,2BAA2B,CAAC,EAAE;QACvC,2BAA2B,CAAC,GAAG,CAAC,GAAG,IAAI,mBAAQ,CAAiB,iBAAiB,CAAC,CAAC;KACtF;IACD,OAAO,2BAA2B,CAAC,GAAG,CAAE,CAAC;AAC7C,CAAC,CAAC;AALW,QAAA,qBAAqB,yBAKhC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stuntman/server",
3
- "version": "0.1.7",
3
+ "version": "0.1.9",
4
4
  "description": "Stuntman - HTTP proxy / mock server with API",
5
5
  "main": "dist/index.js",
6
6
  "repository": {
@@ -66,7 +66,7 @@
66
66
  "CHANGELOG.md"
67
67
  ],
68
68
  "scripts": {
69
- "test": "SUPPRESS_NO_CONFIG_WARNING=1 jest",
69
+ "test": "SUPPRESS_NO_CONFIG_WARNING=1 jest --coverage",
70
70
  "clean": "rm -fr dist",
71
71
  "build": "tsc && cp -rv src/api/webgui dist/api",
72
72
  "lint": "prettier --check \"./{src,test}/**/*\" && eslint \"./{src,test}/**/*\"",