@mostajs/orm-cli 0.5.2 → 0.5.3

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.
Files changed (2) hide show
  1. package/bin/mostajs.sh +107 -0
  2. package/package.json +1 -1
package/bin/mostajs.sh CHANGED
@@ -1799,6 +1799,7 @@ menu_replicator() {
1799
1799
  echo -e " ${CYAN}8${RESET}) Run a CDC sync + show stats"
1800
1800
  echo -e " ${CYAN}9${RESET}) Remove a CDC rule"
1801
1801
  echo -e " ${CYAN}m${RESET}) ${BOLD}Open monitor${RESET} (live dashboard — localhost:14499)"
1802
+ echo -e " ${CYAN}s${RESET}) ${BOLD}Scaffold services${RESET} — services/replicator.mjs + services/monitor.mjs + package.json scripts"
1802
1803
  echo -e " ${CYAN}v${RESET}) View the raw tree file"
1803
1804
  echo -e " ${CYAN}c${RESET}) Clear (delete the tree file — DESTRUCTIVE)"
1804
1805
  echo
@@ -1817,6 +1818,7 @@ menu_replicator() {
1817
1818
  8) action_rep_sync ;;
1818
1819
  9) action_rep_remove_rule ;;
1819
1820
  m|M) action_rep_open_monitor ;;
1821
+ s|S) action_rep_scaffold_services ;;
1820
1822
  v|V) action_rep_view_tree ;;
1821
1823
  c|C) action_rep_clear ;;
1822
1824
  b|B) return ;;
@@ -1825,6 +1827,111 @@ menu_replicator() {
1825
1827
  menu_replicator
1826
1828
  }
1827
1829
 
1830
+ # ------------------------------------------------------------
1831
+ # Scaffold background services (replicator + monitor) + package.json patch
1832
+ # ------------------------------------------------------------
1833
+ action_rep_scaffold_services() {
1834
+ header
1835
+ echo -e "${BOLD}${MAGENTA}▶ Scaffold background services${RESET}"
1836
+ echo
1837
+ echo -e " This will :"
1838
+ echo -e " 1. ${CYAN}services/replicator.mjs${RESET} (from @mostajs/replicator)"
1839
+ echo -e " 2. ${CYAN}services/monitor.mjs${RESET} (from @mostajs/replica-monitor)"
1840
+ echo -e " 3. patch ${CYAN}package.json${RESET} : scripts.replicator / monitor / dev:all"
1841
+ echo -e " 4. install ${CYAN}concurrently${RESET} if missing"
1842
+ echo
1843
+ if ! confirm "Proceed?"; then return; fi
1844
+
1845
+ # Ensure the scaffolders' packages are installed locally
1846
+ ensure_pkg "@mostajs/replicator" "@mostajs/replica-monitor" || { pause; return; }
1847
+
1848
+ local force_arg=""
1849
+ if confirm "Overwrite existing services/*.mjs if present?"; then force_arg="--force"; fi
1850
+
1851
+ # Call each scaffolder (uses the lib's own emit logic — single source of truth)
1852
+ echo
1853
+ echo -e "${CYAN}▶ scaffoldReplicatorService${RESET}"
1854
+ node --input-type=module -e "
1855
+ const { scaffoldReplicatorService } = await import('${PROJECT_ROOT}/node_modules/@mostajs/replicator/dist/scaffold.js');
1856
+ const r = scaffoldReplicatorService({ projectDir: '${PROJECT_ROOT}', force: ${force_arg:+true}${force_arg:-false} });
1857
+ console.log(' ' + (r.wrote ? '✓' : '•') + ' ' + r.action + ' : ' + r.path);
1858
+ " 2>&1 | sed 's/^/ /'
1859
+
1860
+ echo
1861
+ echo -e "${CYAN}▶ scaffoldMonitorService${RESET}"
1862
+ node --input-type=module -e "
1863
+ const { scaffoldMonitorService } = await import('${PROJECT_ROOT}/node_modules/@mostajs/replica-monitor/dist/scaffold.js');
1864
+ const r = scaffoldMonitorService({ projectDir: '${PROJECT_ROOT}', force: ${force_arg:+true}${force_arg:-false} });
1865
+ console.log(' ' + (r.wrote ? '✓' : '•') + ' ' + r.action + ' : ' + r.path);
1866
+ " 2>&1 | sed 's/^/ /'
1867
+
1868
+ # Patch package.json scripts
1869
+ echo
1870
+ echo -e "${CYAN}▶ patching package.json scripts${RESET}"
1871
+ if [[ ! -f "$PROJECT_ROOT/package.json" ]]; then
1872
+ warn " no package.json found — skipping scripts patch"
1873
+ else
1874
+ PROJECT="$PROJECT_ROOT" node --input-type=module -e "
1875
+ const fs = await import('node:fs');
1876
+ const path = process.env.PROJECT + '/package.json';
1877
+ const pkg = JSON.parse(fs.readFileSync(path, 'utf8'));
1878
+ pkg.scripts = pkg.scripts || {};
1879
+ const add = (key, val) => {
1880
+ if (pkg.scripts[key]) {
1881
+ console.log(' • ' + key + ' already set (kept as-is)');
1882
+ } else {
1883
+ pkg.scripts[key] = val;
1884
+ console.log(' ✓ added ' + key);
1885
+ }
1886
+ };
1887
+ add('replicator', 'node services/replicator.mjs');
1888
+ add('monitor', 'node services/monitor.mjs');
1889
+ add('dev:all', 'concurrently --kill-others-on-fail --names next,rep,mon -c blue,magenta,cyan \"npm:dev\" \"npm:replicator\" \"npm:monitor\"');
1890
+ fs.writeFileSync(path, JSON.stringify(pkg, null, 2) + '\n');
1891
+ " 2>&1 | sed 's/^/ /'
1892
+ fi
1893
+
1894
+ # Ensure concurrently is installed (devDependency)
1895
+ echo
1896
+ echo -e "${CYAN}▶ checking concurrently${RESET}"
1897
+ if [[ -d "$PROJECT_ROOT/node_modules/concurrently" ]]; then
1898
+ ok " concurrently already installed"
1899
+ else
1900
+ if confirm "Install concurrently as a devDependency?"; then
1901
+ cd "$PROJECT_ROOT" || return 1
1902
+ local log_file="/tmp/mostajs-concurrently-$$.log"
1903
+ case "$PKG_MANAGER" in
1904
+ pnpm) pnpm add -D concurrently > "$log_file" 2>&1 & ;;
1905
+ yarn) yarn add -D concurrently > "$log_file" 2>&1 & ;;
1906
+ bun) bun add -d concurrently > "$log_file" 2>&1 & ;;
1907
+ *) npm install --save-dev concurrently --legacy-peer-deps > "$log_file" 2>&1 & ;;
1908
+ esac
1909
+ local pid=$! frames='⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏' tick=0
1910
+ while kill -0 "$pid" 2>/dev/null; do
1911
+ local f="${frames:$((tick % 10)):1}"
1912
+ printf "\r ${YELLOW}%s${RESET} installing concurrently ${DIM}(%ds)${RESET} " "$f" "$((tick / 5))"
1913
+ tick=$((tick + 1)); sleep 0.2
1914
+ done
1915
+ wait "$pid"; local rc=$?
1916
+ printf "\r%60s\r" ""
1917
+ if [[ $rc -eq 0 ]]; then ok " concurrently installed"
1918
+ else err " install failed (see $log_file)"; tail -3 "$log_file"
1919
+ fi
1920
+ rm -f "$log_file"
1921
+ fi
1922
+ fi
1923
+
1924
+ echo
1925
+ echo -e "${BOLD}${GREEN}✓ Scaffold complete.${RESET}"
1926
+ echo
1927
+ echo -e " ${BOLD}Next steps :${RESET}"
1928
+ echo -e " 1. ${CYAN}mostajs${RESET} → menu r → add replicas + CDC rules (writes replicator-tree.json)"
1929
+ echo -e " 2. ${CYAN}npm run dev:all${RESET} — starts Next + replicator + monitor in parallel"
1930
+ echo -e " or individually : ${CYAN}npm run replicator${RESET} / ${CYAN}npm run monitor${RESET}"
1931
+ echo -e " 3. Open ${CYAN}http://localhost:14499${RESET} for the live dashboard"
1932
+ pause
1933
+ }
1934
+
1828
1935
  action_rep_add_replica() {
1829
1936
  local project name role dialect uri lag
1830
1937
  project=$(ask "Project name" "default")
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mostajs/orm-cli",
3
- "version": "0.5.2",
3
+ "version": "0.5.3",
4
4
  "description": "Universal CLI to integrate @mostajs/orm into any project — one-shot `mostajs bootstrap` migrates a Prisma project (codemod + deps + schema convert + DDL) to 13 databases with zero code change.",
5
5
  "author": "Dr Hamid MADANI <drmdh@msn.com>",
6
6
  "license": "AGPL-3.0-or-later",