import { isNull, get, isArray, isUndefined, isNumber, isString, camelCase } from 'lodash'; import { createError, backSlashToForwardSlash, sanitizeForVarname, TemplateOptions } from '@cirrusct/core-node'; import { MonoRepoPackage } from '@cirrusct/mr-core'; import { PackageTemplateContext } from '@cirrusct/mr-templates'; import { BuildSpecConfig, BuildPathsConfig } from '@cirrusct/mr-build'; import { TemplateFile, resolveModelTemplatePropertiesToSelf, resolveModelTemplatePropertiesRecursive, } from '@cirrusct/templates'; import { DeployTemplateModel, MrDeployOptions, ResolvedDeploymentConfig, DeploymentLocationConfig, MrDeployConfigProperties, } from './types'; export const getDashedName = (name: string) => { return camelCase(name) .replace(/([a-zA-Z])(?=[A-Z])/g, '$1-') .toLowerCase(); }; export class DeployTemplateContext extends PackageTemplateContext< DeployTemplateModel, BuildSpecConfig, MrDeployOptions > { private _joinedStartCmds: string; private _envStatements: string[]; private _deployModel: DeployTemplateModel; private _currentServerContext: DeployTemplateContext; private _dependsOnServerContexts: DeployTemplateContext[]; constructor(private resolvedConfig: ResolvedDeploymentConfig, dependsOnServerContexts?: DeployTemplateContext[]) { super( resolvedConfig.mrPackage, resolvedConfig.buildSpec, resolvedConfig.options, resolvedConfig.output, resolvedConfig.templateSourceFiles ); this._dependsOnServerContexts = dependsOnServerContexts; } // tslint:disable-next-line no-any private getResolvedConfig = (path: string, defaultValue?: any) => { return get(this.resolvedConfig, path, defaultValue); }; private get startCmds(): string[] { const startCmds = this.getResolvedConfig('startCmds', []); return isArray(startCmds) ? startCmds : [startCmds]; } public get currentServerContext(): DeployTemplateContext { return this._currentServerContext; } public set currentServerContext(server: DeployTemplateContext) { this._currentServerContext = server; this._deployModel = null; } public get currentServerModel(): DeployTemplateModel | null { return this.currentServerContext ? this.currentServerContext.model : null; } public get dependsOnServerModels(): DeployTemplateModel[] { return this.dependsOnServerContexts.map(serverContext => { return serverContext.model; }); } public set dependsOnServerContexts(contexts: DeployTemplateContext[]) { this._dependsOnServerContexts = contexts; this._deployModel = null; } public get dependsOnServerContexts(): DeployTemplateContext[] { return this._dependsOnServerContexts || []; } private get locations(): DeploymentLocationConfig[] { let locConfig = this.getResolvedConfig('locations', [{ url: '/' }]); if (isString(locConfig)) { locConfig = [ { url: locConfig as string, }, ]; } return locConfig; } private get deploymentNameDashed(): string { return getDashedName(this.resolvedConfig.name); } public get model(): DeployTemplateModel { if (!this._deployModel) { this._deployModel = { deploymentName: this.resolvedConfig.name, deploymentNameDashed: this.deploymentNameDashed, ...this.buildModel(), dependsOnServers: this.dependsOnServerModels, startCmds: this.startCmds, currentServer: this.currentServerModel, port: this.getResolvedConfig('port'), volumes: this.getResolvedConfig('volumes') || [], mountPoints: this.getResolvedConfig('mountPoints') || [], portWs: this.getResolvedConfig('portWs'), locations: this.locations, }; this._deployModel.properties = resolveModelTemplatePropertiesRecursive( this.resolvedConfig.properties, this._deployModel ); this._deployModel = resolveModelTemplatePropertiesToSelf(this._deployModel) as DeployTemplateModel; } return this._deployModel; } }