[ Web Proxy ]
URL:
Viewing: https://raw.githubusercontent.com/devforth/adminforth/main/adminforth/commands/cli.js [Back]  [Original]

#!/usr/bin/env node

const args = process.argv.slice(2);
const command = args[0];

import bundle from "./bundle.js";
import createApp from "./createApp/main.js";
import generateModels from "./generateModels.js";
import createPlugin from "./createPlugin/main.js";
import createComponent from "./createCustomComponent/main.js";
import createResource from "./createResource/main.js";
import chalk from "chalk";
import path from "path";
import fs from "fs";
import { fileURLToPath } from 'url';

function showHelp() {
  console.log(
    chalk.white("Available commands:\n") +
    chalk.green('  create-app') + chalk.white('         Create a new AdminForth app\n') +
    chalk.green('  create-plugin') + chalk.white('      Create a plugin for your AdminForth app\n') +
    chalk.green('  generate-models') + chalk.white('    Generate TypeScript models from your databases\n') +
    chalk.green('  bundle') + chalk.white('             Bundles your AdminForth app SPA for production\n') +
    chalk.green('  component') + chalk.white('          Scaffold a custom Vue component\n') +
    chalk.green('  resource') + chalk.white('            Scaffold a custom resource\n')
  );
}

export function currentFileDir(importMetaUrl) {
  const filePath = fileURLToPath(importMetaUrl);
  const fileDir = path.dirname(filePath);
  return fileDir;
}

export function getVersion() {
  const ADMIN_FORTH_ABSOLUTE_PATH = path.join(currentFileDir(import.meta.url), '..');
  
  const package_json = JSON.parse(fs.readFileSync(path.join(ADMIN_FORTH_ABSOLUTE_PATH, 'package.json'), 'utf8'));
  
  const ADMINFORTH_VERSION  = package_json.version;

  return ADMINFORTH_VERSION;
}

/**
 * Resolves the adminforth version range to write into a scaffolded package.json.
 *
 * Returns a caret range pinned to the latest published release of the dist-tag
 * matching the running CLI, e.g. "^3.6.12" (installs the latest 3.x.x, never a
 * major upgrade). For "next" builds the moving "next" tag is kept, since
 * prerelease versions do not caret cleanly. Falls back to a major-only range
 * (e.g. "^3.0.0"), and finally to "latest", when the registry is unreachable.
 */
export async function resolveAdminforthVersionRange() {
  // Determine which dist-tag matches the CLI currently running, and derive an
  // offline fallback range from the CLI's own major version.
  let tag = 'latest';
  let offlineFallback = 'latest';
  try {
    const version = getVersion();
    if (typeof version === 'string') {
      if (version.includes('next')) {
        tag = 'next';
      }
      const major = version.split('.')[0];
      if (/^\d+$/.test(major)) {
        offlineFallback = `^${major}.0.0`;
      }
    }
  } catch {
    // Ignore; fall back to "latest" below.
  }

  // "next" builds keep the moving tag  prerelease versions don't caret cleanly.
  if (tag === 'next') {
    return 'next';
  }

  try {
    const res = await fetch('https://registry.npmjs.org/-/package/adminforth/dist-tags', {
      signal: AbortSignal.timeout(5000),
    });
    if (!res.ok) {
      throw new Error(`registry responded with ${res.status}`);
    }
    const distTags = await res.json();
    const latest = distTags[tag];
    if (typeof latest !== 'string' || !/^\d+\.\d+\.\d+/.test(latest)) {
      throw new Error('invalid version received from registry');
    }
    return `^${latest}`;
  } catch (err) {
    console.warn(
      ` Could not resolve AdminForth version from npm registry (${err.message}); defaulting to "${offlineFallback}".`
    );
    return offlineFallback;
  }
}

function showVersion() {
  const ADMINFORTH_VERSION = getVersion();

  console.log(
    chalk.white('AdminForth CLI version: ') +
    chalk.cyan.bold(ADMINFORTH_VERSION)
  );
}

switch (command) {
  case "create-app":
    createApp(args);
    break;
  case "create-plugin":
    createPlugin(args);
    break;
  case "generate-models":
    generateModels();
    break;
  case "bundle":
    bundle();
    break;
  case "component":
    createComponent(args);
    break;
  case "resource":
    createResource(args);
    break;
  case "help":
  case "--help":
  case "-h":
    showHelp();
    break;
  case "--version":
  case "version":
  case "-v":
    showVersion();
    break;
  default: {
    console.log(
      "Unknown command."
    );
    showHelp();
  }
}

Web Proxy Viewer  |  New URL  |  Original Page