@mak-98/dirvi-cli 0.5.0 → 0.6.1

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.
@@ -1 +1 @@
1
- {"version":3,"file":"effect-to-action.d.ts","sourceRoot":"","sources":["../../src/application/effect-to-action.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,yDAAyD,CAAC;AACjH,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAEhF,MAAM,MAAM,cAAc,CACxB,EAAE,SAAS,eAAe,EAC1B,UAAU,SAAS,QAAQ,CAAC,EAAE,EAAE,UAAU,CAAC,IACzC,CACF,YAAY,EAAE,YAAY,CAAC,EAAE,EAAE,UAAU,CAAC,EAC1C,UAAU,EAAE,OAAO,CAAC,EAAE,EAAE,UAAU,CAAC,EACnC,KAAK,EAAE,KAAK,CAAC,EAAE,EAAE,UAAU,CAAC,KACzB,aAAa,CAAC,EAAE,EAAE,UAAU,CAAC,GAAG,SAAS,CAAC;AAE/C,wBAAgB,oBAAoB,CAClC,EAAE,SAAS,eAAe,EAC1B,UAAU,SAAS,QAAQ,CAAC,EAAE,EAAE,UAAU,CAAC,EAE3C,WAAW,EAAE,WAAW,CAAC,EAAE,EAAE,UAAU,CAAC,EACxC,SAAS,EAAE,SAAS,CAAC,EAAE,CAAC,EACxB,UAAU,EAAE,UAAU,CAAC,EAAE,EAAE,UAAU,CAAC,GACrC,cAAc,CAAC,EAAE,EAAE,UAAU,CAAC,CAgHhC"}
1
+ {"version":3,"file":"effect-to-action.d.ts","sourceRoot":"","sources":["../../src/application/effect-to-action.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EACL,eAAe,EACf,QAAQ,EACR,WAAW,EACZ,MAAM,yDAAyD,CAAC;AACjE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAEhF,MAAM,MAAM,cAAc,CACxB,EAAE,SAAS,eAAe,EAC1B,UAAU,SAAS,QAAQ,CAAC,EAAE,EAAE,UAAU,CAAC,IACzC,CACF,YAAY,EAAE,YAAY,CAAC,EAAE,EAAE,UAAU,CAAC,EAC1C,UAAU,EAAE,OAAO,CAAC,EAAE,EAAE,UAAU,CAAC,EACnC,KAAK,EAAE,KAAK,CAAC,EAAE,EAAE,UAAU,CAAC,KACzB,aAAa,CAAC,EAAE,EAAE,UAAU,CAAC,GAAG,SAAS,CAAC;AAE/C,wBAAgB,oBAAoB,CAClC,EAAE,SAAS,eAAe,EAC1B,UAAU,SAAS,QAAQ,CAAC,EAAE,EAAE,UAAU,CAAC,EAE3C,WAAW,EAAE,WAAW,CAAC,EAAE,EAAE,UAAU,CAAC,EACxC,SAAS,EAAE,SAAS,CAAC,EAAE,CAAC,EACxB,UAAU,EAAE,UAAU,CAAC,EAAE,EAAE,UAAU,CAAC,GACrC,cAAc,CAAC,EAAE,EAAE,UAAU,CAAC,CA+GhC"}
@@ -58,7 +58,9 @@ export function createEffectToAction(treeNodeApi, cursorApi, navNodeApi) {
58
58
  if (state.cursor.kind !== 'fold') {
59
59
  return undefined;
60
60
  }
61
- const node = navNodeApi.getNodeAtPath(navigation, [...state.cursor.parentPath]);
61
+ const node = navNodeApi.getNodeAtPath(navigation, [
62
+ ...state.cursor.parentPath,
63
+ ]);
62
64
  if (node === undefined || node.foldedEntries.length === 0) {
63
65
  return undefined;
64
66
  }
@@ -1 +1 @@
1
- {"version":3,"file":"reducer.d.ts","sourceRoot":"","sources":["../../src/application/reducer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,eAAe,EAAE,eAAe,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxG,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,MAAM,MAAM,OAAO,CACjB,EAAE,SAAS,eAAe,EAC1B,UAAU,SAAS,QAAQ,CAAC,EAAE,EAAE,UAAU,CAAC,IACzC,CACF,KAAK,EAAE,KAAK,CAAC,EAAE,EAAE,UAAU,CAAC,EAC5B,MAAM,EAAE,aAAa,CAAC,EAAE,EAAE,UAAU,CAAC,KAClC,KAAK,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;AAE3B,wBAAgB,aAAa,CAC3B,EAAE,SAAS,eAAe,EAC1B,UAAU,SAAS,QAAQ,CAAC,EAAE,EAAE,UAAU,CAAC,EAE3C,WAAW,EAAE,WAAW,CAAC,EAAE,EAAE,UAAU,CAAC,EACxC,eAAe,EAAE,eAAe,CAAC,EAAE,CAAC,GACnC,OAAO,CAAC,EAAE,EAAE,UAAU,CAAC,CA0FzB"}
1
+ {"version":3,"file":"reducer.d.ts","sourceRoot":"","sources":["../../src/application/reducer.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,eAAe,EACf,eAAe,EACf,KAAK,EACL,QAAQ,EACR,WAAW,EACZ,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,MAAM,MAAM,OAAO,CACjB,EAAE,SAAS,eAAe,EAC1B,UAAU,SAAS,QAAQ,CAAC,EAAE,EAAE,UAAU,CAAC,IACzC,CACF,KAAK,EAAE,KAAK,CAAC,EAAE,EAAE,UAAU,CAAC,EAC5B,MAAM,EAAE,aAAa,CAAC,EAAE,EAAE,UAAU,CAAC,KAClC,KAAK,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;AAE3B,wBAAgB,aAAa,CAC3B,EAAE,SAAS,eAAe,EAC1B,UAAU,SAAS,QAAQ,CAAC,EAAE,EAAE,UAAU,CAAC,EAE3C,WAAW,EAAE,WAAW,CAAC,EAAE,EAAE,UAAU,CAAC,EACxC,eAAe,EAAE,eAAe,CAAC,EAAE,CAAC,GACnC,OAAO,CAAC,EAAE,EAAE,UAAU,CAAC,CA0FzB"}
@@ -1 +1 @@
1
- {"version":3,"file":"app-api.d.ts","sourceRoot":"","sources":["../../src/domain/app-api.ts"],"names":[],"mappings":"AAAA,OAAO,EAOL,SAAS,EACT,WAAW,EACX,eAAe,EACf,UAAU,EAAE,eAAe,EAC3B,QAAQ,EACR,QAAQ,EACR,WAAW,EACZ,MAAM,WAAW,CAAC;AAEnB,MAAM,MAAM,MAAM,CAChB,EAAE,SAAS,eAAe,EAC1B,UAAU,SAAS,QAAQ,CAAC,EAAE,EAAE,UAAU,CAAC,IACzC;IACF;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;;OAGG;IACH,kBAAkB,EAAE,MAAM,CAAC;IAE3B;;;;OAIG;IACH,YAAY,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,KAAK,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IAEpD;;;;;OAKG;IACH,iBAAiB,EAAE,CAAC,QAAQ,EAAE,MAAM,IAAI,KAAK,MAAM,IAAI,CAAC;IAExD,WAAW,EAAE,WAAW,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;IAEzC;;OAEG;IACH,WAAW,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC;IAE7B;;;OAGG;IACH,eAAe,EAAE,eAAe,CAAC,EAAE,CAAC,CAAC;IAErC,SAAS,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC;IAEzB,QAAQ,EAAE,QAAQ,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;IAEnC,UAAU,EAAE,UAAU,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;CACxC,CAAC;AAEF,wBAAgB,aAAa,CAC3B,EAAE,SAAS,eAAe,EAC1B,UAAU,SAAS,QAAQ,CAAC,EAAE,EAAE,UAAU,CAAC,KACxC;IACH,WAAW,EAAE,WAAW,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;IACzC,WAAW,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC;IAC7B,eAAe,EAAE,eAAe,CAAC,EAAE,CAAC,CAAC;IACrC,SAAS,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC;IACzB,QAAQ,EAAE,QAAQ,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;IACnC,UAAU,EAAE,UAAU,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;CACxC,CAkCA"}
1
+ {"version":3,"file":"app-api.d.ts","sourceRoot":"","sources":["../../src/domain/app-api.ts"],"names":[],"mappings":"AAAA,OAAO,EAOL,SAAS,EACT,WAAW,EACX,eAAe,EACf,UAAU,EACV,eAAe,EACf,QAAQ,EACR,QAAQ,EACR,WAAW,EACZ,MAAM,WAAW,CAAC;AAEnB,MAAM,MAAM,MAAM,CAChB,EAAE,SAAS,eAAe,EAC1B,UAAU,SAAS,QAAQ,CAAC,EAAE,EAAE,UAAU,CAAC,IACzC;IACF;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;;OAGG;IACH,kBAAkB,EAAE,MAAM,CAAC;IAE3B;;;;OAIG;IACH,YAAY,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,KAAK,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IAEpD;;;;;OAKG;IACH,iBAAiB,EAAE,CAAC,QAAQ,EAAE,MAAM,IAAI,KAAK,MAAM,IAAI,CAAC;IAExD,WAAW,EAAE,WAAW,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;IAEzC;;OAEG;IACH,WAAW,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC;IAE7B;;;OAGG;IACH,eAAe,EAAE,eAAe,CAAC,EAAE,CAAC,CAAC;IAErC,SAAS,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC;IAEzB,QAAQ,EAAE,QAAQ,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;IAEnC,UAAU,EAAE,UAAU,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;CACxC,CAAC;AAEF,wBAAgB,aAAa,CAC3B,EAAE,SAAS,eAAe,EAC1B,UAAU,SAAS,QAAQ,CAAC,EAAE,EAAE,UAAU,CAAC,KACxC;IACH,WAAW,EAAE,WAAW,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;IACzC,WAAW,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC;IAC7B,eAAe,EAAE,eAAe,CAAC,EAAE,CAAC,CAAC;IACrC,SAAS,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC;IACzB,QAAQ,EAAE,QAAQ,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;IACnC,UAAU,EAAE,UAAU,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;CACxC,CAkCA"}
package/dist/index.js CHANGED
@@ -1,5 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { spawn } from 'node:child_process';
3
4
  import { Command } from 'commander';
4
5
  import { render } from 'ink';
5
6
  import { AppShell } from './ui/AppShell.js';
@@ -10,12 +11,6 @@ const program = new Command();
10
11
  // when Node is exiting.
11
12
  // Write UI to stderr
12
13
  const uiOutput = process.stderr;
13
- // The newline makes each message a separate JSON Lines message.
14
- // Note: if you pipe output you'll need to use FORCE_COLOR=3
15
- // to keep interactive screen colored.
16
- const emitStdoutMsg = (message) => {
17
- process.stdout.write(message);
18
- };
19
14
  const enterAlternateScreen = '\u001b[?1049h\u001b[2J\u001b[H\u001b[?25l';
20
15
  const leaveAlternateScreen = '\u001b[?25h\u001b[?1049l';
21
16
  // Idempotent terminal restoration
@@ -33,7 +28,7 @@ process.on('exit', restoreTerminal);
33
28
  program
34
29
  .name('direx')
35
30
  .description('View and manage directories.')
36
- .version('0.4.0')
31
+ .version('0.6.1')
37
32
  .helpOption('--help')
38
33
  .option('-d, --directory <path>', 'Directory to browse')
39
34
  .action(async () => {
@@ -45,10 +40,28 @@ program
45
40
  uiOutput.write(enterAlternateScreen);
46
41
  alternateScreenActive = true;
47
42
  }
43
+ const stdout = (message) => {
44
+ // The newline makes each message a separate JSON Lines message.
45
+ // Note: if you pipe output you'll need to use FORCE_COLOR=3
46
+ // to keep interactive screen colored.
47
+ process.stdout.write(`${message}\n`);
48
+ };
49
+ const clipboard = (value) => {
50
+ if (process.platform !== 'darwin') {
51
+ return;
52
+ }
53
+ const child = spawn('pbcopy');
54
+ child.once('error', (error) => {
55
+ process.stderr.write(`direx: unable to copy to clipboard: ${error.message}\n`);
56
+ });
57
+ child.stdin.end(value);
58
+ };
48
59
  try {
49
60
  const app = render(_jsx(AppShell, { ...(options.directory === undefined
50
61
  ? {}
51
- : { directory: options.directory }), ...(stdoutIsInteractive ? {} : { print: emitStdoutMsg }), onError: (error) => {
62
+ : { directory: options.directory }), ...(stdoutIsInteractive
63
+ ? {}
64
+ : { stdout }), clipboard: clipboard, onError: (error) => {
52
65
  appError = error;
53
66
  } }), { stdout: uiOutput });
54
67
  // Errors thrown while leaving this await still execute the finally block.
package/dist/ui/App.d.ts CHANGED
@@ -1,5 +1,4 @@
1
1
  import { IntentToEffect, SerializableKey, State, TreeNode } from 'dirvi-lib';
2
- import type { EventMessage } from '../domain/event-message.js';
3
2
  import { EffectToAction } from '../application/effect-to-action.js';
4
3
  import { AppApi } from '../domain/app-api.js';
5
4
  import { Reducer } from '../application/reducer.js';
@@ -9,9 +8,10 @@ type AppProps<Id extends SerializableKey, BufferNode extends TreeNode<Id, Buffer
9
8
  reducer: Reducer<Id, BufferNode>;
10
9
  intentToEffect: IntentToEffect<Id, BufferNode>;
11
10
  effectToAction: EffectToAction<Id, BufferNode>;
12
- print?: (message: EventMessage<Id, BufferNode>) => void;
11
+ stdout?: (message: string) => void;
12
+ clipboard?: (value: string) => void;
13
13
  onError?: (error: Error) => void;
14
14
  };
15
- export declare function App<Id extends SerializableKey, BufferNode extends TreeNode<Id, BufferNode>>({ appApi, initialState, reducer, intentToEffect, effectToAction, print, onError, }: AppProps<Id, BufferNode>): import("react").JSX.Element | null;
15
+ export declare function App<Id extends SerializableKey, BufferNode extends TreeNode<Id, BufferNode>>({ appApi, initialState, reducer, intentToEffect, effectToAction, stdout, clipboard, onError, }: AppProps<Id, BufferNode>): import("react").JSX.Element | null;
16
16
  export {};
17
17
  //# sourceMappingURL=App.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../src/ui/App.tsx"],"names":[],"mappings":"AAGA,OAAO,EAGL,cAAc,EAAE,eAAe,EAC/B,KAAK,EACL,QAAQ,EAET,MAAM,WAAW,CAAC;AAEnB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE/D,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAGpE,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAC;AAGpD,KAAK,QAAQ,CACX,EAAE,SAAS,eAAe,EAC1B,UAAU,SAAS,QAAQ,CAAC,EAAE,EAAE,UAAU,CAAC,IACzC;IACF,MAAM,EAAE,MAAM,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;IAC/B,YAAY,EAAE,KAAK,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;IACpC,OAAO,EAAE,OAAO,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;IACjC,cAAc,EAAE,cAAc,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;IAC/C,cAAc,EAAE,cAAc,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;IAC/C,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,YAAY,CAAC,EAAE,EAAE,UAAU,CAAC,KAAK,IAAI,CAAC;IACxD,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAClC,CAAC;AAEF,wBAAgB,GAAG,CACjB,EAAE,SAAS,eAAe,EAC1B,UAAU,SAAS,QAAQ,CAAC,EAAE,EAAE,UAAU,CAAC,EAC3C,EACA,MAAM,EACN,YAAY,EACZ,OAAO,EACP,cAAc,EACd,cAAc,EACd,KAAK,EACL,OAAO,GACR,EAAE,QAAQ,CAAC,EAAE,EAAE,UAAU,CAAC,sCAoL1B"}
1
+ {"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../src/ui/App.tsx"],"names":[],"mappings":"AAGA,OAAO,EAGL,cAAc,EACd,eAAe,EACf,KAAK,EACL,QAAQ,EAET,MAAM,WAAW,CAAC;AAGnB,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAGpE,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAC;AAGpD,KAAK,QAAQ,CACX,EAAE,SAAS,eAAe,EAC1B,UAAU,SAAS,QAAQ,CAAC,EAAE,EAAE,UAAU,CAAC,IACzC;IACF,MAAM,EAAE,MAAM,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;IAC/B,YAAY,EAAE,KAAK,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;IACpC,OAAO,EAAE,OAAO,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;IACjC,cAAc,EAAE,cAAc,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;IAC/C,cAAc,EAAE,cAAc,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;IAC/C,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAClC,CAAC;AAEF,wBAAgB,GAAG,CACjB,EAAE,SAAS,eAAe,EAC1B,UAAU,SAAS,QAAQ,CAAC,EAAE,EAAE,UAAU,CAAC,EAC3C,EACA,MAAM,EACN,YAAY,EACZ,OAAO,EACP,cAAc,EACd,cAAc,EACd,MAAM,EACN,SAAS,EACT,OAAO,GACR,EAAE,QAAQ,CAAC,EAAE,EAAE,UAAU,CAAC,sCA0K1B"}
package/dist/ui/App.js CHANGED
@@ -6,7 +6,7 @@ import { ViewRowComponent } from './components/ViewRowComponent.js';
6
6
  import { StatusBar } from './components/StatusBar.js';
7
7
  import { inkInputToUserInput } from '../infrastructure/ink-input-to-user-input.js';
8
8
  import { useView } from './hooks/useView.js';
9
- export function App({ appApi, initialState, reducer, intentToEffect, effectToAction, print, onError, }) {
9
+ export function App({ appApi, initialState, reducer, intentToEffect, effectToAction, stdout, clipboard, onError, }) {
10
10
  const [state, dispatch] = useReducer(reducer, initialState);
11
11
  // Give `subscribeToResync` callback a way to see current state:
12
12
  const stateRef = useRef(state);
@@ -19,15 +19,6 @@ export function App({ appApi, initialState, reducer, intentToEffect, effectToAct
19
19
  const { rows: terminalRows } = useWindowSize();
20
20
  const view = useView(navigation, state, appApi.cursorApi, terminalRows);
21
21
  const [exitStatus, setExitStatus] = useState();
22
- // Print on changes: view, paths of visible leaves
23
- useEffect(() => {
24
- print?.({ type: 'view', view: state });
25
- const visibleLeavesPaths = appApi.navNodeApi.visibleLeavesPaths(navigation);
26
- print?.({
27
- type: 'displayed-leaves-paths',
28
- paths: visibleLeavesPaths,
29
- });
30
- }, [appApi.navNodeApi, state, print, navigation]);
31
22
  // Subscribe to directory watcher, do not
32
23
  // resubscribe on every state change.
33
24
  useEffect(() => {
@@ -92,10 +83,15 @@ export function App({ appApi, initialState, reducer, intentToEffect, effectToAct
92
83
  });
93
84
  return;
94
85
  }
95
- case 'emitPath':
96
- print?.({
97
- type: 'file',
98
- path: effect.path,
86
+ case 'emitVisibleLeavesPaths':
87
+ const visibleLeavesPaths = appApi.navNodeApi.visibleLeavesPaths(navigation);
88
+ stdout?.(JSON.stringify({
89
+ type: 'displayed-leaves-paths',
90
+ paths: visibleLeavesPaths,
91
+ }));
92
+ setInputState({
93
+ inputMode: 'normal',
94
+ normalBuffer: '',
99
95
  });
100
96
  return;
101
97
  case 'quit':
@@ -1,8 +1,8 @@
1
- import { SerializableKey, TreeNode } from 'dirvi-lib';
2
1
  export type ShellAppProps = {
3
2
  directory?: string;
4
- print?: (message: string) => void;
3
+ stdout?: (message: string) => void;
4
+ clipboard?: (value: string) => void;
5
5
  onError?: (error: Error) => void;
6
6
  };
7
- export declare function AppShell<Id extends SerializableKey, BufferNode extends TreeNode<Id, BufferNode>>({ directory, print, onError }: ShellAppProps): import("react").JSX.Element;
7
+ export declare function AppShell({ directory, stdout, clipboard, onError }: ShellAppProps): import("react").JSX.Element;
8
8
  //# sourceMappingURL=AppShell.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"AppShell.d.ts","sourceRoot":"","sources":["../../src/ui/AppShell.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAwB,eAAe,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAI5E,MAAM,MAAM,aAAa,GAAG;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAClC,CAAC;AAIF,wBAAgB,QAAQ,CACtB,EAAE,SAAS,eAAe,EAC1B,UAAU,SAAS,QAAQ,CAAC,EAAE,EAAE,UAAU,CAAC,EAC3C,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,aAAa,+BAyB7C"}
1
+ {"version":3,"file":"AppShell.d.ts","sourceRoot":"","sources":["../../src/ui/AppShell.tsx"],"names":[],"mappings":"AAIA,MAAM,MAAM,aAAa,GAAG;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAClC,CAAC;AAIF,wBAAgB,QAAQ,CAAC,EACtB,SAAS,EACT,MAAM,EACN,SAAS,EACT,OAAO,EACT,EAAE,aAAa,+BAYf"}
@@ -1,23 +1,11 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { loadPosixAppApi } from '../infrastructure/load-posix-app-api.js';
3
3
  import { LoadingApp } from './LoadingApp.js';
4
- import { join } from 'node:path';
5
4
  import { useMemo } from 'react';
6
5
  // App Shell is for choosing the active app, then loading the api,
7
6
  // and showing the app.
8
- export function AppShell({ directory, print, onError }) {
7
+ export function AppShell({ directory, stdout, clipboard, onError }) {
9
8
  // Api owns directory watcher and subscriptions
10
9
  const posixAppApi = useMemo(() => loadPosixAppApi(directory), [directory]);
11
- const emitEventMsg = print
12
- ? (message) => {
13
- const externalMessage = message.type === 'displayed-leaves-paths'
14
- ? {
15
- ...message,
16
- paths: message.paths.map((path) => join(...path)),
17
- }
18
- : message;
19
- print(`${JSON.stringify(externalMessage)}\n`);
20
- }
21
- : undefined;
22
- return (_jsx(LoadingApp, { appApi: posixAppApi, ...(emitEventMsg === undefined ? {} : { print: emitEventMsg }), ...(onError === undefined ? {} : { onError }) }));
10
+ return (_jsx(LoadingApp, { appApi: posixAppApi, ...(stdout === undefined ? {} : { stdout }), ...(clipboard === undefined ? {} : { clipboard }), ...(onError === undefined ? {} : { onError }) }));
23
11
  }
@@ -1,11 +1,11 @@
1
1
  import { SerializableKey, TreeNode } from 'dirvi-lib';
2
- import type { EventMessage } from '../domain/event-message.js';
3
2
  import { AppApi } from '../domain/app-api.js';
4
3
  type LoadingAppProps<Id extends SerializableKey, BufferNode extends TreeNode<Id, BufferNode>> = {
5
4
  appApi: AppApi<Id, BufferNode>;
6
- print?: (message: EventMessage<Id, BufferNode>) => void;
5
+ stdout?: (message: string) => void;
6
+ clipboard?: (value: string) => void;
7
7
  onError?: (error: Error) => void;
8
8
  };
9
- export declare function LoadingApp<Id extends SerializableKey, BufferNode extends TreeNode<Id, BufferNode>>({ appApi, print, onError }: LoadingAppProps<Id, BufferNode>): import("react").JSX.Element;
9
+ export declare function LoadingApp<Id extends SerializableKey, BufferNode extends TreeNode<Id, BufferNode>>({ appApi, stdout, clipboard, onError }: LoadingAppProps<Id, BufferNode>): import("react").JSX.Element;
10
10
  export {};
11
11
  //# sourceMappingURL=LoadingApp.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"LoadingApp.d.ts","sourceRoot":"","sources":["../../src/ui/LoadingApp.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAwB,eAAe,EAAS,QAAQ,EAAE,MAAM,WAAW,CAAC;AAEnF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE/D,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAI9C,KAAK,eAAe,CAClB,EAAE,SAAS,eAAe,EAC1B,UAAU,SAAS,QAAQ,CAAC,EAAE,EAAE,UAAU,CAAC,IACzC;IACF,MAAM,EAAE,MAAM,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;IAC/B,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,YAAY,CAAC,EAAE,EAAE,UAAU,CAAC,KAAK,IAAI,CAAC;IACxD,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAClC,CAAC;AA0BF,wBAAgB,UAAU,CACxB,EAAE,SAAS,eAAe,EAC1B,UAAU,SAAS,QAAQ,CAAC,EAAE,EAAE,UAAU,CAAC,EAC3C,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,eAAe,CAAC,EAAE,EAAE,UAAU,CAAC,+BA+F5D"}
1
+ {"version":3,"file":"LoadingApp.d.ts","sourceRoot":"","sources":["../../src/ui/LoadingApp.tsx"],"names":[],"mappings":"AAGA,OAAO,EAEL,eAAe,EAEf,QAAQ,EACT,MAAM,WAAW,CAAC;AAGnB,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAI9C,KAAK,eAAe,CAClB,EAAE,SAAS,eAAe,EAC1B,UAAU,SAAS,QAAQ,CAAC,EAAE,EAAE,UAAU,CAAC,IACzC;IACF,MAAM,EAAE,MAAM,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;IAC/B,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAClC,CAAC;AA0BF,wBAAgB,UAAU,CACxB,EAAE,SAAS,eAAe,EAC1B,UAAU,SAAS,QAAQ,CAAC,EAAE,EAAE,UAAU,CAAC,EAC3C,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,eAAe,CAAC,EAAE,EAAE,UAAU,CAAC,+BAgGxE"}
@@ -1,7 +1,7 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { Text } from 'ink';
3
3
  import { useEffect, useMemo, useState } from 'react';
4
- import { createIntentToEffect } from 'dirvi-lib';
4
+ import { createIntentToEffect, } from 'dirvi-lib';
5
5
  import { App } from './App.js';
6
6
  import { createReducer } from '../application/reducer.js';
7
7
  import { createEffectToAction } from '../application/effect-to-action.js';
@@ -19,7 +19,7 @@ function createInitialState(rootBranches, createEmptyFoldRoot) {
19
19
  },
20
20
  };
21
21
  }
22
- export function LoadingApp({ appApi, print, onError }) {
22
+ export function LoadingApp({ appApi, stdout, clipboard, onError }) {
23
23
  const [initialState, setInitialState] = useState();
24
24
  const [empty, setEmpty] = useState(false);
25
25
  const [error, setError] = useState();
@@ -63,5 +63,5 @@ export function LoadingApp({ appApi, print, onError }) {
63
63
  if (initialState === undefined) {
64
64
  return _jsx(Text, { dimColor: true, children: "Loading." });
65
65
  }
66
- return (_jsx(App, { appApi: appApi, initialState: initialState, reducer: reducer, intentToEffect: intentToEffect, effectToAction: effectToAction, ...(print === undefined ? {} : { print }), ...(onError === undefined ? {} : { onError }) }));
66
+ return (_jsx(App, { appApi: appApi, initialState: initialState, reducer: reducer, intentToEffect: intentToEffect, effectToAction: effectToAction, ...(stdout === undefined ? {} : { stdout }), ...(clipboard === undefined ? {} : { clipboard }), ...(onError === undefined ? {} : { onError }) }));
67
67
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mak-98/dirvi-cli",
3
- "version": "0.5.0",
3
+ "version": "0.6.1",
4
4
  "description": "A Vim-inspired TUI for browsing directories.",
5
5
  "type": "module",
6
6
  "license": "GPL-3.0-or-later",
@@ -13,7 +13,7 @@
13
13
  ],
14
14
  "dependencies": {
15
15
  "commander": "^13.0.0",
16
- "dirvi-lib": "0.5.0",
16
+ "dirvi-lib": "0.6.1",
17
17
  "ink": "^7.1.1",
18
18
  "react": "^19.0.0"
19
19
  },