@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
+ :root{--primary: #4f46e5;--primary-hover: #4338ca;--success: #10b981;--warning: #f59e0b;--error: #ef4444;--bg: #f5f5f5;--card-bg: #ffffff;--border: #e5e7eb;--text: #1f2937;--text-muted: #6b7280}*{box-sizing:border-box}body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,sans-serif;background:var(--bg);color:var(--text);margin:0;padding:0}.app{max-width:1200px;margin:0 auto;padding:20px}.header{display:flex;justify-content:space-between;align-items:center;margin-bottom:24px;padding-bottom:16px;border-bottom:1px solid var(--border)}.header h1{font-size:24px;font-weight:600;color:var(--text)}.header-actions{display:flex;gap:12px}.btn{padding:8px 16px;border:none;border-radius:6px;font-size:14px;font-weight:500;cursor:pointer;transition:all .15s ease}.btn-primary{background:var(--primary);color:#fff}.btn-primary:hover{background:var(--primary-hover)}.btn-secondary{background:var(--card-bg);color:var(--text);border:1px solid var(--border)}.btn-secondary:hover{background:var(--bg)}.btn-danger{background:var(--error);color:#fff}.btn-danger:hover{background:#dc2626}.btn-sm{padding:4px 10px;font-size:12px}.grid{display:grid;grid-template-columns:1fr 300px;gap:24px}.main-content{display:flex;flex-direction:column;gap:24px}.card{background:var(--card-bg);border-radius:8px;border:1px solid var(--border);overflow:hidden}.card-header{padding:16px;border-bottom:1px solid var(--border);display:flex;justify-content:space-between;align-items:center}.card-header h2{font-size:16px;font-weight:600}.card-body{padding:16px}.endpoint-list{display:flex;flex-direction:column;gap:12px}.endpoint-item{border:1px solid var(--border);border-radius:6px;overflow:hidden}.endpoint-header{padding:12px 16px;background:var(--bg);display:flex;justify-content:space-between;align-items:center;cursor:pointer}.endpoint-header:hover{background:#e5e7eb}.endpoint-info{display:flex;align-items:center;gap:12px}.method-badge{padding:2px 8px;border-radius:4px;font-size:12px;font-weight:600;text-transform:uppercase}.method-GET{background:#dbeafe;color:#1d4ed8}.method-POST{background:#dcfce7;color:#16a34a}.method-PUT{background:#fef3c7;color:#d97706}.method-DELETE{background:#fee2e2;color:#dc2626}.method-PATCH{background:#f3e8ff;color:#9333ea}.endpoint-path{font-family:SF Mono,Monaco,monospace;font-size:13px}.endpoint-id{font-size:12px;color:var(--text-muted)}.scenarios-list{padding:12px 16px;border-top:1px solid var(--border)}.scenario-item{display:flex;justify-content:space-between;align-items:center;padding:8px 0;border-bottom:1px solid var(--border)}.scenario-item:last-child{border-bottom:none}.scenario-info{display:flex;align-items:center;gap:8px}.scenario-name{font-size:14px}.badge{padding:2px 6px;border-radius:4px;font-size:10px;font-weight:600;text-transform:uppercase}.badge-default{background:#dbeafe;color:#1d4ed8}.badge-active{background:#dcfce7;color:#16a34a}.sidebar{display:flex;flex-direction:column;gap:24px}.state-panel .state-item{display:flex;justify-content:space-between;align-items:center;padding:8px 0;border-bottom:1px solid var(--border)}.state-panel .state-item:last-child{border-bottom:none}.state-label{font-size:13px;color:var(--text-muted)}.state-value{font-size:13px;font-weight:500}.flow-list{display:flex;flex-direction:column;gap:8px}.flow-item{display:flex;justify-content:space-between;align-items:center;padding:10px 12px;border:1px solid var(--border);border-radius:6px;cursor:pointer;transition:all .15s ease}.flow-item:hover{border-color:var(--primary)}.flow-item.active{border-color:var(--success);background:#f0fdf4}.flow-name{font-size:14px;font-weight:500}.flow-description{font-size:12px;color:var(--text-muted);margin-top:2px}.flows-card{display:flex;flex-direction:column;max-height:600px}.flows-body{flex:1;overflow-y:auto;min-height:0}.active-flow-banner{padding:8px 12px;background:#f0fdf4;border-bottom:1px solid #bbf7d0;display:flex;align-items:center;gap:8px;font-size:13px}.active-flow-label{color:var(--success);font-weight:600}.active-flow-name{font-weight:500}.active-flow-category{color:var(--text-muted)}.flows-search{padding:8px 12px;border-bottom:1px solid var(--border);display:flex;align-items:center;gap:8px;position:relative}.flows-search-input{flex:1;padding:6px 28px 6px 10px;border:1px solid var(--border);border-radius:4px;font-size:13px}.flows-search-input:focus{outline:none;border-color:var(--primary)}.flows-search-clear{position:absolute;right:20px;background:none;border:none;font-size:18px;color:var(--text-muted);cursor:pointer;padding:0 4px;line-height:1}.flows-search-clear:hover{color:var(--text)}.flow-groups{display:flex;flex-direction:column}.flow-group{border-bottom:1px solid var(--border)}.flow-group:last-child{border-bottom:none}.flow-group-header{display:flex;align-items:center;gap:8px;padding:10px 12px;cursor:pointer;-webkit-user-select:none;user-select:none;background:var(--bg-primary);transition:background .15s ease}.flow-group-header:hover{background:var(--bg-secondary)}.flow-group-header.has-active{background:#f0fdf4}.flow-group-toggle{font-size:10px;color:var(--text-muted);width:12px}.flow-group-name{flex:1;font-weight:600;font-size:13px}.flow-group-count{background:var(--bg-secondary);color:var(--text-muted);font-size:11px;padding:2px 6px;border-radius:10px;font-weight:500}.flow-group-items{display:flex;flex-direction:column;gap:4px;padding:8px 12px;background:var(--bg-secondary)}.flow-group-items .flow-item{background:var(--bg-primary);padding:8px 10px}.flow-item-content{flex:1;min-width:0}.flow-meta{display:flex;gap:8px;margin-top:4px}.flow-endpoints{font-size:11px;color:var(--text-muted)}.loading{display:flex;justify-content:center;align-items:center;padding:40px;color:var(--text-muted)}.error{padding:16px;background:#fef2f2;border:1px solid #fecaca;border-radius:6px;color:var(--error)}.empty{padding:24px;text-align:center;color:var(--text-muted)}@media(max-width:900px){.grid{grid-template-columns:1fr}.sidebar{order:-1}}.btn:disabled{opacity:.6;cursor:not-allowed}.btn-success{background:var(--success);color:#fff}.btn-success:hover:not(:disabled){background:#059669}.modal-overlay{position:fixed;inset:0;background:#00000080;display:flex;justify-content:center;align-items:center;z-index:1000;padding:20px}.modal{background:var(--card-bg);border-radius:12px;box-shadow:0 20px 40px #0003;width:100%;max-width:700px;max-height:90vh;display:flex;flex-direction:column;overflow:hidden}.modal-header{padding:16px 20px;border-bottom:1px solid var(--border);display:flex;justify-content:space-between;align-items:center}.modal-header h2{font-size:18px;font-weight:600;margin:0}.modal-close{background:none;border:none;font-size:24px;cursor:pointer;color:var(--text-muted);padding:0;line-height:1}.modal-close:hover{color:var(--text)}.modal-body{padding:20px;overflow-y:auto;flex:1}.modal-footer{padding:16px 20px;border-top:1px solid var(--border);display:flex;justify-content:flex-end;gap:12px}.modal-error{margin-top:12px;padding:10px 12px;background:#fef2f2;border:1px solid #fecaca;border-radius:6px;color:var(--error);font-size:13px}.json-editor{display:flex;flex-direction:column;gap:8px}.json-editor-header{display:flex;justify-content:space-between;align-items:center}.json-editor-label{font-size:14px;font-weight:500;color:var(--text)}.json-editor-textarea{width:100%;padding:12px;font-family:SF Mono,Monaco,Cascadia Code,monospace;font-size:13px;line-height:1.5;border:1px solid var(--border);border-radius:6px;background:#fafafa;color:var(--text);resize:vertical;outline:none;transition:border-color .15s ease}.json-editor-textarea:focus{border-color:var(--primary);box-shadow:0 0 0 3px #4f46e51a}.json-editor-textarea.json-editor-error{border-color:var(--error)}.json-editor-textarea.json-editor-error:focus{box-shadow:0 0 0 3px #ef44441a}.json-editor-error-message{padding:8px 10px;background:#fef2f2;border:1px solid #fecaca;border-radius:4px;color:var(--error);font-size:12px;font-family:SF Mono,Monaco,Cascadia Code,monospace}.endpoint-header-actions{display:flex;gap:8px}.endpoint-actions{display:flex;gap:6px;margin-left:auto}.btn-icon{padding:4px 8px;font-size:12px;background:transparent;border:1px solid var(--border);border-radius:4px;cursor:pointer;color:var(--text-muted)}.btn-icon:hover{background:var(--bg);color:var(--text)}.btn-icon.btn-danger{border-color:transparent}.btn-icon.btn-danger:hover{background:#fef2f2;color:var(--error);border-color:#fecaca}.confirm-dialog{text-align:center}.confirm-dialog p{margin:0 0 20px;font-size:15px;color:var(--text)}.confirm-dialog .btn-group{display:flex;justify-content:center;gap:12px}.flow-item.has-actions{cursor:default}.flow-item.has-actions .flow-item-content{cursor:pointer}.flow-item-actions{display:flex;align-items:center;gap:8px}.flow-action-buttons{display:flex;gap:4px;opacity:0;transition:opacity .15s ease}.flow-item:hover .flow-action-buttons{opacity:1}.btn-danger-icon:hover{color:var(--error)}.card-header-actions{display:flex;gap:8px}.modal-large{max-width:900px}.flow-editor-modal .modal-body{display:flex;flex-direction:column;gap:20px}.flow-editor-fields{display:flex;flex-direction:column;gap:16px}.form-row{display:flex;gap:16px}.form-group{flex:1;display:flex;flex-direction:column;gap:6px}.form-group-wide{flex:2}.form-group label{font-size:13px;font-weight:500;color:var(--text)}.form-group input{width:100%;padding:8px 12px;border:1px solid var(--border);border-radius:6px;font-size:14px;transition:border-color .15s ease;box-sizing:border-box}.form-group input:focus{outline:none;border-color:var(--primary)}.form-group input.disabled{background:var(--bg-secondary);color:var(--text-muted);cursor:not-allowed}.form-hint{font-size:11px;color:var(--text-muted)}.required{color:var(--error)}.category-input,.category-input-wrapper{position:relative}.category-input-wrapper input{width:100%}.category-suggestions{position:absolute;top:100%;left:0;right:0;background:var(--card-bg);border:1px solid var(--border);border-radius:6px;box-shadow:0 4px 12px #0000001a;z-index:10;max-height:150px;overflow-y:auto;margin-top:4px}.category-suggestion{display:block;width:100%;text-align:left;padding:8px 12px;background:none;border:none;font-size:13px;cursor:pointer}.category-suggestion:hover{background:var(--bg-secondary)}.flow-editor-picker{border-top:1px solid var(--border);padding-top:20px}.flow-editor-picker h4{margin:0 0 4px;font-size:15px;font-weight:600}.picker-description{font-size:13px;color:var(--text-muted);margin:0 0 12px}.endpoint-scenario-picker{border:1px solid var(--border);border-radius:8px;overflow:hidden}.picker-header{display:flex;justify-content:space-between;align-items:center;padding:10px 12px;background:var(--bg-secondary);border-bottom:1px solid var(--border)}.picker-stats{font-size:13px;color:var(--text-muted)}.picker-actions{display:flex;gap:8px}.picker-search{padding:8px 12px;border-bottom:1px solid var(--border);position:relative}.picker-search-input{width:100%;padding:6px 28px 6px 10px;border:1px solid var(--border);border-radius:4px;font-size:13px}.picker-search-input:focus{outline:none;border-color:var(--primary)}.picker-search-clear{position:absolute;right:20px;top:50%;transform:translateY(-50%);background:none;border:none;font-size:18px;color:var(--text-muted);cursor:pointer;padding:0 4px;line-height:1}.picker-list{max-height:300px;overflow-y:auto}.picker-empty{padding:24px;text-align:center;color:var(--text-muted)}.picker-endpoint{border-bottom:1px solid var(--border)}.picker-endpoint:last-child{border-bottom:none}.picker-endpoint.has-selection{background:#f0fdf4}.picker-endpoint-header{display:flex;align-items:center;gap:8px;padding:10px 12px;cursor:pointer;-webkit-user-select:none;user-select:none}.picker-endpoint-header:hover{background:var(--bg-secondary)}.picker-toggle{font-size:10px;color:var(--text-muted);width:12px}.picker-endpoint-path{font-family:SF Mono,Monaco,monospace;font-size:13px;flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.picker-selected-badge{font-size:11px;padding:2px 6px;background:var(--success);color:#fff;border-radius:4px}.picker-scenarios{padding:8px 12px 8px 32px;background:var(--bg-secondary);display:flex;flex-direction:column;gap:6px}.picker-scenario{display:flex;align-items:center;gap:8px;padding:6px 10px;background:var(--card-bg);border:1px solid var(--border);border-radius:4px;cursor:pointer;transition:all .15s ease}.picker-scenario:hover{border-color:var(--primary)}.picker-scenario.selected{border-color:var(--success);background:#f0fdf4}.picker-scenario input[type=radio]{margin:0}.picker-scenario-name{font-size:13px;font-weight:500}.picker-scenario-id{font-size:11px;color:var(--text-muted);font-family:SF Mono,Monaco,monospace}.picker-scenario-default{font-size:10px;padding:1px 4px;background:var(--primary);color:#fff;border-radius:3px;margin-left:auto}.picker-remove{padding:4px 8px;color:var(--text-muted);font-size:12px}.btn-link{background:none;border:none;color:var(--primary);cursor:pointer;text-decoration:none}.btn-link:hover{text-decoration:underline}
@@ -0,0 +1,29 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+
4
+ <head>
5
+ <meta charset="UTF-8" />
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
+ <title>Mock Server Admin</title>
8
+ <style>
9
+ * {
10
+ box-sizing: border-box;
11
+ margin: 0;
12
+ padding: 0;
13
+ }
14
+
15
+ body {
16
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif;
17
+ background: #f5f5f5;
18
+ color: #333;
19
+ }
20
+ </style>
21
+ <script type="module" crossorigin src="/mock-admin/assets/index-SADMOgPE.js"></script>
22
+ <link rel="stylesheet" crossorigin href="/mock-admin/assets/index-rj7m-XdG.css">
23
+ </head>
24
+
25
+ <body>
26
+ <div id="root"></div>
27
+ </body>
28
+
29
+ </html>
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=config-watcher.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-watcher.test.d.ts","sourceRoot":"","sources":["../../../src/watcher/__tests__/config-watcher.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,372 @@
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
+ const vitest_1 = require("vitest");
7
+ const promises_1 = __importDefault(require("fs/promises"));
8
+ const path_1 = __importDefault(require("path"));
9
+ const os_1 = __importDefault(require("os"));
10
+ const config_watcher_js_1 = require("../config-watcher.js");
11
+ const index_js_1 = require("../../config/index.js");
12
+ const index_js_2 = require("../../server/index.js");
13
+ const types_js_1 = require("../types.js");
14
+ (0, vitest_1.describe)('ConfigWatcher', () => {
15
+ let tempDir;
16
+ let endpointsDir;
17
+ let flowsDir;
18
+ let configLoader;
19
+ let watcher;
20
+ // Helper to create a temp directory with config structure
21
+ async function createTempConfigDir() {
22
+ const dir = await promises_1.default.mkdtemp(path_1.default.join(os_1.default.tmpdir(), 'mock-watcher-test-'));
23
+ await promises_1.default.mkdir(path_1.default.join(dir, 'endpoints'), { recursive: true });
24
+ await promises_1.default.mkdir(path_1.default.join(dir, 'flows'), { recursive: true });
25
+ return dir;
26
+ }
27
+ // Create a valid endpoint configuration
28
+ function createEndpointConfig(id, method, urlPath, body = []) {
29
+ return {
30
+ id,
31
+ method,
32
+ path: urlPath,
33
+ scenarios: [
34
+ {
35
+ id: 'success',
36
+ name: 'Success Response',
37
+ status: 200,
38
+ body,
39
+ },
40
+ {
41
+ id: 'error',
42
+ name: 'Error Response',
43
+ status: 500,
44
+ body: { error: 'Server Error' },
45
+ },
46
+ ],
47
+ defaultScenarioId: 'success',
48
+ };
49
+ }
50
+ // Helper to write a valid endpoint config
51
+ async function writeEndpoint(name, content) {
52
+ const filePath = path_1.default.join(endpointsDir, `${name}.json`);
53
+ await promises_1.default.writeFile(filePath, JSON.stringify(content, null, 2));
54
+ return filePath;
55
+ }
56
+ // Helper to write a valid flow config
57
+ async function writeFlow(name, content) {
58
+ const filePath = path_1.default.join(flowsDir, `${name}.json`);
59
+ await promises_1.default.writeFile(filePath, JSON.stringify(content, null, 2));
60
+ return filePath;
61
+ }
62
+ // Helper to wait for a condition with timeout
63
+ async function waitFor(condition, timeout = 2000, interval = 50) {
64
+ const start = Date.now();
65
+ while (!condition()) {
66
+ if (Date.now() - start > timeout) {
67
+ throw new Error('Timeout waiting for condition');
68
+ }
69
+ await new Promise((resolve) => setTimeout(resolve, interval));
70
+ }
71
+ }
72
+ (0, vitest_1.beforeEach)(async () => {
73
+ tempDir = await createTempConfigDir();
74
+ endpointsDir = path_1.default.join(tempDir, 'endpoints');
75
+ flowsDir = path_1.default.join(tempDir, 'flows');
76
+ configLoader = (0, index_js_1.createConfigLoader)(tempDir);
77
+ });
78
+ (0, vitest_1.afterEach)(async () => {
79
+ if (watcher) {
80
+ await watcher.stop();
81
+ }
82
+ // Clean up temp directory
83
+ await promises_1.default.rm(tempDir, { recursive: true, force: true });
84
+ });
85
+ (0, vitest_1.describe)('constructor', () => {
86
+ (0, vitest_1.it)('should create watcher with default options', () => {
87
+ watcher = new config_watcher_js_1.ConfigWatcher(configLoader);
88
+ (0, vitest_1.expect)(watcher.isWatching()).toBe(false);
89
+ });
90
+ (0, vitest_1.it)('should create watcher with custom options', () => {
91
+ watcher = new config_watcher_js_1.ConfigWatcher(configLoader, {
92
+ debounceMs: 500,
93
+ recursive: false,
94
+ });
95
+ (0, vitest_1.expect)(watcher.isWatching()).toBe(false);
96
+ });
97
+ });
98
+ (0, vitest_1.describe)('createConfigWatcher factory', () => {
99
+ (0, vitest_1.it)('should create a ConfigWatcher instance', () => {
100
+ watcher = (0, config_watcher_js_1.createConfigWatcher)(configLoader);
101
+ (0, vitest_1.expect)(watcher).toBeInstanceOf(config_watcher_js_1.ConfigWatcher);
102
+ });
103
+ });
104
+ (0, vitest_1.describe)('start/stop', () => {
105
+ (0, vitest_1.it)('should start watching directories', async () => {
106
+ watcher = (0, config_watcher_js_1.createConfigWatcher)(configLoader);
107
+ await watcher.start();
108
+ (0, vitest_1.expect)(watcher.isWatching()).toBe(true);
109
+ const state = watcher.getState();
110
+ (0, vitest_1.expect)(state.watching).toBe(true);
111
+ (0, vitest_1.expect)(state.watchedDirectories.length).toBeGreaterThan(0);
112
+ });
113
+ (0, vitest_1.it)('should stop watching directories', async () => {
114
+ watcher = (0, config_watcher_js_1.createConfigWatcher)(configLoader);
115
+ await watcher.start();
116
+ await watcher.stop();
117
+ (0, vitest_1.expect)(watcher.isWatching()).toBe(false);
118
+ const state = watcher.getState();
119
+ (0, vitest_1.expect)(state.watching).toBe(false);
120
+ });
121
+ (0, vitest_1.it)('should be idempotent for multiple start calls', async () => {
122
+ watcher = (0, config_watcher_js_1.createConfigWatcher)(configLoader);
123
+ await watcher.start();
124
+ await watcher.start(); // Should not throw
125
+ (0, vitest_1.expect)(watcher.isWatching()).toBe(true);
126
+ });
127
+ (0, vitest_1.it)('should throw error if no config directories exist', async () => {
128
+ // Remove the directories
129
+ await promises_1.default.rm(endpointsDir, { recursive: true });
130
+ await promises_1.default.rm(flowsDir, { recursive: true });
131
+ watcher = (0, config_watcher_js_1.createConfigWatcher)(configLoader);
132
+ await (0, vitest_1.expect)(watcher.start()).rejects.toThrow('No configuration directories found');
133
+ });
134
+ (0, vitest_1.it)('should work with only endpoints directory', async () => {
135
+ await promises_1.default.rm(flowsDir, { recursive: true });
136
+ watcher = (0, config_watcher_js_1.createConfigWatcher)(configLoader);
137
+ await watcher.start();
138
+ (0, vitest_1.expect)(watcher.isWatching()).toBe(true);
139
+ });
140
+ (0, vitest_1.it)('should work with only flows directory', async () => {
141
+ await promises_1.default.rm(endpointsDir, { recursive: true });
142
+ watcher = (0, config_watcher_js_1.createConfigWatcher)(configLoader);
143
+ await watcher.start();
144
+ (0, vitest_1.expect)(watcher.isWatching()).toBe(true);
145
+ });
146
+ });
147
+ (0, vitest_1.describe)('onReload callback', () => {
148
+ (0, vitest_1.it)('should call reload callback when file changes', async () => {
149
+ // Write initial endpoint
150
+ await writeEndpoint('users', createEndpointConfig('get-users', 'GET', '/users'));
151
+ watcher = (0, config_watcher_js_1.createConfigWatcher)(configLoader, { debounceMs: 50 });
152
+ const reloadCallback = vitest_1.vi.fn();
153
+ watcher.onReload(reloadCallback);
154
+ await watcher.start();
155
+ // Wait a bit for watcher to stabilize
156
+ await new Promise((resolve) => setTimeout(resolve, 100));
157
+ // Modify the endpoint
158
+ await writeEndpoint('users', createEndpointConfig('get-users', 'GET', '/users', [{ id: 1 }]));
159
+ // Wait for debounced reload
160
+ await waitFor(() => reloadCallback.mock.calls.length > 0, 2000);
161
+ (0, vitest_1.expect)(reloadCallback).toHaveBeenCalled();
162
+ const event = reloadCallback.mock.calls[0][0];
163
+ (0, vitest_1.expect)(event.changedFiles.length).toBeGreaterThan(0);
164
+ (0, vitest_1.expect)(event.timestamp).toBeInstanceOf(Date);
165
+ });
166
+ (0, vitest_1.it)('should remove callback when unsubscribe is called', async () => {
167
+ await writeEndpoint('users', createEndpointConfig('get-users', 'GET', '/users'));
168
+ watcher = (0, config_watcher_js_1.createConfigWatcher)(configLoader, { debounceMs: 50 });
169
+ const reloadCallback = vitest_1.vi.fn();
170
+ const unsubscribe = watcher.onReload(reloadCallback);
171
+ await watcher.start();
172
+ // Unsubscribe
173
+ unsubscribe();
174
+ // Wait a bit
175
+ await new Promise((resolve) => setTimeout(resolve, 100));
176
+ // Modify the endpoint
177
+ await writeEndpoint('users', createEndpointConfig('get-users', 'GET', '/users', [{ id: 1 }]));
178
+ // Wait and verify callback was not called
179
+ await new Promise((resolve) => setTimeout(resolve, 300));
180
+ (0, vitest_1.expect)(reloadCallback).not.toHaveBeenCalled();
181
+ });
182
+ });
183
+ (0, vitest_1.describe)('onError callback', () => {
184
+ (0, vitest_1.it)('should call error callback when reload fails', async () => {
185
+ // Write an invalid endpoint
186
+ await promises_1.default.writeFile(path_1.default.join(endpointsDir, 'invalid.json'), '{ invalid json }');
187
+ watcher = (0, config_watcher_js_1.createConfigWatcher)(configLoader, { debounceMs: 50 });
188
+ const errorCallback = vitest_1.vi.fn();
189
+ watcher.onError(errorCallback);
190
+ await watcher.start();
191
+ // Wait a bit for watcher to stabilize
192
+ await new Promise((resolve) => setTimeout(resolve, 100));
193
+ // Trigger reload by modifying the invalid file
194
+ await promises_1.default.writeFile(path_1.default.join(endpointsDir, 'invalid.json'), '{ "still": "invalid" }');
195
+ // Wait for error callback
196
+ await waitFor(() => errorCallback.mock.calls.length > 0, 2000);
197
+ (0, vitest_1.expect)(errorCallback).toHaveBeenCalled();
198
+ });
199
+ (0, vitest_1.it)('should remove error callback when unsubscribe is called', async () => {
200
+ watcher = (0, config_watcher_js_1.createConfigWatcher)(configLoader, { debounceMs: 50 });
201
+ const errorCallback = vitest_1.vi.fn();
202
+ const unsubscribe = watcher.onError(errorCallback);
203
+ unsubscribe();
204
+ // Verify callback was removed (internal check - no direct way to verify)
205
+ (0, vitest_1.expect)(watcher.isWatching()).toBe(false);
206
+ });
207
+ });
208
+ (0, vitest_1.describe)('debouncing', () => {
209
+ (0, vitest_1.it)('should debounce multiple rapid changes', async () => {
210
+ await writeEndpoint('users', createEndpointConfig('get-users', 'GET', '/users'));
211
+ watcher = (0, config_watcher_js_1.createConfigWatcher)(configLoader, { debounceMs: 200 });
212
+ const reloadCallback = vitest_1.vi.fn();
213
+ watcher.onReload(reloadCallback);
214
+ await watcher.start();
215
+ // Wait a bit for watcher to stabilize
216
+ await new Promise((resolve) => setTimeout(resolve, 100));
217
+ // Make multiple rapid changes
218
+ for (let i = 0; i < 5; i++) {
219
+ await writeEndpoint('users', createEndpointConfig('get-users', 'GET', '/users', [{ count: i }]));
220
+ await new Promise((resolve) => setTimeout(resolve, 30));
221
+ }
222
+ // Wait for debounced reload
223
+ await waitFor(() => reloadCallback.mock.calls.length > 0, 2000);
224
+ // Should only have called reload once due to debouncing
225
+ (0, vitest_1.expect)(reloadCallback.mock.calls.length).toBe(1);
226
+ });
227
+ });
228
+ (0, vitest_1.describe)('server integration', () => {
229
+ (0, vitest_1.it)('should update attached server on reload', async () => {
230
+ await writeEndpoint('users', createEndpointConfig('get-users', 'GET', '/users'));
231
+ const serverApp = (0, index_js_2.createMockServerApp)();
232
+ watcher = (0, config_watcher_js_1.createConfigWatcher)(configLoader, { debounceMs: 50 });
233
+ watcher.attachServer(serverApp);
234
+ const reloadCallback = vitest_1.vi.fn();
235
+ watcher.onReload(reloadCallback);
236
+ await watcher.start();
237
+ // Initial load
238
+ const initialResult = await configLoader.load();
239
+ if (!initialResult.success) {
240
+ console.log('Load errors:', initialResult.errors);
241
+ }
242
+ (0, vitest_1.expect)(initialResult.success).toBe(true);
243
+ serverApp.registerConfig(initialResult.config.endpoints, initialResult.config.flows);
244
+ (0, vitest_1.expect)(serverApp.getState().endpointCount).toBe(1);
245
+ // Wait a bit for watcher to stabilize
246
+ await new Promise((resolve) => setTimeout(resolve, 100));
247
+ // Add another endpoint
248
+ await writeEndpoint('products', createEndpointConfig('get-products', 'GET', '/products'));
249
+ // Wait for reload
250
+ await waitFor(() => reloadCallback.mock.calls.length > 0, 2000);
251
+ // Server should have been updated
252
+ (0, vitest_1.expect)(serverApp.getState().endpointCount).toBe(2);
253
+ });
254
+ (0, vitest_1.it)('should allow detaching server', async () => {
255
+ await writeEndpoint('users', createEndpointConfig('get-users', 'GET', '/users'));
256
+ const serverApp = (0, index_js_2.createMockServerApp)();
257
+ watcher = (0, config_watcher_js_1.createConfigWatcher)(configLoader, { debounceMs: 50 });
258
+ watcher.attachServer(serverApp);
259
+ // Initial load
260
+ const initialResult = await configLoader.load();
261
+ (0, vitest_1.expect)(initialResult.success).toBe(true);
262
+ serverApp.registerConfig(initialResult.config.endpoints, initialResult.config.flows);
263
+ // Detach before starting
264
+ watcher.detachServer();
265
+ const reloadCallback = vitest_1.vi.fn();
266
+ watcher.onReload(reloadCallback);
267
+ await watcher.start();
268
+ // Wait a bit for watcher to stabilize
269
+ await new Promise((resolve) => setTimeout(resolve, 100));
270
+ // Add another endpoint
271
+ await writeEndpoint('products', createEndpointConfig('get-products', 'GET', '/products'));
272
+ // Wait for reload
273
+ await waitFor(() => reloadCallback.mock.calls.length > 0, 2000);
274
+ // Server should NOT have been updated (still 1 endpoint)
275
+ (0, vitest_1.expect)(serverApp.getState().endpointCount).toBe(1);
276
+ });
277
+ });
278
+ (0, vitest_1.describe)('triggerReload', () => {
279
+ (0, vitest_1.it)('should manually trigger a reload', async () => {
280
+ await writeEndpoint('users', createEndpointConfig('get-users', 'GET', '/users'));
281
+ watcher = (0, config_watcher_js_1.createConfigWatcher)(configLoader);
282
+ const reloadCallback = vitest_1.vi.fn();
283
+ watcher.onReload(reloadCallback);
284
+ // Don't need to start watching for manual trigger
285
+ await watcher.triggerReload();
286
+ (0, vitest_1.expect)(reloadCallback).toHaveBeenCalledTimes(1);
287
+ });
288
+ });
289
+ (0, vitest_1.describe)('getState', () => {
290
+ (0, vitest_1.it)('should return initial state when not watching', () => {
291
+ watcher = (0, config_watcher_js_1.createConfigWatcher)(configLoader);
292
+ const state = watcher.getState();
293
+ (0, vitest_1.expect)(state.watching).toBe(false);
294
+ (0, vitest_1.expect)(state.watchedDirectories).toEqual([]);
295
+ (0, vitest_1.expect)(state.fileCount).toBe(0);
296
+ });
297
+ (0, vitest_1.it)('should return accurate state when watching', async () => {
298
+ await writeEndpoint('users', createEndpointConfig('get-users', 'GET', '/users'));
299
+ watcher = (0, config_watcher_js_1.createConfigWatcher)(configLoader);
300
+ await watcher.start();
301
+ const state = watcher.getState();
302
+ (0, vitest_1.expect)(state.watching).toBe(true);
303
+ (0, vitest_1.expect)(state.watchedDirectories.length).toBeGreaterThan(0);
304
+ });
305
+ });
306
+ (0, vitest_1.describe)('file filtering', () => {
307
+ (0, vitest_1.it)('should ignore non-config files', async () => {
308
+ // Write endpoint first (before watcher starts)
309
+ await writeEndpoint('users', createEndpointConfig('get-users', 'GET', '/users'));
310
+ // Wait for file to fully settle before starting watcher
311
+ await new Promise((resolve) => setTimeout(resolve, 200));
312
+ watcher = (0, config_watcher_js_1.createConfigWatcher)(configLoader, { debounceMs: 50 });
313
+ const reloadCallback = vitest_1.vi.fn();
314
+ watcher.onReload(reloadCallback);
315
+ await watcher.start();
316
+ // Wait for watcher to stabilize after starting
317
+ await new Promise((resolve) => setTimeout(resolve, 200));
318
+ // Reset any calls that might have happened during stabilization
319
+ reloadCallback.mockClear();
320
+ // Write a non-config file (e.g., .txt)
321
+ await promises_1.default.writeFile(path_1.default.join(endpointsDir, 'readme.txt'), 'hello');
322
+ // Wait and verify no reload for non-config file
323
+ await new Promise((resolve) => setTimeout(resolve, 200));
324
+ (0, vitest_1.expect)(reloadCallback).not.toHaveBeenCalled();
325
+ });
326
+ (0, vitest_1.it)('should handle TypeScript config files', async () => {
327
+ // Write a .ts file with valid endpoint config
328
+ const tsFilePath = path_1.default.join(endpointsDir, 'users.ts');
329
+ await promises_1.default.writeFile(tsFilePath, `export default {
330
+ id: 'get-users',
331
+ method: 'GET',
332
+ path: '/users',
333
+ scenarios: [
334
+ { id: 'success', name: 'Success', status: 200, body: [] },
335
+ { id: 'error', name: 'Error', status: 500, body: { error: 'Error' } },
336
+ ],
337
+ defaultScenarioId: 'success',
338
+ };`);
339
+ watcher = (0, config_watcher_js_1.createConfigWatcher)(configLoader, { debounceMs: 50 });
340
+ const reloadCallback = vitest_1.vi.fn();
341
+ watcher.onReload(reloadCallback);
342
+ await watcher.start();
343
+ // Wait a bit for watcher to stabilize
344
+ await new Promise((resolve) => setTimeout(resolve, 100));
345
+ // Modify the TS file
346
+ await promises_1.default.writeFile(tsFilePath, `export default {
347
+ id: 'get-users',
348
+ method: 'GET',
349
+ path: '/users',
350
+ scenarios: [
351
+ { id: 'success', name: 'Success', status: 200, body: [{ id: 1 }] },
352
+ { id: 'error', name: 'Error', status: 500, body: { error: 'Error' } },
353
+ ],
354
+ defaultScenarioId: 'success',
355
+ };`);
356
+ // Wait for reload
357
+ await waitFor(() => reloadCallback.mock.calls.length > 0, 2000);
358
+ (0, vitest_1.expect)(reloadCallback).toHaveBeenCalled();
359
+ });
360
+ });
361
+ (0, vitest_1.describe)('DEFAULT_WATCHER_OPTIONS', () => {
362
+ (0, vitest_1.it)('should have correct default values', () => {
363
+ (0, vitest_1.expect)(types_js_1.DEFAULT_WATCHER_OPTIONS.debounceMs).toBe(300);
364
+ (0, vitest_1.expect)(types_js_1.DEFAULT_WATCHER_OPTIONS.recursive).toBe(true);
365
+ (0, vitest_1.expect)(types_js_1.DEFAULT_WATCHER_OPTIONS.extensions).toContain('.json');
366
+ (0, vitest_1.expect)(types_js_1.DEFAULT_WATCHER_OPTIONS.extensions).toContain('.ts');
367
+ (0, vitest_1.expect)(types_js_1.DEFAULT_WATCHER_OPTIONS.extensions).toContain('.js');
368
+ (0, vitest_1.expect)(types_js_1.DEFAULT_WATCHER_OPTIONS.ignorePatterns).toContain('node_modules');
369
+ (0, vitest_1.expect)(types_js_1.DEFAULT_WATCHER_OPTIONS.ignorePatterns).toContain('__tests__');
370
+ });
371
+ });
372
+ });
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-watcher.test.js","sourceRoot":"","sources":["../../../src/watcher/__tests__/config-watcher.test.ts"],"names":[],"mappings":";;;;;AAAA,mCAAyE;AACzE,2DAA6B;AAC7B,gDAAwB;AACxB,4CAAoB;AACpB,4DAA0E;AAC1E,oDAAyE;AACzE,oDAA2E;AAE3E,0CAAsD;AAEtD,IAAA,iBAAQ,EAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,IAAI,OAAe,CAAC;IACpB,IAAI,YAAoB,CAAC;IACzB,IAAI,QAAgB,CAAC;IACrB,IAAI,YAA0B,CAAC;IAC/B,IAAI,OAAsB,CAAC;IAE3B,0DAA0D;IAC1D,KAAK,UAAU,mBAAmB;QAChC,MAAM,GAAG,GAAG,MAAM,kBAAE,CAAC,OAAO,CAAC,cAAI,CAAC,IAAI,CAAC,YAAE,CAAC,MAAM,EAAE,EAAE,oBAAoB,CAAC,CAAC,CAAC;QAC3E,MAAM,kBAAE,CAAC,KAAK,CAAC,cAAI,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACjE,MAAM,kBAAE,CAAC,KAAK,CAAC,cAAI,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7D,OAAO,GAAG,CAAC;IACb,CAAC;IAED,wCAAwC;IACxC,SAAS,oBAAoB,CAC3B,EAAU,EACV,MAAc,EACd,OAAe,EACf,OAAgB,EAAE;QAElB,OAAO;YACL,EAAE;YACF,MAAM;YACN,IAAI,EAAE,OAAO;YACb,SAAS,EAAE;gBACT;oBACE,EAAE,EAAE,SAAS;oBACb,IAAI,EAAE,kBAAkB;oBACxB,MAAM,EAAE,GAAG;oBACX,IAAI;iBACL;gBACD;oBACE,EAAE,EAAE,OAAO;oBACX,IAAI,EAAE,gBAAgB;oBACtB,MAAM,EAAE,GAAG;oBACX,IAAI,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE;iBAChC;aACF;YACD,iBAAiB,EAAE,SAAS;SAC7B,CAAC;IACJ,CAAC;IAED,0CAA0C;IAC1C,KAAK,UAAU,aAAa,CAAC,IAAY,EAAE,OAAe;QACxD,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,IAAI,OAAO,CAAC,CAAC;QACzD,MAAM,kBAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC/D,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,sCAAsC;IACtC,KAAK,UAAU,SAAS,CAAC,IAAY,EAAE,OAAe;QACpD,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,IAAI,OAAO,CAAC,CAAC;QACrD,MAAM,kBAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC/D,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,8CAA8C;IAC9C,KAAK,UAAU,OAAO,CACpB,SAAwB,EACxB,OAAO,GAAG,IAAI,EACd,QAAQ,GAAG,EAAE;QAEb,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACzB,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC;YACpB,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,OAAO,EAAE,CAAC;gBACjC,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;YACnD,CAAC;YACD,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;IAED,IAAA,mBAAU,EAAC,KAAK,IAAI,EAAE;QACpB,OAAO,GAAG,MAAM,mBAAmB,EAAE,CAAC;QACtC,YAAY,GAAG,cAAI,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QAC/C,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACvC,YAAY,GAAG,IAAA,6BAAkB,EAAC,OAAO,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,IAAA,kBAAS,EAAC,KAAK,IAAI,EAAE;QACnB,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;QACvB,CAAC;QACD,0BAA0B;QAC1B,MAAM,kBAAE,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,IAAA,iBAAQ,EAAC,aAAa,EAAE,GAAG,EAAE;QAC3B,IAAA,WAAE,EAAC,4CAA4C,EAAE,GAAG,EAAE;YACpD,OAAO,GAAG,IAAI,iCAAa,CAAC,YAAY,CAAC,CAAC;YAC1C,IAAA,eAAM,EAAC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3C,CAAC,CAAC,CAAC;QAEH,IAAA,WAAE,EAAC,2CAA2C,EAAE,GAAG,EAAE;YACnD,OAAO,GAAG,IAAI,iCAAa,CAAC,YAAY,EAAE;gBACxC,UAAU,EAAE,GAAG;gBACf,SAAS,EAAE,KAAK;aACjB,CAAC,CAAC;YACH,IAAA,eAAM,EAAC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,IAAA,iBAAQ,EAAC,6BAA6B,EAAE,GAAG,EAAE;QAC3C,IAAA,WAAE,EAAC,wCAAwC,EAAE,GAAG,EAAE;YAChD,OAAO,GAAG,IAAA,uCAAmB,EAAC,YAAY,CAAC,CAAC;YAC5C,IAAA,eAAM,EAAC,OAAO,CAAC,CAAC,cAAc,CAAC,iCAAa,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,IAAA,iBAAQ,EAAC,YAAY,EAAE,GAAG,EAAE;QAC1B,IAAA,WAAE,EAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;YACjD,OAAO,GAAG,IAAA,uCAAmB,EAAC,YAAY,CAAC,CAAC;YAC5C,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;YAEtB,IAAA,eAAM,EAAC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACxC,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;YACjC,IAAA,eAAM,EAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClC,IAAA,eAAM,EAAC,KAAK,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAC7D,CAAC,CAAC,CAAC;QAEH,IAAA,WAAE,EAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;YAChD,OAAO,GAAG,IAAA,uCAAmB,EAAC,YAAY,CAAC,CAAC;YAC5C,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;YACtB,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;YAErB,IAAA,eAAM,EAAC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACzC,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;YACjC,IAAA,eAAM,EAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;QAEH,IAAA,WAAE,EAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;YAC7D,OAAO,GAAG,IAAA,uCAAmB,EAAC,YAAY,CAAC,CAAC;YAC5C,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;YACtB,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,mBAAmB;YAE1C,IAAA,eAAM,EAAC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;QAEH,IAAA,WAAE,EAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;YACjE,yBAAyB;YACzB,MAAM,kBAAE,CAAC,EAAE,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC/C,MAAM,kBAAE,CAAC,EAAE,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAE3C,OAAO,GAAG,IAAA,uCAAmB,EAAC,YAAY,CAAC,CAAC;YAC5C,MAAM,IAAA,eAAM,EAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,oCAAoC,CAAC,CAAC;QACtF,CAAC,CAAC,CAAC;QAEH,IAAA,WAAE,EAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;YACzD,MAAM,kBAAE,CAAC,EAAE,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAE3C,OAAO,GAAG,IAAA,uCAAmB,EAAC,YAAY,CAAC,CAAC;YAC5C,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;YAEtB,IAAA,eAAM,EAAC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;QAEH,IAAA,WAAE,EAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;YACrD,MAAM,kBAAE,CAAC,EAAE,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAE/C,OAAO,GAAG,IAAA,uCAAmB,EAAC,YAAY,CAAC,CAAC;YAC5C,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;YAEtB,IAAA,eAAM,EAAC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,IAAA,iBAAQ,EAAC,mBAAmB,EAAE,GAAG,EAAE;QACjC,IAAA,WAAE,EAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;YAC7D,yBAAyB;YACzB,MAAM,aAAa,CAAC,OAAO,EAAE,oBAAoB,CAAC,WAAW,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;YAEjF,OAAO,GAAG,IAAA,uCAAmB,EAAC,YAAY,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC;YAChE,MAAM,cAAc,GAAG,WAAE,CAAC,EAAE,EAAE,CAAC;YAC/B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;YACjC,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;YAEtB,sCAAsC;YACtC,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;YAEzD,sBAAsB;YACtB,MAAM,aAAa,CAAC,OAAO,EAAE,oBAAoB,CAAC,WAAW,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAE9F,4BAA4B;YAC5B,MAAM,OAAO,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;YAEhE,IAAA,eAAM,EAAC,cAAc,CAAC,CAAC,gBAAgB,EAAE,CAAC;YAC1C,MAAM,KAAK,GAAgB,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3D,IAAA,eAAM,EAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;YACrD,IAAA,eAAM,EAAC,KAAK,CAAC,SAAS,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;QAEH,IAAA,WAAE,EAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;YACjE,MAAM,aAAa,CAAC,OAAO,EAAE,oBAAoB,CAAC,WAAW,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;YAEjF,OAAO,GAAG,IAAA,uCAAmB,EAAC,YAAY,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC;YAChE,MAAM,cAAc,GAAG,WAAE,CAAC,EAAE,EAAE,CAAC;YAC/B,MAAM,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;YACrD,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;YAEtB,cAAc;YACd,WAAW,EAAE,CAAC;YAEd,aAAa;YACb,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;YAEzD,sBAAsB;YACtB,MAAM,aAAa,CAAC,OAAO,EAAE,oBAAoB,CAAC,WAAW,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAE9F,0CAA0C;YAC1C,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;YACzD,IAAA,eAAM,EAAC,cAAc,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAChD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,IAAA,iBAAQ,EAAC,kBAAkB,EAAE,GAAG,EAAE;QAChC,IAAA,WAAE,EAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;YAC5D,4BAA4B;YAC5B,MAAM,kBAAE,CAAC,SAAS,CAChB,cAAI,CAAC,IAAI,CAAC,YAAY,EAAE,cAAc,CAAC,EACvC,kBAAkB,CACnB,CAAC;YAEF,OAAO,GAAG,IAAA,uCAAmB,EAAC,YAAY,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC;YAChE,MAAM,aAAa,GAAG,WAAE,CAAC,EAAE,EAAE,CAAC;YAC9B,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;YAC/B,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;YAEtB,sCAAsC;YACtC,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;YAEzD,+CAA+C;YAC/C,MAAM,kBAAE,CAAC,SAAS,CAChB,cAAI,CAAC,IAAI,CAAC,YAAY,EAAE,cAAc,CAAC,EACvC,wBAAwB,CACzB,CAAC;YAEF,0BAA0B;YAC1B,MAAM,OAAO,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;YAE/D,IAAA,eAAM,EAAC,aAAa,CAAC,CAAC,gBAAgB,EAAE,CAAC;QAC3C,CAAC,CAAC,CAAC;QAEH,IAAA,WAAE,EAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;YACvE,OAAO,GAAG,IAAA,uCAAmB,EAAC,YAAY,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC;YAChE,MAAM,aAAa,GAAG,WAAE,CAAC,EAAE,EAAE,CAAC;YAC9B,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;YAEnD,WAAW,EAAE,CAAC;YAEd,yEAAyE;YACzE,IAAA,eAAM,EAAC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,IAAA,iBAAQ,EAAC,YAAY,EAAE,GAAG,EAAE;QAC1B,IAAA,WAAE,EAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;YACtD,MAAM,aAAa,CAAC,OAAO,EAAE,oBAAoB,CAAC,WAAW,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;YAEjF,OAAO,GAAG,IAAA,uCAAmB,EAAC,YAAY,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;YACjE,MAAM,cAAc,GAAG,WAAE,CAAC,EAAE,EAAE,CAAC;YAC/B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;YACjC,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;YAEtB,sCAAsC;YACtC,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;YAEzD,8BAA8B;YAC9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC3B,MAAM,aAAa,CAAC,OAAO,EAAE,oBAAoB,CAAC,WAAW,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;gBACjG,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;YAC1D,CAAC;YAED,4BAA4B;YAC5B,MAAM,OAAO,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;YAEhE,wDAAwD;YACxD,IAAA,eAAM,EAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,IAAA,iBAAQ,EAAC,oBAAoB,EAAE,GAAG,EAAE;QAClC,IAAA,WAAE,EAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;YACvD,MAAM,aAAa,CAAC,OAAO,EAAE,oBAAoB,CAAC,WAAW,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;YAEjF,MAAM,SAAS,GAAG,IAAA,8BAAmB,GAAE,CAAC;YACxC,OAAO,GAAG,IAAA,uCAAmB,EAAC,YAAY,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC;YAChE,OAAO,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;YAEhC,MAAM,cAAc,GAAG,WAAE,CAAC,EAAE,EAAE,CAAC;YAC/B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;YACjC,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;YAEtB,eAAe;YACf,MAAM,aAAa,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,CAAC;YAChD,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC;gBAC3B,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;YACpD,CAAC;YACD,IAAA,eAAM,EAAC,aAAa,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACzC,SAAS,CAAC,cAAc,CAAC,aAAa,CAAC,MAAO,CAAC,SAAS,EAAE,aAAa,CAAC,MAAO,CAAC,KAAK,CAAC,CAAC;YACvF,IAAA,eAAM,EAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAEnD,sCAAsC;YACtC,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;YAEzD,uBAAuB;YACvB,MAAM,aAAa,CAAC,UAAU,EAAE,oBAAoB,CAAC,cAAc,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC;YAE1F,kBAAkB;YAClB,MAAM,OAAO,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;YAEhE,kCAAkC;YAClC,IAAA,eAAM,EAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACrD,CAAC,CAAC,CAAC;QAEH,IAAA,WAAE,EAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;YAC7C,MAAM,aAAa,CAAC,OAAO,EAAE,oBAAoB,CAAC,WAAW,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;YAEjF,MAAM,SAAS,GAAG,IAAA,8BAAmB,GAAE,CAAC;YACxC,OAAO,GAAG,IAAA,uCAAmB,EAAC,YAAY,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC;YAChE,OAAO,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;YAEhC,eAAe;YACf,MAAM,aAAa,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,CAAC;YAChD,IAAA,eAAM,EAAC,aAAa,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACzC,SAAS,CAAC,cAAc,CAAC,aAAa,CAAC,MAAO,CAAC,SAAS,EAAE,aAAa,CAAC,MAAO,CAAC,KAAK,CAAC,CAAC;YAEvF,yBAAyB;YACzB,OAAO,CAAC,YAAY,EAAE,CAAC;YAEvB,MAAM,cAAc,GAAG,WAAE,CAAC,EAAE,EAAE,CAAC;YAC/B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;YACjC,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;YAEtB,sCAAsC;YACtC,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;YAEzD,uBAAuB;YACvB,MAAM,aAAa,CAAC,UAAU,EAAE,oBAAoB,CAAC,cAAc,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC;YAE1F,kBAAkB;YAClB,MAAM,OAAO,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;YAEhE,yDAAyD;YACzD,IAAA,eAAM,EAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACrD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,IAAA,iBAAQ,EAAC,eAAe,EAAE,GAAG,EAAE;QAC7B,IAAA,WAAE,EAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;YAChD,MAAM,aAAa,CAAC,OAAO,EAAE,oBAAoB,CAAC,WAAW,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;YAEjF,OAAO,GAAG,IAAA,uCAAmB,EAAC,YAAY,CAAC,CAAC;YAC5C,MAAM,cAAc,GAAG,WAAE,CAAC,EAAE,EAAE,CAAC;YAC/B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;YAEjC,kDAAkD;YAClD,MAAM,OAAO,CAAC,aAAa,EAAE,CAAC;YAE9B,IAAA,eAAM,EAAC,cAAc,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,IAAA,iBAAQ,EAAC,UAAU,EAAE,GAAG,EAAE;QACxB,IAAA,WAAE,EAAC,+CAA+C,EAAE,GAAG,EAAE;YACvD,OAAO,GAAG,IAAA,uCAAmB,EAAC,YAAY,CAAC,CAAC;YAC5C,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;YAEjC,IAAA,eAAM,EAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnC,IAAA,eAAM,EAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAC7C,IAAA,eAAM,EAAC,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;QAEH,IAAA,WAAE,EAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;YAC1D,MAAM,aAAa,CAAC,OAAO,EAAE,oBAAoB,CAAC,WAAW,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;YAEjF,OAAO,GAAG,IAAA,uCAAmB,EAAC,YAAY,CAAC,CAAC;YAC5C,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;YAEtB,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;YACjC,IAAA,eAAM,EAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClC,IAAA,eAAM,EAAC,KAAK,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAC7D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,IAAA,iBAAQ,EAAC,gBAAgB,EAAE,GAAG,EAAE;QAC9B,IAAA,WAAE,EAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;YAC9C,+CAA+C;YAC/C,MAAM,aAAa,CAAC,OAAO,EAAE,oBAAoB,CAAC,WAAW,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;YAEjF,wDAAwD;YACxD,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;YAEzD,OAAO,GAAG,IAAA,uCAAmB,EAAC,YAAY,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC;YAChE,MAAM,cAAc,GAAG,WAAE,CAAC,EAAE,EAAE,CAAC;YAC/B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;YACjC,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;YAEtB,+CAA+C;YAC/C,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;YAEzD,gEAAgE;YAChE,cAAc,CAAC,SAAS,EAAE,CAAC;YAE3B,uCAAuC;YACvC,MAAM,kBAAE,CAAC,SAAS,CAAC,cAAI,CAAC,IAAI,CAAC,YAAY,EAAE,YAAY,CAAC,EAAE,OAAO,CAAC,CAAC;YAEnE,gDAAgD;YAChD,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;YACzD,IAAA,eAAM,EAAC,cAAc,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAChD,CAAC,CAAC,CAAC;QAEH,IAAA,WAAE,EAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;YACrD,8CAA8C;YAC9C,MAAM,UAAU,GAAG,cAAI,CAAC,IAAI,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;YACvD,MAAM,kBAAE,CAAC,SAAS,CAChB,UAAU,EACV;;;;;;;;;GASL,CACI,CAAC;YAEF,OAAO,GAAG,IAAA,uCAAmB,EAAC,YAAY,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC;YAChE,MAAM,cAAc,GAAG,WAAE,CAAC,EAAE,EAAE,CAAC;YAC/B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;YACjC,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;YAEtB,sCAAsC;YACtC,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;YAEzD,qBAAqB;YACrB,MAAM,kBAAE,CAAC,SAAS,CAChB,UAAU,EACV;;;;;;;;;GASL,CACI,CAAC;YAEF,kBAAkB;YAClB,MAAM,OAAO,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;YAEhE,IAAA,eAAM,EAAC,cAAc,CAAC,CAAC,gBAAgB,EAAE,CAAC;QAC5C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,IAAA,iBAAQ,EAAC,yBAAyB,EAAE,GAAG,EAAE;QACvC,IAAA,WAAE,EAAC,oCAAoC,EAAE,GAAG,EAAE;YAC5C,IAAA,eAAM,EAAC,kCAAuB,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACrD,IAAA,eAAM,EAAC,kCAAuB,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACrD,IAAA,eAAM,EAAC,kCAAuB,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YAC9D,IAAA,eAAM,EAAC,kCAAuB,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YAC5D,IAAA,eAAM,EAAC,kCAAuB,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YAC5D,IAAA,eAAM,EAAC,kCAAuB,CAAC,cAAc,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;YACzE,IAAA,eAAM,EAAC,kCAAuB,CAAC,cAAc,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QACxE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,100 @@
1
+ import { ConfigLoader } from '../config/index.js';
2
+ import { MockServerApp } from '../server/index.js';
3
+ import type { WatcherOptions, ReloadCallback, ErrorCallback, WatcherState } from './types.js';
4
+ /**
5
+ * Watches configuration directories and triggers hot reload on changes
6
+ */
7
+ export declare class ConfigWatcher {
8
+ private configLoader;
9
+ private serverApp;
10
+ private options;
11
+ private watcher;
12
+ private pendingEvents;
13
+ private debounceTimer;
14
+ private reloadCallbacks;
15
+ private errorCallbacks;
16
+ private isReloading;
17
+ private watchedFiles;
18
+ constructor(configLoader: ConfigLoader, options?: WatcherOptions);
19
+ /**
20
+ * Attach a MockServerApp to receive config updates
21
+ */
22
+ attachServer(serverApp: MockServerApp): void;
23
+ /**
24
+ * Detach the MockServerApp
25
+ */
26
+ detachServer(): void;
27
+ /**
28
+ * Start watching configuration directories
29
+ */
30
+ start(): Promise<void>;
31
+ /**
32
+ * Stop watching configuration directories
33
+ */
34
+ stop(): Promise<void>;
35
+ /**
36
+ * Add a callback for reload events
37
+ */
38
+ onReload(callback: ReloadCallback): () => void;
39
+ /**
40
+ * Add a callback for error events
41
+ */
42
+ onError(callback: ErrorCallback): () => void;
43
+ /**
44
+ * Get current watcher state
45
+ */
46
+ getState(): WatcherState;
47
+ /**
48
+ * Check if watcher is active
49
+ */
50
+ isWatching(): boolean;
51
+ /**
52
+ * Manually trigger a reload (useful for testing or forced refresh)
53
+ */
54
+ triggerReload(): Promise<void>;
55
+ /**
56
+ * Handle a file system event
57
+ */
58
+ private handleFileEvent;
59
+ /**
60
+ * Process pending events after debounce
61
+ */
62
+ private processEvents;
63
+ /**
64
+ * Perform the actual reload
65
+ */
66
+ private performReload;
67
+ /**
68
+ * Handle errors
69
+ */
70
+ private handleError;
71
+ /**
72
+ * Emit reload event to all callbacks
73
+ */
74
+ private emitReload;
75
+ /**
76
+ * Emit error to all callbacks
77
+ */
78
+ private emitError;
79
+ /**
80
+ * Check if a file should be watched based on extension
81
+ */
82
+ private isWatchableFile;
83
+ /**
84
+ * Determine which config directory a file belongs to
85
+ */
86
+ private getFileDirectory;
87
+ /**
88
+ * Build ignore patterns for chokidar
89
+ */
90
+ private buildIgnorePatterns;
91
+ /**
92
+ * Check if a directory exists
93
+ */
94
+ private directoryExists;
95
+ }
96
+ /**
97
+ * Factory function to create a ConfigWatcher
98
+ */
99
+ export declare function createConfigWatcher(configLoader: ConfigLoader, options?: WatcherOptions): ConfigWatcher;
100
+ //# sourceMappingURL=config-watcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-watcher.d.ts","sourceRoot":"","sources":["../../src/watcher/config-watcher.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,EACV,cAAc,EAGd,cAAc,EACd,aAAa,EACb,YAAY,EACb,MAAM,YAAY,CAAC;AAGpB;;GAEG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,SAAS,CAA8B;IAC/C,OAAO,CAAC,OAAO,CAA2B;IAC1C,OAAO,CAAC,OAAO,CAA0B;IACzC,OAAO,CAAC,aAAa,CAAsB;IAC3C,OAAO,CAAC,aAAa,CAA+B;IACpD,OAAO,CAAC,eAAe,CAAkC;IACzD,OAAO,CAAC,cAAc,CAAiC;IACvD,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,YAAY,CAA0B;gBAG5C,YAAY,EAAE,YAAY,EAC1B,OAAO,GAAE,cAAmB;IAM9B;;OAEG;IACH,YAAY,CAAC,SAAS,EAAE,aAAa,GAAG,IAAI;IAI5C;;OAEG;IACH,YAAY,IAAI,IAAI;IAIpB;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA6D5B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAe3B;;OAEG;IACH,QAAQ,CAAC,QAAQ,EAAE,cAAc,GAAG,MAAM,IAAI;IAK9C;;OAEG;IACH,OAAO,CAAC,QAAQ,EAAE,aAAa,GAAG,MAAM,IAAI;IAK5C;;OAEG;IACH,QAAQ,IAAI,YAAY;IAcxB;;OAEG;IACH,UAAU,IAAI,OAAO;IAIrB;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAIpC;;OAEG;IACH,OAAO,CAAC,eAAe;IAgCvB;;OAEG;YACW,aAAa;IAY3B;;OAEG;YACW,aAAa;IAsC3B;;OAEG;IACH,OAAO,CAAC,WAAW;IAInB;;OAEG;YACW,UAAU;IAUxB;;OAEG;IACH,OAAO,CAAC,SAAS;IAUjB;;OAEG;IACH,OAAO,CAAC,eAAe;IAKvB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAcxB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAkB3B;;OAEG;YACW,eAAe;CAS9B;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,YAAY,EAAE,YAAY,EAC1B,OAAO,CAAC,EAAE,cAAc,GACvB,aAAa,CAEf"}