@agility/cli
Version:
Agility CLI for working with your content. (Public Beta)
603 lines • 23 kB
JavaScript
;
/**
* 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