@zze/mock-server 0.2.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (177) hide show
  1. package/README.md +643 -0
  2. package/dist/__tests__/mock-server.test.d.ts +5 -0
  3. package/dist/__tests__/mock-server.test.d.ts.map +1 -0
  4. package/dist/__tests__/mock-server.test.js +599 -0
  5. package/dist/__tests__/mock-server.test.js.map +1 -0
  6. package/dist/admin/__tests__/admin-router.test.d.ts +2 -0
  7. package/dist/admin/__tests__/admin-router.test.d.ts.map +1 -0
  8. package/dist/admin/__tests__/admin-router.test.js +621 -0
  9. package/dist/admin/__tests__/admin-router.test.js.map +1 -0
  10. package/dist/admin/admin-router.d.ts +27 -0
  11. package/dist/admin/admin-router.d.ts.map +1 -0
  12. package/dist/admin/admin-router.js +616 -0
  13. package/dist/admin/admin-router.js.map +1 -0
  14. package/dist/admin/index.d.ts +4 -0
  15. package/dist/admin/index.d.ts.map +1 -0
  16. package/dist/admin/index.js +10 -0
  17. package/dist/admin/index.js.map +1 -0
  18. package/dist/admin/types.d.ts +185 -0
  19. package/dist/admin/types.d.ts.map +1 -0
  20. package/dist/admin/types.js +33 -0
  21. package/dist/admin/types.js.map +1 -0
  22. package/dist/config/__tests__/config-discovery.test.d.ts +2 -0
  23. package/dist/config/__tests__/config-discovery.test.d.ts.map +1 -0
  24. package/dist/config/__tests__/config-discovery.test.js +52 -0
  25. package/dist/config/__tests__/config-discovery.test.js.map +1 -0
  26. package/dist/config/__tests__/config-loader.test.d.ts +2 -0
  27. package/dist/config/__tests__/config-loader.test.d.ts.map +1 -0
  28. package/dist/config/__tests__/config-loader.test.js +124 -0
  29. package/dist/config/__tests__/config-loader.test.js.map +1 -0
  30. package/dist/config/__tests__/file-loader.test.d.ts +2 -0
  31. package/dist/config/__tests__/file-loader.test.d.ts.map +1 -0
  32. package/dist/config/__tests__/file-loader.test.js +63 -0
  33. package/dist/config/__tests__/file-loader.test.js.map +1 -0
  34. package/dist/config/__tests__/fixtures/mock-config/endpoints/products.d.ts +25 -0
  35. package/dist/config/__tests__/fixtures/mock-config/endpoints/products.d.ts.map +1 -0
  36. package/dist/config/__tests__/fixtures/mock-config/endpoints/products.js +25 -0
  37. package/dist/config/__tests__/fixtures/mock-config/endpoints/products.js.map +1 -0
  38. package/dist/config/__tests__/fixtures/mock-config/flows/error-flow.d.ts +11 -0
  39. package/dist/config/__tests__/fixtures/mock-config/flows/error-flow.d.ts.map +1 -0
  40. package/dist/config/__tests__/fixtures/mock-config/flows/error-flow.js +11 -0
  41. package/dist/config/__tests__/fixtures/mock-config/flows/error-flow.js.map +1 -0
  42. package/dist/config/config-discovery.d.ts +23 -0
  43. package/dist/config/config-discovery.d.ts.map +1 -0
  44. package/dist/config/config-discovery.js +60 -0
  45. package/dist/config/config-discovery.js.map +1 -0
  46. package/dist/config/config-loader.d.ts +56 -0
  47. package/dist/config/config-loader.d.ts.map +1 -0
  48. package/dist/config/config-loader.js +162 -0
  49. package/dist/config/config-loader.js.map +1 -0
  50. package/dist/config/config-writer.d.ts +96 -0
  51. package/dist/config/config-writer.d.ts.map +1 -0
  52. package/dist/config/config-writer.js +248 -0
  53. package/dist/config/config-writer.js.map +1 -0
  54. package/dist/config/file-loader.d.ts +16 -0
  55. package/dist/config/file-loader.d.ts.map +1 -0
  56. package/dist/config/file-loader.js +90 -0
  57. package/dist/config/file-loader.js.map +1 -0
  58. package/dist/config/index.d.ts +7 -0
  59. package/dist/config/index.d.ts.map +1 -0
  60. package/dist/config/index.js +23 -0
  61. package/dist/config/index.js.map +1 -0
  62. package/dist/config/types.d.ts +47 -0
  63. package/dist/config/types.d.ts.map +1 -0
  64. package/dist/config/types.js +7 -0
  65. package/dist/config/types.js.map +1 -0
  66. package/dist/index.d.ts +28 -0
  67. package/dist/index.d.ts.map +1 -0
  68. package/dist/index.js +31 -0
  69. package/dist/index.js.map +1 -0
  70. package/dist/mock-server.d.ts +243 -0
  71. package/dist/mock-server.d.ts.map +1 -0
  72. package/dist/mock-server.js +387 -0
  73. package/dist/mock-server.js.map +1 -0
  74. package/dist/resolver/__tests__/response-resolver.test.d.ts +2 -0
  75. package/dist/resolver/__tests__/response-resolver.test.d.ts.map +1 -0
  76. package/dist/resolver/__tests__/response-resolver.test.js +358 -0
  77. package/dist/resolver/__tests__/response-resolver.test.js.map +1 -0
  78. package/dist/resolver/index.d.ts +4 -0
  79. package/dist/resolver/index.d.ts.map +1 -0
  80. package/dist/resolver/index.js +9 -0
  81. package/dist/resolver/index.js.map +1 -0
  82. package/dist/resolver/response-resolver.d.ts +73 -0
  83. package/dist/resolver/response-resolver.d.ts.map +1 -0
  84. package/dist/resolver/response-resolver.js +167 -0
  85. package/dist/resolver/response-resolver.js.map +1 -0
  86. package/dist/resolver/types.d.ts +47 -0
  87. package/dist/resolver/types.d.ts.map +1 -0
  88. package/dist/resolver/types.js +9 -0
  89. package/dist/resolver/types.js.map +1 -0
  90. package/dist/schemas/__tests__/config.validator.test.d.ts +2 -0
  91. package/dist/schemas/__tests__/config.validator.test.d.ts.map +1 -0
  92. package/dist/schemas/__tests__/config.validator.test.js +66 -0
  93. package/dist/schemas/__tests__/config.validator.test.js.map +1 -0
  94. package/dist/schemas/__tests__/endpoint.schema.test.d.ts +2 -0
  95. package/dist/schemas/__tests__/endpoint.schema.test.d.ts.map +1 -0
  96. package/dist/schemas/__tests__/endpoint.schema.test.js +103 -0
  97. package/dist/schemas/__tests__/endpoint.schema.test.js.map +1 -0
  98. package/dist/schemas/__tests__/flow.schema.test.d.ts +2 -0
  99. package/dist/schemas/__tests__/flow.schema.test.d.ts.map +1 -0
  100. package/dist/schemas/__tests__/flow.schema.test.js +92 -0
  101. package/dist/schemas/__tests__/flow.schema.test.js.map +1 -0
  102. package/dist/schemas/config.validator.d.ts +39 -0
  103. package/dist/schemas/config.validator.d.ts.map +1 -0
  104. package/dist/schemas/config.validator.js +117 -0
  105. package/dist/schemas/config.validator.js.map +1 -0
  106. package/dist/schemas/endpoint.schema.d.ts +108 -0
  107. package/dist/schemas/endpoint.schema.d.ts.map +1 -0
  108. package/dist/schemas/endpoint.schema.js +87 -0
  109. package/dist/schemas/endpoint.schema.js.map +1 -0
  110. package/dist/schemas/flow.schema.d.ts +46 -0
  111. package/dist/schemas/flow.schema.d.ts.map +1 -0
  112. package/dist/schemas/flow.schema.js +73 -0
  113. package/dist/schemas/flow.schema.js.map +1 -0
  114. package/dist/schemas/http.schema.d.ts +15 -0
  115. package/dist/schemas/http.schema.d.ts.map +1 -0
  116. package/dist/schemas/http.schema.js +32 -0
  117. package/dist/schemas/http.schema.js.map +1 -0
  118. package/dist/schemas/index.d.ts +6 -0
  119. package/dist/schemas/index.d.ts.map +1 -0
  120. package/dist/schemas/index.js +33 -0
  121. package/dist/schemas/index.js.map +1 -0
  122. package/dist/schemas/scenario.schema.d.ts +54 -0
  123. package/dist/schemas/scenario.schema.d.ts.map +1 -0
  124. package/dist/schemas/scenario.schema.js +75 -0
  125. package/dist/schemas/scenario.schema.js.map +1 -0
  126. package/dist/server/__tests__/mock-server-app.test.d.ts +2 -0
  127. package/dist/server/__tests__/mock-server-app.test.d.ts.map +1 -0
  128. package/dist/server/__tests__/mock-server-app.test.js +296 -0
  129. package/dist/server/__tests__/mock-server-app.test.js.map +1 -0
  130. package/dist/server/index.d.ts +4 -0
  131. package/dist/server/index.d.ts.map +1 -0
  132. package/dist/server/index.js +10 -0
  133. package/dist/server/index.js.map +1 -0
  134. package/dist/server/mock-server-app.d.ts +119 -0
  135. package/dist/server/mock-server-app.d.ts.map +1 -0
  136. package/dist/server/mock-server-app.js +304 -0
  137. package/dist/server/mock-server-app.js.map +1 -0
  138. package/dist/server/types.d.ts +38 -0
  139. package/dist/server/types.d.ts.map +1 -0
  140. package/dist/server/types.js +11 -0
  141. package/dist/server/types.js.map +1 -0
  142. package/dist/state/__tests__/state-manager.test.d.ts +2 -0
  143. package/dist/state/__tests__/state-manager.test.d.ts.map +1 -0
  144. package/dist/state/__tests__/state-manager.test.js +275 -0
  145. package/dist/state/__tests__/state-manager.test.js.map +1 -0
  146. package/dist/state/index.d.ts +3 -0
  147. package/dist/state/index.d.ts.map +1 -0
  148. package/dist/state/index.js +7 -0
  149. package/dist/state/index.js.map +1 -0
  150. package/dist/state/state-manager.d.ts +92 -0
  151. package/dist/state/state-manager.d.ts.map +1 -0
  152. package/dist/state/state-manager.js +198 -0
  153. package/dist/state/state-manager.js.map +1 -0
  154. package/dist/state/types.d.ts +30 -0
  155. package/dist/state/types.d.ts.map +1 -0
  156. package/dist/state/types.js +2 -0
  157. package/dist/state/types.js.map +1 -0
  158. package/dist/ui/assets/index-SADMOgPE.js +10 -0
  159. package/dist/ui/assets/index-rj7m-XdG.css +1 -0
  160. package/dist/ui/index.html +29 -0
  161. package/dist/watcher/__tests__/config-watcher.test.d.ts +2 -0
  162. package/dist/watcher/__tests__/config-watcher.test.d.ts.map +1 -0
  163. package/dist/watcher/__tests__/config-watcher.test.js +372 -0
  164. package/dist/watcher/__tests__/config-watcher.test.js.map +1 -0
  165. package/dist/watcher/config-watcher.d.ts +100 -0
  166. package/dist/watcher/config-watcher.d.ts.map +1 -0
  167. package/dist/watcher/config-watcher.js +358 -0
  168. package/dist/watcher/config-watcher.js.map +1 -0
  169. package/dist/watcher/index.d.ts +7 -0
  170. package/dist/watcher/index.d.ts.map +1 -0
  171. package/dist/watcher/index.js +8 -0
  172. package/dist/watcher/index.js.map +1 -0
  173. package/dist/watcher/types.d.ts +64 -0
  174. package/dist/watcher/types.d.ts.map +1 -0
  175. package/dist/watcher/types.js +15 -0
  176. package/dist/watcher/types.js.map +1 -0
  177. package/package.json +58 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-discovery.d.ts","sourceRoot":"","sources":["../../src/config/config-discovery.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,iDAAiD;IACjD,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,MAAM,EAAE,CAAC,CA6BnB;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOpE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG;IACxD,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAKA"}
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.discoverConfigFiles = discoverConfigFiles;
4
+ exports.directoryExists = directoryExists;
5
+ exports.getConfigDirectories = getConfigDirectories;
6
+ const promises_1 = require("fs/promises");
7
+ const path_1 = require("path");
8
+ const file_loader_js_1 = require("./file-loader.js");
9
+ /**
10
+ * Discover all supported config files in a directory
11
+ */
12
+ async function discoverConfigFiles(directory, options = {}) {
13
+ const { recursive = false } = options;
14
+ const files = [];
15
+ try {
16
+ const entries = await (0, promises_1.readdir)(directory, { withFileTypes: true });
17
+ for (const entry of entries) {
18
+ const fullPath = (0, path_1.join)(directory, entry.name);
19
+ if (entry.isDirectory() && recursive) {
20
+ const subFiles = await discoverConfigFiles(fullPath, options);
21
+ files.push(...subFiles);
22
+ }
23
+ else if (entry.isFile()) {
24
+ const ext = (0, path_1.extname)(entry.name).toLowerCase();
25
+ if ((0, file_loader_js_1.isSupportedExtension)(ext)) {
26
+ files.push(fullPath);
27
+ }
28
+ }
29
+ }
30
+ }
31
+ catch (error) {
32
+ // Directory doesn't exist or can't be read - return empty array
33
+ if (error.code === 'ENOENT') {
34
+ return [];
35
+ }
36
+ throw error;
37
+ }
38
+ return files.sort();
39
+ }
40
+ /**
41
+ * Check if a directory exists
42
+ */
43
+ async function directoryExists(path) {
44
+ try {
45
+ const stats = await (0, promises_1.stat)(path);
46
+ return stats.isDirectory();
47
+ }
48
+ catch {
49
+ return false;
50
+ }
51
+ }
52
+ /**
53
+ * Get the standard config directories from a base config path
54
+ */
55
+ function getConfigDirectories(configPath) {
56
+ return {
57
+ endpointsDir: (0, path_1.join)(configPath, 'endpoints'),
58
+ flowsDir: (0, path_1.join)(configPath, 'flows'),
59
+ };
60
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-discovery.js","sourceRoot":"","sources":["../../src/config/config-discovery.ts"],"names":[],"mappings":";;AAeA,kDAgCC;AAKD,0CAOC;AAKD,oDAQC;AAxED,0CAA4C;AAC5C,+BAAqC;AACrC,qDAAwD;AAUxD;;GAEG;AACI,KAAK,UAAU,mBAAmB,CACvC,SAAiB,EACjB,UAA4B,EAAE;IAE9B,MAAM,EAAE,SAAS,GAAG,KAAK,EAAE,GAAG,OAAO,CAAC;IACtC,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,IAAA,kBAAO,EAAC,SAAS,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAElE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAG,IAAA,WAAI,EAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAE7C,IAAI,KAAK,CAAC,WAAW,EAAE,IAAI,SAAS,EAAE,CAAC;gBACrC,MAAM,QAAQ,GAAG,MAAM,mBAAmB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBAC9D,KAAK,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC;YAC1B,CAAC;iBAAM,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;gBAC1B,MAAM,GAAG,GAAG,IAAA,cAAO,EAAC,KAAK,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;gBAC9C,IAAI,IAAA,qCAAoB,EAAC,GAAG,CAAC,EAAE,CAAC;oBAC9B,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACvB,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,gEAAgE;QAChE,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACvD,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC;AACtB,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,eAAe,CAAC,IAAY;IAChD,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,IAAA,eAAI,EAAC,IAAI,CAAC,CAAC;QAC/B,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAgB,oBAAoB,CAAC,UAAkB;IAIrD,OAAO;QACL,YAAY,EAAE,IAAA,WAAI,EAAC,UAAU,EAAE,WAAW,CAAC;QAC3C,QAAQ,EAAE,IAAA,WAAI,EAAC,UAAU,EAAE,OAAO,CAAC;KACpC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,56 @@
1
+ import type { EndpointConfig, FlowConfig } from '../schemas/index.js';
2
+ import type { ConfigLoadResult } from './types.js';
3
+ /**
4
+ * Configuration loader that discovers and loads endpoint and flow configs
5
+ */
6
+ export declare class ConfigLoader {
7
+ private configPath;
8
+ private endpointsDir;
9
+ private flowsDir;
10
+ constructor(configPath: string);
11
+ /**
12
+ * Get the resolved config path
13
+ */
14
+ getConfigPath(): string;
15
+ /**
16
+ * Get the endpoints directory path
17
+ */
18
+ getEndpointsDir(): string;
19
+ /**
20
+ * Get the flows directory path
21
+ */
22
+ getFlowsDir(): string;
23
+ /**
24
+ * Load all endpoint configurations from the endpoints directory
25
+ */
26
+ loadEndpoints(): Promise<{
27
+ endpoints: EndpointConfig[];
28
+ errors: Array<{
29
+ filePath: string;
30
+ error: string;
31
+ }>;
32
+ }>;
33
+ /**
34
+ * Load all flow configurations from the flows directory
35
+ */
36
+ loadFlows(): Promise<{
37
+ flows: FlowConfig[];
38
+ errors: Array<{
39
+ filePath: string;
40
+ error: string;
41
+ }>;
42
+ }>;
43
+ /**
44
+ * Load all configuration (endpoints and flows) and validate cross-references
45
+ */
46
+ load(): Promise<ConfigLoadResult>;
47
+ /**
48
+ * Reload configuration (used for hot reload)
49
+ */
50
+ reload(): Promise<ConfigLoadResult>;
51
+ }
52
+ /**
53
+ * Create a new ConfigLoader instance
54
+ */
55
+ export declare function createConfigLoader(configPath: string): ConfigLoader;
56
+ //# sourceMappingURL=config-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-loader.d.ts","sourceRoot":"","sources":["../../src/config/config-loader.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAatE,OAAO,KAAK,EAAE,gBAAgB,EAAgB,MAAM,YAAY,CAAC;AAEjE;;GAEG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAS;gBAEb,UAAU,EAAE,MAAM;IAO9B;;OAEG;IACH,aAAa,IAAI,MAAM;IAIvB;;OAEG;IACH,eAAe,IAAI,MAAM;IAIzB;;OAEG;IACH,WAAW,IAAI,MAAM;IAIrB;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC;QAC7B,SAAS,EAAE,cAAc,EAAE,CAAC;QAC5B,MAAM,EAAE,KAAK,CAAC;YAAE,QAAQ,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KACpD,CAAC;IA4CF;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC;QACzB,KAAK,EAAE,UAAU,EAAE,CAAC;QACpB,MAAM,EAAE,KAAK,CAAC;YAAE,QAAQ,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KACpD,CAAC;IA4CF;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,gBAAgB,CAAC;IA6CvC;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,gBAAgB,CAAC;CAG1C;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,YAAY,CAEnE"}
@@ -0,0 +1,162 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ConfigLoader = void 0;
4
+ exports.createConfigLoader = createConfigLoader;
5
+ const path_1 = require("path");
6
+ const index_js_1 = require("../schemas/index.js");
7
+ const file_loader_js_1 = require("./file-loader.js");
8
+ const config_discovery_js_1 = require("./config-discovery.js");
9
+ /**
10
+ * Configuration loader that discovers and loads endpoint and flow configs
11
+ */
12
+ class ConfigLoader {
13
+ constructor(configPath) {
14
+ this.configPath = (0, path_1.resolve)(configPath);
15
+ const dirs = (0, config_discovery_js_1.getConfigDirectories)(this.configPath);
16
+ this.endpointsDir = dirs.endpointsDir;
17
+ this.flowsDir = dirs.flowsDir;
18
+ }
19
+ /**
20
+ * Get the resolved config path
21
+ */
22
+ getConfigPath() {
23
+ return this.configPath;
24
+ }
25
+ /**
26
+ * Get the endpoints directory path
27
+ */
28
+ getEndpointsDir() {
29
+ return this.endpointsDir;
30
+ }
31
+ /**
32
+ * Get the flows directory path
33
+ */
34
+ getFlowsDir() {
35
+ return this.flowsDir;
36
+ }
37
+ /**
38
+ * Load all endpoint configurations from the endpoints directory
39
+ */
40
+ async loadEndpoints() {
41
+ const endpoints = [];
42
+ const errors = [];
43
+ if (!(await (0, config_discovery_js_1.directoryExists)(this.endpointsDir))) {
44
+ return { endpoints, errors };
45
+ }
46
+ const files = await (0, config_discovery_js_1.discoverConfigFiles)(this.endpointsDir, { recursive: true });
47
+ for (const filePath of files) {
48
+ const loadResult = await (0, file_loader_js_1.loadConfigFile)(filePath);
49
+ if (!loadResult.success) {
50
+ errors.push({
51
+ filePath,
52
+ error: loadResult.error || 'Unknown error loading file',
53
+ });
54
+ continue;
55
+ }
56
+ // Handle both single endpoint and array of endpoints
57
+ const configs = Array.isArray(loadResult.data)
58
+ ? loadResult.data
59
+ : [loadResult.data];
60
+ for (const config of configs) {
61
+ const validationResult = (0, index_js_1.validateEndpoint)(config, filePath);
62
+ if (!validationResult.success) {
63
+ errors.push({
64
+ filePath,
65
+ error: (0, index_js_1.formatValidationErrors)(validationResult.errors),
66
+ });
67
+ continue;
68
+ }
69
+ endpoints.push(validationResult.data);
70
+ }
71
+ }
72
+ return { endpoints, errors };
73
+ }
74
+ /**
75
+ * Load all flow configurations from the flows directory
76
+ */
77
+ async loadFlows() {
78
+ const flows = [];
79
+ const errors = [];
80
+ if (!(await (0, config_discovery_js_1.directoryExists)(this.flowsDir))) {
81
+ return { flows, errors };
82
+ }
83
+ const files = await (0, config_discovery_js_1.discoverConfigFiles)(this.flowsDir, { recursive: true });
84
+ for (const filePath of files) {
85
+ const loadResult = await (0, file_loader_js_1.loadConfigFile)(filePath);
86
+ if (!loadResult.success) {
87
+ errors.push({
88
+ filePath,
89
+ error: loadResult.error || 'Unknown error loading file',
90
+ });
91
+ continue;
92
+ }
93
+ // Handle both single flow and array of flows
94
+ const configs = Array.isArray(loadResult.data)
95
+ ? loadResult.data
96
+ : [loadResult.data];
97
+ for (const config of configs) {
98
+ const validationResult = (0, index_js_1.validateFlow)(config, filePath);
99
+ if (!validationResult.success) {
100
+ errors.push({
101
+ filePath,
102
+ error: (0, index_js_1.formatValidationErrors)(validationResult.errors),
103
+ });
104
+ continue;
105
+ }
106
+ flows.push(validationResult.data);
107
+ }
108
+ }
109
+ return { flows, errors };
110
+ }
111
+ /**
112
+ * Load all configuration (endpoints and flows) and validate cross-references
113
+ */
114
+ async load() {
115
+ const errors = [];
116
+ // Load endpoints
117
+ const endpointResult = await this.loadEndpoints();
118
+ errors.push(...endpointResult.errors);
119
+ // Load flows
120
+ const flowResult = await this.loadFlows();
121
+ errors.push(...flowResult.errors);
122
+ // If there were file-level errors, return early
123
+ if (errors.length > 0) {
124
+ return {
125
+ success: false,
126
+ errors,
127
+ };
128
+ }
129
+ // Validate cross-references and uniqueness
130
+ const validationResult = (0, index_js_1.validateConfiguration)(endpointResult.endpoints, flowResult.flows);
131
+ if (!validationResult.success) {
132
+ return {
133
+ success: false,
134
+ errors: validationResult.errors.map((err) => ({
135
+ filePath: err.path || 'configuration',
136
+ error: err.message,
137
+ })),
138
+ };
139
+ }
140
+ return {
141
+ success: true,
142
+ config: {
143
+ endpoints: endpointResult.endpoints,
144
+ flows: flowResult.flows,
145
+ },
146
+ errors: [],
147
+ };
148
+ }
149
+ /**
150
+ * Reload configuration (used for hot reload)
151
+ */
152
+ async reload() {
153
+ return this.load();
154
+ }
155
+ }
156
+ exports.ConfigLoader = ConfigLoader;
157
+ /**
158
+ * Create a new ConfigLoader instance
159
+ */
160
+ function createConfigLoader(configPath) {
161
+ return new ConfigLoader(configPath);
162
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-loader.js","sourceRoot":"","sources":["../../src/config/config-loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,96 @@
1
+ /**
2
+ * Config file writer - handles persisting endpoint and flow configs to disk
3
+ */
4
+ import type { EndpointConfig, FlowConfig } from '../schemas/index.js';
5
+ /**
6
+ * Result of a write operation
7
+ */
8
+ export interface WriteResult {
9
+ success: boolean;
10
+ filePath?: string;
11
+ error?: string;
12
+ }
13
+ /**
14
+ * Options for ConfigWriter
15
+ */
16
+ export interface ConfigWriterOptions {
17
+ /** Directory for endpoint config files */
18
+ endpointsDir: string;
19
+ /** Directory for flow config files */
20
+ flowsDir: string;
21
+ }
22
+ /**
23
+ * ConfigWriter handles persisting endpoint and flow configurations to disk
24
+ */
25
+ export declare class ConfigWriter {
26
+ private endpointsDir;
27
+ private flowsDir;
28
+ constructor(options: ConfigWriterOptions);
29
+ /**
30
+ * Get the file path for an endpoint config
31
+ */
32
+ getEndpointFilePath(endpointId: string): string;
33
+ /**
34
+ * Get the file path for a flow config
35
+ */
36
+ getFlowFilePath(flowId: string): string;
37
+ /**
38
+ * Check if an endpoint file exists
39
+ */
40
+ endpointExists(endpointId: string): Promise<boolean>;
41
+ /**
42
+ * Check if a flow file exists
43
+ */
44
+ flowExists(flowId: string): Promise<boolean>;
45
+ /**
46
+ * Find an existing endpoint file by ID (could be .json, .js, or .ts)
47
+ */
48
+ findEndpointFile(endpointId: string): Promise<string | null>;
49
+ /**
50
+ * Find an existing flow file by ID (could be .json, .js, or .ts)
51
+ */
52
+ findFlowFile(flowId: string): Promise<string | null>;
53
+ /**
54
+ * Validate an endpoint config
55
+ */
56
+ validateEndpoint(data: unknown): {
57
+ success: boolean;
58
+ data?: EndpointConfig;
59
+ error?: string;
60
+ };
61
+ /**
62
+ * Validate a flow config
63
+ */
64
+ validateFlow(data: unknown): {
65
+ success: boolean;
66
+ data?: FlowConfig;
67
+ error?: string;
68
+ };
69
+ /**
70
+ * Write an endpoint config to disk
71
+ * Creates a new file or overwrites existing .json file
72
+ */
73
+ writeEndpoint(endpoint: EndpointConfig): Promise<WriteResult>;
74
+ /**
75
+ * Write a flow config to disk
76
+ */
77
+ writeFlow(flow: FlowConfig): Promise<WriteResult>;
78
+ /**
79
+ * Delete an endpoint file
80
+ */
81
+ deleteEndpoint(endpointId: string): Promise<WriteResult>;
82
+ /**
83
+ * Delete a flow file
84
+ */
85
+ deleteFlow(flowId: string): Promise<WriteResult>;
86
+ /**
87
+ * Clean endpoint data for JSON serialization
88
+ * Converts function bodies to null (they can't be serialized)
89
+ */
90
+ private cleanEndpointForJson;
91
+ }
92
+ /**
93
+ * Create a ConfigWriter instance
94
+ */
95
+ export declare function createConfigWriter(options: ConfigWriterOptions): ConfigWriter;
96
+ //# sourceMappingURL=config-writer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-writer.d.ts","sourceRoot":"","sources":["../../src/config/config-writer.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAGtE;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,0CAA0C;IAC1C,YAAY,EAAE,MAAM,CAAC;IACrB,sCAAsC;IACtC,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAS;gBAEb,OAAO,EAAE,mBAAmB;IAKxC;;OAEG;IACH,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM;IAI/C;;OAEG;IACH,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAIvC;;OAEG;IACG,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAU1D;;OAEG;IACG,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAUlD;;OAEG;IACG,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAclE;;OAEG;IACG,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAc1D;;OAEG;IACH,gBAAgB,CAAC,IAAI,EAAE,OAAO,GAAG;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,cAAc,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE;IAS5F;;OAEG;IACH,YAAY,CAAC,IAAI,EAAE,OAAO,GAAG;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,UAAU,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE;IASpF;;;OAGG;IACG,aAAa,CAAC,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC,WAAW,CAAC;IAuBnE;;OAEG;IACG,SAAS,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC;IAoBvD;;OAEG;IACG,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAkB9D;;OAEG;IACG,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAkBtD;;;OAGG;IACH,OAAO,CAAC,oBAAoB;CAU7B;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,mBAAmB,GAAG,YAAY,CAE7E"}
@@ -0,0 +1,248 @@
1
+ "use strict";
2
+ /**
3
+ * Config file writer - handles persisting endpoint and flow configs to disk
4
+ */
5
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ var desc = Object.getOwnPropertyDescriptor(m, k);
8
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9
+ desc = { enumerable: true, get: function() { return m[k]; } };
10
+ }
11
+ Object.defineProperty(o, k2, desc);
12
+ }) : (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ o[k2] = m[k];
15
+ }));
16
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
17
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
18
+ }) : function(o, v) {
19
+ o["default"] = v;
20
+ });
21
+ var __importStar = (this && this.__importStar) || (function () {
22
+ var ownKeys = function(o) {
23
+ ownKeys = Object.getOwnPropertyNames || function (o) {
24
+ var ar = [];
25
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
26
+ return ar;
27
+ };
28
+ return ownKeys(o);
29
+ };
30
+ return function (mod) {
31
+ if (mod && mod.__esModule) return mod;
32
+ var result = {};
33
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
34
+ __setModuleDefault(result, mod);
35
+ return result;
36
+ };
37
+ })();
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.ConfigWriter = void 0;
40
+ exports.createConfigWriter = createConfigWriter;
41
+ const fs = __importStar(require("fs/promises"));
42
+ const path = __importStar(require("path"));
43
+ const index_js_1 = require("../schemas/index.js");
44
+ /**
45
+ * ConfigWriter handles persisting endpoint and flow configurations to disk
46
+ */
47
+ class ConfigWriter {
48
+ constructor(options) {
49
+ this.endpointsDir = options.endpointsDir;
50
+ this.flowsDir = options.flowsDir;
51
+ }
52
+ /**
53
+ * Get the file path for an endpoint config
54
+ */
55
+ getEndpointFilePath(endpointId) {
56
+ return path.join(this.endpointsDir, `${endpointId}.json`);
57
+ }
58
+ /**
59
+ * Get the file path for a flow config
60
+ */
61
+ getFlowFilePath(flowId) {
62
+ return path.join(this.flowsDir, `${flowId}.json`);
63
+ }
64
+ /**
65
+ * Check if an endpoint file exists
66
+ */
67
+ async endpointExists(endpointId) {
68
+ const filePath = this.getEndpointFilePath(endpointId);
69
+ try {
70
+ await fs.access(filePath);
71
+ return true;
72
+ }
73
+ catch {
74
+ return false;
75
+ }
76
+ }
77
+ /**
78
+ * Check if a flow file exists
79
+ */
80
+ async flowExists(flowId) {
81
+ const filePath = this.getFlowFilePath(flowId);
82
+ try {
83
+ await fs.access(filePath);
84
+ return true;
85
+ }
86
+ catch {
87
+ return false;
88
+ }
89
+ }
90
+ /**
91
+ * Find an existing endpoint file by ID (could be .json, .js, or .ts)
92
+ */
93
+ async findEndpointFile(endpointId) {
94
+ const extensions = ['.json', '.js', '.ts', '.mjs', '.mts'];
95
+ for (const ext of extensions) {
96
+ const filePath = path.join(this.endpointsDir, `${endpointId}${ext}`);
97
+ try {
98
+ await fs.access(filePath);
99
+ return filePath;
100
+ }
101
+ catch {
102
+ // Continue checking
103
+ }
104
+ }
105
+ return null;
106
+ }
107
+ /**
108
+ * Find an existing flow file by ID (could be .json, .js, or .ts)
109
+ */
110
+ async findFlowFile(flowId) {
111
+ const extensions = ['.json', '.js', '.ts', '.mjs', '.mts'];
112
+ for (const ext of extensions) {
113
+ const filePath = path.join(this.flowsDir, `${flowId}${ext}`);
114
+ try {
115
+ await fs.access(filePath);
116
+ return filePath;
117
+ }
118
+ catch {
119
+ // Continue checking
120
+ }
121
+ }
122
+ return null;
123
+ }
124
+ /**
125
+ * Validate an endpoint config
126
+ */
127
+ validateEndpoint(data) {
128
+ const result = index_js_1.EndpointConfigSchema.safeParse(data);
129
+ if (result.success) {
130
+ return { success: true, data: result.data };
131
+ }
132
+ const errors = result.error.issues.map((i) => `${i.path.join('.')}: ${i.message}`).join('; ');
133
+ return { success: false, error: errors };
134
+ }
135
+ /**
136
+ * Validate a flow config
137
+ */
138
+ validateFlow(data) {
139
+ const result = index_js_1.FlowConfigSchema.safeParse(data);
140
+ if (result.success) {
141
+ return { success: true, data: result.data };
142
+ }
143
+ const errors = result.error.issues.map((i) => `${i.path.join('.')}: ${i.message}`).join('; ');
144
+ return { success: false, error: errors };
145
+ }
146
+ /**
147
+ * Write an endpoint config to disk
148
+ * Creates a new file or overwrites existing .json file
149
+ */
150
+ async writeEndpoint(endpoint) {
151
+ const filePath = this.getEndpointFilePath(endpoint.id);
152
+ try {
153
+ // Ensure directory exists
154
+ await fs.mkdir(this.endpointsDir, { recursive: true });
155
+ // Prepare clean endpoint data (remove function bodies for JSON)
156
+ const cleanEndpoint = this.cleanEndpointForJson(endpoint);
157
+ // Write formatted JSON
158
+ const content = JSON.stringify(cleanEndpoint, null, 2) + '\n';
159
+ await fs.writeFile(filePath, content, 'utf-8');
160
+ return { success: true, filePath };
161
+ }
162
+ catch (error) {
163
+ return {
164
+ success: false,
165
+ error: error instanceof Error ? error.message : 'Unknown error',
166
+ };
167
+ }
168
+ }
169
+ /**
170
+ * Write a flow config to disk
171
+ */
172
+ async writeFlow(flow) {
173
+ const filePath = this.getFlowFilePath(flow.id);
174
+ try {
175
+ // Ensure directory exists
176
+ await fs.mkdir(this.flowsDir, { recursive: true });
177
+ // Write formatted JSON
178
+ const content = JSON.stringify(flow, null, 2) + '\n';
179
+ await fs.writeFile(filePath, content, 'utf-8');
180
+ return { success: true, filePath };
181
+ }
182
+ catch (error) {
183
+ return {
184
+ success: false,
185
+ error: error instanceof Error ? error.message : 'Unknown error',
186
+ };
187
+ }
188
+ }
189
+ /**
190
+ * Delete an endpoint file
191
+ */
192
+ async deleteEndpoint(endpointId) {
193
+ const existingFile = await this.findEndpointFile(endpointId);
194
+ if (!existingFile) {
195
+ return { success: false, error: `Endpoint "${endpointId}" not found` };
196
+ }
197
+ try {
198
+ await fs.unlink(existingFile);
199
+ return { success: true, filePath: existingFile };
200
+ }
201
+ catch (error) {
202
+ return {
203
+ success: false,
204
+ error: error instanceof Error ? error.message : 'Unknown error',
205
+ };
206
+ }
207
+ }
208
+ /**
209
+ * Delete a flow file
210
+ */
211
+ async deleteFlow(flowId) {
212
+ const existingFile = await this.findFlowFile(flowId);
213
+ if (!existingFile) {
214
+ return { success: false, error: `Flow "${flowId}" not found` };
215
+ }
216
+ try {
217
+ await fs.unlink(existingFile);
218
+ return { success: true, filePath: existingFile };
219
+ }
220
+ catch (error) {
221
+ return {
222
+ success: false,
223
+ error: error instanceof Error ? error.message : 'Unknown error',
224
+ };
225
+ }
226
+ }
227
+ /**
228
+ * Clean endpoint data for JSON serialization
229
+ * Converts function bodies to null (they can't be serialized)
230
+ */
231
+ cleanEndpointForJson(endpoint) {
232
+ return {
233
+ ...endpoint,
234
+ scenarios: endpoint.scenarios.map((scenario) => ({
235
+ ...scenario,
236
+ // If body is a function, convert to a placeholder or keep as-is for objects
237
+ body: typeof scenario.body === 'function' ? { _note: 'Function body - edit in .ts file' } : scenario.body,
238
+ })),
239
+ };
240
+ }
241
+ }
242
+ exports.ConfigWriter = ConfigWriter;
243
+ /**
244
+ * Create a ConfigWriter instance
245
+ */
246
+ function createConfigWriter(options) {
247
+ return new ConfigWriter(options);
248
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-writer.js","sourceRoot":"","sources":["../../src/config/config-writer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { FileLoadResult, SupportedExtension } from './types.js';
2
+ /**
3
+ * Check if a file extension is supported
4
+ */
5
+ export declare function isSupportedExtension(ext: string): ext is SupportedExtension;
6
+ /**
7
+ * Load a single configuration file
8
+ * Supports .json, .js, .ts, .mjs, .mts extensions
9
+ */
10
+ export declare function loadConfigFile<T>(filePath: string): Promise<FileLoadResult<T>>;
11
+ /**
12
+ * Clear the jiti module cache for a specific file
13
+ * Used during hot reload to ensure fresh imports
14
+ */
15
+ export declare function clearModuleCache(filePath: string): void;
16
+ //# sourceMappingURL=file-loader.d.ts.map