UNPKG

@pega/custom-dx-components

Version:

Utility for building custom UI components

248 lines (194 loc) 7.93 kB
import inquirer from 'inquirer'; import chalk from 'chalk'; import fetch from 'node-fetch'; import { join } from 'path'; import fs from 'fs'; import ora from 'ora'; import { zipUnArchiveToTempAndReturnBuffer, constructCompleteUrl, getHttpsAgent, getPegaServerConfig, addDebugLog, getConfigDefaults, zipVersionAndArchive, updateServerConfigArchiveRuleSetAndVersion } from '../../util.js'; import { getPublishComponentQuestions } from './helper.js'; import { LP_PUBLISH_COMPONENT_SERVICE_REST_ENDPOINT, PUBLISH_COMPONENT_LIBRARY_ARCHIVE_SERVICE_REST_ENDPOINT, TEMP_PATH, TOKEN_PATH, ARCHIVES_PATH } from '../../constants.js'; export const publishComponentLibraryArchiveToServer = async (data, zipContent, doFetch) => { addDebugLog("publishComponentToServer", `data: ${data}`, ""); const { rulesetName, rulesetVersion, libraryName, version } = data; const defaultPegaServerConfig = await getPegaServerConfig(); const { serverType, isolationId } = defaultPegaServerConfig; const isLaunchpad = serverType === 'launchpad'; const launchpadRestEndpoint = LP_PUBLISH_COMPONENT_SERVICE_REST_ENDPOINT.replace( '{isolationId}', isolationId || 'undefined' ); let apiBody; let urlParams; if (isLaunchpad) { // currently no launchpad records to rule resolve a library } else { urlParams = `/library-name/${libraryName}/library-version/${version}/rulesetname/${rulesetName}/rulesetversion/${rulesetVersion}`; } const defaultPegaConfig = await getPegaServerConfig(); let url = constructCompleteUrl( defaultPegaConfig.server, isLaunchpad ? launchpadRestEndpoint : PUBLISH_COMPONENT_LIBRARY_ARCHIVE_SERVICE_REST_ENDPOINT ); url = url.concat(urlParams); if (doFetch) { try { const OauthData = fs.readFileSync(TOKEN_PATH, 'utf8'); if (OauthData) { const { access_token: accessToken, token_type: tokenType // refresh_token: refreshToken } = JSON.parse(OauthData); let status = 500; let headers = {}; if (isLaunchpad) { headers.cookie = `Pega-AAT=${accessToken}`; headers['Content-Type'] = 'application/json'; } else { headers.Authorization = `${tokenType} ${accessToken}`; headers['Content-Type'] = 'application/json'; } const response = await fetch(url, { method: 'POST', agent: getHttpsAgent(defaultPegaConfig), headers, body: JSON.stringify(zipContent) }); status = response.status; if (!response.ok) { if (status === 401) { throw new Error( 'Error occurred in authentication. Please regenerate using authenticate' ); // console.log(accessTokenUri, refreshToken); /* TODO - Handle refresh_token */ } else if (status === 404) { throw new Error('404: Server resource not found'); } else if (status === 405) { throw new Error('405: Server method not allowed'); } else if (status === 408) { throw new Error('408: Server timed out'); } else if (response.status === 403) { throw new Error('Error forbidden: User does not have privileges to Publish.'); } } try { const respData = isLaunchpad ? await response.text() : await response.json(); console.log(chalk.bold.green(`Success : ${isLaunchpad ? respData : respData.message}`)); if (status === 500) { status = 999; throw new Error(respData.message); } } catch (err) { if (status === 500) { const respData = isLaunchpad ? await response.text() : await response.json(); throw new Error( `Error occurred in authentication. Please regenerate using authenticate` ); } else if (status === 999) { throw new Error(err); } } } else { throw new Error(`Error occurred in authentication. Please regenerate using authenticate`); } } catch (err) { // throw new Error(`Error occurred in authentication. Please regenerate using authenticate`); throw Error(err); } } }; export default async (orgLibName, selectedVersion) => { // console.log(orgLibName + ", " + selectedVersion); const configDef = await getConfigDefaults(); let archiveBeforeStore = false; const rulesetQuestions = await getPublishComponentQuestions(); const rulesetAnswers = await inquirer.prompt(rulesetQuestions); const { rulesetName, rulesetVersion} = rulesetAnswers; const mainDirectory = process.cwd(); let content = { libraryName : orgLibName, version : selectedVersion, rulesetName, rulesetVersion }; // update so will get archived updateServerConfigArchiveRuleSetAndVersion(content.rulesetName, content.rulesetVersion); if (orgLibName === configDef.currentOrgLib && selectedVersion === configDef.buildVersion) { archiveBeforeStore = true; if (archiveBeforeStore) { const archiveFileName = `${orgLibName}_${selectedVersion}.arch.zip`; const archiveDirectory = join (mainDirectory, ARCHIVES_PATH, `${orgLibName}`, `${selectedVersion}`); const defaultPegaConfig = await getPegaServerConfig(); if (fs.existsSync(archiveDirectory)) { const archiveFile = join(archiveDirectory, archiveFileName); let zipContent = fs.readFileSync(archiveFile).toString("base64"); if (zipContent != null) { zipContent = zipContent.replaceAll('"', ""); let spinner; try { console.log(""); // archive it, which will save updated archiveRuleset/Version await zipVersionAndArchive(content.libraryName, content.version); spinner = ora(`Exporting to server ${defaultPegaConfig.server}. \n`).start(); publishComponentLibraryArchiveToServer(content, zipContent, true ) .then( () => { spinner.stop(); console.log(chalk.green.bold(`Success: Published Archive ${content.libraryName}/${content.version} to server.`)); }) .catch( (err) => { spinner.stop(); console.log(chalk.red.bold(err)); }) } catch (err) { spinner.stop(); console.log(chalk.bold.red(err.toString())); } } } return; } } else { // for now, to get a "buffer" from a zip file, need to unzip it in a /temp directory // then re-zip. During the re-zip, create a buffer that can be passed to PegaInfinity // unzip to /temp, then re-zip and retrieve the buffer (remove /temp later) let zipBuffer = await zipUnArchiveToTempAndReturnBuffer(orgLibName, selectedVersion); zipBuffer.output.on('close', function() { // get rid of temp directory, regardless const tempDirectory = join (mainDirectory, TEMP_PATH); if (fs.existsSync(tempDirectory)) { fs.rmSync(tempDirectory, { recursive: true }); } if (zipBuffer.zipContent != null) { content = { ...content, zipContent: zipBuffer.zipContent}; try { publishComponentLibraryArchiveToServer(content, zipBuffer.zipContent, true ) .then( () => { console.log(chalk.green.bold(`Success: Published Archive ${content.libraryName}/${content.version} to server.`)); }) .catch( (err) => { console.log(chalk.red.bold(err)); }) } catch (err) { console.log(chalk.bold.red(err.toString())); } } }); } };