@browserless/function 10.6.1 → 10.6.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.
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@browserless/function",
3
3
  "description": "Run abritrary JavaScript inside a browser sandbox",
4
4
  "homepage": "https://browserless.js.org",
5
- "version": "10.6.1",
5
+ "version": "10.6.2",
6
6
  "main": "src/index.js",
7
7
  "author": {
8
8
  "email": "hello@microlink.io",
@@ -35,12 +35,14 @@
35
35
  },
36
36
  "devDependencies": {
37
37
  "@browserless/test": "^10.6.0",
38
+ "acorn": "~8.12.1",
39
+ "acorn-walk": "~8.3.4",
38
40
  "ava": "5",
39
41
  "browserless": "^10.6.0",
40
42
  "lodash": "latest"
41
43
  },
42
44
  "engines": {
43
- "node": ">= 12"
45
+ "node": ">= 20"
44
46
  },
45
47
  "files": [
46
48
  "src"
@@ -54,5 +56,5 @@
54
56
  "timeout": "2m",
55
57
  "workerThreads": false
56
58
  },
57
- "gitHead": "44f9a1f22ea2020949e8d7465362908e3fd8e1a7"
59
+ "gitHead": "ed2a375a7f7c26625261dd7b5a83aa1f5f578867"
58
60
  }
package/src/function.js CHANGED
@@ -1,21 +1,10 @@
1
1
  'use strict'
2
2
 
3
3
  const isolatedFunction = require('isolated-function')
4
-
5
- const createFn = code => `
6
- async (url, browserWSEndpoint, opts) => {
7
- const puppeteer = require('@cloudflare/puppeteer')
8
- const browser = await puppeteer.connect({ browserWSEndpoint })
9
- const page = (await browser.pages())[1]
10
- try {
11
- return await (${code})({ page, ...opts })
12
- } finally {
13
- await browser.disconnect()
14
- }
15
- }`
4
+ const template = require('./template')
16
5
 
17
6
  module.exports = async ({ url, code, vmOpts, browserWSEndpoint, ...opts }) => {
18
- const [fn, teardown] = isolatedFunction(createFn(code), { ...vmOpts, throwError: false })
7
+ const [fn, teardown] = isolatedFunction(template(code), { ...vmOpts, throwError: false })
19
8
  const result = await fn(url, browserWSEndpoint, opts)
20
9
  await teardown()
21
10
  return result
@@ -0,0 +1,41 @@
1
+ 'use strict'
2
+
3
+ const walk = require('acorn-walk')
4
+ const acorn = require('acorn')
5
+
6
+ module.exports = code => {
7
+ const ast = acorn.parse(code, { ecmaVersion: 2023, sourceType: 'module' })
8
+
9
+ let isUsingPage = false
10
+
11
+ walk.simple(ast, {
12
+ ObjectPattern (node) {
13
+ node.properties.forEach(prop => {
14
+ if (prop.type === 'Property' && prop.key.name === 'page') {
15
+ isUsingPage = true
16
+ }
17
+ if (prop.type === 'RestElement' && prop.argument.name === 'page') {
18
+ isUsingPage = true
19
+ }
20
+ })
21
+ },
22
+ MemberExpression (node) {
23
+ if (node.property.name === 'page' || node.property.value === 'page') {
24
+ isUsingPage = true
25
+ }
26
+ }
27
+ })
28
+
29
+ if (!isUsingPage) return `async (url, _, opts) => (${code})(opts)`
30
+ return `
31
+ async (url, browserWSEndpoint, opts) => {
32
+ const puppeteer = require('@cloudflare/puppeteer')
33
+ const browser = await puppeteer.connect({ browserWSEndpoint })
34
+ const page = (await browser.pages())[1]
35
+ try {
36
+ return await (${code})({ page, ...opts })
37
+ } finally {
38
+ await browser.disconnect()
39
+ }
40
+ }`
41
+ }