@bobfrankston/msger 0.1.82 → 0.1.83

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/README.md CHANGED
@@ -81,16 +81,27 @@ msger --help
81
81
 
82
82
  ## JSON Configuration Files
83
83
 
84
- You can store message box configuration in a JSON file for reuse:
84
+ You can store message box configuration in a JSON file for reuse. JSON files support comments (JSON5 format).
85
85
 
86
86
  ```bash
87
87
  # Load configuration from file
88
- msger config.json
88
+ msger -load config.json
89
89
 
90
- # Override specific values
91
- msger config.json --title "New Title" --width 800
90
+ # Override specific values from loaded config
91
+ msger -load config.json -title "New Title" -size 800,600
92
+
93
+ # Save current command-line options to a file (only saves explicitly specified values)
94
+ msger -title "My Dialog" -message "Hello" -buttons Yes No -save my-config.json
95
+
96
+ # Load base config, override, and save the overrides
97
+ msger -load base.json -title "Modified" -save modified.json
98
+
99
+ # Save and show (saves config then displays the message box)
100
+ msger -title "Test" -message "Saving config..." -save test.json
92
101
  ```
93
102
 
103
+ **Note:** The `-save` option saves only the explicitly specified command-line arguments, not derived defaults. This keeps config files minimal and allows defaults to evolve.
104
+
94
105
  ### Complete JSON Structure
95
106
 
96
107
  ```json
package/cli.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["cli.ts"],"names":[],"mappings":";AAKA,wBAA8B,IAAI,kBA6DjC"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["cli.ts"],"names":[],"mappings":";AAKA,wBAA8B,IAAI,kBA8GjC"}
package/cli.js CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  import { showMessageBox } from './shower.js';
3
- import { parseCliArgs, showHelp, showVersion } from './clihandler.js';
3
+ import { parseCliArgs, showHelp, showVersion, loadConfigFile, saveConfigFile } from './clihandler.js';
4
4
  export default async function main() {
5
5
  const args = process.argv.slice(2);
6
6
  // No arguments - show help
@@ -9,7 +9,57 @@ export default async function main() {
9
9
  process.exit(0);
10
10
  }
11
11
  // Parse command line arguments
12
- const { options, showHelp: shouldShowHelp, showVersion: shouldShowVersion } = parseCliArgs(args);
12
+ const { options, showHelp: shouldShowHelp, showVersion: shouldShowVersion, loadFile, saveFile } = parseCliArgs(args);
13
+ // Load config file if specified
14
+ let finalOptions = options;
15
+ if (loadFile) {
16
+ try {
17
+ const loadedConfig = loadConfigFile(loadFile);
18
+ // Merge: CLI args override loaded config
19
+ // Only override properties that were explicitly set (not undefined/empty)
20
+ finalOptions = { ...loadedConfig };
21
+ if (options.title)
22
+ finalOptions.title = options.title;
23
+ if (options.message)
24
+ finalOptions.message = options.message;
25
+ if (options.html)
26
+ finalOptions.html = options.html;
27
+ if (options.url)
28
+ finalOptions.url = options.url;
29
+ if (options.size)
30
+ finalOptions.size = options.size;
31
+ if (options.pos)
32
+ finalOptions.pos = options.pos;
33
+ if (options.buttons && options.buttons.length > 0)
34
+ finalOptions.buttons = options.buttons;
35
+ if (options.allowInput !== undefined)
36
+ finalOptions.allowInput = options.allowInput;
37
+ if (options.defaultValue)
38
+ finalOptions.defaultValue = options.defaultValue;
39
+ if (options.inputPlaceholder)
40
+ finalOptions.inputPlaceholder = options.inputPlaceholder;
41
+ if (options.timeout !== undefined)
42
+ finalOptions.timeout = options.timeout;
43
+ if (options.alwaysOnTop !== undefined)
44
+ finalOptions.alwaysOnTop = options.alwaysOnTop;
45
+ if (options.fullscreen !== undefined)
46
+ finalOptions.fullscreen = options.fullscreen;
47
+ if (options.zoomPercent !== undefined)
48
+ finalOptions.zoomPercent = options.zoomPercent;
49
+ if (options.icon)
50
+ finalOptions.icon = options.icon;
51
+ if (options.dev !== undefined)
52
+ finalOptions.dev = options.dev;
53
+ if (options.debug !== undefined)
54
+ finalOptions.debug = options.debug;
55
+ if (options.detach !== undefined)
56
+ finalOptions.detach = options.detach;
57
+ }
58
+ catch (error) {
59
+ console.error('Error loading config:', error.message);
60
+ process.exit(1);
61
+ }
62
+ }
13
63
  // Help always takes precedence and exits
14
64
  if (shouldShowHelp) {
15
65
  showHelp();
@@ -29,15 +79,32 @@ export default async function main() {
29
79
  if (shouldShowVersion) {
30
80
  showVersion();
31
81
  }
82
+ // Save config file if specified
83
+ if (saveFile) {
84
+ try {
85
+ // Save only the explicit CLI arguments, not the merged/derived settings
86
+ // This preserves defaults as defaults
87
+ saveConfigFile(saveFile, options);
88
+ console.log(`Configuration saved to: ${saveFile}`);
89
+ // If save was the only operation (no content to show), exit
90
+ if (!finalOptions.message && !finalOptions.url && !finalOptions.html) {
91
+ process.exit(0);
92
+ }
93
+ }
94
+ catch (error) {
95
+ console.error('Error saving config:', error.message);
96
+ process.exit(1);
97
+ }
98
+ }
32
99
  // If no actual message/content was provided, show help
33
- if (!options.message && !options.url && !options.html) {
100
+ if (!finalOptions.message && !finalOptions.url && !finalOptions.html) {
34
101
  showHelp();
35
102
  process.exit(0);
36
103
  }
37
104
  try {
38
- const result = await showMessageBox(options);
105
+ const result = await showMessageBox(finalOptions);
39
106
  // If detached, exit immediately without printing result
40
- if (options.detach) {
107
+ if (finalOptions.detach) {
41
108
  process.exit(0);
42
109
  }
43
110
  console.log(JSON.stringify(result, null, 2));
package/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAEtE,MAAM,CAAC,OAAO,CAAC,KAAK,UAAU,IAAI;IAC9B,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAEnC,2BAA2B;IAC3B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpB,QAAQ,EAAE,CAAC;QACX,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAED,+BAA+B;IAC/B,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,WAAW,EAAE,iBAAiB,EAAE,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAEjG,yCAAyC;IACzC,IAAI,cAAc,EAAE,CAAC;QACjB,QAAQ,EAAE,CAAC;QACX,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAED,8DAA8D;IAC9D,wFAAwF;IACxF,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CACnC,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC;QACpB,GAAG,KAAK,UAAU;QAClB,GAAG,KAAK,OAAO;QACf,GAAG,KAAK,MAAM,CACjB,CAAC;IAEF,IAAI,iBAAiB,IAAI,CAAC,cAAc,EAAE,CAAC;QACvC,WAAW,EAAE,CAAC;QACd,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAED,wEAAwE;IACxE,IAAI,iBAAiB,EAAE,CAAC;QACpB,WAAW,EAAE,CAAC;IAClB,CAAC;IAED,uDAAuD;IACvD,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QACpD,QAAQ,EAAE,CAAC;QACX,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAED,IAAI,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC,CAAC;QAE7C,wDAAwD;QACxD,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACjB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAE7C,iCAAiC;QACjC,IAAI,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YACpC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC;IACL,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QACvC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACL,CAAC;AAED,sEAAsE;AAEtE,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IACnB,MAAM,IAAI,EAAE,CAAC;AACjB,CAAC"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["cli.ts"],"names":[],"mappings":"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"}
package/cli.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
 
3
3
  import { showMessageBox } from './shower.js';
4
- import { parseCliArgs, showHelp, showVersion } from './clihandler.js';
4
+ import { parseCliArgs, showHelp, showVersion, loadConfigFile, saveConfigFile } from './clihandler.js';
5
5
 
6
6
  export default async function main() {
7
7
  const args = process.argv.slice(2);
@@ -13,7 +13,39 @@ export default async function main() {
13
13
  }
14
14
 
15
15
  // Parse command line arguments
16
- const { options, showHelp: shouldShowHelp, showVersion: shouldShowVersion } = parseCliArgs(args);
16
+ const { options, showHelp: shouldShowHelp, showVersion: shouldShowVersion, loadFile, saveFile } = parseCliArgs(args);
17
+
18
+ // Load config file if specified
19
+ let finalOptions = options;
20
+ if (loadFile) {
21
+ try {
22
+ const loadedConfig = loadConfigFile(loadFile);
23
+ // Merge: CLI args override loaded config
24
+ // Only override properties that were explicitly set (not undefined/empty)
25
+ finalOptions = { ...loadedConfig };
26
+ if (options.title) finalOptions.title = options.title;
27
+ if (options.message) finalOptions.message = options.message;
28
+ if (options.html) finalOptions.html = options.html;
29
+ if (options.url) finalOptions.url = options.url;
30
+ if (options.size) finalOptions.size = options.size;
31
+ if (options.pos) finalOptions.pos = options.pos;
32
+ if (options.buttons && options.buttons.length > 0) finalOptions.buttons = options.buttons;
33
+ if (options.allowInput !== undefined) finalOptions.allowInput = options.allowInput;
34
+ if (options.defaultValue) finalOptions.defaultValue = options.defaultValue;
35
+ if (options.inputPlaceholder) finalOptions.inputPlaceholder = options.inputPlaceholder;
36
+ if (options.timeout !== undefined) finalOptions.timeout = options.timeout;
37
+ if (options.alwaysOnTop !== undefined) finalOptions.alwaysOnTop = options.alwaysOnTop;
38
+ if (options.fullscreen !== undefined) finalOptions.fullscreen = options.fullscreen;
39
+ if (options.zoomPercent !== undefined) finalOptions.zoomPercent = options.zoomPercent;
40
+ if (options.icon) finalOptions.icon = options.icon;
41
+ if (options.dev !== undefined) finalOptions.dev = options.dev;
42
+ if (options.debug !== undefined) finalOptions.debug = options.debug;
43
+ if (options.detach !== undefined) finalOptions.detach = options.detach;
44
+ } catch (error: any) {
45
+ console.error('Error loading config:', error.message);
46
+ process.exit(1);
47
+ }
48
+ }
17
49
 
18
50
  // Help always takes precedence and exits
19
51
  if (shouldShowHelp) {
@@ -40,17 +72,34 @@ export default async function main() {
40
72
  showVersion();
41
73
  }
42
74
 
75
+ // Save config file if specified
76
+ if (saveFile) {
77
+ try {
78
+ // Save only the explicit CLI arguments, not the merged/derived settings
79
+ // This preserves defaults as defaults
80
+ saveConfigFile(saveFile, options);
81
+ console.log(`Configuration saved to: ${saveFile}`);
82
+ // If save was the only operation (no content to show), exit
83
+ if (!finalOptions.message && !finalOptions.url && !finalOptions.html) {
84
+ process.exit(0);
85
+ }
86
+ } catch (error: any) {
87
+ console.error('Error saving config:', error.message);
88
+ process.exit(1);
89
+ }
90
+ }
91
+
43
92
  // If no actual message/content was provided, show help
44
- if (!options.message && !options.url && !options.html) {
93
+ if (!finalOptions.message && !finalOptions.url && !finalOptions.html) {
45
94
  showHelp();
46
95
  process.exit(0);
47
96
  }
48
97
 
49
98
  try {
50
- const result = await showMessageBox(options);
99
+ const result = await showMessageBox(finalOptions);
51
100
 
52
101
  // If detached, exit immediately without printing result
53
- if (options.detach) {
102
+ if (finalOptions.detach) {
54
103
  process.exit(0);
55
104
  }
56
105
 
package/clihandler.d.ts CHANGED
@@ -6,7 +6,18 @@ export declare function parseCliArgs(args: string[]): {
6
6
  options: MessageBoxOptions;
7
7
  showHelp: boolean;
8
8
  showVersion: boolean;
9
+ loadFile?: string;
10
+ saveFile?: string;
9
11
  };
12
+ /**
13
+ * Load configuration from JSON file (supports JSON with comments)
14
+ */
15
+ export declare function loadConfigFile(filePath: string): Partial<MessageBoxOptions>;
16
+ /**
17
+ * Save configuration to JSON file with helpful comments
18
+ * Only saves non-default values to keep the file minimal
19
+ */
20
+ export declare function saveConfigFile(filePath: string, options: MessageBoxOptions): void;
10
21
  export declare function showHelp(): void;
11
22
  export declare function showVersion(): void;
12
23
  //# sourceMappingURL=clihandler.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"clihandler.d.ts","sourceRoot":"","sources":["clihandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AA8FhD;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG;IAAE,OAAO,EAAE,iBAAiB,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAC;IAAC,WAAW,EAAE,OAAO,CAAA;CAAE,CA2NpH;AAED,wBAAgB,QAAQ,IAAI,IAAI,CAE/B;AAED,wBAAgB,WAAW,IAAI,IAAI,CAElC"}
1
+ {"version":3,"file":"clihandler.d.ts","sourceRoot":"","sources":["clihandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAmGhD;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG;IAC1C,OAAO,EAAE,iBAAiB,CAAC;IAC3B,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACrB,CAuOA;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAgB3E;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,GAAG,IAAI,CAoGjF;AAED,wBAAgB,QAAQ,IAAI,IAAI,CAE/B;AAED,wBAAgB,WAAW,IAAI,IAAI,CAElC"}
package/clihandler.js CHANGED
@@ -2,6 +2,7 @@ import packageJson from './package.json' with { type: 'json' };
2
2
  import fs from 'fs';
3
3
  import path from 'path';
4
4
  import { execSync } from 'child_process';
5
+ import JSON5 from 'json5';
5
6
  const HELP_TEXT = `
6
7
  msger v${packageJson.version} - Fast, lightweight, cross-platform message box (Rust-powered)
7
8
 
@@ -31,6 +32,8 @@ Options:
31
32
  -detach Leave window open after app exits (parent process returns immediately)
32
33
  -fullscreen Start window in fullscreen mode (F11 to toggle, Escape to exit)
33
34
  -ontop Keep window always on top of other windows
35
+ -load <file> Load options from JSON file (supports comments)
36
+ -save <file> Save current options to JSON file
34
37
  -dev Open DevTools (F12) automatically on startup (for debugging)
35
38
  -debug Return debug info (HTML, size) in result
36
39
  -v, -version, --version Show version number
@@ -191,6 +194,14 @@ export function parseCliArgs(args) {
191
194
  cli.debug = true;
192
195
  i++;
193
196
  }
197
+ else if (arg === '-load' || arg === '--load') {
198
+ cli.load = args[++i];
199
+ i++;
200
+ }
201
+ else if (arg === '-save' || arg === '--save') {
202
+ cli.save = args[++i];
203
+ i++;
204
+ }
194
205
  else if (!arg.startsWith('-')) {
195
206
  // Non-option argument - part of the message
196
207
  messageWords.push(arg);
@@ -308,7 +319,147 @@ export function parseCliArgs(args) {
308
319
  options.pos.screen = cli.screen;
309
320
  }
310
321
  }
311
- return { options, showHelp: cli.help || false, showVersion: cli.version || false };
322
+ return {
323
+ options,
324
+ showHelp: cli.help || false,
325
+ showVersion: cli.version || false,
326
+ loadFile: cli.load,
327
+ saveFile: cli.save
328
+ };
329
+ }
330
+ /**
331
+ * Load configuration from JSON file (supports JSON with comments)
332
+ */
333
+ export function loadConfigFile(filePath) {
334
+ const absolutePath = path.resolve(filePath);
335
+ if (!fs.existsSync(absolutePath)) {
336
+ throw new Error(`Config file not found: ${absolutePath}`);
337
+ }
338
+ const fileContent = fs.readFileSync(absolutePath, 'utf-8');
339
+ try {
340
+ // Use JSON5 to parse (supports comments and trailing commas)
341
+ const config = JSON5.parse(fileContent);
342
+ return config;
343
+ }
344
+ catch (error) {
345
+ throw new Error(`Failed to parse config file ${filePath}: ${error.message}`);
346
+ }
347
+ }
348
+ /**
349
+ * Save configuration to JSON file with helpful comments
350
+ * Only saves non-default values to keep the file minimal
351
+ */
352
+ export function saveConfigFile(filePath, options) {
353
+ const absolutePath = path.resolve(filePath);
354
+ // Create a clean object without undefined values or defaults
355
+ const config = {};
356
+ if (options.title && options.title !== 'Message')
357
+ config.title = options.title;
358
+ if (options.message)
359
+ config.message = options.message;
360
+ if (options.html)
361
+ config.html = options.html;
362
+ if (options.url)
363
+ config.url = options.url;
364
+ // Only save size if explicitly set
365
+ if (options.size)
366
+ config.size = options.size;
367
+ if (options.pos)
368
+ config.pos = options.pos;
369
+ // Only save buttons if not the default ['OK']
370
+ if (options.buttons && options.buttons.length > 0 && JSON.stringify(options.buttons) !== '["OK"]') {
371
+ config.buttons = options.buttons;
372
+ }
373
+ if (options.allowInput)
374
+ config.allowInput = options.allowInput;
375
+ if (options.defaultValue)
376
+ config.defaultValue = options.defaultValue;
377
+ if (options.inputPlaceholder)
378
+ config.inputPlaceholder = options.inputPlaceholder;
379
+ if (options.timeout)
380
+ config.timeout = options.timeout;
381
+ if (options.alwaysOnTop)
382
+ config.alwaysOnTop = options.alwaysOnTop;
383
+ if (options.fullscreen)
384
+ config.fullscreen = options.fullscreen;
385
+ if (options.zoomPercent && options.zoomPercent !== 100)
386
+ config.zoomPercent = options.zoomPercent;
387
+ if (options.icon)
388
+ config.icon = options.icon;
389
+ if (options.dev)
390
+ config.dev = options.dev;
391
+ if (options.debug)
392
+ config.debug = options.debug;
393
+ // Build JSON content - only include non-empty sections
394
+ const sections = [];
395
+ // Title (always include if set)
396
+ if (config.title) {
397
+ sections.push(` // Window title\n "title": ${JSON.stringify(config.title)}`);
398
+ }
399
+ // Message
400
+ if (config.message) {
401
+ sections.push(` // Message content (plain text)\n "message": ${JSON.stringify(config.message)}`);
402
+ }
403
+ // HTML
404
+ if (config.html) {
405
+ sections.push(` // HTML content (overrides message)\n "html": ${JSON.stringify(config.html)}`);
406
+ }
407
+ // URL
408
+ if (config.url) {
409
+ sections.push(` // URL to load (overrides message and html)\n "url": ${JSON.stringify(config.url)}`);
410
+ }
411
+ // Size
412
+ if (config.size) {
413
+ sections.push(` // Window size\n "size": {\n "width": ${config.size.width},\n "height": ${config.size.height}\n }`);
414
+ }
415
+ // Position
416
+ if (config.pos) {
417
+ const screenPart = config.pos.screen !== undefined ? `,\n "screen": ${config.pos.screen}` : '';
418
+ sections.push(` // Window position\n "pos": {\n "x": ${config.pos.x},\n "y": ${config.pos.y}${screenPart}\n }`);
419
+ }
420
+ // Buttons
421
+ if (config.buttons) {
422
+ sections.push(` // Button labels\n "buttons": ${JSON.stringify(config.buttons)}`);
423
+ }
424
+ // Input options
425
+ if (config.allowInput || config.defaultValue || config.inputPlaceholder) {
426
+ const inputParts = [];
427
+ if (config.allowInput)
428
+ inputParts.push(` "allowInput": true`);
429
+ if (config.defaultValue)
430
+ inputParts.push(` "defaultValue": ${JSON.stringify(config.defaultValue)}`);
431
+ if (config.inputPlaceholder)
432
+ inputParts.push(` "inputPlaceholder": ${JSON.stringify(config.inputPlaceholder)}`);
433
+ if (inputParts.length > 0) {
434
+ sections.push(` // Input field options\n${inputParts.join(',\n')}`);
435
+ }
436
+ }
437
+ // Window behavior
438
+ const behaviorParts = [];
439
+ if (config.alwaysOnTop)
440
+ behaviorParts.push(` "alwaysOnTop": true`);
441
+ if (config.fullscreen)
442
+ behaviorParts.push(` "fullscreen": true`);
443
+ if (config.timeout)
444
+ behaviorParts.push(` "timeout": ${config.timeout}`);
445
+ if (config.zoomPercent)
446
+ behaviorParts.push(` "zoomPercent": ${config.zoomPercent}`);
447
+ if (config.icon)
448
+ behaviorParts.push(` "icon": ${JSON.stringify(config.icon)}`);
449
+ if (behaviorParts.length > 0) {
450
+ sections.push(` // Window behavior\n${behaviorParts.join(',\n')}`);
451
+ }
452
+ // Development options
453
+ const devParts = [];
454
+ if (config.dev)
455
+ devParts.push(` "dev": true`);
456
+ if (config.debug)
457
+ devParts.push(` "debug": true`);
458
+ if (devParts.length > 0) {
459
+ sections.push(` // Development options\n${devParts.join(',\n')}`);
460
+ }
461
+ const jsonContent = `{\n${sections.join(',\n\n')}\n}\n`;
462
+ fs.writeFileSync(absolutePath, jsonContent, 'utf-8');
312
463
  }
313
464
  export function showHelp() {
314
465
  console.log(HELP_TEXT);
package/clihandler.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"clihandler.js","sourceRoot":"","sources":["clihandler.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"clihandler.js","sourceRoot":"","sources":["clihandler.ts"],"names":[],"mappings":"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"}
package/clihandler.ts CHANGED
@@ -3,6 +3,7 @@ import packageJson from './package.json' with { type: 'json' };
3
3
  import fs from 'fs';
4
4
  import path from 'path';
5
5
  import { execSync } from 'child_process';
6
+ import JSON5 from 'json5';
6
7
 
7
8
  interface CliOptions {
8
9
  message?: string;
@@ -29,6 +30,8 @@ interface CliOptions {
29
30
  dev?: boolean;
30
31
  help?: boolean;
31
32
  version?: boolean;
33
+ load?: string;
34
+ save?: string;
32
35
  }
33
36
 
34
37
  const HELP_TEXT = `
@@ -60,6 +63,8 @@ Options:
60
63
  -detach Leave window open after app exits (parent process returns immediately)
61
64
  -fullscreen Start window in fullscreen mode (F11 to toggle, Escape to exit)
62
65
  -ontop Keep window always on top of other windows
66
+ -load <file> Load options from JSON file (supports comments)
67
+ -save <file> Save current options to JSON file
63
68
  -dev Open DevTools (F12) automatically on startup (for debugging)
64
69
  -debug Return debug info (HTML, size) in result
65
70
  -v, -version, --version Show version number
@@ -95,7 +100,13 @@ Security Note:
95
100
  /**
96
101
  * Parse command line arguments into message box options
97
102
  */
98
- export function parseCliArgs(args: string[]): { options: MessageBoxOptions; showHelp: boolean; showVersion: boolean } {
103
+ export function parseCliArgs(args: string[]): {
104
+ options: MessageBoxOptions;
105
+ showHelp: boolean;
106
+ showVersion: boolean;
107
+ loadFile?: string;
108
+ saveFile?: string;
109
+ } {
99
110
  const cli: CliOptions = {
100
111
  buttons: [],
101
112
  input: false,
@@ -196,6 +207,12 @@ export function parseCliArgs(args: string[]): { options: MessageBoxOptions; show
196
207
  } else if (arg === '-debug' || arg === '--debug') {
197
208
  cli.debug = true;
198
209
  i++;
210
+ } else if (arg === '-load' || arg === '--load') {
211
+ cli.load = args[++i];
212
+ i++;
213
+ } else if (arg === '-save' || arg === '--save') {
214
+ cli.save = args[++i];
215
+ i++;
199
216
  } else if (!arg.startsWith('-')) {
200
217
  // Non-option argument - part of the message
201
218
  messageWords.push(arg);
@@ -313,7 +330,140 @@ export function parseCliArgs(args: string[]): { options: MessageBoxOptions; show
313
330
  }
314
331
  }
315
332
 
316
- return { options, showHelp: cli.help || false, showVersion: cli.version || false };
333
+ return {
334
+ options,
335
+ showHelp: cli.help || false,
336
+ showVersion: cli.version || false,
337
+ loadFile: cli.load,
338
+ saveFile: cli.save
339
+ };
340
+ }
341
+
342
+ /**
343
+ * Load configuration from JSON file (supports JSON with comments)
344
+ */
345
+ export function loadConfigFile(filePath: string): Partial<MessageBoxOptions> {
346
+ const absolutePath = path.resolve(filePath);
347
+
348
+ if (!fs.existsSync(absolutePath)) {
349
+ throw new Error(`Config file not found: ${absolutePath}`);
350
+ }
351
+
352
+ const fileContent = fs.readFileSync(absolutePath, 'utf-8');
353
+
354
+ try {
355
+ // Use JSON5 to parse (supports comments and trailing commas)
356
+ const config = JSON5.parse(fileContent);
357
+ return config;
358
+ } catch (error: any) {
359
+ throw new Error(`Failed to parse config file ${filePath}: ${error.message}`);
360
+ }
361
+ }
362
+
363
+ /**
364
+ * Save configuration to JSON file with helpful comments
365
+ * Only saves non-default values to keep the file minimal
366
+ */
367
+ export function saveConfigFile(filePath: string, options: MessageBoxOptions): void {
368
+ const absolutePath = path.resolve(filePath);
369
+
370
+ // Create a clean object without undefined values or defaults
371
+ const config: any = {};
372
+
373
+ if (options.title && options.title !== 'Message') config.title = options.title;
374
+ if (options.message) config.message = options.message;
375
+ if (options.html) config.html = options.html;
376
+ if (options.url) config.url = options.url;
377
+ // Only save size if explicitly set
378
+ if (options.size) config.size = options.size;
379
+ if (options.pos) config.pos = options.pos;
380
+ // Only save buttons if not the default ['OK']
381
+ if (options.buttons && options.buttons.length > 0 && JSON.stringify(options.buttons) !== '["OK"]') {
382
+ config.buttons = options.buttons;
383
+ }
384
+ if (options.allowInput) config.allowInput = options.allowInput;
385
+ if (options.defaultValue) config.defaultValue = options.defaultValue;
386
+ if (options.inputPlaceholder) config.inputPlaceholder = options.inputPlaceholder;
387
+ if (options.timeout) config.timeout = options.timeout;
388
+ if (options.alwaysOnTop) config.alwaysOnTop = options.alwaysOnTop;
389
+ if (options.fullscreen) config.fullscreen = options.fullscreen;
390
+ if (options.zoomPercent && options.zoomPercent !== 100) config.zoomPercent = options.zoomPercent;
391
+ if (options.icon) config.icon = options.icon;
392
+ if (options.dev) config.dev = options.dev;
393
+ if (options.debug) config.debug = options.debug;
394
+
395
+ // Build JSON content - only include non-empty sections
396
+ const sections: string[] = [];
397
+
398
+ // Title (always include if set)
399
+ if (config.title) {
400
+ sections.push(` // Window title\n "title": ${JSON.stringify(config.title)}`);
401
+ }
402
+
403
+ // Message
404
+ if (config.message) {
405
+ sections.push(` // Message content (plain text)\n "message": ${JSON.stringify(config.message)}`);
406
+ }
407
+
408
+ // HTML
409
+ if (config.html) {
410
+ sections.push(` // HTML content (overrides message)\n "html": ${JSON.stringify(config.html)}`);
411
+ }
412
+
413
+ // URL
414
+ if (config.url) {
415
+ sections.push(` // URL to load (overrides message and html)\n "url": ${JSON.stringify(config.url)}`);
416
+ }
417
+
418
+ // Size
419
+ if (config.size) {
420
+ sections.push(` // Window size\n "size": {\n "width": ${config.size.width},\n "height": ${config.size.height}\n }`);
421
+ }
422
+
423
+ // Position
424
+ if (config.pos) {
425
+ const screenPart = config.pos.screen !== undefined ? `,\n "screen": ${config.pos.screen}` : '';
426
+ sections.push(` // Window position\n "pos": {\n "x": ${config.pos.x},\n "y": ${config.pos.y}${screenPart}\n }`);
427
+ }
428
+
429
+ // Buttons
430
+ if (config.buttons) {
431
+ sections.push(` // Button labels\n "buttons": ${JSON.stringify(config.buttons)}`);
432
+ }
433
+
434
+ // Input options
435
+ if (config.allowInput || config.defaultValue || config.inputPlaceholder) {
436
+ const inputParts: string[] = [];
437
+ if (config.allowInput) inputParts.push(` "allowInput": true`);
438
+ if (config.defaultValue) inputParts.push(` "defaultValue": ${JSON.stringify(config.defaultValue)}`);
439
+ if (config.inputPlaceholder) inputParts.push(` "inputPlaceholder": ${JSON.stringify(config.inputPlaceholder)}`);
440
+ if (inputParts.length > 0) {
441
+ sections.push(` // Input field options\n${inputParts.join(',\n')}`);
442
+ }
443
+ }
444
+
445
+ // Window behavior
446
+ const behaviorParts: string[] = [];
447
+ if (config.alwaysOnTop) behaviorParts.push(` "alwaysOnTop": true`);
448
+ if (config.fullscreen) behaviorParts.push(` "fullscreen": true`);
449
+ if (config.timeout) behaviorParts.push(` "timeout": ${config.timeout}`);
450
+ if (config.zoomPercent) behaviorParts.push(` "zoomPercent": ${config.zoomPercent}`);
451
+ if (config.icon) behaviorParts.push(` "icon": ${JSON.stringify(config.icon)}`);
452
+ if (behaviorParts.length > 0) {
453
+ sections.push(` // Window behavior\n${behaviorParts.join(',\n')}`);
454
+ }
455
+
456
+ // Development options
457
+ const devParts: string[] = [];
458
+ if (config.dev) devParts.push(` "dev": true`);
459
+ if (config.debug) devParts.push(` "debug": true`);
460
+ if (devParts.length > 0) {
461
+ sections.push(` // Development options\n${devParts.join(',\n')}`);
462
+ }
463
+
464
+ const jsonContent = `{\n${sections.join(',\n\n')}\n}\n`;
465
+
466
+ fs.writeFileSync(absolutePath, jsonContent, 'utf-8');
317
467
  }
318
468
 
319
469
  export function showHelp(): void {
@@ -9,7 +9,6 @@ tao = "0.30"
9
9
  serde = { version = "1.0", features = ["derive"] }
10
10
  serde_json = "1.0"
11
11
  image = "0.24"
12
- clap = { version = "4.5", features = ["derive"] }
13
12
 
14
13
  [target.'cfg(windows)'.dependencies]
15
14
  windows = { version = "0.58", features = ["Win32_UI_WindowsAndMessaging", "Win32_Foundation", "Win32_UI_Shell"] }
Binary file
@@ -1,6 +1,5 @@
1
1
  use serde::{Deserialize, Serialize};
2
2
  use std::io::{self, Read};
3
- use std::fs;
4
3
  use tao::{
5
4
  event::{Event, WindowEvent, ElementState, KeyEvent},
6
5
  event_loop::{ControlFlow, EventLoop},
@@ -9,7 +8,6 @@ use tao::{
9
8
  platform::windows::WindowExtWindows,
10
9
  };
11
10
  use wry::{WebViewBuilder, WebContext};
12
- use clap::Parser;
13
11
 
14
12
  #[cfg(windows)]
15
13
  use windows::Win32::UI::WindowsAndMessaging::{
@@ -58,104 +56,6 @@ unsafe extern "system" fn subclass_proc(
58
56
  // JavaScript API to inject into webviews
59
57
  const MSGER_JS_API: &str = include_str!("msger-api.js");
60
58
 
61
- /// Message box application with webview support
62
- #[derive(Parser, Debug)]
63
- #[command(name = "msgernative")]
64
- #[command(about = "Display message boxes with HTML/URL content", long_about = None)]
65
- struct Cli {
66
- /// JSON file to load default options from
67
- #[arg(short, long, value_name = "FILE")]
68
- json: Option<String>,
69
-
70
- /// Window title
71
- #[arg(long)]
72
- title: Option<String>,
73
-
74
- /// Plain text message to display
75
- #[arg(long)]
76
- message: Option<String>,
77
-
78
- /// HTML content to display
79
- #[arg(long)]
80
- html: Option<String>,
81
-
82
- /// URL to load
83
- #[arg(long)]
84
- url: Option<String>,
85
-
86
- /// Window width
87
- #[arg(long)]
88
- width: Option<i32>,
89
-
90
- /// Window height
91
- #[arg(long)]
92
- height: Option<i32>,
93
-
94
- /// Window X position
95
- #[arg(long)]
96
- x: Option<i32>,
97
-
98
- /// Window Y position
99
- #[arg(long)]
100
- y: Option<i32>,
101
-
102
- /// Screen number (for multi-monitor setups)
103
- #[arg(long)]
104
- screen: Option<i32>,
105
-
106
- /// Button labels (comma-separated)
107
- #[arg(long, value_delimiter = ',')]
108
- buttons: Option<Vec<String>>,
109
-
110
- /// Default input value
111
- #[arg(long)]
112
- default_value: Option<String>,
113
-
114
- /// Input placeholder text
115
- #[arg(long)]
116
- input_placeholder: Option<String>,
117
-
118
- /// Allow text input
119
- #[arg(long)]
120
- allow_input: bool,
121
-
122
- /// Timeout in seconds
123
- #[arg(long)]
124
- timeout: Option<u64>,
125
-
126
- /// Auto-size window to content
127
- #[arg(long)]
128
- auto_size: bool,
129
-
130
- /// Keep window always on top
131
- #[arg(long)]
132
- always_on_top: bool,
133
-
134
- /// Start in fullscreen mode
135
- #[arg(long)]
136
- fullscreen: bool,
137
-
138
- /// Zoom percentage
139
- #[arg(long)]
140
- zoom_percent: Option<f64>,
141
-
142
- /// Enable debug mode
143
- #[arg(long)]
144
- debug: bool,
145
-
146
- /// Path to window icon
147
- #[arg(long)]
148
- icon: Option<String>,
149
-
150
- /// Enable developer mode
151
- #[arg(long)]
152
- dev: bool,
153
-
154
- /// Positional argument (if ends with .json, treated as JSON file)
155
- #[arg(value_name = "FILE_OR_JSON")]
156
- file: Option<String>,
157
- }
158
-
159
59
  #[derive(Deserialize, Debug)]
160
60
  #[serde(rename_all = "camelCase")]
161
61
  struct Position {
@@ -352,145 +252,17 @@ fn escape_html(s: &str) -> String {
352
252
  .replace('\'', "&#39;")
353
253
  }
354
254
 
355
- fn load_options_from_json(json_str: &str) -> Result<MessageBoxOptions, serde_json::Error> {
356
- serde_json::from_str(json_str)
357
- }
358
-
359
- fn merge_cli_with_options(cli: &Cli, mut options: MessageBoxOptions) -> MessageBoxOptions {
360
- // Override with CLI arguments if provided
361
- if let Some(ref title) = cli.title {
362
- options.title = title.clone();
363
- }
364
- if let Some(ref message) = cli.message {
365
- options.message = Some(message.clone());
366
- }
367
- if let Some(ref html) = cli.html {
368
- options.html = Some(html.clone());
369
- }
370
- if let Some(ref url) = cli.url {
371
- options.url = Some(url.clone());
372
- }
373
-
374
- // Handle size - if CLI provides width or height, update both old fields and size object
375
- if cli.width.is_some() || cli.height.is_some() {
376
- let existing_size = options.size.take().unwrap_or(Size {
377
- width: options.width,
378
- height: options.height,
379
- });
380
- let new_size = Size {
381
- width: cli.width.unwrap_or(existing_size.width),
382
- height: cli.height.unwrap_or(existing_size.height),
383
- };
384
- // Update both for backward compatibility
385
- options.width = new_size.width;
386
- options.height = new_size.height;
387
- options.size = Some(new_size);
388
- }
389
-
390
- // Handle position
391
- if cli.x.is_some() || cli.y.is_some() || cli.screen.is_some() {
392
- let existing_pos = options.pos.take().unwrap_or(Position {
393
- x: 0,
394
- y: 0,
395
- screen: None,
396
- });
397
- options.pos = Some(Position {
398
- x: cli.x.unwrap_or(existing_pos.x),
399
- y: cli.y.unwrap_or(existing_pos.y),
400
- screen: cli.screen.or(existing_pos.screen),
401
- });
402
- }
403
-
404
- if let Some(ref buttons) = cli.buttons {
405
- options.buttons = buttons.clone();
406
- }
407
- if let Some(ref default_value) = cli.default_value {
408
- options.default_value = Some(default_value.clone());
409
- }
410
- if let Some(ref input_placeholder) = cli.input_placeholder {
411
- options.input_placeholder = Some(input_placeholder.clone());
412
- }
413
- if cli.allow_input {
414
- options.allow_input = true;
415
- }
416
- if let Some(timeout) = cli.timeout {
417
- options.timeout = Some(timeout);
418
- }
419
- if cli.auto_size {
420
- options.auto_size = true;
421
- }
422
- if cli.always_on_top {
423
- options.always_on_top = true;
424
- }
425
- if cli.fullscreen {
426
- options.fullscreen = true;
427
- }
428
- if let Some(zoom_percent) = cli.zoom_percent {
429
- options.zoom_percent = Some(zoom_percent);
430
- }
431
- if cli.debug {
432
- options.debug = true;
433
- }
434
- if let Some(ref icon) = cli.icon {
435
- options.icon = Some(icon.clone());
436
- }
437
- if cli.dev {
438
- options.dev = true;
439
- }
440
-
441
- options
442
- }
443
255
 
444
256
  fn main() {
445
- // Parse command-line arguments
446
- let cli = Cli::parse();
447
-
448
- // Determine JSON source and load options
449
- let options = if let Some(ref json_file) = cli.json {
450
- // Explicit -json flag
451
- let json_str = fs::read_to_string(json_file)
452
- .unwrap_or_else(|e| panic!("Failed to read JSON file '{}': {}", json_file, e));
453
- let base_options = load_options_from_json(&json_str)
454
- .expect("Failed to parse JSON input");
455
- merge_cli_with_options(&cli, base_options)
456
- } else if let Some(ref file) = cli.file {
457
- // First positional argument - check if it's a .json file
458
- if file.ends_with(".json") {
459
- let json_str = fs::read_to_string(file)
460
- .unwrap_or_else(|e| panic!("Failed to read JSON file '{}': {}", file, e));
461
- let base_options = load_options_from_json(&json_str)
462
- .expect("Failed to parse JSON input");
463
- merge_cli_with_options(&cli, base_options)
464
- } else {
465
- // Not a JSON file, read from stdin
466
- let mut input = String::new();
467
- io::stdin()
468
- .read_to_string(&mut input)
469
- .expect("Failed to read stdin");
470
- let base_options = load_options_from_json(&input)
471
- .expect("Failed to parse JSON input");
472
- merge_cli_with_options(&cli, base_options)
473
- }
474
- } else {
475
- // Check if stdin has data (piped input)
476
- use std::io::IsTerminal;
477
- if !io::stdin().is_terminal() {
478
- // Data piped via stdin
479
- let mut input = String::new();
480
- io::stdin()
481
- .read_to_string(&mut input)
482
- .expect("Failed to read stdin");
483
- let base_options = load_options_from_json(&input)
484
- .expect("Failed to parse JSON input");
485
- merge_cli_with_options(&cli, base_options)
486
- } else {
487
- // No JSON file, no stdin - create default options and apply CLI args
488
- let default_json = "{}";
489
- let base_options = load_options_from_json(default_json)
490
- .expect("Failed to create default options");
491
- merge_cli_with_options(&cli, base_options)
492
- }
493
- };
257
+ // Read JSON from stdin
258
+ let mut input = String::new();
259
+ io::stdin()
260
+ .read_to_string(&mut input)
261
+ .expect("Failed to read stdin");
262
+
263
+ // Parse JSON into options
264
+ let options: MessageBoxOptions = serde_json::from_str(&input)
265
+ .expect("Failed to parse JSON input");
494
266
 
495
267
  // Create event loop and window
496
268
  let event_loop = EventLoop::new();
@@ -505,10 +277,26 @@ fn main() {
505
277
  // On Windows, get the actual monitor position if screen number provided
506
278
  #[cfg(target_os = "windows")]
507
279
  if let Some(screen_num) = pos.screen {
508
- // Get all monitors
509
- let monitors: Vec<_> = event_loop.available_monitors().collect();
280
+ // Get all monitors and sort them by physical layout
281
+ // (bottom row first, then left to right)
282
+ let mut monitors: Vec<_> = event_loop.available_monitors().collect();
283
+
284
+ // Sort by Top (descending - bottom first), then by Left (ascending - left to right)
285
+ monitors.sort_by(|a, b| {
286
+ let a_pos = a.position();
287
+ let b_pos = b.position();
288
+
289
+ // Compare Y positions (descending - higher Y = lower on screen = bottom row)
290
+ match b_pos.y.cmp(&a_pos.y) {
291
+ std::cmp::Ordering::Equal => {
292
+ // Same row: sort by X position (ascending - left to right)
293
+ a_pos.x.cmp(&b_pos.x)
294
+ }
295
+ other => other,
296
+ }
297
+ });
510
298
 
511
- // Get the specific monitor by index
299
+ // Get the specific monitor by index from sorted list
512
300
  if let Some(monitor) = monitors.get(screen_num as usize) {
513
301
  // Get the monitor's actual position from the OS
514
302
  let monitor_pos = monitor.position();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bobfrankston/msger",
3
- "version": "0.1.82",
3
+ "version": "0.1.83",
4
4
  "description": "Fast, lightweight, cross-platform message box - Rust-powered alternative to msgview",
5
5
  "type": "module",
6
6
  "main": "./index.js",
@@ -56,6 +56,7 @@
56
56
  "@types/node": "^24.9.1"
57
57
  },
58
58
  "dependencies": {
59
- "ansi-to-html": "^0.7.2"
59
+ "ansi-to-html": "^0.7.2",
60
+ "json5": "^2.2.3"
60
61
  }
61
62
  }