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()