Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 1 addition & 3 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,4 @@ coverage
.env
.envrc
stats.html
src/node.mjs
lightweight/index.js
lightweight/index-bundled.d.ts
dist/index.js
2 changes: 1 addition & 1 deletion index.html
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@
}
</script>
<script type="module">
import microlink from './lightweight/index.js'
import microlink from './dist/index.js'

function getBrowser() {
var ua=navigator.userAgent,tem,M=ua.match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i) || [];
Expand Down
5 changes: 0 additions & 5 deletions lightweight/package.json

This file was deleted.

37 changes: 19 additions & 18 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,12 @@
"description": "Browser functions as Service. Interacting with browser pages, remotely.",
"homepage": "https://function.microlink.io",
"version": "0.2.2",
"types": "lightweight/index.d.ts",
"types": "src/index.d.ts",
"exports": {
"require": "./src/node.js",
"default": "./lightweight/index.js"
"types": "./src/index.d.ts",
"require": "./src/index.js",
"import": "./src/index.mjs",
"default": "./src/index.mjs"
},
"author": {
"email": "josefrancisco.verdu@gmail.com",
Expand All @@ -31,8 +33,8 @@
"serverless"
],
"dependencies": {
"@microlink/mql": "~0.14.0",
"base64-url": "~2.3.3"
"@microlink/mql": "~0.15.1",
"lz-ts": "~1.1.2"
},
"devDependencies": {
"@commitlint/cli": "latest",
Expand All @@ -54,26 +56,22 @@
"puppeteer-core": "latest",
"rollup": "latest",
"rollup-plugin-filesize": "latest",
"rollup-plugin-rewrite": "latest",
"rollup-plugin-visualizer": "latest",
"simple-git-hooks": "latest",
"standard": "latest",
"standard-version": "latest",
"stream-to-promise": "latest",
"tinyspawn": "latest",
"tsd": "latest"
},
"engines": {
"node": ">= 18"
},
"files": [
"lightweight",
"src/factory.js",
"src/node.js"
"src"
],
"scripts": {
"build": "rollup -c rollup.config.js --bundleConfigAsCjs",
"clean": "rm -rf node_modules",
"clean:build": "rm -rf lightweight/index.js",
"clean:build": "rm -rf dist/index.js",
"contributors": "(npx git-authors-cli && npx finepack && git add package.json && git commit -m 'build: contributors' --no-verify) || true",
"dev": "npm run build -- -w",
"lint": "standard && tsd",
Expand All @@ -88,10 +86,6 @@
},
"license": "MIT",
"ava": {
"files": [
"test/**/*",
"!test/clients.mjs"
],
"timeout": "1m"
},
"commitlint": {
Expand Down Expand Up @@ -119,11 +113,18 @@
},
"standard": {
"ignore": [
"lightweight/index.js",
"src/node.mjs"
"dist"
]
},
"tsd": {
"compilerOptions": {
"baseUrl": ".",
"paths": {
"@microlink/function": [
"./src/index.d.ts"
]
}
},
"directory": "test"
}
}
25 changes: 11 additions & 14 deletions rollup.config.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import nodeResolve from '@rollup/plugin-node-resolve'
import { visualizer } from 'rollup-plugin-visualizer'
import commonjs from '@rollup/plugin-commonjs'
import filesize from 'rollup-plugin-filesize'
import replace from '@rollup/plugin-replace'
Expand All @@ -23,24 +22,22 @@ const build = ({ input, output, plugins = [], compress }) => {
comments: false
}
}),
filesize(),
visualizer()
]
filesize()
].filter(Boolean)
}
}

const builds = [
/* This build is just for testing using ESM interface */
build({
input: './src/node.js',
output: { file: 'src/node.mjs', format: 'es' },
plugins: [commonjs()]
}),
build({
compress: true,
input: 'src/lightweight.mjs',
output: { file: 'lightweight/index.js', format: 'es' },
plugins: [nodeResolve()]
compress: false,
input: 'src/index.js',
output: { file: 'dist/index.js', format: 'es' },
plugins: [
nodeResolve({
mainFields: ['browser', 'module', 'main']
}),
commonjs({ strictRequires: 'auto' })
]
})
]

Expand Down
File renamed without changes.
41 changes: 41 additions & 0 deletions src/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
'use strict'

const mql = require('@microlink/mql')

let toCompress

try {
const { promisify } = require('util')
const { brotliCompress } = require('zlib')
const compress = promisify(brotliCompress)
toCompress = async code =>
`br#${(await compress(code.toString())).toString('base64url')}`
} catch {
const { compressToURI } = require('lz-ts')
toCompress = code => Promise.resolve(`lz#${compressToURI(code.toString())}`)
}

const fn = (code, mqlOpts, gotOpts) => {
const compressed = toCompress(code)

return async (url, opts) => {
const { data } = await mql(
url,
{
function: await compressed,
meta: false,
...mqlOpts,
...opts
},
gotOpts
)

return data.function
}
}

fn.compress = toCompress
fn.mql = mql
fn.version = require('../package.json').version

module.exports = fn
10 changes: 10 additions & 0 deletions src/index.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import { createRequire } from 'module'

const require = createRequire(import.meta.url)
const fn = require('./index.js')

export const compress = fn.compress
export const mql = fn.mql
export const version = fn.version

export default fn
22 changes: 0 additions & 22 deletions src/lightweight.mjs

This file was deleted.

39 changes: 0 additions & 39 deletions src/node.js

This file was deleted.

7 changes: 0 additions & 7 deletions test/clients.mjs

This file was deleted.

49 changes: 49 additions & 0 deletions test/compress.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
import { brotliDecompress } from 'zlib'
import { createRequire } from 'module'
import { promisify } from 'util'
import test from 'ava'

const require = createRequire(import.meta.url)
const { decompressFromURI, compressToURI } = require('lz-ts')
const fn = require('@microlink/function')

const decompress = promisify(brotliDecompress)
const code = '({ page }) => page.title()'

test('compress is exported', t => {
t.is(typeof fn.compress, 'function')
})

test('node.js selects brotli compression', async t => {
const compressed = await fn.compress(code)
t.true(compressed.startsWith('br#'))
})

test('brotli roundtrip produces original code', async t => {
const compressed = await fn.compress(code)
const payload = compressed.slice(3)
const decompressed = (await decompress(Buffer.from(payload, 'base64url'))).toString()
t.is(decompressed, code)
})

test('falls back to lz-string when zlib is unavailable', async t => {
const { execFileSync } = await import('child_process')
const result = execFileSync(process.execPath, ['-e', `
const Module = require('module')
const originalLoad = Module._load
Module._load = function (id, parent, isMain) {
if (id === 'zlib') throw new Error('not available')
return originalLoad(id, parent, isMain)
}
const fn = require(${JSON.stringify(require.resolve('@microlink/function'))})
fn.compress('({ page }) => page.title()').then(r => process.stdout.write(r))
`], { encoding: 'utf8' })
t.true(result.startsWith('lz#'))
})

test('lz roundtrip produces original code', t => {
const compressed = `lz#${compressToURI(code)}`
t.true(compressed.startsWith('lz#'))
const payload = compressed.slice(3)
t.is(decompressFromURI(payload), code)
})
Loading
Loading