@checkly/playwright-core 1.48.22 → 1.51.11-beta.2

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 (307) hide show
  1. package/ThirdPartyNotices.txt +60 -48
  2. package/bin/reinstall_chrome_beta_linux.sh +10 -8
  3. package/bin/reinstall_chrome_stable_linux.sh +10 -8
  4. package/bin/reinstall_msedge_beta_linux.sh +17 -9
  5. package/bin/reinstall_msedge_dev_linux.sh +17 -9
  6. package/bin/reinstall_msedge_stable_linux.sh +17 -9
  7. package/browsers.json +33 -12
  8. package/index.js +0 -1
  9. package/lib/androidServerImpl.js +5 -5
  10. package/lib/browserServerImpl.js +18 -9
  11. package/lib/checkly/secretsFilter.js +1 -1
  12. package/lib/cli/driver.js +6 -6
  13. package/lib/cli/program.js +38 -43
  14. package/lib/cli/programWithTestStub.js +2 -1
  15. package/lib/client/android.js +37 -58
  16. package/lib/client/artifact.js +4 -7
  17. package/lib/client/browser.js +10 -15
  18. package/lib/client/browserContext.js +69 -62
  19. package/lib/client/browserType.js +30 -64
  20. package/lib/client/channelOwner.js +53 -68
  21. package/lib/client/clientHelper.js +4 -6
  22. package/lib/client/clientInstrumentation.js +2 -0
  23. package/lib/client/clientStackTrace.js +65 -0
  24. package/lib/client/connection.js +48 -41
  25. package/lib/client/consoleMessage.js +4 -7
  26. package/lib/client/electron.js +10 -10
  27. package/lib/client/elementHandle.js +32 -33
  28. package/lib/client/errors.js +2 -2
  29. package/lib/client/eventEmitter.js +5 -8
  30. package/lib/client/fetch.js +61 -62
  31. package/lib/client/fileUtils.js +31 -0
  32. package/lib/client/frame.js +22 -23
  33. package/lib/client/harRouter.js +7 -9
  34. package/lib/client/jsHandle.js +3 -4
  35. package/lib/client/localUtils.js +24 -0
  36. package/lib/client/locator.js +27 -13
  37. package/lib/client/network.js +44 -37
  38. package/lib/client/page.js +50 -41
  39. package/lib/client/platform.js +71 -0
  40. package/lib/client/playwright.js +21 -1
  41. package/lib/client/selectors.js +8 -2
  42. package/lib/client/stream.js +2 -21
  43. package/lib/client/timeoutSettings.js +65 -0
  44. package/lib/client/tracing.js +29 -7
  45. package/lib/client/video.js +2 -2
  46. package/lib/client/waiter.js +19 -16
  47. package/lib/client/webSocket.js +106 -0
  48. package/lib/client/worker.js +4 -4
  49. package/lib/client/writableStream.js +2 -21
  50. package/lib/generated/consoleApiSource.js +1 -1
  51. package/lib/generated/injectedScriptSource.js +1 -1
  52. package/lib/generated/pollingRecorderSource.js +1 -1
  53. package/lib/generated/recorderSource.js +7 -0
  54. package/lib/generated/webSocketMockSource.js +1 -1
  55. package/lib/inProcessFactory.js +8 -3
  56. package/lib/outofprocess.js +12 -8
  57. package/lib/protocol/debug.js +1 -1
  58. package/lib/protocol/validator.js +77 -11
  59. package/lib/protocol/validatorPrimitives.js +1 -2
  60. package/lib/remote/playwrightConnection.js +21 -12
  61. package/lib/remote/playwrightServer.js +22 -8
  62. package/lib/server/android/android.js +17 -14
  63. package/lib/server/android/backendAdb.js +14 -14
  64. package/lib/server/artifact.js +3 -3
  65. package/lib/server/bidi/bidiBrowser.js +11 -8
  66. package/lib/server/bidi/bidiChromium.js +5 -4
  67. package/lib/server/bidi/bidiConnection.js +1 -3
  68. package/lib/server/bidi/bidiExecutionContext.js +71 -25
  69. package/lib/server/bidi/bidiFirefox.js +4 -3
  70. package/lib/server/bidi/bidiInput.js +11 -12
  71. package/lib/server/bidi/bidiNetworkManager.js +11 -12
  72. package/lib/server/bidi/bidiOverCdp.js +2 -2
  73. package/lib/server/bidi/bidiPage.js +39 -66
  74. package/lib/server/bidi/third_party/bidiKeyboard.js +9 -7
  75. package/lib/server/bidi/third_party/firefoxPrefs.js +19 -3
  76. package/lib/server/browser.js +2 -2
  77. package/lib/server/browserContext.js +60 -55
  78. package/lib/server/browserType.js +22 -18
  79. package/lib/server/callLog.js +79 -0
  80. package/lib/server/chromium/chromium.js +20 -16
  81. package/lib/server/chromium/chromiumSwitches.js +32 -9
  82. package/lib/server/chromium/crBrowser.js +25 -24
  83. package/lib/server/chromium/crConnection.js +2 -2
  84. package/lib/server/chromium/crCoverage.js +1 -1
  85. package/lib/server/chromium/crDevTools.js +1 -1
  86. package/lib/server/chromium/crDragDrop.js +1 -1
  87. package/lib/server/chromium/crExecutionContext.js +26 -35
  88. package/lib/server/chromium/crInput.js +17 -6
  89. package/lib/server/chromium/crNetworkManager.js +3 -3
  90. package/lib/server/chromium/crPage.js +43 -55
  91. package/lib/server/chromium/crPdf.js +1 -1
  92. package/lib/server/chromium/crProtocolHelper.js +3 -3
  93. package/lib/server/chromium/crServiceWorker.js +2 -2
  94. package/lib/server/chromium/videoRecorder.js +2 -2
  95. package/lib/server/clock.js +1 -1
  96. package/lib/server/codegen/csharp.js +21 -16
  97. package/lib/server/codegen/java.js +17 -9
  98. package/lib/server/codegen/javascript.js +37 -7
  99. package/lib/server/codegen/jsonl.js +1 -1
  100. package/lib/server/codegen/languages.js +2 -2
  101. package/lib/server/codegen/python.js +14 -17
  102. package/lib/server/debugController.js +23 -45
  103. package/lib/server/debugger.js +1 -1
  104. package/lib/server/deviceDescriptors.js +1 -1
  105. package/lib/server/deviceDescriptorsSource.json +131 -131
  106. package/lib/server/dispatchers/androidDispatcher.js +14 -3
  107. package/lib/server/dispatchers/artifactDispatcher.js +3 -3
  108. package/lib/server/dispatchers/browserContextDispatcher.js +21 -32
  109. package/lib/server/dispatchers/browserTypeDispatcher.js +1 -1
  110. package/lib/server/dispatchers/cdpSessionDispatcher.js +1 -1
  111. package/lib/server/dispatchers/debugControllerDispatcher.js +5 -3
  112. package/lib/server/dispatchers/dispatcher.js +27 -25
  113. package/lib/server/dispatchers/electronDispatcher.js +3 -3
  114. package/lib/server/dispatchers/elementHandlerDispatcher.js +7 -2
  115. package/lib/server/dispatchers/frameDispatcher.js +9 -3
  116. package/lib/server/dispatchers/jsonPipeDispatcher.js +2 -2
  117. package/lib/server/dispatchers/localUtilsDispatcher.js +25 -291
  118. package/lib/server/dispatchers/networkDispatchers.js +3 -3
  119. package/lib/server/dispatchers/pageDispatcher.js +10 -8
  120. package/lib/server/dispatchers/playwrightDispatcher.js +5 -5
  121. package/lib/server/dispatchers/streamDispatcher.js +4 -3
  122. package/lib/server/dispatchers/tracingDispatcher.js +10 -0
  123. package/lib/server/dispatchers/webSocketRouteDispatcher.js +18 -18
  124. package/lib/server/dispatchers/writableStreamDispatcher.js +5 -6
  125. package/lib/server/dom.js +102 -48
  126. package/lib/server/download.js +1 -1
  127. package/lib/server/electron/electron.js +17 -16
  128. package/lib/server/errors.js +1 -1
  129. package/lib/server/fetch.js +49 -33
  130. package/lib/server/fileUploadUtils.js +7 -4
  131. package/lib/server/firefox/ffBrowser.js +17 -9
  132. package/lib/server/firefox/ffConnection.js +1 -1
  133. package/lib/server/firefox/ffExecutionContext.js +25 -29
  134. package/lib/server/firefox/ffInput.js +15 -4
  135. package/lib/server/firefox/ffNetworkManager.js +3 -3
  136. package/lib/server/firefox/ffPage.js +29 -50
  137. package/lib/server/firefox/firefox.js +7 -9
  138. package/lib/server/frameSelectors.js +1 -1
  139. package/lib/server/frames.js +65 -55
  140. package/lib/server/har/harRecorder.js +4 -4
  141. package/lib/server/har/harTracer.js +8 -9
  142. package/lib/server/harBackend.js +157 -0
  143. package/lib/server/helper.js +2 -2
  144. package/lib/server/index.js +1 -14
  145. package/lib/server/input.js +3 -4
  146. package/lib/server/instrumentation.js +2 -2
  147. package/lib/server/isomorphic/utilityScriptSerializers.js +3 -0
  148. package/lib/server/javascript.js +26 -33
  149. package/lib/server/launchApp.js +7 -7
  150. package/lib/server/localUtils.js +203 -0
  151. package/lib/server/network.js +5 -5
  152. package/lib/server/page.js +76 -37
  153. package/lib/server/pipeTransport.js +1 -1
  154. package/lib/server/playwright.js +5 -5
  155. package/lib/server/progress.js +1 -4
  156. package/lib/server/protocolError.js +1 -1
  157. package/lib/server/recorder/chat.js +177 -0
  158. package/lib/server/recorder/codeGenerator.js +154 -0
  159. package/lib/server/recorder/contextRecorder.js +9 -18
  160. package/lib/server/recorder/csharp.js +311 -0
  161. package/lib/server/recorder/java.js +249 -0
  162. package/lib/server/recorder/javascript.js +230 -0
  163. package/lib/server/recorder/jsonl.js +48 -0
  164. package/lib/server/recorder/language.js +45 -0
  165. package/lib/server/recorder/python.js +276 -0
  166. package/lib/server/recorder/recorderActions.js +6 -0
  167. package/lib/server/recorder/recorderApp.js +25 -28
  168. package/lib/server/recorder/recorderCollection.js +9 -21
  169. package/lib/server/recorder/recorderInTraceViewer.js +1 -1
  170. package/lib/server/recorder/recorderRunner.js +7 -3
  171. package/lib/server/recorder/recorderUtils.js +5 -28
  172. package/lib/server/recorder/throttledFile.js +3 -4
  173. package/lib/server/recorder/utils.js +46 -0
  174. package/lib/server/recorder.js +83 -43
  175. package/lib/server/registry/browserFetcher.js +10 -8
  176. package/lib/server/registry/dependencies.js +20 -20
  177. package/lib/server/registry/index.js +215 -61
  178. package/lib/server/registry/nativeDeps.js +10 -4
  179. package/lib/server/registry/oopDownloadBrowserMain.js +3 -3
  180. package/lib/server/screenshotter.js +1 -1
  181. package/lib/server/selectors.js +3 -3
  182. package/lib/server/socksClientCertificatesInterceptor.js +8 -8
  183. package/lib/server/socksInterceptor.js +8 -5
  184. package/lib/server/storageScript.js +160 -0
  185. package/lib/server/timeoutSettings.js +74 -0
  186. package/lib/server/trace/recorder/snapshotter.js +10 -20
  187. package/lib/server/trace/recorder/snapshotterInjected.js +26 -1
  188. package/lib/server/trace/recorder/tracing.js +108 -45
  189. package/lib/server/trace/test/inMemorySnapshotter.js +6 -6
  190. package/lib/server/trace/viewer/traceViewer.js +21 -7
  191. package/lib/server/transport.js +3 -2
  192. package/lib/server/utils/ascii.js +31 -0
  193. package/lib/server/utils/comparators.js +159 -0
  194. package/lib/server/utils/crypto.js +171 -0
  195. package/lib/server/utils/debug.js +38 -0
  196. package/lib/server/utils/debugLogger.js +93 -0
  197. package/lib/server/utils/env.js +53 -0
  198. package/lib/server/utils/eventsHelper.js +38 -0
  199. package/lib/server/utils/expectUtils.js +33 -0
  200. package/lib/server/utils/fileUtils.js +204 -0
  201. package/lib/server/utils/happyEyeballs.js +207 -0
  202. package/lib/server/utils/hostPlatform.js +145 -0
  203. package/lib/server/utils/httpServer.js +233 -0
  204. package/lib/server/utils/image_tools/colorUtils.js +98 -0
  205. package/lib/server/utils/image_tools/compare.js +108 -0
  206. package/lib/server/utils/image_tools/imageChannel.js +70 -0
  207. package/lib/server/utils/image_tools/stats.js +102 -0
  208. package/lib/server/utils/linuxUtils.js +58 -0
  209. package/lib/server/utils/network.js +160 -0
  210. package/lib/server/utils/nodePlatform.js +140 -0
  211. package/lib/server/utils/pipeTransport.js +82 -0
  212. package/lib/server/utils/processLauncher.js +248 -0
  213. package/lib/server/utils/profiler.js +52 -0
  214. package/lib/server/utils/socksProxy.js +570 -0
  215. package/lib/server/utils/spawnAsync.js +45 -0
  216. package/lib/server/utils/task.js +58 -0
  217. package/lib/server/utils/userAgent.js +91 -0
  218. package/lib/server/utils/wsServer.js +128 -0
  219. package/lib/server/utils/zipFile.js +75 -0
  220. package/lib/server/utils/zones.js +54 -0
  221. package/lib/server/webkit/webkit.js +4 -4
  222. package/lib/server/webkit/wkBrowser.js +10 -10
  223. package/lib/server/webkit/wkConnection.js +1 -1
  224. package/lib/server/webkit/wkExecutionContext.js +26 -30
  225. package/lib/server/webkit/wkInput.js +17 -7
  226. package/lib/server/webkit/wkInterceptableRequest.js +2 -2
  227. package/lib/server/webkit/wkPage.js +80 -66
  228. package/lib/server/webkit/wkProvisionalPage.js +1 -1
  229. package/lib/server/webkit/wkWorkers.js +2 -2
  230. package/lib/utils/fileUtils.js +1 -1
  231. package/lib/utils/glob.js +84 -0
  232. package/lib/utils/isomorphic/ariaSnapshot.js +392 -0
  233. package/lib/utils/isomorphic/assert.js +25 -0
  234. package/lib/utils/isomorphic/colors.js +65 -0
  235. package/lib/utils/isomorphic/cssParser.js +5 -5
  236. package/lib/utils/isomorphic/headers.js +52 -0
  237. package/lib/utils/isomorphic/locatorGenerators.js +38 -8
  238. package/lib/utils/isomorphic/locatorParser.js +19 -13
  239. package/lib/utils/isomorphic/manualPromise.js +107 -0
  240. package/lib/utils/isomorphic/mimeType.js +11 -3
  241. package/lib/utils/isomorphic/multimap.js +73 -0
  242. package/lib/utils/isomorphic/rtti.js +41 -0
  243. package/lib/utils/isomorphic/semaphore.js +51 -0
  244. package/lib/utils/isomorphic/stackTrace.js +169 -0
  245. package/lib/utils/isomorphic/stringUtils.js +31 -1
  246. package/lib/utils/isomorphic/time.js +25 -0
  247. package/lib/utils/isomorphic/timeoutRunner.js +66 -0
  248. package/lib/utils/isomorphic/traceUtils.js +23 -0
  249. package/lib/utils/isomorphic/types.js +5 -0
  250. package/lib/utils/isomorphic/urlMatch.js +7 -5
  251. package/lib/utils/mimeType.js +30 -0
  252. package/lib/utils/stackTrace.js +1 -1
  253. package/lib/utils.js +447 -0
  254. package/lib/utilsBundle.js +4 -29
  255. package/lib/utilsBundleImpl/index.js +188 -33
  256. package/lib/vite/htmlReport/index.html +20 -17
  257. package/lib/vite/recorder/assets/codeMirrorModule-B9YMkrwa.js +24 -0
  258. package/lib/vite/recorder/assets/index-ELPgmkwA.js +184 -0
  259. package/lib/vite/recorder/assets/{index-BW-aOBcL.css → index-eHBmevrY.css} +1 -1
  260. package/lib/vite/recorder/index.html +2 -2
  261. package/lib/vite/traceViewer/assets/codeMirrorModule-gU1OOCQO.js +24 -0
  262. package/lib/vite/traceViewer/assets/defaultSettingsView-B5n_FjMx.js +1 -0
  263. package/lib/vite/traceViewer/assets/inspectorTab-6Tru8Mn_.js +235 -0
  264. package/lib/vite/traceViewer/assets/workbench-B_Nj4NA2.js +25 -0
  265. package/lib/vite/traceViewer/assets/{xtermModule-BeNbaIVa.js → xtermModule-BoAIEibi.js} +7 -7
  266. package/lib/vite/traceViewer/defaultSettingsView.CO3FR0CX.css +1 -0
  267. package/lib/vite/traceViewer/{embedded.BkvOrz5Z.js → embedded.DpNPH6mk.js} +2 -2
  268. package/lib/vite/traceViewer/embedded.html +6 -6
  269. package/lib/vite/traceViewer/index.CuE3SYGw.js +2 -0
  270. package/lib/vite/traceViewer/index.html +27 -9
  271. package/lib/vite/traceViewer/inspectorTab.CXDulcFG.css +1 -0
  272. package/lib/vite/traceViewer/{recorder.DNMfnSiu.js → recorder.BD-uZJs7.js} +2 -2
  273. package/lib/vite/traceViewer/recorder.html +4 -4
  274. package/lib/vite/traceViewer/sw.bundle.js +7888 -3
  275. package/lib/vite/traceViewer/{uiMode.CAYqod-m.css → uiMode.BatfzHMG.css} +1 -1
  276. package/lib/vite/traceViewer/uiMode.DHrNgddz.js +5 -0
  277. package/lib/vite/traceViewer/uiMode.html +8 -7
  278. package/lib/vite/traceViewer/workbench.B9vIAzH9.css +1 -0
  279. package/lib/zipBundleImpl.js +4 -4
  280. package/package.json +7 -7
  281. package/types/protocol.d.ts +820 -153
  282. package/types/types.d.ts +285 -82
  283. package/bin/PrintDeps.exe +0 -0
  284. package/bin/README.md +0 -2
  285. package/lib/vite/recorder/assets/codeMirrorModule-d0KhC1qL.js +0 -24
  286. package/lib/vite/recorder/assets/index-Bxxcmxlu.js +0 -42
  287. package/lib/vite/traceViewer/assets/codeMirrorModule-pBPtArIT.js +0 -24
  288. package/lib/vite/traceViewer/assets/codeMirrorModule-tzBrK1V4.js +0 -24
  289. package/lib/vite/traceViewer/assets/inspectorTab-BuJ3wAX_.js +0 -64
  290. package/lib/vite/traceViewer/assets/inspectorTab-Soeeuvzv.js +0 -64
  291. package/lib/vite/traceViewer/assets/testServerConnection-DeE2kSzz.js +0 -1
  292. package/lib/vite/traceViewer/assets/workbench-DdmJ9AJV.js +0 -9
  293. package/lib/vite/traceViewer/assets/workbench-lypYlf00.js +0 -9
  294. package/lib/vite/traceViewer/embedded.DInvAijy.js +0 -2
  295. package/lib/vite/traceViewer/index.Dha3cgqs.js +0 -2
  296. package/lib/vite/traceViewer/index._Iolt-uE.js +0 -2
  297. package/lib/vite/traceViewer/inspectorTab.DLjBDrQR.css +0 -1
  298. package/lib/vite/traceViewer/recorder.DTSaNaly.js +0 -2
  299. package/lib/vite/traceViewer/uiMode.BM7yhjzl.js +0 -5
  300. package/lib/vite/traceViewer/uiMode.Cr1tvTWS.js +0 -5
  301. package/lib/vite/traceViewer/workbench.DlsCx8k5.css +0 -1
  302. /package/lib/vite/recorder/assets/{codeMirrorModule-ez37Vkbh.css → codeMirrorModule-C3UTv-Ge.css} +0 -0
  303. /package/lib/vite/traceViewer/{codeMirrorModule.ez37Vkbh.css → codeMirrorModule.C3UTv-Ge.css} +0 -0
  304. /package/lib/vite/traceViewer/{embedded.w7WN2u1R.css → embedded.mLhjB5IF.css} +0 -0
  305. /package/lib/vite/traceViewer/{index.CrbWWHbf.css → index.CFOW-Ezb.css} +0 -0
  306. /package/lib/vite/traceViewer/{recorder.B_SY1GJM.css → recorder.tn0RQdqM.css} +0 -0
  307. /package/lib/vite/traceViewer/{xtermModule.DSXBckUd.css → xtermModule.Beg8tuEN.css} +0 -0
@@ -9,15 +9,11 @@ exports.convertSelectOptionValues = convertSelectOptionValues;
9
9
  exports.determineScreenshotType = determineScreenshotType;
10
10
  var _frame = require("./frame");
11
11
  var _jsHandle = require("./jsHandle");
12
- var _fs = _interopRequireDefault(require("fs"));
13
- var _utilsBundle = require("../utilsBundle");
14
- var _path = _interopRequireDefault(require("path"));
15
- var _utils = require("../utils");
16
- var _fileUtils = require("../utils/fileUtils");
12
+ var _assert = require("../utils/isomorphic/assert");
13
+ var _fileUtils = require("./fileUtils");
14
+ var _rtti = require("../utils/isomorphic/rtti");
17
15
  var _writableStream = require("./writableStream");
18
- var _stream = require("stream");
19
- var _util = require("util");
20
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
16
+ var _mimeType = require("../utils/isomorphic/mimeType");
21
17
  /**
22
18
  * Copyright (c) Microsoft Corporation.
23
19
  *
@@ -34,7 +30,6 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
34
30
  * limitations under the License.
35
31
  */
36
32
 
37
- const pipelineAsync = (0, _util.promisify)(_stream.pipeline);
38
33
  class ElementHandle extends _jsHandle.JSHandle {
39
34
  static from(handle) {
40
35
  return handle._object;
@@ -56,6 +51,10 @@ class ElementHandle extends _jsHandle.JSHandle {
56
51
  async contentFrame() {
57
52
  return _frame.Frame.fromNullable((await this._elementChannel.contentFrame()).frame);
58
53
  }
54
+ async _generateLocatorString() {
55
+ const value = (await this._elementChannel.generateLocatorString()).value;
56
+ return value === undefined ? null : value;
57
+ }
59
58
  async getAttribute(name) {
60
59
  const value = (await this._elementChannel.getAttribute({
61
60
  name
@@ -133,7 +132,7 @@ class ElementHandle extends _jsHandle.JSHandle {
133
132
  async setInputFiles(files, options = {}) {
134
133
  const frame = await this.ownerFrame();
135
134
  if (!frame) throw new Error('Cannot set input files to detached element');
136
- const converted = await convertInputFiles(files, frame.page().context());
135
+ const converted = await convertInputFiles(this._platform, files, frame.page().context());
137
136
  await this._elementChannel.setInputFiles({
138
137
  ...converted,
139
138
  ...options
@@ -168,21 +167,22 @@ class ElementHandle extends _jsHandle.JSHandle {
168
167
  return value === undefined ? null : value;
169
168
  }
170
169
  async screenshot(options = {}) {
170
+ const mask = options.mask;
171
171
  const copy = {
172
172
  ...options,
173
173
  mask: undefined
174
174
  };
175
175
  if (!copy.type) copy.type = determineScreenshotType(options);
176
- if (options.mask) {
177
- copy.mask = options.mask.map(locator => ({
176
+ if (mask) {
177
+ copy.mask = mask.map(locator => ({
178
178
  frame: locator._frame._channel,
179
179
  selector: locator._selector
180
180
  }));
181
181
  }
182
182
  const result = await this._elementChannel.screenshot(copy);
183
183
  if (options.path) {
184
- await (0, _fileUtils.mkdirIfNeeded)(options.path);
185
- await _fs.default.promises.writeFile(options.path, result.binary);
184
+ await (0, _fileUtils.mkdirIfNeeded)(this._platform, options.path);
185
+ await this._platform.fs().promises.writeFile(options.path, result.binary);
186
186
  }
187
187
  return result.binary;
188
188
  }
@@ -234,11 +234,11 @@ function convertSelectOptionValues(values) {
234
234
  if (values === null) return {};
235
235
  if (!Array.isArray(values)) values = [values];
236
236
  if (!values.length) return {};
237
- for (let i = 0; i < values.length; i++) (0, _utils.assert)(values[i] !== null, `options[${i}]: expected object, got null`);
237
+ for (let i = 0; i < values.length; i++) (0, _assert.assert)(values[i] !== null, `options[${i}]: expected object, got null`);
238
238
  if (values[0] instanceof ElementHandle) return {
239
239
  elements: values.map(v => v._elementChannel)
240
240
  };
241
- if ((0, _utils.isString)(values[0])) return {
241
+ if ((0, _rtti.isString)(values[0])) return {
242
242
  options: values.map(valueOrLabel => ({
243
243
  valueOrLabel
244
244
  }))
@@ -250,50 +250,49 @@ function convertSelectOptionValues(values) {
250
250
  function filePayloadExceedsSizeLimit(payloads) {
251
251
  return payloads.reduce((size, item) => size + (item.buffer ? item.buffer.byteLength : 0), 0) >= _fileUtils.fileUploadSizeLimit;
252
252
  }
253
- async function resolvePathsAndDirectoryForInputFiles(items) {
254
- var _localPaths2;
253
+ async function resolvePathsAndDirectoryForInputFiles(platform, items) {
254
+ var _localPaths;
255
255
  let localPaths;
256
256
  let localDirectory;
257
257
  for (const item of items) {
258
- const stat = await _fs.default.promises.stat(item);
258
+ const stat = await platform.fs().promises.stat(item);
259
259
  if (stat.isDirectory()) {
260
260
  if (localDirectory) throw new Error('Multiple directories are not supported');
261
- localDirectory = _path.default.resolve(item);
261
+ localDirectory = platform.path().resolve(item);
262
262
  } else {
263
- var _localPaths;
264
- (_localPaths = localPaths) !== null && _localPaths !== void 0 ? _localPaths : localPaths = [];
265
- localPaths.push(_path.default.resolve(item));
263
+ localPaths !== null && localPaths !== void 0 ? localPaths : localPaths = [];
264
+ localPaths.push(platform.path().resolve(item));
266
265
  }
267
266
  }
268
- if ((_localPaths2 = localPaths) !== null && _localPaths2 !== void 0 && _localPaths2.length && localDirectory) throw new Error('File paths must be all files or a single directory');
267
+ if ((_localPaths = localPaths) !== null && _localPaths !== void 0 && _localPaths.length && localDirectory) throw new Error('File paths must be all files or a single directory');
269
268
  return [localPaths, localDirectory];
270
269
  }
271
- async function convertInputFiles(files, context) {
270
+ async function convertInputFiles(platform, files, context) {
272
271
  const items = Array.isArray(files) ? files.slice() : [files];
273
272
  if (items.some(item => typeof item === 'string')) {
274
273
  if (!items.every(item => typeof item === 'string')) throw new Error('File paths cannot be mixed with buffers');
275
- const [localPaths, localDirectory] = await resolvePathsAndDirectoryForInputFiles(items);
274
+ const [localPaths, localDirectory] = await resolvePathsAndDirectoryForInputFiles(platform, items);
276
275
  if (context._connection.isRemote()) {
277
- const files = localDirectory ? (await _fs.default.promises.readdir(localDirectory, {
276
+ const files = localDirectory ? (await platform.fs().promises.readdir(localDirectory, {
278
277
  withFileTypes: true,
279
278
  recursive: true
280
- })).filter(f => f.isFile()).map(f => _path.default.join(f.path, f.name)) : localPaths;
279
+ })).filter(f => f.isFile()).map(f => platform.path().join(f.path, f.name)) : localPaths;
281
280
  const {
282
281
  writableStreams,
283
282
  rootDir
284
283
  } = await context._wrapApiCall(async () => context._channel.createTempFiles({
285
- rootDirName: localDirectory ? _path.default.basename(localDirectory) : undefined,
284
+ rootDirName: localDirectory ? platform.path().basename(localDirectory) : undefined,
286
285
  items: await Promise.all(files.map(async file => {
287
- const lastModifiedMs = (await _fs.default.promises.stat(file)).mtimeMs;
286
+ const lastModifiedMs = (await platform.fs().promises.stat(file)).mtimeMs;
288
287
  return {
289
- name: localDirectory ? _path.default.relative(localDirectory, file) : _path.default.basename(file),
288
+ name: localDirectory ? platform.path().relative(localDirectory, file) : platform.path().basename(file),
290
289
  lastModifiedMs
291
290
  };
292
291
  }))
293
292
  }), true);
294
293
  for (let i = 0; i < files.length; i++) {
295
294
  const writable = _writableStream.WritableStream.from(writableStreams[i]);
296
- await pipelineAsync(_fs.default.createReadStream(files[i]), writable.stream());
295
+ await platform.streamFile(files[i], writable.stream());
297
296
  }
298
297
  return {
299
298
  directoryStream: rootDir,
@@ -313,7 +312,7 @@ async function convertInputFiles(files, context) {
313
312
  }
314
313
  function determineScreenshotType(options) {
315
314
  if (options.path) {
316
- const mimeType = _utilsBundle.mime.getType(options.path);
315
+ const mimeType = (0, _mimeType.getMimeTypeForPath)(options.path);
317
316
  if (mimeType === 'image/png') return 'png';else if (mimeType === 'image/jpeg') return 'jpeg';
318
317
  throw new Error(`path: unsupported mime type "${mimeType}"`);
319
318
  }
@@ -7,8 +7,8 @@ exports.TimeoutError = exports.TargetClosedError = void 0;
7
7
  exports.isTargetClosedError = isTargetClosedError;
8
8
  exports.parseError = parseError;
9
9
  exports.serializeError = serializeError;
10
- var _utils = require("../utils");
11
10
  var _serializers = require("../protocol/serializers");
11
+ var _rtti = require("../utils/isomorphic/rtti");
12
12
  /**
13
13
  * Copyright (c) Microsoft Corporation.
14
14
  *
@@ -42,7 +42,7 @@ function isTargetClosedError(error) {
42
42
  return error instanceof TargetClosedError;
43
43
  }
44
44
  function serializeError(e) {
45
- if ((0, _utils.isError)(e)) return {
45
+ if ((0, _rtti.isError)(e)) return {
46
46
  error: {
47
47
  message: e.message,
48
48
  stack: e.stack,
@@ -4,8 +4,6 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.EventEmitter = void 0;
7
- var _events = require("events");
8
- var _utils = require("../utils");
9
7
  /**
10
8
  * Copyright Joyent, Inc. and other Node contributors.
11
9
  * Modifications copyright (c) Microsoft Corporation.
@@ -31,12 +29,14 @@ var _utils = require("../utils");
31
29
  */
32
30
 
33
31
  class EventEmitter {
34
- constructor() {
32
+ constructor(platform) {
35
33
  this._events = undefined;
36
34
  this._eventsCount = 0;
37
35
  this._maxListeners = undefined;
38
36
  this._pendingHandlers = new Map();
39
37
  this._rejectionHandler = void 0;
38
+ this._platform = void 0;
39
+ this._platform = platform;
40
40
  if (this._events === undefined || this._events === Object.getPrototypeOf(this)._events) {
41
41
  this._events = Object.create(null);
42
42
  this._eventsCount = 0;
@@ -51,7 +51,7 @@ class EventEmitter {
51
51
  return this;
52
52
  }
53
53
  getMaxListeners() {
54
- return this._maxListeners === undefined ? _events.EventEmitter.defaultMaxListeners : this._maxListeners;
54
+ return this._maxListeners === undefined ? this._platform.defaultMaxListeners() : this._maxListeners;
55
55
  }
56
56
  emit(type, ...args) {
57
57
  const events = this._events;
@@ -130,7 +130,7 @@ class EventEmitter {
130
130
  w.emitter = this;
131
131
  w.type = type;
132
132
  w.count = existing.length;
133
- if (!(0, _utils.isUnderTest)()) {
133
+ if (!this._platform.isUnderTest()) {
134
134
  // eslint-disable-next-line no-console
135
135
  console.warn(w);
136
136
  }
@@ -191,14 +191,11 @@ class EventEmitter {
191
191
  if (options.behavior === 'wait') {
192
192
  const errors = [];
193
193
  this._rejectionHandler = error => errors.push(error);
194
- // eslint-disable-next-line internal-playwright/await-promise-in-class-returns
195
194
  return this._waitFor(type).then(() => {
196
195
  if (errors.length) throw errors[0];
197
196
  });
198
197
  }
199
198
  if (options.behavior === 'ignoreErrors') this._rejectionHandler = () => {};
200
-
201
- // eslint-disable-next-line internal-playwright/await-promise-in-class-returns
202
199
  return Promise.resolve();
203
200
  }
204
201
  _removeAllListeners(type) {
@@ -4,18 +4,16 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.APIResponse = exports.APIRequestContext = exports.APIRequest = void 0;
7
- var _fs = _interopRequireDefault(require("fs"));
8
- var _path = _interopRequireDefault(require("path"));
9
- var util = _interopRequireWildcard(require("util"));
10
- var _utils = require("../utils");
11
- var _fileUtils = require("../utils/fileUtils");
7
+ var _browserContext = require("./browserContext");
12
8
  var _channelOwner = require("./channelOwner");
9
+ var _errors = require("./errors");
13
10
  var _network = require("./network");
14
11
  var _tracing = require("./tracing");
15
- var _errors = require("./errors");
16
- var _browserContext = require("./browserContext");
12
+ var _assert = require("../utils/isomorphic/assert");
13
+ var _fileUtils = require("./fileUtils");
14
+ var _headers = require("../utils/isomorphic/headers");
15
+ var _rtti = require("../utils/isomorphic/rtti");
17
16
  var _fetch = require("../checkly/fetch");
18
- let _Symbol$asyncDispose, _Symbol$asyncDispose2, _util$inspect$custom;
19
17
  /**
20
18
  * Copyright (c) Microsoft Corporation.
21
19
  *
@@ -31,42 +29,37 @@ let _Symbol$asyncDispose, _Symbol$asyncDispose2, _util$inspect$custom;
31
29
  * See the License for the specific language governing permissions and
32
30
  * limitations under the License.
33
31
  */
34
- function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
35
- function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
36
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
32
+
37
33
  class APIRequest {
38
34
  constructor(playwright) {
39
35
  this._playwright = void 0;
40
36
  this._contexts = new Set();
41
- // Instrumentation.
42
- this._defaultContextOptions = void 0;
43
37
  this._playwright = playwright;
44
38
  }
45
39
  async newContext(options = {}) {
46
- var _this$_defaultContext;
40
+ var _this$_playwright$_de, _this$_playwright$_de2;
47
41
  options = {
48
- ...this._defaultContextOptions,
42
+ ...this._playwright._defaultContextOptions,
43
+ timeout: this._playwright._defaultContextTimeout,
49
44
  ...options
50
45
  };
51
- const storageState = typeof options.storageState === 'string' ? JSON.parse(await _fs.default.promises.readFile(options.storageState, 'utf8')) : options.storageState;
52
- // We do not expose tracesDir in the API, so do not allow options to accidentally override it.
53
- const tracesDir = (_this$_defaultContext = this._defaultContextOptions) === null || _this$_defaultContext === void 0 ? void 0 : _this$_defaultContext.tracesDir;
46
+ const storageState = typeof options.storageState === 'string' ? JSON.parse(await this._playwright._platform.fs().promises.readFile(options.storageState, 'utf8')) : options.storageState;
54
47
  const context = APIRequestContext.from((await this._playwright._channel.newRequest({
55
48
  ...options,
56
- extraHTTPHeaders: options.extraHTTPHeaders ? (0, _utils.headersObjectToArray)(options.extraHTTPHeaders) : undefined,
49
+ extraHTTPHeaders: options.extraHTTPHeaders ? (0, _headers.headersObjectToArray)(options.extraHTTPHeaders) : undefined,
57
50
  storageState,
58
- tracesDir,
59
- clientCertificates: await (0, _browserContext.toClientCertificatesProtocol)(options.clientCertificates)
51
+ tracesDir: (_this$_playwright$_de = this._playwright._defaultLaunchOptions) === null || _this$_playwright$_de === void 0 ? void 0 : _this$_playwright$_de.tracesDir,
52
+ // We do not expose tracesDir in the API, so do not allow options to accidentally override it.
53
+ clientCertificates: await (0, _browserContext.toClientCertificatesProtocol)(this._playwright._platform, options.clientCertificates)
60
54
  })).request);
61
55
  this._contexts.add(context);
62
56
  context._request = this;
63
- context._tracing._tracesDir = tracesDir;
57
+ context._tracing._tracesDir = (_this$_playwright$_de2 = this._playwright._defaultLaunchOptions) === null || _this$_playwright$_de2 === void 0 ? void 0 : _this$_playwright$_de2.tracesDir;
64
58
  await context._instrumentation.runAfterCreateRequestContext(context);
65
59
  return context;
66
60
  }
67
61
  }
68
62
  exports.APIRequest = APIRequest;
69
- _Symbol$asyncDispose = Symbol.asyncDispose;
70
63
  class APIRequestContext extends _channelOwner.ChannelOwner {
71
64
  static from(channel) {
72
65
  return channel._object;
@@ -78,7 +71,7 @@ class APIRequestContext extends _channelOwner.ChannelOwner {
78
71
  this._closeReason = void 0;
79
72
  this._tracing = _tracing.Tracing.from(initializer.tracing);
80
73
  }
81
- async [_Symbol$asyncDispose]() {
74
+ async [Symbol.asyncDispose]() {
82
75
  await this.dispose();
83
76
  }
84
77
  async dispose(options = {}) {
@@ -131,8 +124,8 @@ class APIRequestContext extends _channelOwner.ChannelOwner {
131
124
  });
132
125
  }
133
126
  async fetch(urlOrRequest, options = {}) {
134
- const url = (0, _utils.isString)(urlOrRequest) ? urlOrRequest : undefined;
135
- const request = (0, _utils.isString)(urlOrRequest) ? undefined : urlOrRequest;
127
+ const url = (0, _rtti.isString)(urlOrRequest) ? urlOrRequest : undefined;
128
+ const request = (0, _rtti.isString)(urlOrRequest) ? undefined : urlOrRequest;
136
129
  return await this._innerFetch({
137
130
  url,
138
131
  request,
@@ -141,7 +134,7 @@ class APIRequestContext extends _channelOwner.ChannelOwner {
141
134
  }
142
135
  async writeApiCallToDisk(options) {
143
136
  try {
144
- await _fs.default.promises.writeFile(_path.default.join(process.env.TEMP_DIR, 'apiCall-' + (Math.random() + 1).toString(36).substring(7) + '.txt'), options.url !== undefined ? options.url : options.request.url());
137
+ await fs.promises.writeFile(path.join(process.env.TEMP_DIR, 'apiCall-' + (Math.random() + 1).toString(36).substring(7) + '.txt'), options.url !== undefined ? options.url : options.request.url());
145
138
  } catch {}
146
139
  }
147
140
  async _innerFetch(options = {}) {
@@ -149,23 +142,23 @@ class APIRequestContext extends _channelOwner.ChannelOwner {
149
142
  return await this._wrapApiCall(async () => {
150
143
  var _options$request, _options$request2, _options$request3;
151
144
  if (this._closeReason) throw new _errors.TargetClosedError(this._closeReason);
152
- (0, _utils.assert)(options.request || typeof options.url === 'string', 'First argument must be either URL string or Request');
153
- (0, _utils.assert)((options.data === undefined ? 0 : 1) + (options.form === undefined ? 0 : 1) + (options.multipart === undefined ? 0 : 1) <= 1, `Only one of 'data', 'form' or 'multipart' can be specified`);
154
- (0, _utils.assert)(options.maxRedirects === undefined || options.maxRedirects >= 0, `'maxRedirects' must be greater than or equal to '0'`);
155
- (0, _utils.assert)(options.maxRetries === undefined || options.maxRetries >= 0, `'maxRetries' must be greater than or equal to '0'`);
145
+ (0, _assert.assert)(options.request || typeof options.url === 'string', 'First argument must be either URL string or Request');
146
+ (0, _assert.assert)((options.data === undefined ? 0 : 1) + (options.form === undefined ? 0 : 1) + (options.multipart === undefined ? 0 : 1) <= 1, `Only one of 'data', 'form' or 'multipart' can be specified`);
147
+ (0, _assert.assert)(options.maxRedirects === undefined || options.maxRedirects >= 0, `'maxRedirects' must be greater than or equal to '0'`);
148
+ (0, _assert.assert)(options.maxRetries === undefined || options.maxRetries >= 0, `'maxRetries' must be greater than or equal to '0'`);
156
149
  const url = options.url !== undefined ? options.url : options.request.url();
157
150
  const method = options.method || ((_options$request = options.request) === null || _options$request === void 0 ? void 0 : _options$request.method());
158
151
  let encodedParams = undefined;
159
152
  if (typeof options.params === 'string') encodedParams = options.params;else if (options.params instanceof URLSearchParams) encodedParams = options.params.toString();
160
153
  // Cannot call allHeaders() here as the request may be paused inside route handler.
161
154
  const headersObj = options.headers || ((_options$request2 = options.request) === null || _options$request2 === void 0 ? void 0 : _options$request2.headers());
162
- const headers = headersObj ? (0, _utils.headersObjectToArray)(headersObj) : undefined;
155
+ const headers = headersObj ? (0, _headers.headersObjectToArray)(headersObj) : undefined;
163
156
  let jsonData;
164
157
  let formData;
165
158
  let multipartData;
166
159
  let postDataBuffer;
167
160
  if (options.data !== undefined) {
168
- if ((0, _utils.isString)(options.data)) {
161
+ if ((0, _rtti.isString)(options.data)) {
169
162
  if (isJsonContentType(headers)) jsonData = isJsonParsable(options.data) ? options.data : JSON.stringify(options.data);else postDataBuffer = Buffer.from(options.data, 'utf8');
170
163
  } else if (Buffer.isBuffer(options.data)) {
171
164
  postDataBuffer = options.data;
@@ -192,7 +185,7 @@ class APIRequestContext extends _channelOwner.ChannelOwner {
192
185
  if (globalThis.FormData && options.multipart instanceof FormData) {
193
186
  const form = options.multipart;
194
187
  for (const [name, value] of form.entries()) {
195
- if ((0, _utils.isString)(value)) {
188
+ if ((0, _rtti.isString)(value)) {
196
189
  multipartData.push({
197
190
  name,
198
191
  value
@@ -211,7 +204,7 @@ class APIRequestContext extends _channelOwner.ChannelOwner {
211
204
  }
212
205
  } else {
213
206
  // Convert file-like values to ServerFilePayload structs.
214
- for (const [name, value] of Object.entries(options.multipart)) multipartData.push(await toFormField(name, value));
207
+ for (const [name, value] of Object.entries(options.multipart)) multipartData.push(await toFormField(this._platform, name, value));
215
208
  }
216
209
  }
217
210
  if (postDataBuffer === undefined && jsonData === undefined && formData === undefined && multipartData === undefined) postDataBuffer = ((_options$request3 = options.request) === null || _options$request3 === void 0 ? void 0 : _options$request3.postDataBuffer()) || undefined;
@@ -241,16 +234,19 @@ class APIRequestContext extends _channelOwner.ChannelOwner {
241
234
  });
242
235
  }
243
236
  async storageState(options = {}) {
244
- const state = await this._channel.storageState();
237
+ const state = await this._channel.storageState({
238
+ indexedDB: options.indexedDB
239
+ });
245
240
  if (options.path) {
246
- await (0, _fileUtils.mkdirIfNeeded)(options.path);
247
- await _fs.default.promises.writeFile(options.path, JSON.stringify(state, undefined, 2), 'utf8');
241
+ await (0, _fileUtils.mkdirIfNeeded)(this._platform, options.path);
242
+ await this._platform.fs().promises.writeFile(options.path, JSON.stringify(state, undefined, 2), 'utf8');
248
243
  }
249
244
  return state;
250
245
  }
251
246
  }
252
247
  exports.APIRequestContext = APIRequestContext;
253
- async function toFormField(name, value) {
248
+ async function toFormField(platform, name, value) {
249
+ const typeOfValue = typeof value;
254
250
  if (isFilePayload(value)) {
255
251
  const payload = value;
256
252
  if (!Buffer.isBuffer(payload.buffer)) throw new Error(`Unexpected buffer type of 'data.${name}'`);
@@ -258,15 +254,15 @@ async function toFormField(name, value) {
258
254
  name,
259
255
  file: filePayloadToJson(payload)
260
256
  };
261
- } else if (value instanceof _fs.default.ReadStream) {
257
+ } else if (typeOfValue === 'string' || typeOfValue === 'number' || typeOfValue === 'boolean') {
262
258
  return {
263
259
  name,
264
- file: await readStreamToJson(value)
260
+ value: String(value)
265
261
  };
266
262
  } else {
267
263
  return {
268
264
  name,
269
- value: String(value)
265
+ file: await readStreamToJson(platform, value)
270
266
  };
271
267
  }
272
268
  }
@@ -279,8 +275,6 @@ function isJsonParsable(value) {
279
275
  if (e instanceof SyntaxError) return false;else throw e;
280
276
  }
281
277
  }
282
- _Symbol$asyncDispose2 = Symbol.asyncDispose;
283
- _util$inspect$custom = util.inspect.custom;
284
278
  class APIResponse {
285
279
  constructor(context, initializer) {
286
280
  this._initializer = void 0;
@@ -289,6 +283,7 @@ class APIResponse {
289
283
  this._request = context;
290
284
  this._initializer = initializer;
291
285
  this._headers = new _network.RawHeaders(this._initializer.headers);
286
+ if (context._platform.inspectCustom) this[context._platform.inspectCustom] = () => this._inspect();
292
287
  }
293
288
  ok() {
294
289
  return this._initializer.status >= 200 && this._initializer.status <= 299;
@@ -312,16 +307,18 @@ class APIResponse {
312
307
  return this._initializer.timings;
313
308
  }
314
309
  async body() {
315
- try {
316
- const result = await this._request._channel.fetchResponseBody({
317
- fetchUid: this._fetchUid()
318
- });
319
- if (result.binary === undefined) throw new Error('Response has been disposed');
320
- return result.binary;
321
- } catch (e) {
322
- if ((0, _errors.isTargetClosedError)(e)) throw new Error('Response has been disposed');
323
- throw e;
324
- }
310
+ return await this._request._wrapApiCall(async () => {
311
+ try {
312
+ const result = await this._request._channel.fetchResponseBody({
313
+ fetchUid: this._fetchUid()
314
+ });
315
+ if (result.binary === undefined) throw new Error('Response has been disposed');
316
+ return result.binary;
317
+ } catch (e) {
318
+ if ((0, _errors.isTargetClosedError)(e)) throw new Error('Response has been disposed');
319
+ throw e;
320
+ }
321
+ }, true);
325
322
  }
326
323
  async text() {
327
324
  const content = await this.body();
@@ -331,7 +328,7 @@ class APIResponse {
331
328
  const content = await this.text();
332
329
  return JSON.parse(content);
333
330
  }
334
- async [_Symbol$asyncDispose2]() {
331
+ async [Symbol.asyncDispose]() {
335
332
  await this.dispose();
336
333
  }
337
334
  async dispose() {
@@ -339,7 +336,7 @@ class APIResponse {
339
336
  fetchUid: this._fetchUid()
340
337
  });
341
338
  }
342
- [_util$inspect$custom]() {
339
+ _inspect() {
343
340
  const headers = this.headersArray().map(({
344
341
  name,
345
342
  value
@@ -369,7 +366,7 @@ function filePayloadToJson(payload) {
369
366
  buffer: payload.buffer
370
367
  };
371
368
  }
372
- async function readStreamToJson(stream) {
369
+ async function readStreamToJson(platform, stream) {
373
370
  const buffer = await new Promise((resolve, reject) => {
374
371
  const chunks = [];
375
372
  stream.on('data', chunk => chunks.push(chunk));
@@ -378,7 +375,7 @@ async function readStreamToJson(stream) {
378
375
  });
379
376
  const streamPath = Buffer.isBuffer(stream.path) ? stream.path.toString('utf8') : stream.path;
380
377
  return {
381
- name: _path.default.basename(streamPath),
378
+ name: platform.path().basename(streamPath),
382
379
  buffer
383
380
  };
384
381
  }
@@ -395,10 +392,12 @@ function isJsonContentType(headers) {
395
392
  function objectToArray(map) {
396
393
  if (!map) return undefined;
397
394
  const result = [];
398
- for (const [name, value] of Object.entries(map)) result.push({
399
- name,
400
- value: String(value)
401
- });
395
+ for (const [name, value] of Object.entries(map)) {
396
+ if (value !== undefined) result.push({
397
+ name,
398
+ value: String(value)
399
+ });
400
+ }
402
401
  return result;
403
402
  }
404
403
  function queryStringToArray(queryString) {
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.fileUploadSizeLimit = void 0;
7
+ exports.mkdirIfNeeded = mkdirIfNeeded;
8
+ /**
9
+ * Copyright (c) Microsoft Corporation.
10
+ *
11
+ * Licensed under the Apache License, Version 2.0 (the "License");
12
+ * you may not use this file except in compliance with the License.
13
+ * You may obtain a copy of the License at
14
+ *
15
+ * http://www.apache.org/licenses/LICENSE-2.0
16
+ *
17
+ * Unless required by applicable law or agreed to in writing, software
18
+ * distributed under the License is distributed on an "AS IS" BASIS,
19
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
20
+ * See the License for the specific language governing permissions and
21
+ * limitations under the License.
22
+ */
23
+
24
+ // Keep in sync with the server.
25
+ const fileUploadSizeLimit = exports.fileUploadSizeLimit = 50 * 1024 * 1024;
26
+ async function mkdirIfNeeded(platform, filePath) {
27
+ // This will harmlessly throw on windows if the dirname is the root directory.
28
+ await platform.fs().promises.mkdir(platform.path().dirname(filePath), {
29
+ recursive: true
30
+ }).catch(() => {});
31
+ }