UNPKG

@agility/cli

Version:

Agility CLI for working with your content. (Public Beta)

603 lines 23 kB
"use strict"; /** * Centralized state management for Agility CLI * Simple state object that gets populated from argv and referenced throughout the app */ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.state = void 0; exports.setState = setState; exports.configureSSL = configureSSL; exports.primeFromEnv = primeFromEnv; exports.resetState = resetState; exports.getState = getState; exports.getApiClient = getApiClient; exports.createApiClient = createApiClient; exports.clearApiClient = clearApiClient; exports.getUIMode = getUIMode; exports.getApiKeysForGuid = getApiKeysForGuid; exports.getAllApiKeys = getAllApiKeys; exports.validateLocaleFormat = validateLocaleFormat; exports.validateLocales = validateLocales; exports.initializeLogger = initializeLogger; exports.initializeGuidLogger = initializeGuidLogger; exports.getLoggerForGuid = getLoggerForGuid; exports.getLogger = getLogger; exports.finalizeGuidLogger = finalizeGuidLogger; exports.finalizeAllGuidLoggers = finalizeAllGuidLoggers; exports.finalizeLogger = finalizeLogger; exports.startTimer = startTimer; exports.endTimer = endTimer; exports.clearLogger = clearLogger; var mgmtApi = __importStar(require("@agility/management-sdk")); var fs_1 = __importDefault(require("fs")); var path_1 = __importDefault(require("path")); var logs_1 = require("./logs"); // Global state - populated from argv and referenced throughout the app exports.state = { // Environment modes dev: false, local: false, preprod: false, // UI modes headless: false, verbose: false, // Instance/Connection sourceGuid: [], targetGuid: [], locale: [], availableLocales: [], guidLocaleMap: new Map(), apiKeys: [], channel: "website", preview: true, elements: "Models,Galleries,Assets,Containers,Content,Templates,Pages,Sitemaps", // File system rootPath: "agility-files", legacyFolders: false, // Network/Security insecure: false, baseUrl: undefined, // Debug/Analysis test: false, // Operation control overwrite: false, force: false, reset: false, update: true, // Publishing control publish: false, // Model-specific models: "", modelsWithDeps: "", // Content-specific contentItems: undefined, // Cached API client instance (to prevent connection pool exhaustion) cachedApiClient: undefined, // Centralized logger instance logger: undefined, loggerRegistry: new Map(), // Legacy fields (for backward compatibility) token: null, localServer: "", isAgilityDev: false, forceNGROK: false, isPush: false, isPull: false, isSync: false, }; /** * Set state from command line arguments */ function setState(argv) { // Environment modes if (argv.dev !== undefined) exports.state.dev = argv.dev; if (argv.local !== undefined) exports.state.local = argv.local; if (argv.preprod !== undefined) exports.state.preprod = argv.preprod; // UI modes if (argv.headless !== undefined) exports.state.headless = argv.headless; if (argv.verbose !== undefined) exports.state.verbose = argv.verbose; // Instance/Connection - Multi-GUID parsing logic if (argv.sourceGuid !== undefined) { if (argv.sourceGuid.includes(',')) { // Multi-GUID specification exports.state.sourceGuid = argv.sourceGuid.split(',') .map(function (g) { return g.trim(); }) .filter(function (g) { return g.length > 0; }); } else { // Single GUID exports.state.sourceGuid = [argv.sourceGuid]; } } if (argv.targetGuid !== undefined) { if (argv.targetGuid.includes(',')) { // Multi-GUID specification exports.state.targetGuid = argv.targetGuid.split(',') .map(function (g) { return g.trim(); }) .filter(function (g) { return g.length > 0; }); } else { // Single GUID exports.state.targetGuid = [argv.targetGuid]; } } // Multi-locale parsing logic if (argv.locale !== undefined) { if (argv.locale.trim() === "") { // Empty string = auto-detection exports.state.locale = []; } else if (argv.locale.includes(',') || argv.locale.includes(' ')) { // Multi-locale specification exports.state.locale = argv.locale.split(/[,\s]+/) .map(function (l) { return l.trim(); }) .filter(function (l) { return l.length > 0; }); } else { // Single locale exports.state.locale = [argv.locale]; } } if (argv.channel !== undefined) exports.state.channel = argv.channel; if (argv.preview !== undefined) exports.state.preview = argv.preview; if (argv.elements !== undefined) exports.state.elements = argv.elements; // File system if (argv.rootPath !== undefined) exports.state.rootPath = argv.rootPath; if (argv.legacyFolders !== undefined) exports.state.legacyFolders = argv.legacyFolders; // Network/Security if (argv.insecure !== undefined) exports.state.insecure = argv.insecure; if (argv.baseUrl !== undefined) exports.state.baseUrl = argv.baseUrl; // Debug/Analysis if (argv.test !== undefined) exports.state.test = argv.test; // Operation control if (argv.overwrite !== undefined) exports.state.overwrite = argv.overwrite; if (argv.force !== undefined) exports.state.force = argv.force; if (argv.reset !== undefined) exports.state.reset = argv.reset; if (argv.update !== undefined) exports.state.update = argv.update; // Publishing control if (argv.publish !== undefined) exports.state.publish = argv.publish; // Model-specific if (argv.models !== undefined) exports.state.models = argv.models; if (argv.modelsWithDeps !== undefined) exports.state.modelsWithDeps = argv.modelsWithDeps; // Content-specific if (argv.contentItems !== undefined) exports.state.contentItems = argv.contentItems; } /** * Configure SSL verification based on CLI mode */ function configureSSL() { if (exports.state.local) { process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0"; console.warn("\nWarning: SSL certificate verification is disabled for development/local mode"); } } /** * Prime state from .env file before setState() is called * This allows .env values to be overridden by command line arguments */ function primeFromEnv() { var envFiles = ['.env', '.env.local', '.env.development', '.env.production']; var primedValues = []; for (var _i = 0, envFiles_1 = envFiles; _i < envFiles_1.length; _i++) { var envFile = envFiles_1[_i]; var envPath = path_1.default.join(process.cwd(), envFile); if (fs_1.default.existsSync(envPath)) { var envContent = fs_1.default.readFileSync(envPath, 'utf8'); // Parse all relevant environment variables var envVars = { AGILITY_GUID: envContent.match(/AGILITY_GUID=([^\n]+)/), AGILITY_TARGET_GUID: envContent.match(/AGILITY_TARGET_GUID=([^\n]+)/), AGILITY_WEBSITE: envContent.match(/AGILITY_WEBSITE=([^\n]+)/), AGILITY_LOCALES: envContent.match(/AGILITY_LOCALES=([^\n]+)/), AGILITY_TEST: envContent.match(/AGILITY_TEST=([^\n]+)/), AGILITY_OVERWRITE: envContent.match(/AGILITY_OVERWRITE=([^\n]+)/), AGILITY_PREVIEW: envContent.match(/AGILITY_PREVIEW=([^\n]+)/), AGILITY_VERBOSE: envContent.match(/AGILITY_VERBOSE=([^\n]+)/), AGILITY_HEADLESS: envContent.match(/AGILITY_HEADLESS=([^\n]+)/), AGILITY_ELEMENTS: envContent.match(/AGILITY_ELEMENTS=([^\n]+)/), AGILITY_ROOT_PATH: envContent.match(/AGILITY_ROOT_PATH=([^\n]+)/), AGILITY_BASE_URL: envContent.match(/AGILITY_BASE_URL=([^\n]+)/), AGILITY_DEV: envContent.match(/AGILITY_DEV=([^\n]+)/), AGILITY_LOCAL: envContent.match(/AGILITY_LOCAL=([^\n]+)/), AGILITY_PREPROD: envContent.match(/AGILITY_PREPROD=([^\n]+)/), AGILITY_LEGACY_FOLDERS: envContent.match(/AGILITY_LEGACY_FOLDERS=([^\n]+)/), AGILITY_INSECURE: envContent.match(/AGILITY_INSECURE=([^\n]+)/), AGILITY_MODELS: envContent.match(/AGILITY_MODELS=([^\n]+)/), }; // Only prime state values that aren't already set from command line if (envVars.AGILITY_GUID && envVars.AGILITY_GUID[1] && exports.state.sourceGuid.length === 0) { exports.state.sourceGuid = [envVars.AGILITY_GUID[1].trim()]; primedValues.push('sourceGuid'); } if (envVars.AGILITY_WEBSITE && envVars.AGILITY_WEBSITE[1] && !exports.state.channel) { exports.state.channel = envVars.AGILITY_WEBSITE[1].trim(); primedValues.push('channel'); } if (envVars.AGILITY_LOCALES && envVars.AGILITY_LOCALES[1] && exports.state.locale.length === 0) { exports.state.locale = envVars.AGILITY_LOCALES[1].trim().split(','); primedValues.push('locale'); } // Handle boolean flags - prefer command line args over .env if (envVars.AGILITY_TEST && envVars.AGILITY_TEST[1] && exports.state.test === undefined) { exports.state.test = envVars.AGILITY_TEST[1].trim().toLowerCase() === 'true'; primedValues.push('test'); } if (envVars.AGILITY_OVERWRITE && envVars.AGILITY_OVERWRITE[1] && exports.state.overwrite === undefined) { exports.state.overwrite = envVars.AGILITY_OVERWRITE[1].trim().toLowerCase() === 'true'; primedValues.push('overwrite'); } if (envVars.AGILITY_PREVIEW && envVars.AGILITY_PREVIEW[1] && exports.state.preview === undefined) { exports.state.preview = envVars.AGILITY_PREVIEW[1].trim().toLowerCase() === 'true'; primedValues.push('preview'); } if (envVars.AGILITY_VERBOSE && envVars.AGILITY_VERBOSE[1] && exports.state.verbose === undefined) { exports.state.verbose = envVars.AGILITY_VERBOSE[1].trim().toLowerCase() === 'true'; primedValues.push('verbose'); } if (envVars.AGILITY_HEADLESS && envVars.AGILITY_HEADLESS[1] && exports.state.headless === undefined) { exports.state.headless = envVars.AGILITY_HEADLESS[1].trim().toLowerCase() === 'true'; primedValues.push('headless'); } if (envVars.AGILITY_ELEMENTS && envVars.AGILITY_ELEMENTS[1] && !exports.state.elements) { exports.state.elements = envVars.AGILITY_ELEMENTS[1].trim(); primedValues.push('elements'); } if (envVars.AGILITY_ROOT_PATH && envVars.AGILITY_ROOT_PATH[1] && !exports.state.rootPath) { exports.state.rootPath = envVars.AGILITY_ROOT_PATH[1].trim(); primedValues.push('rootPath'); } if (envVars.AGILITY_BASE_URL && envVars.AGILITY_BASE_URL[1] && !exports.state.baseUrl) { exports.state.baseUrl = envVars.AGILITY_BASE_URL[1].trim(); primedValues.push('baseUrl'); } // Additional system args if (envVars.AGILITY_TARGET_GUID && envVars.AGILITY_TARGET_GUID[1] && exports.state.targetGuid.length === 0) { exports.state.targetGuid = [envVars.AGILITY_TARGET_GUID[1].trim()]; primedValues.push('targetGuid'); } if (envVars.AGILITY_DEV && envVars.AGILITY_DEV[1] && exports.state.dev === undefined) { exports.state.dev = envVars.AGILITY_DEV[1].trim().toLowerCase() === 'true'; primedValues.push('dev'); } if (envVars.AGILITY_LOCAL && envVars.AGILITY_LOCAL[1] && exports.state.local === undefined) { exports.state.local = envVars.AGILITY_LOCAL[1].trim().toLowerCase() === 'true'; primedValues.push('local'); } if (envVars.AGILITY_PREPROD && envVars.AGILITY_PREPROD[1] && exports.state.preprod === undefined) { exports.state.preprod = envVars.AGILITY_PREPROD[1].trim().toLowerCase() === 'true'; primedValues.push('preprod'); } if (envVars.AGILITY_LEGACY_FOLDERS && envVars.AGILITY_LEGACY_FOLDERS[1] && exports.state.legacyFolders === undefined) { exports.state.legacyFolders = envVars.AGILITY_LEGACY_FOLDERS[1].trim().toLowerCase() === 'true'; primedValues.push('legacyFolders'); } if (envVars.AGILITY_INSECURE && envVars.AGILITY_INSECURE[1] && exports.state.insecure === undefined) { exports.state.insecure = envVars.AGILITY_INSECURE[1].trim().toLowerCase() === 'true'; primedValues.push('insecure'); } if (envVars.AGILITY_MODELS && envVars.AGILITY_MODELS[1] && !exports.state.models) { exports.state.models = envVars.AGILITY_MODELS[1].trim(); primedValues.push('models'); } if (primedValues.length > 0) { return { hasEnvFile: true, primedValues: primedValues }; } } } return { hasEnvFile: false, primedValues: [] }; } /** * Reset state to default values (called at start of each command) * Prevents contamination between command executions */ function resetState() { // Environment modes exports.state.dev = false; exports.state.local = false; exports.state.preprod = false; // UI modes exports.state.headless = false; exports.state.verbose = false; // Instance/Connection exports.state.sourceGuid = []; exports.state.targetGuid = []; exports.state.locale = []; exports.state.availableLocales = []; exports.state.guidLocaleMap = new Map(); exports.state.apiKeys = []; exports.state.channel = "website"; exports.state.preview = true; exports.state.elements = "Models,Galleries,Assets,Containers,Content,Templates,Pages,Sitemaps"; // File system exports.state.rootPath = "agility-files"; exports.state.legacyFolders = false; // Network/Security exports.state.insecure = false; exports.state.baseUrl = undefined; // Debug/Analysis exports.state.test = false; // Operation control exports.state.overwrite = false; exports.state.force = false; exports.state.reset = false; exports.state.update = true; // Publishing control exports.state.publish = false; // Model-specific exports.state.models = ""; // Content-specific exports.state.contentItems = undefined; // Clear computed properties exports.state.useHeadless = undefined; exports.state.useVerbose = undefined; // Clear auth/API objects exports.state.mgmtApiOptions = undefined; exports.state.user = undefined; exports.state.apiKeyForPull = undefined; exports.state.previewKey = undefined; exports.state.fetchKey = undefined; exports.state.currentWebsite = undefined; // Legacy fields exports.state.token = null; exports.state.localServer = ""; exports.state.isAgilityDev = false; exports.state.forceNGROK = false; } /** * Get the current state */ function getState() { return exports.state; } /** * Get or create ApiClient - reuses cached instance to prevent connection pool exhaustion * This ensures the client always uses current auth state while maintaining connection efficiency */ function getApiClient() { // Check if we already have a cached client if (exports.state.cachedApiClient) { return exports.state.cachedApiClient; } // Create new client using current auth state if (!exports.state.mgmtApiOptions) { throw new Error('Management API options not initialized. Call auth.init() first.'); } // Create and cache the client exports.state.cachedApiClient = new mgmtApi.ApiClient(exports.state.mgmtApiOptions); return exports.state.cachedApiClient; } /** * @deprecated Use getApiClient() instead - this function is kept for backward compatibility */ function createApiClient() { return getApiClient(); } /** * Clear the cached API client - forces creation of new instance on next getApiClient() call */ function clearApiClient() { exports.state.cachedApiClient = undefined; } /** * Get computed UI mode based on state */ function getUIMode() { var useHeadless = exports.state.headless; var useVerbose = !useHeadless && exports.state.verbose; return { useHeadless: useHeadless, useVerbose: useVerbose, }; } /** * Get API keys for a specific GUID */ function getApiKeysForGuid(guid) { var apiKeyEntry = exports.state.apiKeys.find(function (item) { return item.guid === guid; }); return apiKeyEntry ? { previewKey: apiKeyEntry.previewKey, fetchKey: apiKeyEntry.fetchKey } : null; } /** * Get all API keys */ function getAllApiKeys() { return exports.state.apiKeys; } /** * Validate locale format (e.g., en-us, fr-ca, es-es) */ function validateLocaleFormat(locale) { var localeRegex = /^[a-z]{2}-[a-z]{2}$/i; return localeRegex.test(locale); } /** * Validate array of locales and return valid/invalid splits */ function validateLocales(locales) { var valid = []; var invalid = []; for (var _i = 0, locales_1 = locales; _i < locales_1.length; _i++) { var locale = locales_1[_i]; if (validateLocaleFormat(locale)) { valid.push(locale); } else { invalid.push(locale); } } return { valid: valid, invalid: invalid }; } /** * Initialize centralized logger for the current operation */ function initializeLogger(operationType) { exports.state.logger = new logs_1.Logs(operationType); // Configure based on current state exports.state.logger.configure({ logToConsole: !exports.state.headless, logToFile: true, showColors: !exports.state.headless, useStructuredFormat: true }); return exports.state.logger; } /** * Initialize a per-GUID logger for parallel operations */ function initializeGuidLogger(guid, operationType, entityType) { if (!exports.state.loggerRegistry) { exports.state.loggerRegistry = new Map(); } var logger = new logs_1.Logs(operationType, entityType, guid); // Configure based on current state logger.configure({ logToConsole: !exports.state.headless, logToFile: true, showColors: !exports.state.headless, useStructuredFormat: true }); exports.state.loggerRegistry.set(guid, logger); return logger; } /** * Get logger for a specific GUID */ function getLoggerForGuid(guid) { if (!exports.state.loggerRegistry) { return null; } var logger = exports.state.loggerRegistry.get(guid); if (logger && !logger.getGuid()) { // Ensure the logger has the GUID set logger.setGuid(guid); } return logger || null; } /** * Get the current global logger instance */ function getLogger() { return exports.state.logger || null; } /** * Save and clear a specific GUID logger */ function finalizeGuidLogger(guid) { if (exports.state.loggerRegistry && exports.state.loggerRegistry.has(guid)) { var guidLogger = exports.state.loggerRegistry.get(guid); if (guidLogger) { var result = guidLogger.saveLogs(); exports.state.loggerRegistry.delete(guid); return result; } } return null; } /** * Save and clear all GUID loggers and merge into global log */ function finalizeAllGuidLoggers() { var results = []; if (exports.state.loggerRegistry) { var entries = Array.from(exports.state.loggerRegistry.entries()); for (var _i = 0, entries_1 = entries; _i < entries_1.length; _i++) { var _a = entries_1[_i], guid = _a[0], logger = _a[1]; var logCount = logger.getLogCount(); if (logCount > 0) { var result = logger.saveLogs(); if (result) { results.push(result); console.log("".concat(result)); } } } exports.state.loggerRegistry.clear(); } return results; } /** * Finalize and save the global logger */ function finalizeLogger() { if (exports.state.logger) { var result = exports.state.logger.saveLogs(); exports.state.logger = undefined; // Return result without automatically displaying it // The calling code will handle display if needed return result; } return null; } function startTimer() { if (exports.state.logger) { exports.state.logger.startTimer(); } } function endTimer() { if (exports.state.logger) { exports.state.logger.endTimer(); } } /** * Clear the current logger from state */ function clearLogger() { exports.state.logger = undefined; } //# sourceMappingURL=state.js.map