reddb-cli 0.1.2-next.30 → 0.1.2-next.31

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
@@ -69,24 +69,18 @@ Release page:
69
69
 
70
70
  ### npx
71
71
 
72
- `reddb` is also published as an npm wrapper that resolves and runs the real `red` binary for you.
72
+ `reddb-cli` is also published as an npm package that installs and runs the real `red` binary for you.
73
73
 
74
- Install the managed binary:
74
+ Run RedDB through `npx`:
75
75
 
76
76
  ```bash
77
- npx reddb --install
77
+ npx reddb-cli@latest version
78
78
  ```
79
79
 
80
- Run RedDB through `npx` with auto-download when needed:
80
+ Start an HTTP server through `npx`:
81
81
 
82
82
  ```bash
83
- npx reddb --auto-download -- server --http --path ./data/reddb.rdb --bind 127.0.0.1:8080
84
- ```
85
-
86
- Wrapper help:
87
-
88
- ```bash
89
- npx reddb --sdk-help
83
+ npx reddb-cli@latest server --http --path ./data/reddb.rdb --bind 127.0.0.1:8080
90
84
  ```
91
85
 
92
86
  ### Build from source
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "reddb-cli",
3
- "version": "0.1.2-next.30",
3
+ "version": "0.1.2-next.31",
4
4
  "description": "JavaScript/TypeScript SDK for RedDB - unified multi-model database",
5
5
  "type": "commonjs",
6
6
  "main": "./sdk/red-sdk.js",
package/sdk/index.d.ts CHANGED
@@ -135,8 +135,6 @@ export interface InternalNamespace {
135
135
  ensureObject: (...args: unknown[]) => unknown;
136
136
  execFilePromise: (...args: unknown[]) => unknown;
137
137
  exists: (...args: unknown[]) => unknown;
138
- formatWrapperBinaryStatus: (...args: unknown[]) => unknown;
139
- formatWrapperHelp: (...args: unknown[]) => unknown;
140
138
  getBinaryInfo: (...args: unknown[]) => unknown;
141
139
  getDefaultBinaryName: (...args: unknown[]) => unknown;
142
140
  getInstalledVersion: (...args: unknown[]) => unknown;
@@ -146,7 +144,6 @@ export interface InternalNamespace {
146
144
  legacyInstallDir: (...args: unknown[]) => unknown;
147
145
  normalizeReleaseTag: (...args: unknown[]) => unknown;
148
146
  parseInstalledVersion: (...args: unknown[]) => unknown;
149
- parseWrapperArgs: (...args: unknown[]) => unknown;
150
147
  request: (...args: unknown[]) => unknown;
151
148
  requestJson: (...args: unknown[]) => unknown;
152
149
  requestText: (...args: unknown[]) => unknown;
@@ -157,11 +154,9 @@ export interface InternalNamespace {
157
154
  resolveManagedBinaryPath: (...args: unknown[]) => unknown;
158
155
  resolveManagedUpgradeDestination: (...args: unknown[]) => unknown;
159
156
  sha256File: (...args: unknown[]) => unknown;
160
- splitWrapperArgs: (...args: unknown[]) => unknown;
161
157
  spawnBinary: (...args: unknown[]) => unknown;
162
158
  upgradeBinary: (...args: unknown[]) => unknown;
163
159
  waitForChild: (...args: unknown[]) => unknown;
164
- writeLine: (...args: unknown[]) => unknown;
165
160
  verifyChecksum: (...args: unknown[]) => unknown;
166
161
  }
167
162
 
package/sdk/red-sdk.js CHANGED
@@ -11,27 +11,6 @@ const { execFile, spawn } = require('child_process');
11
11
 
12
12
  const SDK_VERSION = require(path.join(__dirname, '..', 'package.json')).version;
13
13
  const DEFAULT_REPO = 'forattini-dev/reddb';
14
- const WRAPPER_OPTION_TYPES = Object.freeze({
15
- 'asset-name': 'string',
16
- 'auto-download': 'boolean',
17
- 'binary-path': 'string',
18
- channel: 'string',
19
- 'check-update': 'boolean',
20
- download: 'boolean',
21
- force: 'boolean',
22
- 'github-token': 'string',
23
- install: 'boolean',
24
- 'no-verify': 'boolean',
25
- 'print-binary-path': 'boolean',
26
- 'release-version': 'string',
27
- repo: 'string',
28
- 'sdk-help': 'boolean',
29
- 'static-build': 'boolean',
30
- 'target-dir': 'string',
31
- upgrade: 'boolean',
32
- version: 'string',
33
- verify: 'boolean'
34
- });
35
14
 
36
15
  function getDefaultBinaryName(platform = process.platform) {
37
16
  return platform === 'win32' ? 'red.exe' : 'red';
@@ -537,193 +516,6 @@ function spawnBinary(binaryPath, args, options = {}) {
537
516
  });
538
517
  }
539
518
 
540
- function splitWrapperArgs(argv) {
541
- const rawArgs = Array.isArray(argv) ? argv.slice() : [];
542
- const wrapperArgs = [];
543
- let index = 0;
544
-
545
- while (index < rawArgs.length) {
546
- const token = rawArgs[index];
547
-
548
- if (token === '--') {
549
- return {
550
- wrapperArgs,
551
- passthroughArgs: rawArgs.slice(index + 1),
552
- usedDoubleDash: true
553
- };
554
- }
555
-
556
- if (!token || !token.startsWith('--')) {
557
- break;
558
- }
559
-
560
- const eqIndex = token.indexOf('=');
561
- const optionName = token.slice(2, eqIndex === -1 ? undefined : eqIndex);
562
- const optionType = WRAPPER_OPTION_TYPES[optionName];
563
-
564
- if (!optionType) {
565
- break;
566
- }
567
-
568
- if (optionType === 'string' && eqIndex === -1) {
569
- const nextToken = rawArgs[index + 1];
570
- if (optionName === 'version' && (!nextToken || String(nextToken).startsWith('-'))) {
571
- break;
572
- }
573
- if (nextToken === undefined) {
574
- wrapperArgs.push(token);
575
- index += 1;
576
- continue;
577
- }
578
- }
579
-
580
- wrapperArgs.push(token);
581
- index += 1;
582
-
583
- if (optionType === 'string' && eqIndex === -1 && index < rawArgs.length) {
584
- wrapperArgs.push(rawArgs[index]);
585
- index += 1;
586
- }
587
- }
588
-
589
- return {
590
- wrapperArgs,
591
- passthroughArgs: rawArgs.slice(index),
592
- usedDoubleDash: false
593
- };
594
- }
595
-
596
- async function parseWrapperArgs(argv, runtime = {}) {
597
- const split = splitWrapperArgs(argv);
598
-
599
- const options = {};
600
- const wrapperArgs = split.wrapperArgs;
601
-
602
- for (let i = 0; i < wrapperArgs.length; i++) {
603
- const token = wrapperArgs[i];
604
- if (!token.startsWith('--')) continue;
605
-
606
- const eqIndex = token.indexOf('=');
607
- const name = eqIndex !== -1 ? token.slice(2, eqIndex) : token.slice(2);
608
- const type = WRAPPER_OPTION_TYPES[name];
609
-
610
- if (!type) continue;
611
-
612
- if (type === 'boolean') {
613
- options[name] = true;
614
- } else if (eqIndex !== -1) {
615
- options[name] = token.slice(eqIndex + 1);
616
- } else if (i + 1 < wrapperArgs.length) {
617
- i++;
618
- options[name] = wrapperArgs[i];
619
- }
620
- }
621
-
622
- const releaseVersion = options['release-version'] || options['version'];
623
-
624
- return {
625
- passthroughArgs: split.passthroughArgs,
626
- rawArgs: Array.isArray(argv) ? argv.slice() : [],
627
- usedDoubleDash: split.usedDoubleDash,
628
- resolveOptions: {
629
- binaryPath: options['binary-path'],
630
- targetDir: options['target-dir'],
631
- autoDownload: options['auto-download'] || options['download'] || false,
632
- repo: options['repo'],
633
- channel: options['channel'],
634
- releaseVersion,
635
- assetName: options['asset-name'],
636
- githubToken: options['github-token'],
637
- verify: options['verify'] !== false && !options['no-verify'],
638
- staticBuild: options['static-build'] || false,
639
- force: options['force'] || false,
640
- version: releaseVersion
641
- },
642
- wrapperOptions: {
643
- sdkHelp: options['sdk-help'] || false,
644
- checkUpdate: options['check-update'] || false,
645
- upgrade: options['upgrade'] || false,
646
- install: options['install'] || false,
647
- printBinaryPath: options['print-binary-path'] || false
648
- }
649
- };
650
- }
651
-
652
- function writeLine(stream, message) {
653
- stream.write(`${message}\n`);
654
- }
655
-
656
- function formatWrapperBinaryStatus(result) {
657
- if (result && Object.prototype.hasOwnProperty.call(result, 'latestVersion')) {
658
- if (!result.currentVersion) {
659
- return `reddb is not installed; latest available is ${result.latestVersion}`;
660
- }
661
- if (result.hasUpdate) {
662
- return `reddb update available at ${result.binaryPath}: ${result.currentVersion} -> ${result.latestVersion}`;
663
- }
664
- return `reddb is up to date at ${result.binaryPath} (${result.currentVersion})`;
665
- }
666
-
667
- if (result && Object.prototype.hasOwnProperty.call(result, 'previousVersion')) {
668
- if (!result.changed) {
669
- return `reddb already at ${result.binaryPath} (${result.version || 'version unknown'})`;
670
- }
671
- if (result.previousVersion) {
672
- return `reddb upgraded at ${result.binaryPath}: ${result.previousVersion} -> ${result.version}`;
673
- }
674
- return `reddb installed at ${result.binaryPath} (${result.version || 'version unknown'})`;
675
- }
676
-
677
- if (result && result.binaryPath) {
678
- if (!result.changed) {
679
- return `reddb already installed at ${result.binaryPath}${result.version ? ` (${result.version})` : ''}`;
680
- }
681
- return `reddb installed at ${result.binaryPath}${result.version ? ` (${result.version})` : ''}`;
682
- }
683
-
684
- return 'reddb binary status unavailable';
685
- }
686
-
687
- function formatWrapperHelp() {
688
- const lines = [
689
- 'reddb SDK wrapper',
690
- '',
691
- 'Usage:',
692
- ' red [wrapper options] [reddb args]',
693
- ' npx reddb [reddb args]',
694
- ' pnpm dlx reddb -- [reddb args]',
695
- '',
696
- 'Wrapper options:',
697
- ' --binary-path <path> Use an explicit reddb binary',
698
- ' --target-dir <dir> Resolve or install the managed binary in this directory',
699
- ' --auto-download Download the binary if it is missing before command execution',
700
- ' --install Ensure the managed binary is installed',
701
- ' --upgrade Upgrade the managed binary to the requested release',
702
- ' --check-update Check the installed binary against the latest release',
703
- ' --print-binary-path Print the resolved binary path and exit',
704
- ' --channel <name> Release channel for downloads (stable, latest, next)',
705
- ' --release-version <tag> Pin a release version for install or upgrade',
706
- ' --version <tag> Alias for --release-version',
707
- ' --asset-name <name> Override the release asset name',
708
- ' --repo <owner/name> Override the GitHub repository',
709
- ' --github-token <token> GitHub token for release downloads',
710
- ' --static-build Prefer static Linux assets when available',
711
- ' --force Force a reinstall when used with --upgrade',
712
- ' --no-verify Skip SHA256 verification on download',
713
- ' --sdk-help Show this wrapper help',
714
- '',
715
- 'Notes:',
716
- ' Wrapper options must come before the reddb command.',
717
- ' Managed installs default to ~/.local/bin and still detect legacy ~/.reddb/bin installs.',
718
- ' When installed from pnpm/npm, the package postinstall step stores the managed binary',
719
- ' in package-local .reddb/bin and the wrapper can use it automatically.',
720
- ' Use "red --version" to query the real reddb binary version after installation.',
721
- ''
722
- ];
723
-
724
- return lines.join('\n');
725
- }
726
-
727
519
  function waitForChild(child) {
728
520
  return new Promise((resolve, reject) => {
729
521
  child.on('error', reject);
@@ -844,82 +636,21 @@ async function createClient(options = {}) {
844
636
  }
845
637
 
846
638
  async function runCli(argv = process.argv.slice(2), runtime = {}) {
847
- const stdout = runtime.stdout || process.stdout;
848
639
  const stderr = runtime.stderr || process.stderr;
849
640
 
850
641
  try {
851
- const parsed = await parseWrapperArgs(argv, runtime);
852
- const cliOptions = Object.assign({}, parsed.resolveOptions, {
642
+ const rawArgs = Array.isArray(argv) ? argv.slice() : [];
643
+ const cliOptions = {
853
644
  cwd: runtime.cwd || process.cwd(),
854
645
  env: Object.assign({}, process.env, runtime.env || {})
855
- });
856
-
857
- if (parsed.wrapperOptions.sdkHelp) {
858
- writeLine(stdout, formatWrapperHelp());
859
- return 0;
860
- }
861
-
862
- let resolvedInfo = null;
863
-
864
- if (parsed.wrapperOptions.checkUpdate) {
865
- const updateStatus = await checkForUpdates(cliOptions);
866
- const updateMessage = formatWrapperBinaryStatus(updateStatus);
867
-
868
- if (parsed.passthroughArgs.length === 0) {
869
- writeLine(stdout, updateMessage);
870
- return 0;
871
- }
872
-
873
- writeLine(stderr, updateMessage);
874
- }
875
-
876
- if (parsed.wrapperOptions.upgrade) {
877
- const upgradeResult = await upgradeBinary(cliOptions);
878
- resolvedInfo = {
879
- binaryPath: upgradeResult.binaryPath,
880
- source: upgradeResult.source
881
- };
882
-
883
- if (parsed.passthroughArgs.length === 0 && !parsed.wrapperOptions.printBinaryPath) {
884
- writeLine(stdout, formatWrapperBinaryStatus(upgradeResult));
885
- return 0;
886
- }
887
-
888
- writeLine(stderr, formatWrapperBinaryStatus(upgradeResult));
889
- } else if (parsed.wrapperOptions.install) {
890
- const installResult = await ensureInstalled(cliOptions);
891
- resolvedInfo = {
892
- binaryPath: installResult.binaryPath,
893
- source: installResult.source
894
- };
895
-
896
- if (parsed.passthroughArgs.length === 0 && !parsed.wrapperOptions.printBinaryPath) {
897
- writeLine(stdout, formatWrapperBinaryStatus(installResult));
898
- return 0;
899
- }
900
-
901
- writeLine(stderr, formatWrapperBinaryStatus(installResult));
902
- }
903
-
904
- if (!resolvedInfo) {
905
- resolvedInfo = await resolveBinaryWithInfo(cliOptions);
906
- }
907
-
908
- if (parsed.wrapperOptions.printBinaryPath) {
909
- if (parsed.passthroughArgs.length === 0) {
910
- writeLine(stdout, resolvedInfo.binaryPath);
911
- return 0;
912
- }
913
- writeLine(stderr, `reddb binary: ${resolvedInfo.binaryPath}`);
914
- }
915
-
916
- const binaryPath = resolvedInfo.binaryPath;
646
+ };
647
+ const binaryPath = await resolveBinary(cliOptions);
917
648
  const spawnOptions = {
918
649
  cwd: runtime.cwd || process.cwd(),
919
650
  env: Object.assign({}, process.env, runtime.env || {}),
920
651
  stdio: runtime.stdio || 'inherit'
921
652
  };
922
- const child = spawnBinary(binaryPath, parsed.passthroughArgs, spawnOptions);
653
+ const child = spawnBinary(binaryPath, rawArgs, spawnOptions);
923
654
 
924
655
  return waitForChild(child);
925
656
  } catch (error) {
@@ -955,8 +686,6 @@ module.exports._internal = {
955
686
  ensureObject,
956
687
  execFilePromise,
957
688
  exists,
958
- formatWrapperBinaryStatus,
959
- formatWrapperHelp,
960
689
  getBinaryInfo,
961
690
  getDefaultBinaryName,
962
691
  getInstalledVersion,
@@ -966,7 +695,6 @@ module.exports._internal = {
966
695
  legacyInstallDir,
967
696
  normalizeReleaseTag,
968
697
  parseInstalledVersion,
969
- parseWrapperArgs,
970
698
  request,
971
699
  requestJson,
972
700
  requestText,
@@ -977,11 +705,9 @@ module.exports._internal = {
977
705
  resolveManagedBinaryPath,
978
706
  resolveManagedUpgradeDestination,
979
707
  sha256File,
980
- splitWrapperArgs,
981
708
  spawnBinary,
982
709
  upgradeBinary,
983
710
  waitForChild,
984
- writeLine,
985
711
  verifyChecksum
986
712
  };
987
713