termcast 1.3.18 → 1.3.21
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/dist/apis/environment.d.ts +7 -0
- package/dist/apis/environment.d.ts.map +1 -1
- package/dist/apis/environment.js +38 -0
- package/dist/apis/environment.js.map +1 -1
- package/dist/cli.js +82 -3
- package/dist/cli.js.map +1 -1
- package/dist/compile.d.ts.map +1 -1
- package/dist/compile.js +2 -1
- package/dist/compile.js.map +1 -1
- package/dist/components/actions.d.ts +5 -4
- package/dist/components/actions.d.ts.map +1 -1
- package/dist/components/actions.js.map +1 -1
- package/dist/components/list.d.ts.map +1 -1
- package/dist/components/list.js +11 -0
- package/dist/components/list.js.map +1 -1
- package/dist/examples/list-with-toast.d.ts +2 -0
- package/dist/examples/list-with-toast.d.ts.map +1 -0
- package/dist/examples/list-with-toast.js +24 -0
- package/dist/examples/list-with-toast.js.map +1 -0
- package/dist/extensions/dev.js +1 -1
- package/dist/extensions/dev.js.map +1 -1
- package/dist/index.d.ts +4 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/internal/dialog.d.ts.map +1 -1
- package/dist/internal/dialog.js +1 -1
- package/dist/internal/dialog.js.map +1 -1
- package/dist/internal/navigation.d.ts +2 -0
- package/dist/internal/navigation.d.ts.map +1 -1
- package/dist/internal/navigation.js +28 -1
- package/dist/internal/navigation.js.map +1 -1
- package/dist/keyboard.d.ts +38 -0
- package/dist/keyboard.d.ts.map +1 -0
- package/dist/keyboard.js +25 -0
- package/dist/keyboard.js.map +1 -0
- package/dist/release.d.ts.map +1 -1
- package/dist/release.js +5 -0
- package/dist/release.js.map +1 -1
- package/dist/utils/run-command.d.ts.map +1 -1
- package/dist/utils/run-command.js +9 -0
- package/dist/utils/run-command.js.map +1 -1
- package/package.json +3 -2
- package/src/apis/environment.tsx +60 -0
- package/src/cli.tsx +92 -4
- package/src/compile.tsx +2 -1
- package/src/components/actions.tsx +11 -6
- package/src/components/list.tsx +13 -0
- package/src/examples/list-with-toast.tsx +35 -0
- package/src/examples/list-with-toast.vitest.tsx +134 -0
- package/src/extensions/dev.tsx +1 -1
- package/src/index.tsx +12 -0
- package/src/internal/dialog.tsx +3 -1
- package/src/internal/navigation.tsx +33 -1
- package/src/keyboard.tsx +118 -0
- package/src/release.tsx +5 -0
- package/src/utils/run-command.tsx +10 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-command.d.ts","sourceRoot":"","sources":["../../src/utils/run-command.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAMzB,OAAO,KAAK,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AACpF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAA;AAEhE,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,UAAU,CAAA;IACrC,SAAS,CAAC,EAAE,eAAe,EAAE,CAAA;IAC7B,WAAW,CAAC,EAAE,GAAG,EAAE,CAAA;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,eAAe,CAAA;IACxB,aAAa,EAAE,MAAM,CAAA;IACrB,WAAW,CAAC,EAAE,kBAAkB,CAAA;IAChC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,GAAG,CAAA;IACvC,IAAI,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,SAAS,KAAK,IAAI,CAAA;IAExC,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB;AAED,wBAAsB,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"run-command.d.ts","sourceRoot":"","sources":["../../src/utils/run-command.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAMzB,OAAO,KAAK,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AACpF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAA;AAEhE,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,UAAU,CAAA;IACrC,SAAS,CAAC,EAAE,eAAe,EAAE,CAAA;IAC7B,WAAW,CAAC,EAAE,GAAG,EAAE,CAAA;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,eAAe,CAAA;IACxB,aAAa,EAAE,MAAM,CAAA;IACrB,WAAW,CAAC,EAAE,kBAAkB,CAAA;IAChC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,GAAG,CAAA;IACvC,IAAI,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,SAAS,KAAK,IAAI,CAAA;IAExC,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB;AAED,wBAAsB,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAoH1E;AAmED,wBAAgB,qBAAqB,IAAI,IAAI,CAE5C"}
|
|
@@ -70,6 +70,15 @@ export async function runCommand(options) {
|
|
|
70
70
|
fallbackText: undefined,
|
|
71
71
|
launchContext: undefined,
|
|
72
72
|
};
|
|
73
|
+
// Menu bar commands are not supported in termcast
|
|
74
|
+
if (command.mode === 'menu-bar') {
|
|
75
|
+
await showToast({
|
|
76
|
+
style: Toast.Style.Failure,
|
|
77
|
+
title: 'Unsupported command type',
|
|
78
|
+
message: 'Menu bar commands are not supported',
|
|
79
|
+
});
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
73
82
|
// Handle no-view commands (they export an async function, not a component)
|
|
74
83
|
if (command.mode === 'no-view') {
|
|
75
84
|
if (typeof CommandComponent === 'function') {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-command.js","sourceRoot":"","sources":["../../src/utils/run-command.tsx"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"run-command.js","sourceRoot":"","sources":["../../src/utils/run-command.tsx"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "termcast",
|
|
3
|
-
"version": "1.3.
|
|
3
|
+
"version": "1.3.21",
|
|
4
4
|
"description": "Raycast for the terminal",
|
|
5
5
|
"repository": "https://github.com/remorses/termcast",
|
|
6
6
|
"scripts": {
|
|
@@ -36,11 +36,12 @@
|
|
|
36
36
|
"@tanstack/react-query-persist-client": "^5.85.5",
|
|
37
37
|
"cac": "^6.7.14",
|
|
38
38
|
"change-case": "^5.4.4",
|
|
39
|
+
"cheerio": "^1.1.2",
|
|
39
40
|
"chokidar": "^4.0.3",
|
|
40
41
|
"google-auth-library": "^10.3.0",
|
|
41
42
|
"jszip": "^3.10.1",
|
|
42
43
|
"nanoid": "^5.1.5",
|
|
43
|
-
"node-pty": "^1.
|
|
44
|
+
"node-pty": "^1.0.0",
|
|
44
45
|
"react": "^19.2.0",
|
|
45
46
|
"react-dom": "^19.2.0",
|
|
46
47
|
"react-hook-form": "^7.62.0",
|
package/src/apis/environment.tsx
CHANGED
|
@@ -208,6 +208,66 @@ export async function getSelectedFinderItems(): Promise<string[]> {
|
|
|
208
208
|
return []
|
|
209
209
|
}
|
|
210
210
|
|
|
211
|
+
export interface LaunchOptions {
|
|
212
|
+
name: string
|
|
213
|
+
type: LaunchType
|
|
214
|
+
arguments?: Record<string, any>
|
|
215
|
+
context?: Record<string, any>
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
export async function launchCommand(options: LaunchOptions): Promise<void> {
|
|
219
|
+
const state = useStore.getState()
|
|
220
|
+
const { extensionPath, extensionPackageJson, navigationStack, devRebuildCount } = state
|
|
221
|
+
|
|
222
|
+
if (!extensionPath || !extensionPackageJson) {
|
|
223
|
+
throw new Error('No extension loaded')
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
const commandDef = extensionPackageJson.commands?.find(
|
|
227
|
+
(cmd) => cmd.name === options.name,
|
|
228
|
+
)
|
|
229
|
+
|
|
230
|
+
if (!commandDef) {
|
|
231
|
+
throw new Error(`Command '${options.name}' not found in extension`)
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
const bundledPath = path.join(extensionPath, '.termcast-bundle', `${options.name}.js`)
|
|
235
|
+
|
|
236
|
+
if (!fs.existsSync(bundledPath)) {
|
|
237
|
+
throw new Error(`Command '${options.name}' has not been built`)
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
const importPath = devRebuildCount
|
|
241
|
+
? `${bundledPath}?rebuild=${devRebuildCount}`
|
|
242
|
+
: bundledPath
|
|
243
|
+
const module = await import(importPath)
|
|
244
|
+
const CommandComponent = module.default
|
|
245
|
+
|
|
246
|
+
if (!CommandComponent) {
|
|
247
|
+
throw new Error(`Command '${options.name}' has no default export`)
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
const launchProps: LaunchProps = {
|
|
251
|
+
arguments: options.arguments || {},
|
|
252
|
+
fallbackText: undefined,
|
|
253
|
+
launchContext: options.context,
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
useStore.setState({ currentCommandName: options.name })
|
|
257
|
+
|
|
258
|
+
if (commandDef.mode === 'no-view') {
|
|
259
|
+
await CommandComponent(launchProps)
|
|
260
|
+
return
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
const { createElement } = await import('react')
|
|
264
|
+
const element = createElement(CommandComponent, launchProps)
|
|
265
|
+
|
|
266
|
+
useStore.setState({
|
|
267
|
+
navigationStack: [...navigationStack, { element }],
|
|
268
|
+
})
|
|
269
|
+
}
|
|
270
|
+
|
|
211
271
|
export async function getSelectedText(): Promise<string> {
|
|
212
272
|
// TODO: Improve implementation and cross-platform support
|
|
213
273
|
// Current implementation has issues:
|
package/src/cli.tsx
CHANGED
|
@@ -138,9 +138,10 @@ cli
|
|
|
138
138
|
.on('add', rebuild)
|
|
139
139
|
.on('unlink', rebuild)
|
|
140
140
|
.on('error', (error) => logger.error('Watcher error:', error))
|
|
141
|
-
} catch (e) {
|
|
141
|
+
} catch (e: any) {
|
|
142
|
+
console.error('Failed to start dev mode:', e?.message || e)
|
|
142
143
|
logger.error(e)
|
|
143
|
-
|
|
144
|
+
process.exit(1)
|
|
144
145
|
}
|
|
145
146
|
})
|
|
146
147
|
|
|
@@ -202,10 +203,10 @@ cli
|
|
|
202
203
|
})
|
|
203
204
|
|
|
204
205
|
cli
|
|
205
|
-
.command('release
|
|
206
|
+
.command('release [path]', 'Build and publish extension to GitHub releases')
|
|
206
207
|
.option('--single', 'Only compile for the current platform')
|
|
207
208
|
.action(async (extensionPath: string, options: { single?: boolean }) => {
|
|
208
|
-
extensionPath = path.resolve(extensionPath)
|
|
209
|
+
extensionPath = path.resolve(extensionPath || process.cwd())
|
|
209
210
|
|
|
210
211
|
console.log('Building and releasing extension...')
|
|
211
212
|
try {
|
|
@@ -364,6 +365,93 @@ cli
|
|
|
364
365
|
}
|
|
365
366
|
})
|
|
366
367
|
|
|
368
|
+
cli
|
|
369
|
+
.command('download <extensionName>', 'Download extension from Raycast extensions repo')
|
|
370
|
+
.option('-o, --output <path>', 'Output directory', { default: '.' })
|
|
371
|
+
.action(async (extensionName: string, options: { output: string }) => {
|
|
372
|
+
try {
|
|
373
|
+
const destPath = path.resolve(options.output)
|
|
374
|
+
const extensionDir = path.join(destPath, extensionName)
|
|
375
|
+
|
|
376
|
+
console.log(`Downloading extension '${extensionName}' from raycast/extensions...`)
|
|
377
|
+
|
|
378
|
+
if (fs.existsSync(extensionDir)) {
|
|
379
|
+
console.log(`Removing existing directory: ${extensionDir}`)
|
|
380
|
+
fs.rmSync(extensionDir, { recursive: true, force: true })
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
fs.mkdirSync(destPath, { recursive: true })
|
|
384
|
+
|
|
385
|
+
const repoUrl = 'https://github.com/raycast/extensions.git'
|
|
386
|
+
const cloneCmd = `git clone -n --depth=1 --filter=tree:0 "${repoUrl}" "${extensionName}"`
|
|
387
|
+
console.log(`Running: ${cloneCmd}`)
|
|
388
|
+
try {
|
|
389
|
+
execSync(cloneCmd, {
|
|
390
|
+
cwd: destPath,
|
|
391
|
+
stdio: 'inherit',
|
|
392
|
+
})
|
|
393
|
+
} catch (error) {
|
|
394
|
+
console.error(`Failed to clone repository`)
|
|
395
|
+
process.exit(1)
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
const sparseCmd = `git sparse-checkout set --no-cone "extensions/${extensionName}"`
|
|
399
|
+
console.log(`Running: ${sparseCmd}`)
|
|
400
|
+
try {
|
|
401
|
+
execSync(sparseCmd, {
|
|
402
|
+
cwd: extensionDir,
|
|
403
|
+
stdio: 'inherit',
|
|
404
|
+
})
|
|
405
|
+
} catch (error) {
|
|
406
|
+
console.error(`Failed to set sparse-checkout`)
|
|
407
|
+
process.exit(1)
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
const checkoutCmd = 'git checkout'
|
|
411
|
+
console.log(`Running: ${checkoutCmd}`)
|
|
412
|
+
try {
|
|
413
|
+
execSync(checkoutCmd, {
|
|
414
|
+
cwd: extensionDir,
|
|
415
|
+
stdio: 'inherit',
|
|
416
|
+
})
|
|
417
|
+
} catch (error) {
|
|
418
|
+
console.error(`Failed to checkout files`)
|
|
419
|
+
process.exit(1)
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
const extensionPath = path.join(extensionDir, 'extensions', extensionName)
|
|
423
|
+
|
|
424
|
+
if (!fs.existsSync(extensionPath)) {
|
|
425
|
+
console.error(`Extension '${extensionName}' not found in raycast/extensions repo`)
|
|
426
|
+
fs.rmSync(extensionDir, { recursive: true, force: true })
|
|
427
|
+
process.exit(1)
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
const filesToMove = fs.readdirSync(extensionPath)
|
|
431
|
+
for (const file of filesToMove) {
|
|
432
|
+
const src = path.join(extensionPath, file)
|
|
433
|
+
const dest = path.join(extensionDir, file)
|
|
434
|
+
fs.renameSync(src, dest)
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
fs.rmSync(path.join(extensionDir, 'extensions'), { recursive: true, force: true })
|
|
438
|
+
fs.rmSync(path.join(extensionDir, '.git'), { recursive: true, force: true })
|
|
439
|
+
|
|
440
|
+
console.log(`\nInstalling dependencies...`)
|
|
441
|
+
execSync('npm install', {
|
|
442
|
+
cwd: extensionDir,
|
|
443
|
+
stdio: 'inherit',
|
|
444
|
+
})
|
|
445
|
+
|
|
446
|
+
console.log(`\n✅ Extension downloaded successfully!`)
|
|
447
|
+
console.log(`📁 Path: ${extensionDir}`)
|
|
448
|
+
process.exit(0)
|
|
449
|
+
} catch (error) {
|
|
450
|
+
console.error('Error downloading extension:', error)
|
|
451
|
+
process.exit(1)
|
|
452
|
+
}
|
|
453
|
+
})
|
|
454
|
+
|
|
367
455
|
cli.command('', 'List and run installed extensions').action(async () => {
|
|
368
456
|
await runHomeCommand()
|
|
369
457
|
})
|
package/src/compile.tsx
CHANGED
|
@@ -171,7 +171,8 @@ export async function compileExtension({
|
|
|
171
171
|
})),
|
|
172
172
|
})
|
|
173
173
|
|
|
174
|
-
const
|
|
174
|
+
const targetSuffix = target ? targetToFileSuffix(target) : 'local'
|
|
175
|
+
const tempEntryPath = path.join(bundleDir, `_entry-${targetSuffix}.tsx`)
|
|
175
176
|
fs.writeFileSync(tempEntryPath, entryCode)
|
|
176
177
|
|
|
177
178
|
const bunTarget = target ? targetToString(target) : 'bun'
|
|
@@ -20,6 +20,11 @@ import { useDialog } from 'termcast/src/internal/dialog'
|
|
|
20
20
|
import { Dropdown } from 'termcast/src/components/dropdown'
|
|
21
21
|
import { useIsInFocus } from 'termcast/src/internal/focus-context'
|
|
22
22
|
import { CommonProps } from 'termcast/src/utils'
|
|
23
|
+
import type {
|
|
24
|
+
KeyboardShortcut,
|
|
25
|
+
KeyboardKeyEquivalent,
|
|
26
|
+
KeyboardKeyModifier,
|
|
27
|
+
} from 'termcast/src/keyboard'
|
|
23
28
|
import { showToast, Toast } from 'termcast/src/apis/toast'
|
|
24
29
|
import { createDescendants } from 'termcast/src/descendants'
|
|
25
30
|
import { useFormSubmit } from 'termcast/src/components/form/index'
|
|
@@ -35,8 +40,8 @@ export interface ActionProps extends CommonProps {
|
|
|
35
40
|
icon?: string | null
|
|
36
41
|
style?: ActionStyle
|
|
37
42
|
shortcut?: {
|
|
38
|
-
modifiers?:
|
|
39
|
-
key:
|
|
43
|
+
modifiers?: KeyboardKeyModifier[]
|
|
44
|
+
key: KeyboardKeyEquivalent
|
|
40
45
|
} | null
|
|
41
46
|
onAction?: () => void
|
|
42
47
|
autoFocus?: boolean
|
|
@@ -148,7 +153,7 @@ interface PickDateProps extends Omit<ActionProps, 'onAction'> {
|
|
|
148
153
|
// Create descendants for Actions - minimal fields needed
|
|
149
154
|
interface ActionDescendant {
|
|
150
155
|
title: string
|
|
151
|
-
shortcut?: { modifiers?:
|
|
156
|
+
shortcut?: { modifiers?: KeyboardKeyModifier[]; key: KeyboardKeyEquivalent } | null
|
|
152
157
|
execute: () => void
|
|
153
158
|
}
|
|
154
159
|
|
|
@@ -586,14 +591,14 @@ interface ActionPanelSubmenuProps extends ActionPanelSectionProps {
|
|
|
586
591
|
title: string
|
|
587
592
|
icon?: string | null
|
|
588
593
|
shortcut?: {
|
|
589
|
-
modifiers?:
|
|
590
|
-
key:
|
|
594
|
+
modifiers?: KeyboardKeyModifier[]
|
|
595
|
+
key: KeyboardKeyEquivalent
|
|
591
596
|
} | null
|
|
592
597
|
}
|
|
593
598
|
|
|
594
599
|
// Helper function to format shortcuts for display
|
|
595
600
|
function formatShortcut(
|
|
596
|
-
shortcut?: { modifiers?:
|
|
601
|
+
shortcut?: { modifiers?: KeyboardKeyModifier[]; key: KeyboardKeyEquivalent } | null,
|
|
597
602
|
): string {
|
|
598
603
|
if (!shortcut) return ''
|
|
599
604
|
|
package/src/components/list.tsx
CHANGED
|
@@ -767,6 +767,19 @@ export const List: ListType = (props) => {
|
|
|
767
767
|
}
|
|
768
768
|
}, [selectedItemId])
|
|
769
769
|
|
|
770
|
+
// Call onSelectionChange when selection changes
|
|
771
|
+
useEffect(() => {
|
|
772
|
+
if (!onSelectionChange) return
|
|
773
|
+
|
|
774
|
+
const items = Object.values(descendantsContext.map.current)
|
|
775
|
+
.filter((item) => item.index !== -1)
|
|
776
|
+
.sort((a, b) => a.index - b.index)
|
|
777
|
+
|
|
778
|
+
const currentItem = items.find((item) => item.index === selectedIndex)
|
|
779
|
+
const selectedId = currentItem?.props?.id ?? null
|
|
780
|
+
onSelectionChange(selectedId)
|
|
781
|
+
}, [selectedIndex])
|
|
782
|
+
|
|
770
783
|
const scrollToItem = (item: { props?: ListItemDescendant }) => {
|
|
771
784
|
const scrollBox = scrollBoxRef.current
|
|
772
785
|
const elementRef = item.props?.elementRef
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { renderWithProviders, List, showToast, Toast } from 'termcast'
|
|
2
|
+
|
|
3
|
+
const items = [
|
|
4
|
+
{ id: '1', title: 'First Item' },
|
|
5
|
+
{ id: '2', title: 'Second Item' },
|
|
6
|
+
{ id: '3', title: 'Third Item' },
|
|
7
|
+
{ id: '4', title: 'Fourth Item' },
|
|
8
|
+
{ id: '5', title: 'Fifth Item' },
|
|
9
|
+
]
|
|
10
|
+
|
|
11
|
+
function ListWithToast() {
|
|
12
|
+
const handleSelectionChange = async (id: string | null) => {
|
|
13
|
+
if (id) {
|
|
14
|
+
const item = items.find((i) => i.id === id)
|
|
15
|
+
await showToast({
|
|
16
|
+
style: Toast.Style.Success,
|
|
17
|
+
title: 'Selected',
|
|
18
|
+
message: item?.title,
|
|
19
|
+
})
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
return (
|
|
24
|
+
<List
|
|
25
|
+
navigationTitle='List With Toast'
|
|
26
|
+
onSelectionChange={handleSelectionChange}
|
|
27
|
+
>
|
|
28
|
+
{items.map((item) => (
|
|
29
|
+
<List.Item key={item.id} id={item.id} title={item.title} />
|
|
30
|
+
))}
|
|
31
|
+
</List>
|
|
32
|
+
)
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
await renderWithProviders(<ListWithToast />)
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { test, expect, afterEach, beforeEach } from 'vitest'
|
|
2
|
+
import { launchTerminal, Session } from 'tuistory/src'
|
|
3
|
+
|
|
4
|
+
let session: Session
|
|
5
|
+
|
|
6
|
+
beforeEach(async () => {
|
|
7
|
+
session = await launchTerminal({
|
|
8
|
+
command: 'bun',
|
|
9
|
+
args: ['src/examples/list-with-toast.tsx'],
|
|
10
|
+
cols: 70,
|
|
11
|
+
rows: 20,
|
|
12
|
+
})
|
|
13
|
+
})
|
|
14
|
+
|
|
15
|
+
afterEach(() => {
|
|
16
|
+
session?.close()
|
|
17
|
+
})
|
|
18
|
+
|
|
19
|
+
test('list navigation works while toast is shown', async () => {
|
|
20
|
+
await session.text({
|
|
21
|
+
waitFor: (text) => {
|
|
22
|
+
return /First Item/i.test(text)
|
|
23
|
+
},
|
|
24
|
+
})
|
|
25
|
+
|
|
26
|
+
const initialSnapshot = await session.text()
|
|
27
|
+
expect(initialSnapshot).toMatchInlineSnapshot(`
|
|
28
|
+
"
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
List With Toast ────────────────────────────────────────────────
|
|
32
|
+
|
|
33
|
+
Search...
|
|
34
|
+
|
|
35
|
+
›First Item
|
|
36
|
+
Second Item
|
|
37
|
+
Third Item
|
|
38
|
+
Fourth Item
|
|
39
|
+
Fifth Item
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
↵ select ↑↓ naviga┌─────────────────────────┐
|
|
47
|
+
│ ✓ Selected - First Item │
|
|
48
|
+
└─────────────────────────┘"
|
|
49
|
+
`)
|
|
50
|
+
|
|
51
|
+
await session.press('down')
|
|
52
|
+
await new Promise((r) => setTimeout(r, 200))
|
|
53
|
+
|
|
54
|
+
const afterFirstDown = await session.text()
|
|
55
|
+
expect(afterFirstDown).toMatchInlineSnapshot(`
|
|
56
|
+
"
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
List With Toast ────────────────────────────────────────────────
|
|
60
|
+
|
|
61
|
+
Search...
|
|
62
|
+
|
|
63
|
+
First Item
|
|
64
|
+
›Second Item
|
|
65
|
+
Third Item
|
|
66
|
+
Fourth Item
|
|
67
|
+
Fifth Item
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
↵ select ↑↓ navig┌──────────────────────────┐
|
|
75
|
+
│ ✓ Selected - Second Item │
|
|
76
|
+
└──────────────────────────┘"
|
|
77
|
+
`)
|
|
78
|
+
|
|
79
|
+
await session.press('down')
|
|
80
|
+
await new Promise((r) => setTimeout(r, 200))
|
|
81
|
+
|
|
82
|
+
const afterSecondDown = await session.text()
|
|
83
|
+
expect(afterSecondDown).toMatchInlineSnapshot(`
|
|
84
|
+
"
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
List With Toast ────────────────────────────────────────────────
|
|
88
|
+
|
|
89
|
+
Search...
|
|
90
|
+
|
|
91
|
+
First Item
|
|
92
|
+
Second Item
|
|
93
|
+
›Third Item
|
|
94
|
+
Fourth Item
|
|
95
|
+
Fifth Item
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
↵ select ↑↓ naviga┌─────────────────────────┐
|
|
103
|
+
│ ✓ Selected - Third Item │
|
|
104
|
+
└─────────────────────────┘"
|
|
105
|
+
`)
|
|
106
|
+
|
|
107
|
+
await session.press('up')
|
|
108
|
+
await new Promise((r) => setTimeout(r, 200))
|
|
109
|
+
|
|
110
|
+
const afterUp = await session.text()
|
|
111
|
+
expect(afterUp).toMatchInlineSnapshot(`
|
|
112
|
+
"
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
List With Toast ────────────────────────────────────────────────
|
|
116
|
+
|
|
117
|
+
Search...
|
|
118
|
+
|
|
119
|
+
First Item
|
|
120
|
+
›Second Item
|
|
121
|
+
Third Item
|
|
122
|
+
Fourth Item
|
|
123
|
+
Fifth Item
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
↵ select ↑↓ navig┌──────────────────────────┐
|
|
131
|
+
│ ✓ Selected - Second Item │
|
|
132
|
+
└──────────────────────────┘"
|
|
133
|
+
`)
|
|
134
|
+
}, 10000)
|
package/src/extensions/dev.tsx
CHANGED
|
@@ -68,7 +68,7 @@ function ExtensionCommandsList({
|
|
|
68
68
|
searchBarPlaceholder='Search commands...'
|
|
69
69
|
>
|
|
70
70
|
<List.Section title='Commands'>
|
|
71
|
-
{commands.map((command) => (
|
|
71
|
+
{commands.filter((cmd) => cmd.mode !== 'menu-bar').map((command) => (
|
|
72
72
|
<List.Item
|
|
73
73
|
key={command.name}
|
|
74
74
|
id={command.name}
|
package/src/index.tsx
CHANGED
|
@@ -133,7 +133,9 @@ export { Color } from 'termcast/src/colors'
|
|
|
133
133
|
// Navigation
|
|
134
134
|
export {
|
|
135
135
|
useNavigation,
|
|
136
|
+
NavigationProvider,
|
|
136
137
|
NavigationContainer,
|
|
138
|
+
popToRoot,
|
|
137
139
|
} from 'termcast/src/internal/navigation'
|
|
138
140
|
|
|
139
141
|
// Hooks
|
|
@@ -185,6 +187,7 @@ export {
|
|
|
185
187
|
environment,
|
|
186
188
|
getSelectedFinderItems,
|
|
187
189
|
getSelectedText,
|
|
190
|
+
launchCommand,
|
|
188
191
|
} from 'termcast/src/apis/environment'
|
|
189
192
|
export type { Environment, LaunchProps } from 'termcast/src/apis/environment'
|
|
190
193
|
|
|
@@ -223,5 +226,14 @@ export { closeMainWindow, PopToRootType } from 'termcast/src/apis/window'
|
|
|
223
226
|
// HUD
|
|
224
227
|
export { showHUD } from 'termcast/src/apis/hud'
|
|
225
228
|
|
|
229
|
+
// Keyboard
|
|
230
|
+
export { Keyboard } from 'termcast/src/keyboard'
|
|
231
|
+
export type {
|
|
232
|
+
KeyboardKeyEquivalent,
|
|
233
|
+
KeyboardKeyModifier,
|
|
234
|
+
KeyboardShortcut,
|
|
235
|
+
KeyboardCrossPlatformShortcut,
|
|
236
|
+
} from 'termcast/src/keyboard'
|
|
237
|
+
|
|
226
238
|
// Compile support
|
|
227
239
|
export { startCompiledExtension } from 'termcast/src/extensions/dev'
|
package/src/internal/dialog.tsx
CHANGED
|
@@ -17,6 +17,7 @@ import { logger } from '../logger'
|
|
|
17
17
|
interface Navigation {
|
|
18
18
|
push: (element: ReactNode, onPop?: () => void) => void
|
|
19
19
|
pop: () => void
|
|
20
|
+
popToRoot: () => void
|
|
20
21
|
}
|
|
21
22
|
|
|
22
23
|
interface NavigationContextType {
|
|
@@ -80,12 +81,29 @@ export function NavigationProvider(props: NavigationProviderProps): any {
|
|
|
80
81
|
})
|
|
81
82
|
}, [])
|
|
82
83
|
|
|
84
|
+
const popToRoot = useCallback(() => {
|
|
85
|
+
const currentStack = useStore.getState().navigationStack
|
|
86
|
+
if (currentStack.length <= 1) return
|
|
87
|
+
|
|
88
|
+
const poppedItems = currentStack.slice(1)
|
|
89
|
+
for (const item of poppedItems.reverse()) {
|
|
90
|
+
if (item?.onPop) {
|
|
91
|
+
item.onPop()
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
startNavigationTransition(() => {
|
|
96
|
+
useStore.setState({ navigationStack: [currentStack[0]] })
|
|
97
|
+
})
|
|
98
|
+
}, [])
|
|
99
|
+
|
|
83
100
|
const navigation = React.useMemo(
|
|
84
101
|
() => ({
|
|
85
102
|
push,
|
|
86
103
|
pop,
|
|
104
|
+
popToRoot,
|
|
87
105
|
}),
|
|
88
|
-
[push, pop],
|
|
106
|
+
[push, pop, popToRoot],
|
|
89
107
|
)
|
|
90
108
|
|
|
91
109
|
const value = React.useMemo(
|
|
@@ -138,6 +156,20 @@ export function useNavigationPending(): boolean {
|
|
|
138
156
|
return context?.isPending || false
|
|
139
157
|
}
|
|
140
158
|
|
|
159
|
+
export async function popToRoot(): Promise<void> {
|
|
160
|
+
const currentStack = useStore.getState().navigationStack
|
|
161
|
+
if (currentStack.length <= 1) return
|
|
162
|
+
|
|
163
|
+
const poppedItems = currentStack.slice(1)
|
|
164
|
+
for (const item of poppedItems.reverse()) {
|
|
165
|
+
if (item?.onPop) {
|
|
166
|
+
item.onPop()
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
useStore.setState({ navigationStack: [currentStack[0]] })
|
|
171
|
+
}
|
|
172
|
+
|
|
141
173
|
interface NavigationContainerProps extends CommonProps {
|
|
142
174
|
children: ReactNode
|
|
143
175
|
}
|