v6
  1// Copyright 2022 Google LLC
  2//
  3// Licensed under the Apache License, Version 2.0 (the "License");
  4// you may not use this file except in compliance with the License.
  5// You may obtain a copy of the License at
  6//
  7//     https://www.apache.org/licenses/LICENSE-2.0
  8//
  9// Unless required by applicable law or agreed to in writing, software
 10// distributed under the License is distributed on an "AS IS" BASIS,
 11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 12// See the License for the specific language governing permissions and
 13// limitations under the License.
 14
 15import { test } from 'uvu'
 16import * as assert from 'uvu/assert'
 17import '../build/globals.js'
 18import net from 'node:net'
 19import getPort from 'get-port'
 20
 21const getServer = (resp = [], log = console.log) => {
 22  const server = net.createServer()
 23  server.on('connection', (conn) => {
 24    conn.on('data', (d) => {
 25      conn.write(resp.shift() || 'pong')
 26    })
 27  })
 28  server.stop = () => new Promise((resolve) => server.close(() => resolve()))
 29  server.start = (port) =>
 30    new Promise((resolve) => server.listen(port, () => resolve(server)))
 31  return server
 32}
 33
 34$.verbose = 0
 35
 36test('supports `-v` flag / prints version', async () => {
 37  assert.match((await $`node build/cli.js -v`).toString(), /\d+.\d+.\d+/)
 38})
 39
 40test('prints help', async () => {
 41  let help
 42  try {
 43    await $`node build/cli.js`
 44  } catch (err) {
 45    help = err.toString().trim()
 46  }
 47  assert.ok(help.includes('print current zx version'))
 48})
 49
 50test('supports `--experimental` flag', async () => {
 51  await $`echo 'echo("test")' | node build/cli.js --experimental`
 52})
 53
 54test('supports `--quiet` flag', async () => {
 55  let p = await $`node build/cli.js test/fixtures/markdown.md`
 56  assert.ok(!p.stdout.includes('ignore'), 'ignore was printed')
 57  assert.ok(p.stdout.includes('hello'), 'no hello')
 58  assert.ok(p.stdout.includes('world'), 'no world')
 59})
 60
 61test('supports `--shell` flag ', async () => {
 62  let shell = $.shell
 63  let p =
 64    await $`node build/cli.js --shell=${shell} <<< '$\`echo \${$.shell}\`'`
 65  assert.ok(p.stdout.includes(shell))
 66})
 67
 68test('supports `--prefix` flag ', async () => {
 69  let prefix = 'set -e;'
 70  let p =
 71    await $`node build/cli.js --prefix=${prefix} <<< '$\`echo \${$.prefix}\`'`
 72  assert.ok(p.stdout.includes(prefix))
 73})
 74
 75test('scripts from https', async () => {
 76  const resp = await fs.readFile(path.resolve('test/fixtures/echo.http'))
 77  const port = await getPort()
 78  const server = await getServer([resp]).start(port)
 79  let p = await quiet($`node build/cli.js http://127.0.0.1:${port}/echo.mjs`)
 80
 81  assert.ok(p.stdout.includes('test'))
 82  server.stop()
 83
 84  let err
 85  try {
 86    await quiet($`node build/cli.js http://127.0.0.1:8081/echo.mjs`)
 87  } catch (e) {
 88    err = e
 89  }
 90  assert.ok(err.stderr.includes('ECONNREFUSED'))
 91})
 92
 93test('scripts with no extension', async () => {
 94  await $`node build/cli.js test/fixtures/no-extension`
 95  assert.ok(
 96    /Test file to verify no-extension didn't overwrite similarly name .mjs file./.test(
 97      (await fs.readFile('test/fixtures/no-extension.mjs')).toString()
 98    )
 99  )
100})
101
102test('require() is working from stdin', async () => {
103  await $`node build/cli.js <<< 'require("./package.json").name'`
104})
105
106test('require() is working in ESM', async () => {
107  await $`node build/cli.js test/fixtures/require.mjs`
108})
109
110test('__filename & __dirname are defined', async () => {
111  await $`node build/cli.js test/fixtures/filename-dirname.mjs`
112})
113
114test('markdown scripts are working', async () => {
115  await $`node build/cli.js docs/markdown.md`
116})
117
118test.run()