Skip to content

Commit f0311f5

Browse files
authored
refactor(rspeedy/qrcode): replace qrcode-terminal with uqr (#469)
<!-- Thank you for submitting a pull request! We appreciate the time and effort you have invested in making these changes. Please ensure that you provide enough information to allow others to review your pull request. Upon submission, your pull request will be automatically assigned with reviewers. If you want to learn more about contributing to this project, please visit: https://github.com/lynx-family/lynx-stack/blob/main/CONTRIBUTING.md. --> ## Summary <!-- Can you explain the reasoning behind implementing this change? What problem or issue does this pull request resolve? --> [`uqr`](https://github.com/unjs/uqr) is a modern and simple alternative to `qrcode-terminal`. And most importantly, we could remove the `.patch` and make rspack-ecosystem-ci work. <!-- It would be helpful if you could provide any relevant context, such as GitHub issues or related discussions. --> ## Checklist <!--- Check and mark with an "x" --> - [x] Tests updated (or not required). - [ ] Documentation updated (or **not required**).
1 parent fdaf950 commit f0311f5

File tree

9 files changed

+84
-154
lines changed

9 files changed

+84
-154
lines changed

.changeset/four-shoes-cry.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
---
2+
---

packages/rspeedy/plugin-qrcode/package.json

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,8 @@
5252
"@lynx-js/rspeedy": "workspace:*",
5353
"@microsoft/api-extractor": "catalog:",
5454
"@rsbuild/core": "catalog:rsbuild",
55-
"@types/qrcode-terminal": "^0.12.2",
5655
"picocolors": "^1.1.1",
57-
"qrcode-terminal": "^0.12.0"
56+
"uqr": "0.1.2"
5857
},
5958
"engines": {
6059
"node": ">=18"

packages/rspeedy/plugin-qrcode/src/shortcuts.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ export async function registerConsoleShortcuts(
4242

4343
const value: string | symbol = Object.values(devUrls)[0]!
4444
await options.onPrint?.(value)
45-
await showQRCode(value)
45+
showQRCode(value)
4646

4747
gExistingShortcuts.add(options)
4848

@@ -137,7 +137,7 @@ async function loop(
137137
await options.customShortcuts[name].action?.()
138138
}
139139
await options.onPrint?.(value)
140-
await showQRCode(value)
140+
showQRCode(value)
141141
}
142142

143143
// If the `options` is not deleted from `gExistingShortcuts`, means that this is an explicitly
Lines changed: 5 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,12 @@
11
// Copyright 2024 The Lynx Authors. All rights reserved.
22
// Licensed under the Apache License Version 2.0 that can be found in the
33
// LICENSE file in the root directory of this source tree.
4-
export default async function showQRCode(
5-
url: string,
6-
): Promise<void> {
7-
const [
8-
{ log },
9-
{ default: color },
10-
{ default: QRCode },
11-
] = await Promise.all([
12-
import('@clack/prompts'),
13-
import('picocolors'),
14-
import('qrcode-terminal'),
15-
])
16-
17-
const qrcode = await new Promise<string>((resolve) => {
18-
QRCode.generate(url, { small: true }, resolve)
19-
})
4+
import { log } from '@clack/prompts'
5+
import color from 'picocolors'
6+
import { renderUnicodeCompact } from 'uqr'
207

8+
export default function showQRCode(url: string): void {
219
log.info(color.green('Scan with Lynx'))
22-
log.success(qrcode)
10+
log.success(renderUnicodeCompact(url))
2311
log.success(url)
2412
}

packages/rspeedy/plugin-qrcode/test/index.test.ts

Lines changed: 47 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -86,16 +86,15 @@ describe('Plugins - Terminal', () => {
8686
})
8787

8888
describe('schema', () => {
89+
vi.mock('uqr')
8990
test('custom schema', async () => {
9091
vi.stubEnv('NODE_ENV', 'development')
9192
const { selectKey, isCancel } = await import('@clack/prompts')
9293
vi.mocked(selectKey).mockResolvedValue('foo')
9394
vi.mocked(isCancel).mockReturnValueOnce(false)
9495

95-
const { default: { generate } } = await import('qrcode-terminal')
96-
vi.mocked(generate).mockImplementationOnce((_, __, callback) => {
97-
callback?.('')
98-
})
96+
const { renderUnicodeCompact } = await import('uqr')
97+
vi.mocked(renderUnicodeCompact).mockReturnValueOnce('<data>')
9998
const rsbuild = await createRsbuild(
10099
{
101100
rsbuildConfig: {
@@ -133,21 +132,24 @@ describe('Plugins - Terminal', () => {
133132

134133
await server.waitDevCompileDone()
135134

136-
expect(generate).toBeCalledTimes(1)
135+
expect(renderUnicodeCompact).toBeCalledTimes(1)
137136

138-
expect(generate).toBeCalledWith(
137+
expect(renderUnicodeCompact).toBeCalledWith(
139138
`--http://example.com/foo/main.lynx.bundle--`,
140-
{
141-
small: true,
142-
},
143-
expect.any(Function),
144139
)
145140
})
146141

147142
test('custom schema object', async () => {
148143
vi.stubEnv('NODE_ENV', 'development')
149144
const { select, selectKey, isCancel } = await import('@clack/prompts')
150-
vi.mocked(selectKey).mockResolvedValue('a')
145+
let i = 1
146+
vi.mocked(selectKey).mockImplementation(() => {
147+
if (i === 1) {
148+
i++
149+
return Promise.resolve('a')
150+
}
151+
return Promise.resolve('q')
152+
})
151153
vi.mocked(isCancel).mockReturnValue(false)
152154

153155
let resolve: (v: string) => void
@@ -156,10 +158,8 @@ describe('Plugins - Terminal', () => {
156158
})
157159
vi.mocked(select).mockReturnValue(promise)
158160

159-
const { default: { generate } } = await import('qrcode-terminal')
160-
vi.mocked(generate).mockImplementationOnce((_, __, callback) => {
161-
callback?.('')
162-
})
161+
const { renderUnicodeCompact } = await import('uqr')
162+
vi.mocked(renderUnicodeCompact).mockReturnValueOnce('<data>')
163163
const rsbuild = await createRsbuild(
164164
{
165165
rsbuildConfig: {
@@ -200,32 +200,31 @@ describe('Plugins - Terminal', () => {
200200

201201
await server.waitDevCompileDone()
202202

203-
expect(generate).toBeCalledTimes(1)
204-
expect(generate).toBeCalledWith(
203+
expect(renderUnicodeCompact).toBeCalledTimes(1)
204+
expect(renderUnicodeCompact).toBeCalledWith(
205205
`==http://example.com/foo/main.lynx.bundle==`,
206-
{
207-
small: true,
208-
},
209-
expect.any(Function),
210206
)
211207

212208
// @ts-expect-error xxx
213209
resolve('bar')
214210

215-
await expect.poll(() => generate).toBeCalledTimes(2)
216-
expect(generate).toBeCalledWith(
211+
await expect.poll(() => renderUnicodeCompact).toBeCalledTimes(2)
212+
expect(renderUnicodeCompact).toBeCalledWith(
217213
`$$http://example.com/foo/main.lynx.bundle$$`,
218-
{
219-
small: true,
220-
},
221-
expect.any(Function),
222214
)
223215
})
224216

225217
test('select between entries', async () => {
226218
vi.stubEnv('NODE_ENV', 'development')
227219
const { select, selectKey, isCancel } = await import('@clack/prompts')
228-
vi.mocked(selectKey).mockResolvedValue('r')
220+
let i = 1
221+
vi.mocked(selectKey).mockImplementation(() => {
222+
if (i === 1) {
223+
i++
224+
return Promise.resolve('r')
225+
}
226+
return Promise.resolve('q')
227+
})
229228
vi.mocked(isCancel).mockReturnValue(false)
230229

231230
let resolve: (v: string) => void
@@ -234,10 +233,8 @@ describe('Plugins - Terminal', () => {
234233
})
235234
vi.mocked(select).mockReturnValue(promise)
236235

237-
const { default: { generate } } = await import('qrcode-terminal')
238-
vi.mocked(generate).mockImplementationOnce((_, __, callback) => {
239-
callback?.('')
240-
})
236+
const { renderUnicodeCompact } = await import('uqr')
237+
vi.mocked(renderUnicodeCompact).mockReturnValueOnce('<data>')
241238
const rsbuild = await createRsbuild(
242239
{
243240
rsbuildConfig: {
@@ -280,32 +277,28 @@ describe('Plugins - Terminal', () => {
280277

281278
await server.waitDevCompileDone()
282279

283-
expect(generate).toBeCalledTimes(1)
284-
expect(generate).toBeCalledWith(
280+
expect(renderUnicodeCompact).toBeCalledTimes(1)
281+
expect(renderUnicodeCompact).toBeCalledWith(
285282
`==http://example.com/foo/main.lynx.bundle==`,
286-
{
287-
small: true,
288-
},
289-
expect.any(Function),
290283
)
291284

292285
// @ts-expect-error xxx
293286
resolve('main2')
294287

295-
await expect.poll(() => generate).toBeCalledTimes(2)
296-
expect(generate).toBeCalledWith(
288+
await expect.poll(() => renderUnicodeCompact).toBeCalledTimes(2)
289+
expect(renderUnicodeCompact).toBeCalledWith(
297290
`==http://example.com/foo/main2.lynx.bundle==`,
298-
{
299-
small: true,
300-
},
301-
expect.any(Function),
302291
)
303292
})
304293
})
305294

306295
describe('QRCode', () => {
307-
vi.mock('qrcode-terminal')
296+
vi.mock('uqr')
308297
test('not print qrcode when build', async () => {
298+
const { renderUnicodeCompact } = await import('uqr')
299+
300+
vi.mocked(renderUnicodeCompact).mockClear()
301+
309302
const rsbuild = await createRsbuild(
310303
{
311304
rsbuildConfig: {
@@ -326,20 +319,17 @@ describe('Plugins - Terminal', () => {
326319
},
327320
)
328321
await rsbuild.build()
329-
const QRCode = await import('qrcode-terminal')
330322

331-
expect(QRCode.default.generate).not.toBeCalled()
323+
expect(renderUnicodeCompact).not.toBeCalled()
332324
})
333325

334326
test('print qrcode when dev', async () => {
335327
vi.stubEnv('NODE_ENV', 'development')
336328
const { selectKey, isCancel } = await import('@clack/prompts')
337329
vi.mocked(selectKey).mockResolvedValue('foo')
338330
vi.mocked(isCancel).mockReturnValueOnce(false)
339-
const { default: { generate } } = await import('qrcode-terminal')
340-
vi.mocked(generate).mockImplementationOnce((_, __, callback) => {
341-
callback?.('')
342-
})
331+
const { renderUnicodeCompact } = await import('uqr')
332+
vi.mocked(renderUnicodeCompact).mockReturnValueOnce('<data>')
343333
const rsbuild = await createRsbuild(
344334
{
345335
rsbuildConfig: {
@@ -373,13 +363,13 @@ describe('Plugins - Terminal', () => {
373363

374364
await server.waitDevCompileDone()
375365

376-
expect(generate).toBeCalledTimes(1)
366+
expect(renderUnicodeCompact).toBeCalledTimes(1)
377367
})
378368

379369
test('print qrcode when dev with host specified', async () => {
380370
vi.stubEnv('NODE_ENV', 'development')
381371
vi.mock('qrcode', () => ({
382-
generate: vi.fn(),
372+
renderUnicodeCompact: vi.fn(),
383373
}))
384374
const { selectKey, isCancel } = await import('@clack/prompts')
385375
vi.mocked(selectKey).mockResolvedValue('foo')
@@ -413,22 +403,16 @@ describe('Plugins - Terminal', () => {
413403
},
414404
)
415405

416-
const { default: { generate } } = await import('qrcode-terminal')
417-
vi.mocked(generate).mockImplementationOnce((_, __, callback) => {
418-
callback?.('')
419-
})
406+
const { renderUnicodeCompact } = await import('uqr')
407+
vi.mocked(renderUnicodeCompact).mockReturnValueOnce('<data>')
420408

421409
await using server = await usingDevServer(rsbuild)
422410

423411
await server.waitDevCompileDone()
424412

425-
expect(generate).toBeCalledTimes(1)
426-
expect(generate).toBeCalledWith(
413+
expect(renderUnicodeCompact).toBeCalledTimes(1)
414+
expect(renderUnicodeCompact).toBeCalledWith(
427415
expect.stringContaining('example.com/foo'),
428-
{
429-
small: true,
430-
},
431-
expect.anything(),
432416
)
433417
})
434418
})

0 commit comments

Comments
 (0)