@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.
- package/README.md +643 -0
- package/dist/__tests__/mock-server.test.d.ts +5 -0
- package/dist/__tests__/mock-server.test.d.ts.map +1 -0
- package/dist/__tests__/mock-server.test.js +599 -0
- package/dist/__tests__/mock-server.test.js.map +1 -0
- package/dist/admin/__tests__/admin-router.test.d.ts +2 -0
- package/dist/admin/__tests__/admin-router.test.d.ts.map +1 -0
- package/dist/admin/__tests__/admin-router.test.js +621 -0
- package/dist/admin/__tests__/admin-router.test.js.map +1 -0
- package/dist/admin/admin-router.d.ts +27 -0
- package/dist/admin/admin-router.d.ts.map +1 -0
- package/dist/admin/admin-router.js +616 -0
- package/dist/admin/admin-router.js.map +1 -0
- package/dist/admin/index.d.ts +4 -0
- package/dist/admin/index.d.ts.map +1 -0
- package/dist/admin/index.js +10 -0
- package/dist/admin/index.js.map +1 -0
- package/dist/admin/types.d.ts +185 -0
- package/dist/admin/types.d.ts.map +1 -0
- package/dist/admin/types.js +33 -0
- package/dist/admin/types.js.map +1 -0
- package/dist/config/__tests__/config-discovery.test.d.ts +2 -0
- package/dist/config/__tests__/config-discovery.test.d.ts.map +1 -0
- package/dist/config/__tests__/config-discovery.test.js +52 -0
- package/dist/config/__tests__/config-discovery.test.js.map +1 -0
- package/dist/config/__tests__/config-loader.test.d.ts +2 -0
- package/dist/config/__tests__/config-loader.test.d.ts.map +1 -0
- package/dist/config/__tests__/config-loader.test.js +124 -0
- package/dist/config/__tests__/config-loader.test.js.map +1 -0
- package/dist/config/__tests__/file-loader.test.d.ts +2 -0
- package/dist/config/__tests__/file-loader.test.d.ts.map +1 -0
- package/dist/config/__tests__/file-loader.test.js +63 -0
- package/dist/config/__tests__/file-loader.test.js.map +1 -0
- package/dist/config/__tests__/fixtures/mock-config/endpoints/products.d.ts +25 -0
- package/dist/config/__tests__/fixtures/mock-config/endpoints/products.d.ts.map +1 -0
- package/dist/config/__tests__/fixtures/mock-config/endpoints/products.js +25 -0
- package/dist/config/__tests__/fixtures/mock-config/endpoints/products.js.map +1 -0
- package/dist/config/__tests__/fixtures/mock-config/flows/error-flow.d.ts +11 -0
- package/dist/config/__tests__/fixtures/mock-config/flows/error-flow.d.ts.map +1 -0
- package/dist/config/__tests__/fixtures/mock-config/flows/error-flow.js +11 -0
- package/dist/config/__tests__/fixtures/mock-config/flows/error-flow.js.map +1 -0
- package/dist/config/config-discovery.d.ts +23 -0
- package/dist/config/config-discovery.d.ts.map +1 -0
- package/dist/config/config-discovery.js +60 -0
- package/dist/config/config-discovery.js.map +1 -0
- package/dist/config/config-loader.d.ts +56 -0
- package/dist/config/config-loader.d.ts.map +1 -0
- package/dist/config/config-loader.js +162 -0
- package/dist/config/config-loader.js.map +1 -0
- package/dist/config/config-writer.d.ts +96 -0
- package/dist/config/config-writer.d.ts.map +1 -0
- package/dist/config/config-writer.js +248 -0
- package/dist/config/config-writer.js.map +1 -0
- package/dist/config/file-loader.d.ts +16 -0
- package/dist/config/file-loader.d.ts.map +1 -0
- package/dist/config/file-loader.js +90 -0
- package/dist/config/file-loader.js.map +1 -0
- package/dist/config/index.d.ts +7 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +23 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/types.d.ts +47 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +7 -0
- package/dist/config/types.js.map +1 -0
- package/dist/index.d.ts +28 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +31 -0
- package/dist/index.js.map +1 -0
- package/dist/mock-server.d.ts +243 -0
- package/dist/mock-server.d.ts.map +1 -0
- package/dist/mock-server.js +387 -0
- package/dist/mock-server.js.map +1 -0
- package/dist/resolver/__tests__/response-resolver.test.d.ts +2 -0
- package/dist/resolver/__tests__/response-resolver.test.d.ts.map +1 -0
- package/dist/resolver/__tests__/response-resolver.test.js +358 -0
- package/dist/resolver/__tests__/response-resolver.test.js.map +1 -0
- package/dist/resolver/index.d.ts +4 -0
- package/dist/resolver/index.d.ts.map +1 -0
- package/dist/resolver/index.js +9 -0
- package/dist/resolver/index.js.map +1 -0
- package/dist/resolver/response-resolver.d.ts +73 -0
- package/dist/resolver/response-resolver.d.ts.map +1 -0
- package/dist/resolver/response-resolver.js +167 -0
- package/dist/resolver/response-resolver.js.map +1 -0
- package/dist/resolver/types.d.ts +47 -0
- package/dist/resolver/types.d.ts.map +1 -0
- package/dist/resolver/types.js +9 -0
- package/dist/resolver/types.js.map +1 -0
- package/dist/schemas/__tests__/config.validator.test.d.ts +2 -0
- package/dist/schemas/__tests__/config.validator.test.d.ts.map +1 -0
- package/dist/schemas/__tests__/config.validator.test.js +66 -0
- package/dist/schemas/__tests__/config.validator.test.js.map +1 -0
- package/dist/schemas/__tests__/endpoint.schema.test.d.ts +2 -0
- package/dist/schemas/__tests__/endpoint.schema.test.d.ts.map +1 -0
- package/dist/schemas/__tests__/endpoint.schema.test.js +103 -0
- package/dist/schemas/__tests__/endpoint.schema.test.js.map +1 -0
- package/dist/schemas/__tests__/flow.schema.test.d.ts +2 -0
- package/dist/schemas/__tests__/flow.schema.test.d.ts.map +1 -0
- package/dist/schemas/__tests__/flow.schema.test.js +92 -0
- package/dist/schemas/__tests__/flow.schema.test.js.map +1 -0
- package/dist/schemas/config.validator.d.ts +39 -0
- package/dist/schemas/config.validator.d.ts.map +1 -0
- package/dist/schemas/config.validator.js +117 -0
- package/dist/schemas/config.validator.js.map +1 -0
- package/dist/schemas/endpoint.schema.d.ts +108 -0
- package/dist/schemas/endpoint.schema.d.ts.map +1 -0
- package/dist/schemas/endpoint.schema.js +87 -0
- package/dist/schemas/endpoint.schema.js.map +1 -0
- package/dist/schemas/flow.schema.d.ts +46 -0
- package/dist/schemas/flow.schema.d.ts.map +1 -0
- package/dist/schemas/flow.schema.js +73 -0
- package/dist/schemas/flow.schema.js.map +1 -0
- package/dist/schemas/http.schema.d.ts +15 -0
- package/dist/schemas/http.schema.d.ts.map +1 -0
- package/dist/schemas/http.schema.js +32 -0
- package/dist/schemas/http.schema.js.map +1 -0
- package/dist/schemas/index.d.ts +6 -0
- package/dist/schemas/index.d.ts.map +1 -0
- package/dist/schemas/index.js +33 -0
- package/dist/schemas/index.js.map +1 -0
- package/dist/schemas/scenario.schema.d.ts +54 -0
- package/dist/schemas/scenario.schema.d.ts.map +1 -0
- package/dist/schemas/scenario.schema.js +75 -0
- package/dist/schemas/scenario.schema.js.map +1 -0
- package/dist/server/__tests__/mock-server-app.test.d.ts +2 -0
- package/dist/server/__tests__/mock-server-app.test.d.ts.map +1 -0
- package/dist/server/__tests__/mock-server-app.test.js +296 -0
- package/dist/server/__tests__/mock-server-app.test.js.map +1 -0
- package/dist/server/index.d.ts +4 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +10 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/mock-server-app.d.ts +119 -0
- package/dist/server/mock-server-app.d.ts.map +1 -0
- package/dist/server/mock-server-app.js +304 -0
- package/dist/server/mock-server-app.js.map +1 -0
- package/dist/server/types.d.ts +38 -0
- package/dist/server/types.d.ts.map +1 -0
- package/dist/server/types.js +11 -0
- package/dist/server/types.js.map +1 -0
- package/dist/state/__tests__/state-manager.test.d.ts +2 -0
- package/dist/state/__tests__/state-manager.test.d.ts.map +1 -0
- package/dist/state/__tests__/state-manager.test.js +275 -0
- package/dist/state/__tests__/state-manager.test.js.map +1 -0
- package/dist/state/index.d.ts +3 -0
- package/dist/state/index.d.ts.map +1 -0
- package/dist/state/index.js +7 -0
- package/dist/state/index.js.map +1 -0
- package/dist/state/state-manager.d.ts +92 -0
- package/dist/state/state-manager.d.ts.map +1 -0
- package/dist/state/state-manager.js +198 -0
- package/dist/state/state-manager.js.map +1 -0
- package/dist/state/types.d.ts +30 -0
- package/dist/state/types.d.ts.map +1 -0
- package/dist/state/types.js +2 -0
- package/dist/state/types.js.map +1 -0
- package/dist/ui/assets/index-SADMOgPE.js +10 -0
- package/dist/ui/assets/index-rj7m-XdG.css +1 -0
- package/dist/ui/index.html +29 -0
- package/dist/watcher/__tests__/config-watcher.test.d.ts +2 -0
- package/dist/watcher/__tests__/config-watcher.test.d.ts.map +1 -0
- package/dist/watcher/__tests__/config-watcher.test.js +372 -0
- package/dist/watcher/__tests__/config-watcher.test.js.map +1 -0
- package/dist/watcher/config-watcher.d.ts +100 -0
- package/dist/watcher/config-watcher.d.ts.map +1 -0
- package/dist/watcher/config-watcher.js +358 -0
- package/dist/watcher/config-watcher.js.map +1 -0
- package/dist/watcher/index.d.ts +7 -0
- package/dist/watcher/index.d.ts.map +1 -0
- package/dist/watcher/index.js +8 -0
- package/dist/watcher/index.js.map +1 -0
- package/dist/watcher/types.d.ts +64 -0
- package/dist/watcher/types.d.ts.map +1 -0
- package/dist/watcher/types.js +15 -0
- package/dist/watcher/types.js.map +1 -0
- 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 @@
|
|
|
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":"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"}
|
|
@@ -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"}
|