@jonathanleelx/meddle 0.5.0 → 0.5.1

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 (87) hide show
  1. package/bin/commands/mock/add.js +22 -0
  2. package/bin/commands/mock/index.js +51 -21
  3. package/bin/commands/route/add.js +2 -2
  4. package/bin/commands/route/delete.js +2 -2
  5. package/bin/commands/route/index.js +60 -30
  6. package/bin/commands/route/preview.js +2 -2
  7. package/bin/commands/route/show.js +2 -2
  8. package/bin/commands/route/update.js +2 -2
  9. package/bin/commands/status.js +27 -11
  10. package/bin/doctor.js +8 -4
  11. package/bin/index.js +4 -4
  12. package/bin/lib/file-access.js +28 -11
  13. package/bin/lib/meddle-home.js +14 -1
  14. package/bin/lib/output.js +8 -3
  15. package/bin/lib/proxy-or-file.js +4 -1
  16. package/dist/cert.d.ts +2 -0
  17. package/dist/cert.d.ts.map +1 -1
  18. package/dist/cert.js +10 -1
  19. package/dist/cert.js.map +1 -1
  20. package/dist/core/browser.d.ts +2 -0
  21. package/dist/core/browser.d.ts.map +1 -1
  22. package/dist/core/browser.js +21 -8
  23. package/dist/core/browser.js.map +1 -1
  24. package/dist/core/mock-handler.d.ts +5 -1
  25. package/dist/core/mock-handler.d.ts.map +1 -1
  26. package/dist/core/mock-handler.js +17 -3
  27. package/dist/core/mock-handler.js.map +1 -1
  28. package/dist/core/proxy-record.d.ts +14 -0
  29. package/dist/core/proxy-record.d.ts.map +1 -1
  30. package/dist/core/proxy-record.js +39 -0
  31. package/dist/core/proxy-record.js.map +1 -1
  32. package/dist/core/types.d.ts +2 -0
  33. package/dist/core/types.d.ts.map +1 -1
  34. package/dist/server/config.d.ts.map +1 -1
  35. package/dist/server/config.js +15 -9
  36. package/dist/server/config.js.map +1 -1
  37. package/dist/server/index.d.ts +1 -0
  38. package/dist/server/index.d.ts.map +1 -1
  39. package/dist/server/index.js +7 -0
  40. package/dist/server/index.js.map +1 -1
  41. package/dist/server/json-parse-error.d.ts +7 -0
  42. package/dist/server/json-parse-error.d.ts.map +1 -0
  43. package/dist/server/json-parse-error.js +28 -0
  44. package/dist/server/json-parse-error.js.map +1 -0
  45. package/dist/server/mocks.d.ts +1 -1
  46. package/dist/server/mocks.d.ts.map +1 -1
  47. package/dist/server/rule-files.d.ts.map +1 -1
  48. package/dist/server/rule-files.js +2 -9
  49. package/dist/server/rule-files.js.map +1 -1
  50. package/index.js +92 -9
  51. package/mcp-server.js +18 -5
  52. package/package.json +1 -1
  53. package/web/dist/assets/detail-panel-DZRKJG2W.js +4 -0
  54. package/web/dist/assets/global-panel-shell-Iir-c_pQ.js +6 -0
  55. package/web/dist/assets/{health-panel-DhXLqcOU.js → health-panel-Dmf-EhJz.js} +1 -1
  56. package/web/dist/assets/{index-B-6nUrqW.js → index-C4dIj1nT.js} +5 -5
  57. package/web/dist/assets/index-CdYMl1M7.css +2 -0
  58. package/web/dist/assets/{mobile-proxy-panel-BY8Oi-qC.js → mobile-proxy-panel-CFcwa11A.js} +5 -5
  59. package/web/dist/assets/{mock-config-TPmfJwAt.js → mock-config-CGl50MIr.js} +1 -1
  60. package/web/dist/assets/mock-editor-panel-xcCk23oH.js +20 -0
  61. package/web/dist/assets/{mocks-file-missing-note-BR5oWFLh.js → mocks-file-missing-note-CW_ONVLA.js} +1 -1
  62. package/web/dist/assets/{monaco-editor-BGLPrb0C.js → monaco-editor-BkP7envQ.js} +1 -1
  63. package/web/dist/assets/{pane-bar-gFRISZLD.js → pane-bar-5j9Nf7W_.js} +1 -1
  64. package/web/dist/assets/{pane-split-B6aLmY7G.js → pane-split-C0OSe365.js} +1 -1
  65. package/web/dist/assets/panel-heading-izT5q0ZN.js +1 -0
  66. package/web/dist/assets/plugin-code-editor-DKE9dFEE.js +2 -0
  67. package/web/dist/assets/plugin-config-Cg09TsuV.js +2 -0
  68. package/web/dist/assets/{plugin-generator-Bj4f6dxo.js → plugin-generator-CT1f1tu0.js} +2 -2
  69. package/web/dist/assets/plugin-test-dialog-BbLIMnkJ.js +7 -0
  70. package/web/dist/assets/route-preview-CKO7nF4W.js +1 -0
  71. package/web/dist/assets/{rule-ai-assistant-panel-BEfPNBbx.js → rule-ai-assistant-panel-CtfUqdYG.js} +2 -2
  72. package/web/dist/assets/rule-config-Cb4ejIXI.js +15 -0
  73. package/web/dist/assets/rule-overview-panel-xtHTS27O.js +1 -0
  74. package/web/dist/assets/settings-panel-CpQuE6nr.js +1 -0
  75. package/web/dist/index.html +2 -2
  76. package/web/dist/assets/detail-panel-BtgWWeu3.js +0 -4
  77. package/web/dist/assets/global-panel-shell-NaUhzX7J.js +0 -6
  78. package/web/dist/assets/index-EWNlAdFB.css +0 -2
  79. package/web/dist/assets/mock-editor-panel-WQwcHSTD.js +0 -20
  80. package/web/dist/assets/panel-heading-DT_nXayM.js +0 -1
  81. package/web/dist/assets/plugin-code-editor--Gf4ZwGb.js +0 -2
  82. package/web/dist/assets/plugin-config-DsX9xCW_.js +0 -2
  83. package/web/dist/assets/plugin-test-dialog-DICuykBK.js +0 -7
  84. package/web/dist/assets/route-preview-C-LzS1lT.js +0 -1
  85. package/web/dist/assets/rule-config-Dw9pcuah.js +0 -15
  86. package/web/dist/assets/rule-overview-panel-C4QQ7U3S.js +0 -1
  87. package/web/dist/assets/settings-panel-D8DEH8aH.js +0 -1
@@ -7,8 +7,30 @@ const { apiPost } = require('../../lib/api-client')
7
7
  const { addMockRule } = require('../../lib/file-access')
8
8
  const { withProxyOrFile, failCommand } = require('../../lib/proxy-or-file')
9
9
 
10
+ const MOCK_ADD_HELP = `
11
+ meddle mock add --name <n> --pattern <p> [options] [--json]
12
+
13
+ Add a mock rule. Required: --name and --pattern.
14
+
15
+ Options:
16
+ --name <n> Rule name
17
+ --pattern <p> URL pattern (regex or string; may include query)
18
+ --query <q> Query match (exact key=value params)
19
+ --method <m> HTTP method (GET, POST, *, default: *)
20
+ --status <s> Response status code (default: 200)
21
+ --body <b> Response body content
22
+ --delay <d> Response delay in ms (default: 0)
23
+ --headers <json> Response headers JSON (values may use {origin})
24
+ --cors Shortcut: credentials-friendly CORS headers with {origin}
25
+ --json JSON output
26
+ `
27
+
10
28
  // Parse arguments
11
29
  const args = process.argv.slice(3)
30
+ if (args.includes('--help') || args.includes('-h') || args[0] === 'help') {
31
+ console.log(MOCK_ADD_HELP.trim())
32
+ process.exit(0)
33
+ }
12
34
  const jsonFlag = args.includes('--json')
13
35
  output.setJsonMode(jsonFlag)
14
36
 
@@ -2,28 +2,13 @@
2
2
  * meddle mock - Mock rule subcommand router
3
3
  */
4
4
 
5
+ const output = require('../../lib/output')
6
+
5
7
  const args = process.argv.slice(3)
6
8
  const subcommand = args[0]
9
+ const jsonFlag = args.includes('--json')
7
10
 
8
- switch (subcommand) {
9
- case 'list':
10
- require('./list.js')
11
- break
12
- case 'add':
13
- require('./add.js')
14
- break
15
- case 'update':
16
- require('./update.js')
17
- break
18
- case 'delete':
19
- require('./delete.js')
20
- break
21
- case 'enable':
22
- case 'disable':
23
- require('./toggle.js')
24
- break
25
- default:
26
- console.log(`
11
+ const MOCK_HELP = `
27
12
  Mock Commands:
28
13
  meddle mock list [--json] List all mock rules
29
14
  meddle mock add [options] Add a mock rule
@@ -49,6 +34,51 @@ Examples:
49
34
  meddle mock add --name "Policy A" --pattern "/ops/.*/policy" --query "window_key=A" --body '{"key":"A"}' --cors
50
35
  meddle mock update 1 --status 404 --headers '{"X-Debug":"1"}'
51
36
  meddle mock delete 1
52
- `)
53
- process.exit(1)
37
+ `
38
+
39
+ function printHelp(stream = process.stdout) {
40
+ stream.write(MOCK_HELP.trimStart())
41
+ }
42
+
43
+ function failUnknown(name) {
44
+ const message = `Unknown command: mock ${name}`
45
+ if (jsonFlag) {
46
+ output.setJsonMode(true)
47
+ output.error(message)
48
+ } else {
49
+ console.error(message)
50
+ printHelp(process.stderr)
51
+ }
52
+ process.exit(1)
53
+ }
54
+
55
+ switch (subcommand) {
56
+ case 'list':
57
+ require('./list.js')
58
+ break
59
+ case 'add':
60
+ require('./add.js')
61
+ break
62
+ case 'update':
63
+ require('./update.js')
64
+ break
65
+ case 'delete':
66
+ require('./delete.js')
67
+ break
68
+ case 'enable':
69
+ case 'disable':
70
+ require('./toggle.js')
71
+ break
72
+ case '--help':
73
+ case '-h':
74
+ case 'help':
75
+ printHelp()
76
+ process.exit(0)
77
+ break
78
+ default:
79
+ if (!subcommand) {
80
+ printHelp()
81
+ process.exit(1)
82
+ }
83
+ failUnknown(subcommand)
54
84
  }
@@ -123,7 +123,7 @@ async function run() {
123
123
  // Issue #137: a locked ruleset is a final answer, never a cue to write the file directly.
124
124
  if (isRulesetReadonlyError(e)) exitRulesetReadonly(e, { json: jsonFlag, ruleFile: fileName })
125
125
  const content = getRuleFileContent(fileName)
126
- if (!content) fail(`Route file not found: ${fileName}`, jsonFlag)
126
+ if (content == null) fail(`Route file not found: ${fileName}`, jsonFlag)
127
127
  const newContent = applyAdd(content, plan)
128
128
  saveRuleFileContent(fileName, newContent)
129
129
  output.warnFileOnlyMode()
@@ -133,7 +133,7 @@ async function run() {
133
133
  }
134
134
 
135
135
  const content = getRuleFileContent(fileName)
136
- if (!content) fail(`Route file not found: ${fileName}`, jsonFlag)
136
+ if (content == null) fail(`Route file not found: ${fileName}`, jsonFlag)
137
137
  const newContent = applyAdd(content, plan)
138
138
  saveRuleFileContent(fileName, newContent)
139
139
  output.warnFileOnlyMode()
@@ -101,7 +101,7 @@ async function run() {
101
101
  if (isRulesetReadonlyError(e)) exitRulesetReadonly(e, { json: jsonFlag, ruleFile: fileName })
102
102
  // Fallback to file mode
103
103
  const content = getRuleFileContent(fileName)
104
- if (!content) {
104
+ if (content == null) {
105
105
  fail(`Route file not found: ${fileName}`, jsonFlag)
106
106
  }
107
107
 
@@ -125,7 +125,7 @@ async function run() {
125
125
  } else {
126
126
  // File mode
127
127
  const content = getRuleFileContent(fileName)
128
- if (!content) {
128
+ if (content == null) {
129
129
  fail(`Route file not found: ${fileName}`, jsonFlag)
130
130
  }
131
131
 
@@ -2,36 +2,13 @@
2
2
  * meddle route - Route rule subcommand router
3
3
  */
4
4
 
5
+ const output = require('../../lib/output')
6
+
5
7
  const args = process.argv.slice(3)
6
8
  const subcommand = args[0]
9
+ const jsonFlag = args.includes('--json')
7
10
 
8
- switch (subcommand) {
9
- case 'list':
10
- require('./list.js')
11
- break
12
- case 'show':
13
- require('./show.js')
14
- break
15
- case 'preview':
16
- require('./preview.js')
17
- break
18
- case 'active':
19
- require('./active.js')
20
- break
21
- case 'create':
22
- require('./create.js')
23
- break
24
- case 'add':
25
- require('./add.js')
26
- break
27
- case 'update':
28
- require('./update.js')
29
- break
30
- case 'delete':
31
- require('./delete.js')
32
- break
33
- default:
34
- console.log(`
11
+ const ROUTE_HELP = `
35
12
  Route Commands:
36
13
  meddle route list [--json] List all route files
37
14
  meddle route show <file> [--json] Show rules in a file
@@ -72,6 +49,59 @@ Exclusions:
72
49
 
73
50
  A "#" comments out a whole line only when it is the first non-space
74
51
  character. A "#" later on a rule line is a pattern, not a trailing comment.
75
- `)
76
- process.exit(1)
77
- }
52
+ `
53
+
54
+ function printHelp(stream = process.stdout) {
55
+ stream.write(ROUTE_HELP.trimStart())
56
+ }
57
+
58
+ function failUnknown(name) {
59
+ const message = `Unknown command: route ${name}`
60
+ if (jsonFlag) {
61
+ output.setJsonMode(true)
62
+ output.error(message)
63
+ } else {
64
+ console.error(message)
65
+ printHelp(process.stderr)
66
+ }
67
+ process.exit(1)
68
+ }
69
+
70
+ switch (subcommand) {
71
+ case 'list':
72
+ require('./list.js')
73
+ break
74
+ case 'show':
75
+ require('./show.js')
76
+ break
77
+ case 'preview':
78
+ require('./preview.js')
79
+ break
80
+ case 'active':
81
+ require('./active.js')
82
+ break
83
+ case 'create':
84
+ require('./create.js')
85
+ break
86
+ case 'add':
87
+ require('./add.js')
88
+ break
89
+ case 'update':
90
+ require('./update.js')
91
+ break
92
+ case 'delete':
93
+ require('./delete.js')
94
+ break
95
+ case '--help':
96
+ case '-h':
97
+ case 'help':
98
+ printHelp()
99
+ process.exit(0)
100
+ break
101
+ default:
102
+ if (!subcommand) {
103
+ printHelp()
104
+ process.exit(1)
105
+ }
106
+ failUnknown(subcommand)
107
+ }
@@ -57,7 +57,7 @@ async function run() {
57
57
  const content = await fetch(`${baseUrl}/api/rule-files/${encodeURIComponent(ruleFileArg)}/content`)
58
58
  .then(r => r.ok ? r.text() : null)
59
59
  .catch(() => null)
60
- if (!content) {
60
+ if (content == null) {
61
61
  output.error(`Rule file not found: ${ruleFileArg}`)
62
62
  process.exit(1)
63
63
  }
@@ -91,7 +91,7 @@ async function run() {
91
91
  if (ruleFileArg) {
92
92
  // Use specified rule file
93
93
  const content = getRuleFileContent(ruleFileArg)
94
- if (!content) {
94
+ if (content == null) {
95
95
  output.error(`Rule file not found: ${ruleFileArg}`)
96
96
  process.exit(1)
97
97
  }
@@ -41,7 +41,7 @@ async function run() {
41
41
  } catch (e) {
42
42
  // Fallback to file mode
43
43
  content = getRuleFileContent(fileName)
44
- if (!content) {
44
+ if (content == null) {
45
45
  output.error(`Route file not found: ${fileName}`)
46
46
  process.exit(1)
47
47
  }
@@ -52,7 +52,7 @@ async function run() {
52
52
  }
53
53
  } else {
54
54
  content = getRuleFileContent(fileName)
55
- if (!content) {
55
+ if (content == null) {
56
56
  output.error(`Route file not found: ${fileName}`)
57
57
  process.exit(1)
58
58
  }
@@ -146,7 +146,7 @@ async function run() {
146
146
  if (isRulesetReadonlyError(e)) exitRulesetReadonly(e, { json: jsonFlag, ruleFile: fileName })
147
147
  // Fallback to file mode
148
148
  const content = getRuleFileContent(fileName)
149
- if (!content) fail(`Route file not found: ${fileName}`, jsonFlag)
149
+ if (content == null) fail(`Route file not found: ${fileName}`, jsonFlag)
150
150
  const newContent = applyUpdate(content, plan)
151
151
  saveRuleFileContent(fileName, newContent)
152
152
  output.warnFileOnlyMode()
@@ -156,7 +156,7 @@ async function run() {
156
156
  }
157
157
 
158
158
  const content = getRuleFileContent(fileName)
159
- if (!content) fail(`Route file not found: ${fileName}`, jsonFlag)
159
+ if (content == null) fail(`Route file not found: ${fileName}`, jsonFlag)
160
160
  const newContent = applyUpdate(content, plan)
161
161
  saveRuleFileContent(fileName, newContent)
162
162
  output.warnFileOnlyMode()
@@ -22,6 +22,22 @@ async function run() {
22
22
  let activeRoutes = 0
23
23
  let health = null
24
24
 
25
+ let mocksError = null
26
+
27
+ function readMocksFromFile() {
28
+ try {
29
+ const mocks = loadMockRules()
30
+ mockCount = mocks.length
31
+ activeMocks = mocks.filter(m => m.enabled).length
32
+ } catch (err) {
33
+ mocksError = err && err.code === 'MOCKS_FILE_INVALID'
34
+ ? 'Mock 规则文件格式错误'
35
+ : (err && err.message ? String(err.message) : String(err))
36
+ mockCount = 0
37
+ activeMocks = 0
38
+ }
39
+ }
40
+
25
41
  if (running) {
26
42
  try {
27
43
  // Get mock rules from API
@@ -36,19 +52,13 @@ async function run() {
36
52
  health = await apiGet('/api/health')
37
53
  } catch (_) {
38
54
  // Fallback to file access
39
- const mocks = loadMockRules()
40
- mockCount = mocks.length
41
- activeMocks = mocks.filter(m => m.enabled).length
42
-
55
+ readMocksFromFile()
43
56
  routeFiles = listRuleFiles()
44
57
  activeRoutes = routeFiles.filter(f => f.enabled).length
45
58
  }
46
59
  } else {
47
60
  // File mode
48
- const mocks = loadMockRules()
49
- mockCount = mocks.length
50
- activeMocks = mocks.filter(m => m.enabled).length
51
-
61
+ readMocksFromFile()
52
62
  routeFiles = listRuleFiles()
53
63
  activeRoutes = routeFiles.filter(f => f.enabled).length
54
64
  }
@@ -61,7 +71,9 @@ async function run() {
61
71
  proxyUrl: url,
62
72
  running,
63
73
  health,
64
- mocks: { total: mockCount, active: activeMocks },
74
+ mocks: mocksError
75
+ ? { total: mockCount, active: activeMocks, error: mocksError }
76
+ : { total: mockCount, active: activeMocks },
65
77
  routes: { files: routeFiles.length, activeFiles: activeRoutes, totalRules: totalRouteRules, totalExclusions }
66
78
  })
67
79
  return
@@ -81,8 +93,12 @@ async function run() {
81
93
  }
82
94
 
83
95
  output.section('Mock Rules')
84
- output.kv('Total', mockCount)
85
- output.kv('Active', activeMocks)
96
+ if (mocksError) {
97
+ output.warning(mocksError)
98
+ } else {
99
+ output.kv('Total', mockCount)
100
+ output.kv('Active', activeMocks)
101
+ }
86
102
 
87
103
  output.section('Route Rules')
88
104
  output.kv('Files', routeFiles.length)
package/bin/doctor.js CHANGED
@@ -7,7 +7,7 @@
7
7
  const fs = require('fs')
8
8
  const path = require('path')
9
9
  const chalk = require('chalk')
10
- const { resolveMeddleHome } = require('./lib/meddle-home')
10
+ const { resolveMeddleHome, resolveConfiguredMocksPath } = require('./lib/meddle-home')
11
11
 
12
12
  const meddleDir = resolveMeddleHome()
13
13
  const settingsPath = path.resolve(meddleDir, 'settings.json')
@@ -183,10 +183,14 @@ function checkMocksFile(settings) {
183
183
 
184
184
  let mocksPath = defaultMocksPath
185
185
 
186
- // 检查自定义路径
186
+ // Same resolution as the proxy: ~ expands, relative paths use MEDDLE_HOME.
187
187
  if (settings && settings.mocksFilePath) {
188
- mocksPath = settings.mocksFilePath
189
- printInfo(`使用自定义路径: ${mocksPath}`)
188
+ const resolved = resolveConfiguredMocksPath(settings.mocksFilePath, meddleDir)
189
+ mocksPath = resolved || defaultMocksPath
190
+ printInfo(`使用自定义路径: ${settings.mocksFilePath}`)
191
+ if (resolved && resolved !== settings.mocksFilePath) {
192
+ printInfo(`解析后路径: ${resolved}`)
193
+ }
190
194
  } else {
191
195
  printInfo(`使用默认路径: ${mocksPath}`)
192
196
  }
package/bin/index.js CHANGED
@@ -60,12 +60,12 @@ if (command === 'mock' || command === 'route' || command === 'session') {
60
60
  require('../index.js')
61
61
  } else {
62
62
  console.error(`Unknown command: ${command}`)
63
- showHelp()
63
+ showHelp(process.stderr)
64
64
  process.exit(1)
65
65
  }
66
66
 
67
- function showHelp() {
68
- console.log(`
67
+ function showHelp(stream = process.stdout) {
68
+ stream.write(`
69
69
  Meddle - 开发代理工具
70
70
 
71
71
  用法:
@@ -144,5 +144,5 @@ Route 命令:
144
144
  meddle route active set beta-rules
145
145
 
146
146
  更多信息请访问: https://github.com/JonathanLee-LX/meddle
147
- `)
147
+ `)
148
148
  }
@@ -167,31 +167,48 @@ function describeMocksParseFailure(text, err) {
167
167
  return `${loc}${short}`
168
168
  }
169
169
 
170
+ const MOCKS_MISSING_RULES_MESSAGE = '缺少 rules 数组'
171
+
172
+ function mocksDocumentShapeError(data) {
173
+ if (!data || typeof data !== 'object' || Array.isArray(data) || !Array.isArray(data.rules)) {
174
+ return MOCKS_MISSING_RULES_MESSAGE
175
+ }
176
+ return null
177
+ }
178
+
179
+ function throwMocksFileInvalid(mocksPath, detail) {
180
+ const error = new Error(`Mock 文件格式错误,已禁止写入以免覆盖: ${mocksPath} ${detail}`)
181
+ error.code = 'MOCKS_FILE_INVALID'
182
+ error.filePath = mocksPath
183
+ error.detail = detail
184
+ error.listMessage = `Mock 文件格式错误: ${mocksPath} ${detail}`
185
+ throw error
186
+ }
187
+
170
188
  /**
171
189
  * Read mocks.json. Missing file → null. Empty / whitespace → {}.
172
- * Invalid JSON throws MOCKS_FILE_INVALID and must not be treated as [].
190
+ * Invalid JSON or a valid document with the wrong shape (issue #160, e.g. a
191
+ * top-level array) throws MOCKS_FILE_INVALID and must not be treated as [].
173
192
  * `message` refuses a write; `listMessage` is what `mock list` prints.
174
193
  */
175
194
  function readMocksDocument(mocksPath) {
176
195
  if (!fs.existsSync(mocksPath)) return null
177
196
  const text = fs.readFileSync(mocksPath, 'utf8').replace(/^\uFEFF/, '')
178
197
  if (text.trim() === '') return {}
198
+ let data
179
199
  try {
180
- return JSON.parse(text)
200
+ data = JSON.parse(text)
181
201
  } catch (err) {
182
- const detail = describeMocksParseFailure(text, err)
183
- const error = new Error(`Mock 文件格式错误,已禁止写入以免覆盖: ${mocksPath} ${detail}`)
184
- error.code = 'MOCKS_FILE_INVALID'
185
- error.filePath = mocksPath
186
- error.detail = detail
187
- error.listMessage = `Mock 文件格式错误: ${mocksPath} ${detail}`
188
- throw error
202
+ throwMocksFileInvalid(mocksPath, describeMocksParseFailure(text, err))
189
203
  }
204
+ const shape = mocksDocumentShapeError(data)
205
+ if (shape) throwMocksFileInvalid(mocksPath, shape)
206
+ return data
190
207
  }
191
208
 
192
209
  function rulesFromDocument(data) {
193
- if (!data || typeof data !== 'object' || Array.isArray(data)) return []
194
- return Array.isArray(data.rules) ? data.rules : []
210
+ if (!data || typeof data !== 'object' || Array.isArray(data) || !Array.isArray(data.rules)) return []
211
+ return data.rules
195
212
  }
196
213
 
197
214
  function metaFromDocument(data) {
@@ -17,4 +17,17 @@ function resolveMeddleHome() {
17
17
  return path.resolve(os.homedir(), '.meddle')
18
18
  }
19
19
 
20
- module.exports = { resolveMeddleHome }
20
+ /**
21
+ * Same rules as core/mock-handler.resolveConfiguredMocksPath: `~` expands to
22
+ * the user home directory; a relative path is resolved against MEDDLE_HOME.
23
+ */
24
+ function resolveConfiguredMocksPath(raw, meddleDir, homeDir = os.homedir()) {
25
+ const v = typeof raw === 'string' ? raw.trim() : ''
26
+ if (!v) return null
27
+ let p = v
28
+ if (p === '~') p = homeDir
29
+ else if (p.startsWith('~/') || p.startsWith('~\\')) p = path.join(homeDir, p.slice(2))
30
+ return path.resolve(meddleDir, p)
31
+ }
32
+
33
+ module.exports = { resolveMeddleHome, resolveConfiguredMocksPath }
package/bin/lib/output.js CHANGED
@@ -52,11 +52,16 @@ function success(message) {
52
52
 
53
53
  /**
54
54
  * Print a command failure. Human-readable text goes to stderr so stdout stays
55
- * empty on error. In --json mode this is a no-op; the caller prints the
56
- * `{ success: false }` object on stdout.
55
+ * empty on error. In --json mode stdout is one `{ success: false }` object and
56
+ * the same message is copied to stderr without a `✗` prefix.
57
57
  */
58
58
  function error(message) {
59
- if (jsonMode) return
59
+ if (jsonMode) {
60
+ const text = String(message)
61
+ console.log(JSON.stringify({ success: false, error: { message: text } }))
62
+ console.error(text)
63
+ return
64
+ }
60
65
  console.error(chalk.red(' ✗'), message)
61
66
  }
62
67
 
@@ -77,7 +77,10 @@ async function withProxyOrFile({ api, file }) {
77
77
  */
78
78
  function failCommand(err) {
79
79
  const message = err && err.message ? String(err.message) : String(err)
80
- if (isApiHttpError(err) || (err && err.rawStderr) || output.isJsonMode()) console.error(message)
80
+ // HTTP / raw-stderr failures print the body as-is (no JSON wrapper, no `✗`).
81
+ // Other failures go through output.error, which emits `{success:false}` on
82
+ // stdout when --json is set.
83
+ if (isApiHttpError(err) || (err && err.rawStderr)) console.error(message)
81
84
  else output.error(message)
82
85
  process.exit(1)
83
86
  }
package/dist/cert.d.ts CHANGED
@@ -4,6 +4,8 @@ interface CAStatus {
4
4
  trusted?: boolean;
5
5
  }
6
6
  export declare function getCAStatus(): Promise<CAStatus>;
7
+ /** Skip the interactive CA menu when stdin is not a TTY or a headless/supervised start. */
8
+ export declare function shouldPromptCaTrust(): boolean;
7
9
  export declare function checkCATrusted(): boolean;
8
10
  export declare function ensureRootCA(opts?: {
9
11
  trustCheckAsync?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"cert.d.ts","sourceRoot":"","sources":["../cert.ts"],"names":[],"mappings":"AAiEA,QAAA,MAAM,MAAM,KAA8B,CAAC;AA+B3C,UAAU,QAAQ;IACd,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB;AAGD,wBAAsB,WAAW,IAAI,OAAO,CAAC,QAAQ,CAAC,CAYrD;AA6FD,wBAAgB,cAAc,IAAI,OAAO,CAgCxC;AAED,wBAAsB,YAAY,CAAC,IAAI,GAAE;IAAE,eAAe,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAyB1F;AAMD,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED,OAAO,EAAE,MAAM,EAAE,CAAC"}
1
+ {"version":3,"file":"cert.d.ts","sourceRoot":"","sources":["../cert.ts"],"names":[],"mappings":"AAiEA,QAAA,MAAM,MAAM,KAA8B,CAAC;AA+B3C,UAAU,QAAQ;IACd,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB;AAGD,wBAAsB,WAAW,IAAI,OAAO,CAAC,QAAQ,CAAC,CAYrD;AAwBD,2FAA2F;AAC3F,wBAAgB,mBAAmB,IAAI,OAAO,CAI7C;AAuED,wBAAgB,cAAc,IAAI,OAAO,CAgCxC;AAED,wBAAsB,YAAY,CAAC,IAAI,GAAE;IAAE,eAAe,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAyB1F;AAMD,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED,OAAO,EAAE,MAAM,EAAE,CAAC"}
package/dist/cert.js CHANGED
@@ -35,6 +35,7 @@ var __importStar = (this && this.__importStar) || (function () {
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.crtMgr = void 0;
37
37
  exports.getCAStatus = getCAStatus;
38
+ exports.shouldPromptCaTrust = shouldPromptCaTrust;
38
39
  exports.checkCATrusted = checkCATrusted;
39
40
  exports.ensureRootCA = ensureRootCA;
40
41
  exports.getRootCAPath = getRootCAPath;
@@ -166,6 +167,14 @@ function openCertForUser(rootCAPath) {
166
167
  }
167
168
  }
168
169
  }
170
+ /** Skip the interactive CA menu when stdin is not a TTY or a headless/supervised start. */
171
+ function shouldPromptCaTrust() {
172
+ if (process.env.MEDDLE_HEADLESS || process.env.MEDDLE_MCP || process.env.MEDDLE_SUPERVISED)
173
+ return false;
174
+ if (!process.stdin.isTTY || !process.stdout.isTTY)
175
+ return false;
176
+ return true;
177
+ }
169
178
  async function trustRootCA() {
170
179
  const platform = os.platform();
171
180
  const rootCAPath = crtMgr.getRootCAFilePath();
@@ -281,7 +290,7 @@ async function ensureRootCA(opts = {}) {
281
290
  const runTrustCheck = () => {
282
291
  try {
283
292
  const isTrusted = checkCATrusted();
284
- if (!isTrusted && !process.env.MEDDLE_HEADLESS && !process.env.MEDDLE_MCP) {
293
+ if (!isTrusted && shouldPromptCaTrust()) {
285
294
  trustRootCA();
286
295
  }
287
296
  }
package/dist/cert.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cert.js","sourceRoot":"","sources":["../cert.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsGA,kCAYC;AA6FD,wCAgCC;AAED,oCAyBC;AAMD,sCAEC;AAlRD,MAAM,QAAQ,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;AAC3C,+CAAiC;AACjC,uCAAyB;AACzB,MAAM,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AACrC,iDAAyC;AACzC,2BAAiD;AACjD,2CAA6B;AAE7B,6BAA6B;AAC7B,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;AAEhE,MAAM,OAAO,GAAG;IACZ,WAAW,EAAE,WAAW;IACxB,QAAQ,EAAE,KAAK;IACf,gBAAgB,EAAE;QACd,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,IAAI,EAAE;QACpC,EAAE,IAAI,EAAE,kBAAkB,EAAE,KAAK,EAAE,QAAQ,EAAE;QAC7C,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE;QAChC,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,kBAAkB,EAAE;KACjD;CACJ,CAAC;AAEF,2CAA2C;AAC3C,MAAM,eAAe,GAAG,IAAI,CAAC;AAE7B;;;;;;;;GAQG;AACH,SAAS,6BAA6B;IAClC,IAAI,KAAU,CAAC;IACf,IAAI,CAAC;QACD,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,KAAK,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACjH,CAAC;IAAC,MAAM,CAAC;QACL,OAAO;IACX,CAAC;IACD,MAAM,GAAG,GAAG,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC;IAC5B,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,CAAC,eAAe,KAAK,UAAU,IAAI,GAAG,CAAC,cAAc;QAAE,OAAO;IACpF,MAAM,QAAQ,GAAG,GAAG,CAAC,eAAe,CAAC;IACrC,GAAG,CAAC,eAAe,GAAG,UAAU,IAAa,EAAE,GAAG,IAAe;QAC7D,oEAAoE;QACpE,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,CAAC;QAC3F,IAAI,CAAC;YACD,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC,mBAAmB,CAAC,KAAK,EAAE;gBACrD,aAAa,EAAE,IAAI;gBACnB,cAAc,EAAE,OAAO;gBACvB,kBAAkB,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE;gBACpD,iBAAiB,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE;aACtD,CAAC,CAAC;YACH,MAAM,YAAY,GAAG,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;YAC7D,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,SAAS,EAAE,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9G,CAAC;QAAC,MAAM,CAAC;YACL,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACrC,CAAC;IACL,CAAC,CAAC;IACF,GAAG,CAAC,cAAc,GAAG,IAAI,CAAC;AAC9B,CAAC;AACD,6BAA6B,EAAE,CAAC;AAEhC,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,OAAO,CAAC,CAAC;AACvC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;AAmNlC,wBAAM;AAjNf,MAAM,CAAC,kBAAkB,GAAG,QAAQ,CAAC,kBAAkB,CAAC;AAOxD,KAAK,UAAU,UAAU,CAAC,SAAkB;IACxC,MAAM,WAAW,GAAG;QAChB,UAAU,EAAE,QAAQ;QACpB,SAAS,EAAE,SAAS;KACvB,CAAC;IAEF,OAAO,IAAI,OAAO,CAAC,CAAC,cAAc,EAAE,MAAM,EAAE,EAAE;QAC1C,IAAA,SAAI,EAAC,WAAW,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;YAC7B,IAAI,GAAG,EAAE,CAAC;gBACN,IAAA,cAAS,EAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAChD,CAAC;iBAAM,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBAC7B,mBAAmB;YACvB,CAAC;YAED,QAAQ,CAAC,cAAc,CAAC,WAAW,EAAE,CAAC,KAAmB,EAAE,OAAe,EAAE,OAAe,EAAE,EAAE;gBAC3F,IAAI,KAAK;oBAAE,MAAM,CAAC,KAAK,CAAC,CAAC;;oBACpB,cAAc,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;YAC9C,CAAC,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;AACP,CAAC;AAOD,0BAA0B;AACnB,KAAK,UAAU,WAAW;IAC7B,MAAM,MAAM,GAAa;QACrB,KAAK,EAAE,KAAK;KACf,CAAC;IACF,MAAM,OAAO,GAAG,QAAQ,CAAC,kBAAkB,EAAE,CAAC;IAC9C,IAAI,CAAC,OAAO,EAAE,CAAC;QACX,OAAO,MAAM,CAAC;IAClB,CAAC;SAAM,CAAC;QACJ,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC;QACpB,MAAM,CAAC,OAAO,GAAG,cAAc,EAAE,CAAC;QAClC,OAAO,MAAM,CAAC;IAClB,CAAC;AACL,CAAC;AAED,SAAS,eAAe,CAAC,UAAkB;IACvC,MAAM,QAAQ,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;IAC/B,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACxB,IAAI,CAAC;YACD,IAAA,wBAAQ,EAAC,SAAS,UAAU,GAAG,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;YACvD,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;YAC/C,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;YACtC,OAAO,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC;YACnE,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;QACtC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QACrC,CAAC;IACL,CAAC;SAAM,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QAC9B,IAAI,CAAC;YACD,IAAA,wBAAQ,EAAC,aAAa,UAAU,GAAG,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;YAC3D,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;QAC1C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QACrC,CAAC;IACL,CAAC;AACL,CAAC;AAED,KAAK,UAAU,WAAW;IACtB,MAAM,QAAQ,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;IAC/B,MAAM,UAAU,GAAG,MAAM,CAAC,iBAAiB,EAAE,CAAC;IAE9C,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;QACjC;YACI,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,gBAAgB;YACzB,OAAO,EAAE;gBACL,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,EAAE;gBACxC,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,QAAQ,EAAE;gBAC1C,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE;aACpC;SACJ;KACJ,CAAC,CAAC;IAEH,IAAI,MAAM,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QAC9B,eAAe,CAAC,UAAU,CAAC,CAAC;QAC5B,OAAO;IACX,CAAC;IAED,IAAI,MAAM,CAAC,OAAO,KAAK,MAAM,EAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,UAAU,EAAE,0BAA0B,CAAC,CAAC;QAC7D,OAAO;IACX,CAAC;IAED,IAAI,MAAM,CAAC,OAAO,KAAK,MAAM,EAAE,CAAC;QAC5B,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;YACxB,IAAI,CAAC;gBACD,IAAA,wBAAQ,EAAC,yFAAyF,UAAU,GAAG,EAAE;oBAC7G,KAAK,EAAE,SAAS;iBACnB,CAAC,CAAC;gBACH,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;YAClC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACX,OAAO,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;gBACzC,eAAe,CAAC,UAAU,CAAC,CAAC;YAChC,CAAC;QACL,CAAC;aAAM,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;YAC9B,eAAe,CAAC,UAAU,CAAC,CAAC;QAChC,CAAC;aAAM,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;YAC9B,MAAM,QAAQ,GAAG,oBAAoB,CAAC;YACtC,MAAM,QAAQ,GAAG,IAAA,eAAU,EAAC,kCAAkC,CAAC,CAAC;YAChE,MAAM,MAAM,GAAG,IAAA,eAAU,EAAC,kCAAkC,CAAC,CAAC;YAC9D,IAAI,CAAC;gBACD,IAAI,QAAQ,EAAE,CAAC;oBACX,MAAM,IAAI,GAAG,oCAAoC,QAAQ,EAAE,CAAC;oBAC5D,IAAA,wBAAQ,EAAC,YAAY,UAAU,MAAM,IAAI,kCAAkC,EAAE;wBACzE,KAAK,EAAE,SAAS;qBACnB,CAAC,CAAC;oBACH,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;gBAClC,CAAC;qBAAM,IAAI,MAAM,EAAE,CAAC;oBAChB,MAAM,IAAI,GAAG,oCAAoC,QAAQ,EAAE,CAAC;oBAC5D,IAAA,wBAAQ,EAAC,YAAY,UAAU,MAAM,IAAI,2BAA2B,EAAE;wBAClE,KAAK,EAAE,SAAS;qBACnB,CAAC,CAAC;oBACH,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;gBAClC,CAAC;qBAAM,CAAC;oBACJ,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;oBACvC,eAAe,CAAC,UAAU,CAAC,CAAC;gBAChC,CAAC;YACL,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACX,OAAO,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;gBACzC,eAAe,CAAC,UAAU,CAAC,CAAC;YAChC,CAAC;QACL,CAAC;IACL,CAAC;AACL,CAAC;AAED,SAAgB,cAAc;IAC1B,MAAM,UAAU,GAAG,MAAM,CAAC,iBAAiB,EAAE,CAAC;IAC9C,IAAI,CAAC,UAAU;QAAE,OAAO,KAAK,CAAC;IAC9B,MAAM,QAAQ,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;IAC/B,IAAI,CAAC;QACD,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;YACxB,IAAA,wBAAQ,EAAC,0EAA0E,EAAE;gBACjF,KAAK,EAAE,MAAM;gBACb,OAAO,EAAE,eAAe;aAC3B,CAAC,CAAC;YACH,OAAO,IAAI,CAAC;QAChB,CAAC;aAAM,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;YAC9B,MAAM,SAAS,GAAG;gBACd,oCAAoC;gBACpC,kCAAkC;aACrC,CAAC;YACF,KAAK,MAAM,MAAM,IAAI,SAAS,EAAE,CAAC;gBAC7B,IAAI,IAAA,eAAU,EAAC,MAAM,CAAC,EAAE,CAAC;oBACrB,IAAA,wBAAQ,EAAC,2BAA2B,MAAM,MAAM,UAAU,GAAG,EAAE;wBAC3D,KAAK,EAAE,MAAM;wBACb,OAAO,EAAE,eAAe;qBAC3B,CAAC,CAAC;oBACH,OAAO,IAAI,CAAC;gBAChB,CAAC;YACL,CAAC;YACD,OAAO,KAAK,CAAC;QACjB,CAAC;aAAM,CAAC;YACJ,OAAO,KAAK,CAAC;QACjB,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,KAAK,CAAC;IACjB,CAAC;AACL,CAAC;AAEM,KAAK,UAAU,YAAY,CAAC,OAAsC,EAAE;IACvE,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE,EAAE,CAAC;QAC/B,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,CAAC;QACrD,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAC7C,CAAC;IAED,MAAM,aAAa,GAAG,GAAS,EAAE;QAC7B,IAAI,CAAC;YACD,MAAM,SAAS,GAAG,cAAc,EAAE,CAAC;YACnC,IAAI,CAAC,SAAS,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC;gBACxE,WAAW,EAAE,CAAC;YAClB,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC;QACrD,CAAC;IACL,CAAC,CAAC;IAEF,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,iCAAiC;QACjC,oCAAoC;QACpC,YAAY,CAAC,aAAa,CAAC,CAAC;QAC5B,OAAO;IACX,CAAC;IAED,aAAa,EAAE,CAAC;AACpB,CAAC;AAED,SAAS,eAAe,CAAC,GAAY;IACjC,OAAO,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AAC5D,CAAC;AAED,SAAgB,aAAa;IACzB,OAAO,MAAM,CAAC,iBAAiB,EAAE,CAAC;AACtC,CAAC"}
1
+ {"version":3,"file":"cert.js","sourceRoot":"","sources":["../cert.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,7 @@
1
1
  import * as os from 'os';
2
2
  type Platform = ReturnType<typeof os.platform>;
3
+ /** Same availability rules as `findInstalledBrowser` (PATH on Windows/Linux, .app on macOS). */
4
+ export declare function candidateAvailable(platform: Platform, app: string): boolean;
3
5
  /** Name of a browser this machine can launch (`google-chrome`, `Google Chrome`, …), or null. */
4
6
  export declare function findInstalledBrowser(platform?: Platform): string | null;
5
7
  /** Stop browsers opened by this process. Tests call this from afterAll. */
@@ -1 +1 @@
1
- {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../core/browser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAA;AAmBxB,KAAK,QAAQ,GAAG,UAAU,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,CAAA;AAgC9C,gGAAgG;AAChG,wBAAgB,oBAAoB,CAAC,QAAQ,GAAE,QAAwB,GAAG,MAAM,GAAG,IAAI,CAStF;AAwCD,2EAA2E;AAC3E,wBAAgB,qBAAqB,IAAI,IAAI,CAM5C;AA2GD,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,mBAAmB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAuB9I"}
1
+ {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../core/browser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAA;AAmBxB,KAAK,QAAQ,GAAG,UAAU,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,CAAA;AAgC9C,gGAAgG;AAChG,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAG3E;AAED,gGAAgG;AAChG,wBAAgB,oBAAoB,CAAC,QAAQ,GAAE,QAAwB,GAAG,MAAM,GAAG,IAAI,CAKtF;AAwCD,2EAA2E;AAC3E,wBAAgB,qBAAqB,IAAI,IAAI,CAM5C;AAgHD,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,mBAAmB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CA6B9I"}